Repository: academicpages/academicpages.github.io Branch: master Commit: ce140cb30afb Files: 268 Total size: 895.1 KB Directory structure: gitextract_4ov5u2bm/ ├── .devcontainer/ │ └── devcontainer.json ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ └── workflows/ │ └── scrape_talks.yml ├── .gitignore ├── CONTRIBUTING.md ├── Dockerfile ├── Gemfile ├── LICENSE ├── README.md ├── _config.yml ├── _config_docker.yml ├── _data/ │ ├── authors.yml │ ├── comments/ │ │ ├── layout-comments/ │ │ │ ├── comment-1470944006665.yml │ │ │ └── comment-1470944162041.yml │ │ ├── markup-syntax-highlighting/ │ │ │ └── comment-1470969665387.yml │ │ └── welcome-to-jekyll/ │ │ ├── comment-1470942205700.yml │ │ ├── comment-1470942247755.yml │ │ ├── comment-1470942265819.yml │ │ └── comment-1470942493518.yml │ ├── cv.json │ ├── navigation.yml │ └── ui-text.yml ├── _drafts/ │ └── post-draft.md ├── _includes/ │ ├── analytics-providers/ │ │ ├── custom.html │ │ ├── google-analytics-4.html │ │ ├── google-universal.html │ │ └── google.html │ ├── analytics.html │ ├── archive-single-cv.html │ ├── archive-single-talk-cv.html │ ├── archive-single-talk.html │ ├── archive-single.html │ ├── author-profile.html │ ├── base_path │ ├── breadcrumbs.html │ ├── browser-upgrade.html │ ├── category-list.html │ ├── comment.html │ ├── comments-providers/ │ │ ├── custom.html │ │ ├── discourse.html │ │ ├── disqus.html │ │ ├── facebook.html │ │ ├── google-plus.html │ │ ├── scripts.html │ │ └── staticman.html │ ├── comments.html │ ├── cv-template.html │ ├── feature_row │ ├── footer/ │ │ └── custom.html │ ├── footer.html │ ├── gallery │ ├── group-by-array │ ├── head/ │ │ └── custom.html │ ├── head.html │ ├── masthead.html │ ├── nav_list │ ├── page__hero.html │ ├── page__taxonomy.html │ ├── paginator.html │ ├── post_pagination.html │ ├── read-time.html │ ├── scripts.html │ ├── seo.html │ ├── sidebar.html │ ├── social-share.html │ ├── tag-list.html │ └── toc ├── _layouts/ │ ├── archive-taxonomy.html │ ├── archive.html │ ├── compress.html │ ├── cv-layout.html │ ├── default.html │ ├── single.html │ ├── splash.html │ └── talk.html ├── _pages/ │ ├── 404.md │ ├── about.md │ ├── archive-layout-with-content.md │ ├── category-archive.html │ ├── collection-archive.html │ ├── cv-json.md │ ├── cv.md │ ├── markdown.md │ ├── non-menu-page.md │ ├── page-archive.html │ ├── portfolio.html │ ├── publications.html │ ├── sitemap.md │ ├── tag-archive.html │ ├── talkmap.html │ ├── talks.html │ ├── teaching.html │ ├── terms.md │ └── year-archive.html ├── _portfolio/ │ ├── portfolio-1.md │ └── portfolio-2.html ├── _posts/ │ ├── 2012-08-14-blog-post-1.md │ ├── 2013-08-14-blog-post-2.md │ ├── 2014-08-14-blog-post-3.md │ ├── 2015-08-14-blog-post-4.md │ └── 2199-01-01-future-post.md ├── _publications/ │ ├── 2009-10-01-paper-title-number-1.md │ ├── 2010-10-01-paper-title-number-2.md │ ├── 2015-10-01-paper-title-number-3.md │ ├── 2024-02-17-paper-title-number-4.md │ └── 2025-06-08-paper-title-number-5.md ├── _sass/ │ ├── _syntax.scss │ ├── _themes.scss │ ├── include/ │ │ ├── _mixins.scss │ │ └── _utilities.scss │ ├── layout/ │ │ ├── _archive.scss │ │ ├── _base.scss │ │ ├── _buttons.scss │ │ ├── _footer.scss │ │ ├── _forms.scss │ │ ├── _json_cv.scss │ │ ├── _masthead.scss │ │ ├── _navigation.scss │ │ ├── _notices.scss │ │ ├── _page.scss │ │ ├── _reset.scss │ │ ├── _sidebar.scss │ │ └── _tables.scss │ ├── theme/ │ │ ├── _air_dark.scss │ │ ├── _air_light.scss │ │ ├── _contrast_dark.scss │ │ ├── _contrast_light.scss │ │ ├── _default_dark.scss │ │ ├── _default_light.scss │ │ ├── _dirt_dark.scss │ │ ├── _dirt_light.scss │ │ ├── _mint_dark.scss │ │ ├── _mint_light.scss │ │ ├── _sunrise_dark.scss │ │ └── _sunrise_light.scss │ └── vendor/ │ ├── breakpoint/ │ │ ├── _breakpoint.scss │ │ ├── _context.scss │ │ ├── _helpers.scss │ │ ├── _legacy-settings.scss │ │ ├── _no-query.scss │ │ ├── _parsers.scss │ │ ├── _respond-to.scss │ │ ├── _settings.scss │ │ └── parsers/ │ │ ├── _double.scss │ │ ├── _query.scss │ │ ├── _resolution.scss │ │ ├── _single.scss │ │ ├── _triple.scss │ │ ├── double/ │ │ │ ├── _default-pair.scss │ │ │ ├── _default.scss │ │ │ └── _double-string.scss │ │ ├── resolution/ │ │ │ └── _resolution.scss │ │ ├── single/ │ │ │ └── _default.scss │ │ └── triple/ │ │ └── _default.scss │ ├── font-awesome/ │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _functions.scss │ │ ├── _icons.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _shims.scss │ │ ├── _sizing.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ ├── brands.scss │ │ ├── fontawesome.scss │ │ ├── regular.scss │ │ ├── solid.scss │ │ └── v4-shims.scss │ └── susy/ │ ├── _su.scss │ ├── _susy.scss │ ├── _susyone.scss │ └── susy/ │ ├── _su.scss │ ├── language/ │ │ ├── _susy.scss │ │ ├── _susyone.scss │ │ ├── susy/ │ │ │ ├── _background.scss │ │ │ ├── _bleed.scss │ │ │ ├── _box-sizing.scss │ │ │ ├── _breakpoint-plugin.scss │ │ │ ├── _container.scss │ │ │ ├── _context.scss │ │ │ ├── _gallery.scss │ │ │ ├── _grids.scss │ │ │ ├── _gutters.scss │ │ │ ├── _isolate.scss │ │ │ ├── _margins.scss │ │ │ ├── _padding.scss │ │ │ ├── _rows.scss │ │ │ ├── _settings.scss │ │ │ ├── _span.scss │ │ │ └── _validation.scss │ │ └── susyone/ │ │ ├── _background.scss │ │ ├── _functions.scss │ │ ├── _grid.scss │ │ ├── _isolation.scss │ │ ├── _margin.scss │ │ ├── _media.scss │ │ ├── _padding.scss │ │ └── _settings.scss │ ├── output/ │ │ ├── _float.scss │ │ ├── _shared.scss │ │ ├── _support.scss │ │ ├── float/ │ │ │ ├── _container.scss │ │ │ ├── _end.scss │ │ │ ├── _isolate.scss │ │ │ └── _span.scss │ │ ├── shared/ │ │ │ ├── _background.scss │ │ │ ├── _container.scss │ │ │ ├── _direction.scss │ │ │ ├── _inspect.scss │ │ │ ├── _margins.scss │ │ │ ├── _output.scss │ │ │ └── _padding.scss │ │ └── support/ │ │ ├── _background.scss │ │ ├── _box-sizing.scss │ │ ├── _clearfix.scss │ │ ├── _prefix.scss │ │ ├── _rem.scss │ │ └── _support.scss │ └── su/ │ ├── _grid.scss │ ├── _settings.scss │ ├── _utilities.scss │ └── _validation.scss ├── _talks/ │ ├── 2012-03-01-talk-1.md │ ├── 2013-03-01-tutorial-1.md │ ├── 2014-02-01-talk-2.md │ └── 2014-03-01-talk-3.md ├── _teaching/ │ ├── 2014-spring-teaching-1.md │ └── 2015-spring-teaching-2.md ├── assets/ │ ├── css/ │ │ ├── academicons.css │ │ ├── collapse.css │ │ └── main.scss │ └── js/ │ ├── _main.js │ ├── collapse.js │ ├── plugins/ │ │ └── jquery.greedy-navigation.js │ └── theme.js ├── docker-compose.yaml ├── files/ │ └── bibtex1.bib ├── images/ │ └── manifest.json ├── markdown_generator/ │ ├── OrcidToBib.ipynb │ ├── PubsFromBib.ipynb │ ├── README.md │ ├── publications.csv │ ├── publications.ipynb │ ├── publications.py │ ├── publications.tsv │ ├── pubsFromBib.py │ ├── talks.ipynb │ ├── talks.py │ └── talks.tsv ├── package.json ├── scripts/ │ ├── cv_markdown_to_json.py │ └── update_cv_json.sh ├── talkmap/ │ ├── leaflet_dist/ │ │ ├── MarkerCluster.Default.css │ │ ├── MarkerCluster.css │ │ ├── leaflet.markercluster-src.js │ │ ├── leaflet.markercluster.js │ │ └── screen.css │ ├── map.html │ └── org-locations.js ├── talkmap.ipynb ├── talkmap.py └── talkmap_out.ipynb ================================================ FILE CONTENTS ================================================ ================================================ FILE: .devcontainer/devcontainer.json ================================================ { "name": "ACADEMIC PAGES", "dockerComposeFile": "../docker-compose.yaml", "service": "jekyll-site", "remoteEnv": { "VSCODE_SERVER_DIR": "/home/vscode/.vscode-server" }, "runArgs": [ "--user", "1000:1000" ], "workspaceFolder": "/usr/src/app", "remoteUser": "vscode", "forwardPorts": [4000] // Add port forwarding } ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: '' --- **Describe the bug** A clear and concise description of what the bug is, be sure to note if the issue is presenet in the *template* or appeared on *your site*. If the bug appears on your site, please be sure to provide a link to your repository. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Browser (please complete the following information):** - Device: [e.g. iPhone6] (if applicable) - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - Version [e.g. 22] **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: '' labels: '' assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/workflows/scrape_talks.yml ================================================ name: Scrape Talk Locations on: push: paths: - 'talks/**' - '_talks/**' - 'talkmap.ipynb' jobs: build: runs-on: ubuntu-latest permissions: contents: write # This workflow pushes to the repository steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: '3.9' # Specify the Python version you need - name: Install dependencies run: | pip install jupyter pandas requests beautifulsoup4 geopy # Add other dependencies as needed pip install getorg --upgrade - name: Run Jupyter Notebook run: | jupyter nbconvert --to notebook --execute talkmap.ipynb --output talkmap_out.ipynb - name: Commit changes run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add . git commit -m "Automated update of talk locations" || echo "No changes to commit" git push ================================================ FILE: .gitignore ================================================ # Ignore the contents of the _site directory and other cache directories _site/ .sass-cache/ # Ignore the directory for local files during development local/ # Ignore the Gemfile that is generated Gemfile.lock # Ignore files created by npm node_modules package-lock.json # Ignore the vendor file at root level and bundle for alternative installation /vendor/ .bundle/ # Ignore folders related to IDEs .vscode/ # Ignore files created by MacOS .DS_Store ================================================ FILE: CONTRIBUTING.md ================================================ Contributions are welcome! Please add issues and make pull requests. There are no stupid questions. All ideas are welcome. This is a volunteer project. Be excellent to each other. Bug reports and feature requests to the template should be [submitted via GitHub](https://github.com/academicpages/academicpages.github.io/issues/new/choose). For questions concerning how to style the template, please feel free to start a [new discussion on GitHub](https://github.com/academicpages/academicpages.github.io/discussions). Fork from master and go from there. Remember that this repository is intended to remain a generic, ready-to-fork template that demonstrates the features of academicpages. ================================================ FILE: Dockerfile ================================================ # Base image: Ruby with necessary dependencies for Jekyll FROM ruby:3.2 # Install dependencies RUN apt-get update && apt-get install -y \ build-essential \ nodejs \ && rm -rf /var/lib/apt/lists/* # Create a non-root user with UID 1000 RUN groupadd -g 1000 vscode && \ useradd -m -u 1000 -g vscode vscode # Set the working directory WORKDIR /usr/src/app # Set permissions for the working directory RUN chown -R vscode:vscode /usr/src/app # Switch to the non-root user USER vscode # Copy Gemfile into the container (necessary for `bundle install`) COPY Gemfile ./ # Install bundler and dependencies RUN gem install connection_pool:2.5.0 RUN gem install bundler:2.3.26 RUN bundle install # Command to serve the Jekyll site CMD ["jekyll", "serve", "-H", "0.0.0.0", "-w", "--config", "_config.yml,_config_docker.yml"] ================================================ FILE: Gemfile ================================================ source 'https://rubygems.org' group :jekyll_plugins do gem 'jekyll' gem 'jekyll-feed' gem 'jekyll-sitemap' gem 'jekyll-redirect-from' gem 'jemoji' gem 'webrick', '~> 1.8' end gem 'github-pages' gem 'connection_pool', '2.5.0' ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2016 Michael Rose Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # Academic Pages **Academic Pages is a GitHub Pages template for personal and professional portfolio-oriented websites.** ![Academic Pages template example](images/themes/homepage-light.png "Academic Pages template example") # Getting Started 1. Register a GitHub account if you don't have one and confirm your e-mail (required!) 1. Click the "Use this template" button in the top right. 1. On the "New repository" page, enter your public repository name as "[your GitHub username].github.io", which will also be your website's URL. 1. Edit site-wide configuration in `_config.yml` and double check that the `url` is the one that you just selected in the previous step and that `repository` reflects the correct path for your repository. 1. Add your site content, upload any files (like PDFs, .zip files, etc.) to the `files/` directory. They will appear at https://[your GitHub username].github.io/files/example.pdf. 1. Check status by going to the repository settings, in the "GitHub pages" section 1. (Optional) Use the Jupyter notebooks or python scripts in the `markdown_generator` folder to generate markdown files for publications and talks from a TSV file. See more info at https://academicpages.github.io/ ### Additional Tutorials Additional tutorials for working with the Academic Pages template can be found at the following sites: - https://jayrobwilliams.com/posts/2020/06/academic-website/ ## Running locally When you are initially working on your website, it is very useful to be able to preview the changes locally before pushing them to GitHub. To work locally you will need to: 1. Clone the repository and made updates as detailed above. ### Using a different IDE 1. Make sure you have ruby-dev, bundler, and nodejs installed On most Linux distribution and [Windows Subsystem Linux](https://learn.microsoft.com/en-us/windows/wsl/about) the command is: ```bash sudo apt install ruby-dev ruby-bundler nodejs ``` If you see error `Unable to locate package ruby-bundler`, `Unable to locate package nodejs `, run the following: ```bash sudo apt update && sudo apt upgrade -y ``` then try run `sudo apt install ruby-dev ruby-bundler nodejs` again. On MacOS the commands are: ```bash brew install ruby brew install node gem install bundler ``` 1. Run `bundle install` to install ruby dependencies. If you get errors, delete Gemfile.lock and try again. If you see file permission error like `Fetching bundler-2.6.3.gem ERROR: While executing gem (Gem::FilePermissionError) You don't have write permissions for the /var/lib/gems/3.2.0 directory.` or `Bundler::PermissionError: There was an error while trying to write to /usr/local/bin.` Install Gems Locally (Recommended): ```bash bundle config set --local path 'vendor/bundle' ``` then try run `bundle install` again. If succeeded, you should see a folder called `vendor` and `.bundle`. 1. Run `jekyll serve -l -H localhost` to generate the HTML and serve it from `localhost:4000` the local server will automatically rebuild and refresh the pages on change to Markdown (*.md) and HTML files, while changes to the core template and configuration (i.e., `_config.yml`) will require stopping and restarting Jekyll. You may also try `bundle exec jekyll serve -l -H localhost` to ensure jekyll to use specific dependencies on your own local machine. If you are running on Linux it may be necessary to install some additional dependencies prior to being able to run locally: `sudo apt install build-essential gcc make` ## Using Docker Working from a different OS, or just want to avoid installing dependencies? You can use the provided `Dockerfile` to build a container that will run the site for you if you have [Docker](https://www.docker.com/) installed. You can build and execute the container by running the following command in the repository: ```bash chmod -R 777 . docker compose up ``` You should now be able to access the website from `localhost:4000`. ### Using the DevContainer in VS Code If you are using [Visual Studio Code](https://code.visualstudio.com/) you can use the [Dev Container](https://code.visualstudio.com/docs/devcontainers/containers) that comes with this Repository. Normally VS Code detects that a development container configuration is available and asks you if you want to use the container. If this doesn't happen you can manually start the container by **F1->DevContainer: Reopen in Container**. This restarts your VS Code in the container and automatically hosts your academic page locally on http://localhost:4000. All changes will be updated live to that page after a few seconds. # Maintenance Bug reports and feature requests to the template should be [submitted via GitHub](https://github.com/academicpages/academicpages.github.io/issues/new/choose). For questions concerning how to style the template, please feel free to start a [new discussion on GitHub](https://github.com/academicpages/academicpages.github.io/discussions). This repository was forked (then detached) by [Stuart Geiger](https://github.com/staeiou) from the [Minimal Mistakes Jekyll Theme](https://mmistakes.github.io/minimal-mistakes/), which is © 2016 Michael Rose and released under the MIT License (see LICENSE.md). It is currently being maintained by [Robert Zupko](https://github.com/rjzupkoii) and additional maintainers would be welcomed. ## Bugfixes and enhancements If you have bugfixes and enhancements that you would like to submit as a pull request, you will need to [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) this repository as opposed to using it as a template. This will also allow you to [synchronize your copy](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork) of template to your fork as well. Unfortunately, one logistical issue with a template theme like Academic Pages that makes it a little tricky to get bug fixes and updates to the core theme. If you use this template and customize it, you will probably get merge conflicts if you attempt to synchronize, although [rebasing](https://git-scm.com/docs/git-rebase) the changes from this template will work along with manually [cherry picking](https://git-scm.com/docs/git-cherry-pick) the relevant commits. If you are not comfortable with the Git command line, you can save your various `.yml` configuration files and Markdown files, delete the repository, and fork it again. ---
![pages-build-deployment](https://github.com/academicpages/academicpages.github.io/actions/workflows/pages/pages-build-deployment/badge.svg) [![GitHub contributors](https://img.shields.io/github/contributors/academicpages/academicpages.github.io.svg)](https://github.com/academicpages/academicpages.github.io/graphs/contributors) [![GitHub release](https://img.shields.io/github/v/release/academicpages/academicpages.github.io)](https://github.com/academicpages/academicpages.github.io/releases/latest) [![GitHub license](https://img.shields.io/github/license/academicpages/academicpages.github.io?color=blue)](https://github.com/academicpages/academicpages.github.io/blob/master/LICENSE) [![GitHub stars](https://img.shields.io/github/stars/academicpages/academicpages.github.io)](https://github.com/academicpages/academicpages.github.io) [![GitHub forks](https://img.shields.io/github/forks/academicpages/academicpages.github.io)](https://github.com/academicpages/academicpages.github.io/fork)
================================================ FILE: _config.yml ================================================ # Welcome to Jekyll! # # This config file is meant for settings that affect your entire site, values # which you are expected to set up once and rarely need to edit after that. # For technical reasons, this file is *NOT* reloaded automatically when you use # `jekyll serve -l -H localhost`. If you change this file, please restart the # server process. # Basic Site Settings locale : "en-US" site_theme : "default" # The available themes options are "default", "air", "sunrise", "mint", "dirt" and "contrast" title : "Your Name / Site Title" title_separator : "-" name : &name "Your Name" description : &description "Your Name's academic portfolio" # Update this with a general description of your site, this is the default if not overridden by a page url : https://academicpages.github.io # The base hostname & protocol for your site e.g. "https://[your GitHub username].github.io", # or if you already have some other page hosted on Github then use "https://[your GitHub username].github.io/[Your Repo Name]" baseurl : "" # the subpath of your site, e.g. "/blog" repository : "academicpages/academicpages.github.io" # Site Author - The following control what appear as part of the author content on the side bar. # If a field is blank the icon and link will not appear, otherwise it will be shown. # Additional customization can be done by editing /_includes/author-profile.html author: # Biographic information avatar : "profile.png" name : "Your Sidebar Name" pronouns : # example: "she/her" bio : "Short biography for the left-hand sidebar" location : "Earth" employer : "Red Brick University" uri : # URL email : "none@example.org" # Academic websites academia : # URL arxiv : # URL - Update with the correct link to your profile googlescholar : "https://scholar.google.com/citations?user=PS_CX0AAAAAJ" inspire-hep : # URL impactstory : # URL orcid : "https://orcid.org/yourorcidurl" semantic : # URL ssrn : # URL pubmed : "https://www.ncbi.nlm.nih.gov/pubmed/?term=john+snow" researchgate : # URL scopus : # URL zotero : # URL # Repositories and software development bitbucket : # Username - Update with your username on the site codepen : # Username dribbble : # Username github : "academicpages" kaggle : # Username stackoverflow : # User number or user number and name (i.e., use "1" or "1/jeff-atwood") # Social media artstation : # Username bluesky : "bsky.app" # Replace this with you Bluesky username facebook : # Username flickr : # Username foursquare : # Username goodreads : # Username google_plus : # Username keybase : # Username instagram : # Username lastfm : # Username linkedin : # Username mastodon : # URL medium : # URL pinterest : # Username soundcloud : # Username steam : # Username telegram : # URL tumblr : # Username twitter : # Username for X / Twitter vine : # Username weibo : # Username wikipedia : # Username xing : # Username youtube : # Username zhihu : # Username # Publication Category - The following the list of publication categories and their headings publication_category: books: title: 'Books' manuscripts: title: 'Journal Articles' conferences: title: 'Conference Papers' # Site Settings teaser : # filename of teaser fallback teaser image placed in /images/ for social media previews breadcrumbs : false # true, false (default) words_per_minute : 160 future : true read_more : "disabled" # if enabled, adds "Read more" links to excerpts talkmap_link : false #change to true to add link to talkmap on talks page comments: provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "custom" disqus: shortname : discourse: server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org facebook: appid : num_posts : # 5 (default) colorscheme : # "light" (default), "dark" staticman: allowedFields : ['name', 'email', 'url', 'message'] branch : "gh-pages" # "master", "gh-pages" commitMessage : "New comment." filename : comment-{@timestamp} format : "yml" moderation : true path : "_data/comments/{options.slug}" requiredFields : ['name', 'email', 'message'] transforms: email : "md5" generatedFields: date: type : "date" options: format : "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds" atom_feed: hide : false # change to true to hide the RSS feed in the footer path : # blank (default) uses feed.xml # SEO Related google_site_verification : bing_site_verification : alexa_site_verification : yandex_site_verification : # Social Sharing twitter: username : &twitter facebook: username : app_id : publisher : og_image : # Social media default site image og_description : # Social media default site image description # For specifying social profiles # - https://developers.google.com/structured-data/customize/social-profiles social: type : # Person or Organization (defaults to Person) name : # If the user or organization name differs from the site's name links: # An array of links to social media profiles # Analytics analytics: provider : "false" # false (default), "google", "google-universal", "google-analytics-4", "custom" google: tracking_id : # Reading Files include: - .htaccess - _pages - files exclude: - "*.sublime-project" - "*.sublime-workspace" - .asset-cache - .bundle - .github - .jekyll-assets-cache - .sass-cache - assets/js/_main.js - assets/js/plugins - assets/js/vendor - CHANGELOG - Capfile - config - Dockerfile - Gemfile - Gruntfile.js - gulpfile.js - LICENSE - local - log - node_modules - package.json* - Rakefile - README - tmp - vendor keep_files: - .git - .svn encoding: "utf-8" markdown_ext: "markdown,mkdown,mkdn,mkd,md" # Conversion markdown: kramdown highlighter: rouge lsi: false excerpt_separator: "\n\n" incremental: false # Markdown Processing kramdown: input: GFM hard_wrap: false auto_ids: true footnote_nr: 1 entity_output: as_char toc_levels: 1..6 smart_quotes: lsquo,rsquo,ldquo,rdquo enable_coderay: false # These settings control the types of collections used by the template collections: teaching: output: true permalink: /:collection/:path/ publications: output: true permalink: /:collection/:path/ portfolio: output: true permalink: /:collection/:path/ talks: output: true permalink: /:collection/:path/ # These settings control how pages and collections are included in the site defaults: # _posts - scope: path: "" type: posts values: layout: single author_profile: true read_time: true comments: true share: true related: true # _pages - scope: path: "" type: pages values: layout: single author_profile: true # _teaching - scope: path: "" type: teaching values: layout: single author_profile: true share: true comments: true # _publications - scope: path: "" type: publications values: layout: single author_profile: true share: true comments: true # _portfolio - scope: path: "" type: portfolio values: layout: single author_profile: true share: true comment: true # _talks - scope: path: "" type: talks values: layout: talk author_profile: true share: true # Sass/SCSS sass: sass_dir: _sass style: compressed # https://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style # Outputting permalink: /:categories/:title/ # paginate: 5 # amount of posts to show # paginate_path: /page:num/ timezone: Etc/UTC # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones # Plugins plugins: - jekyll-feed - jekyll-gist - jekyll-paginate - jekyll-sitemap - jekyll-redirect-from - jemoji # Mimic GitHub Pages with --safe whitelist: - jekyll-feed - jekyll-gist - jekyll-paginate - jekyll-sitemap - jekyll-redirect-from - jemoji # Archives # Type # - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default) # - Jekyll Archives plugin archive pages ~> type: jekyll-archives # Path (examples) # - Archive page should exist at path when using Liquid method or you can # expect broken links (especially with breadcrumbs enabled) # - /tags/my-awesome-tag/index.html ~> path: /tags/ # - path: /categories/ # - path: / category_archive: type: liquid path: /categories/ tag_archive: type: liquid path: /tags/ # https://github.com/jekyll/jekyll-archives # jekyll-archives: # enabled: # - categories # - tags # layouts: # category: archive-taxonomy # tag: archive-taxonomy # permalinks: # category: /categories/:name/ # tag: /tags/:name/ # HTML Compression # - https://jch.penibelst.de/ compress_html: clippings: all ignore: envs: development ================================================ FILE: _config_docker.yml ================================================ url: "" ================================================ FILE: _data/authors.yml ================================================ # Authors Name Name: name : "Name Name" uri : "https://name.com" email : "name@name.com" bio : "This is the first name." avatar : "bio-photo-2.jpg" twitter : "name" google_plus : "Name" Name2 Name2: name : "Name2 Name2" email : "name2@name2.com" bio : "I ordered what?" avatar : "bio-photo.jpg" twitter : "name2" google_plus : "Name" ================================================ FILE: _data/comments/layout-comments/comment-1470944006665.yml ================================================ message: "![Bill Murray](http://www.fillmurray.com/400/300)\r\n\r\n“It's hard to be an artist. It's hard to be anything. It's hard to be.”" name: Bill Murray email: b0caa2a71f5066b3d90711c224578c21 url: '' hidden: '' date: '2016-08-11T19:33:25.928Z' ================================================ FILE: _data/comments/layout-comments/comment-1470944162041.yml ================================================ message: "> “I never had seen Seinfeld, and they said, ‘Oh, it’s the last episode.’ And I said, ‘Oh, I’ll watch Seinfeld.’ And it was terrible.”\r\n>\r\n> *— From a 2014 interview with Howard Stern*" name: Anonymous email: 8c7e898f1b570760f834ecc03edf6b35 url: '' hidden: '' date: '2016-08-11T19:36:01.033Z' ================================================ FILE: _data/comments/markup-syntax-highlighting/comment-1470969665387.yml ================================================ message: "Here's a test comment with a Markdown code block:\r\n\r\n```scss\r\nh1, h2, h3, h4, h5, h6 {\r\n margin: 2em 0 0.5em;\r\n line-height: 1.2;\r\n font-family: $header-font-family;\r\n font-weight: bold;\r\n}\r\n```" name: Michael Rose email: 1ce71bc10b86565464b612093d89707e url: 'https://mademistakes.com' hidden: '' date: '2016-08-12T02:41:04.706Z' ================================================ FILE: _data/comments/welcome-to-jekyll/comment-1470942205700.yml ================================================ message: "This is a test comment with some **Markdown** sprinkled about for *testing purposes*.\r\n\r\n### Subheading in a comment? Madness!\r\n\r\nNam et risus nec ipsum efficitur facilisis. Aenean tincidunt dapibus odio, eget rutrum urna lacinia non. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas." name: Michael Rose email: 1ce71bc10b86565464b612093d89707e url: 'https://mademistakes.com' hidden: '' date: '2016-08-11T19:03:24.929Z' ================================================ FILE: _data/comments/welcome-to-jekyll/comment-1470942247755.yml ================================================ message: '"How much wood would a woodchuck chuck if a woodchuck could chuck wood?"' name: Jackalope email: cba827e665ae179e1d1ae007a6c3c1ab url: '' hidden: '' date: '2016-08-11T19:04:06.958Z' ================================================ FILE: _data/comments/welcome-to-jekyll/comment-1470942265819.yml ================================================ message: '"How much wood would a woodchuck chuck if a woodchuck could chuck wood?"' name: Jackalope Duplicate email: cba827e665ae179e1d1ae007a6c3c1ab url: '' hidden: '' date: '2016-08-11T19:04:25.085Z' ================================================ FILE: _data/comments/welcome-to-jekyll/comment-1470942493518.yml ================================================ message: "Images can be added to a comment using Markdown like this\r\n\r\n```\r\n![Bill Murray](http://www.fillmurray.com/600/400)\r\n```\r\n![Bill Murray](http://www.fillmurray.com/600/400)" name: Michael Rose email: 1ce71bc10b86565464b612093d89707e url: 'https://mademistakes.com' hidden: '' date: '2016-08-11T19:08:12.789Z' ================================================ FILE: _data/cv.json ================================================ { "basics": { "name": "Your Sidebar Name", "email": "none@example.org", "phone": "", "website": "https://academicpages.github.io", "summary": "Currently employed at Red Brick University. Short biography for the left-hand sidebar", "location": { "address": "", "postalCode": "", "city": "Earth", "countryCode": "US", "region": "" }, "profiles": [ { "network": "Google Scholar", "username": "", "url": "https://scholar.google.com/citations?user=PS_CX0AAAAAJ" }, { "network": "ORCID", "username": "", "url": "https://orcid.org/yourorcidurl" }, { "network": "GitHub", "username": "academicpages", "url": "https://github.com/academicpages" } ] }, "work": [], "education": [ { "institution": "GitHub University", "area": "Ph.D in Version Control Theory", "studyType": "", "startDate": "", "endDate": "2018", "gpa": null, "courses": [] }, { "institution": "GitHub University", "area": "M.S. in Jekyll", "studyType": "", "startDate": "", "endDate": "2014", "gpa": null, "courses": [] }, { "institution": "GitHub University", "area": "B.S. in GitHub", "studyType": "", "startDate": "", "endDate": "2012", "gpa": null, "courses": [] } ], "skills": [], "languages": [], "interests": [], "references": [], "publications": [ { "name": "Paper Title Number 1", "publisher": "Journal 1", "releaseDate": "2009-10-01", "website": "https://academicpages.github.io/files/paper1.pdf", "summary": "This paper is about the number 1. The number 2 is left for future work." }, { "name": "Paper Title Number 2", "publisher": "Journal 1", "releaseDate": "2010-10-01", "website": "https://academicpages.github.io/files/paper2.pdf", "summary": "This paper is about the number 2. The number 3 is left for future work." }, { "name": "Paper Title Number 3", "publisher": "Journal 1", "releaseDate": "2015-10-01", "website": "https://academicpages.github.io/files/paper3.pdf", "summary": "This paper is about the number 3. The number 4 is left for future work." }, { "name": "Paper Title Number 4", "publisher": "GitHub Journal of Bugs", "releaseDate": "2024-02-17", "website": "https://academicpages.github.io/files/paper3.pdf", "summary": "This paper is about fixing template issue #693." } ], "presentations": [ { "name": "Talk 1 on Relevant Topic in Your Field", "event": "UC San Francisco, Department of Testing", "date": "2012-03-01", "location": "San Francisco, CA, USA", "description": "" }, { "name": "Tutorial 1 on Relevant Topic in Your Field", "event": "UC-Berkeley Institute for Testing Science", "date": "2013-03-01", "location": "Berkeley, CA, USA", "description": "" }, { "name": "Talk 2 on Relevant Topic in Your Field", "event": "London School of Testing", "date": "2014-02-01", "location": "London, UK", "description": "" }, { "name": "Conference Proceeding talk 3 on Relevant Topic in Your Field", "event": "Testing Institute of America 2014 Annual Conference", "date": "2014-03-01", "location": "Los Angeles, CA, USA", "description": "" } ], "teaching": [ { "course": "Teaching experience 1", "institution": "University 1, Department", "date": "2014-01-01", "role": "Undergraduate course", "description": "" }, { "course": "Teaching experience 2", "institution": "University 1, Department", "date": "2015-01-01", "role": "Workshop", "description": "" } ], "portfolio": [ { "name": "Portfolio item number 1", "category": "portfolio", "date": "", "url": "", "description": "Short description of portfolio item number 1
" } ] } ================================================ FILE: _data/navigation.yml ================================================ # The following is the order of the links in the header of the website. # # Changing the order here will adjust the order and you can also add additional # links. Removing a link prevents it from showing in the header, but does not # prevent it from being included in the site. # # NOTE that only one of the CV options should be selected, the first is for the # Markdown formatted page while the second is generated using JSON. main: - title: "Publications" url: /publications/ - title: "Talks" url: /talks/ - title: "Teaching" url: /teaching/ - title: "Portfolio" url: /portfolio/ - title: "Blog Posts" url: /year-archive/ - title: "CV" url: /cv/ # - title: "CV" # url: /cv-json/ - title: "Guide" url: /markdown/ ================================================ FILE: _data/ui-text.yml ================================================ # User interface text and labels # English (default) # ----------------- en: &DEFAULT_EN page : "Page" pagination_previous : "Previous" pagination_next : "Next" breadcrumb_home_label : "Home" breadcrumb_separator : "/" toc_label : "On This Page" ext_link_label : "Direct Link" less_than : "less than" minute_read : "minute read" share_on_label : "Share on" meta_label : tags_label : "Tags:" categories_label : "Categories:" date_label : "Published:" comments_label : "Leave a Comment" comments_title : "Comments" more_label : "Learn More" related_label : "You May Also Enjoy" follow_label : "Follow:" feed_label : "Feed" powered_by : "Powered by" website_label : "Website" email_label : "Email" recent_posts : "Recent Posts" undefined_wpm : "Undefined parameter words_per_minute at _config.yml" comment_form_info : "Your email address will not be published. Required fields are marked" comment_form_comment_label : "Comment" comment_form_md_info : "Markdown is supported." comment_form_name_label : "Name" comment_form_email_label : "Email address" comment_form_website_label : "Website (optional)" comment_btn_submit : "Submit Comment" comment_btn_submitted : "Submitted" comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved." comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." loading_label : "Loading..." en-US: <<: *DEFAULT_EN en-CA: <<: *DEFAULT_EN en-GB: <<: *DEFAULT_EN en-AU: <<: *DEFAULT_EN # Spanish # -------------- es: &DEFAULT_ES page : "Página" pagination_previous : "Anterior" pagination_next : "Siguiente" breadcrumb_home_label : "Inicio" breadcrumb_separator : "/" toc_label : "Contenidos" ext_link_label : "Enlace" less_than : "menos de" minute_read : "minuto de lectura" share_on_label : "Compartir" meta_label : tags_label : "Etiquetas:" categories_label : "Categorías:" date_label : "Actualizado:" comments_label : "Comentar" comments_title : "Deja un comentario" more_label : "Ver más" related_label : "Quizás te interese" follow_label : "Seguir:" feed_label : "Feed" powered_by : "Creado por" website_label : "Sitio web" email_label : "Correo" recent_posts : "Entradas recientes" undefined_wpm : "Parámetro words_per_minute (palabras por minuto) no definido en _config.yml" comment_form_info : "No se publicará tu correo electrónico. Véanse marcados los campos obligatorios" comment_form_comment_label : "Comentario" comment_form_md_info : "Markdown es compatible" comment_form_name_label : "Nombre" comment_form_email_label : "Correo electrónico" comment_form_website_label : "Página web (opcional)" comment_btn_submit : "Enviar comentario" comment_btn_submitted : "Enviado" comment_success_msg : "¡Gracias por tu comentario! Aparecerá en la página cuando sea aprobado." comment_error_msg : "Lo sentimos, ha habido un error con tu solicitud. Por favor, asegúrate de rellenar todos los campos obligatorios e inténtalo de nuevo." loading_label : "Cargando..." es-ES: <<: *DEFAULT_ES es-CO: <<: *DEFAULT_ES # French # ----------------- fr: &DEFAULT_FR page : "Page" pagination_previous : "Précédent" pagination_next : "Suivant" breadcrumb_home_label : "Accueil" breadcrumb_separator : "/" toc_label : "Sur cette page" ext_link_label : "Lien direct" less_than : "plus petit que" minute_read : "minute de lecture" share_on_label : "Partager sur" meta_label : tags_label : "Tags :" categories_label : "Catégories :" date_label : "Mis à jour :" comments_label : "Laisser un commentaire" comments_title : more_label : "Lire plus" related_label : "Vous pourriez aimer" follow_label : "Suivez moi" feed_label : "Flux" powered_by : "Propulsé par" website_label : "Site" email_label : "Email" recent_posts : "Posts récents" undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml" comment_form_info : comment_form_comment_label : comment_form_md_info : comment_form_name_label : comment_form_email_label : comment_form_website_label : comment_btn_submit : comment_btn_submitted : comment_success_msg : comment_error_msg : loading_label : fr-FR: <<: *DEFAULT_FR fr-BE: <<: *DEFAULT_FR fr-CH: <<: *DEFAULT_FR # Turkish # ----------------- tr: &DEFAULT_TR page : "Sayfa" pagination_previous : "Önceki" pagination_next : "Sonraki" breadcrumb_home_label : "Ana Sayfa" breadcrumb_separator : "/" toc_label : "İçindekiler" ext_link_label : "Doğrudan Bağlantı" less_than : "Şu süreden az: " minute_read : "dakika tahmini okuma süresi" share_on_label : "Paylaş" meta_label : tags_label : "Etiketler:" categories_label : "Kategoriler:" date_label : "Güncelleme tarihi:" comments_label : "Yorum yapın" comments_title : more_label : "Daha fazlasını öğrenin" related_label : "Bunlar ilginizi çekebilir:" follow_label : "Takip et:" feed_label : "RSS" powered_by : "Emeği geçenler: " website_label : "Web sayfası" email_label : "E-posta" recent_posts : "Son yazılar" undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi" comment_form_info : comment_form_comment_label : comment_form_md_info : comment_form_name_label : comment_form_email_label : comment_form_website_label : comment_btn_submit : comment_btn_submitted : comment_success_msg : comment_error_msg : loading_label : tr-TR: <<: *DEFAULT_TR # Brazilian Portguese # ----------------- pt: &DEFAULT_PT page : "Página" pagination_previous : "Anterior" pagination_next : "Próxima" breadcrumb_home_label : "Início" breadcrumb_separator : "/" toc_label : "Nesta página" ext_link_label : "Link direto" less_than : "menor que" minute_read : "minutos de leitura" share_on_label : "Compartilhe em" meta_label : tags_label : "Tags:" categories_label : "Categorias:" date_label : "Atualizado em:" comments_label : "Deixe um comentário" comments_title : more_label : "Aprenda Mais" related_label : "Talvez Você Goste Também" follow_label : "Acompanhe em" feed_label : "Feed" powered_by : "Feito por" website_label : "Site" email_label : "E-mail" recent_posts : "Postagens recentes" undefined_wpm : "Parâmetro indefinido em word_per_minute no _config.yml" comment_form_info : "Seu endereço de e-mail não será publicado. Campos obrigatórios são marcados" comment_form_comment_label : "Comentário" comment_form_md_info : "Markdown é suportado" comment_form_name_label : "Nome" comment_form_email_label : "Endereço de e-mail'" comment_form_website_label : "Website (opcional)" comment_btn_submit : "Enviar Comentário" comment_btn_submitted : "Enviado" comment_success_msg : "Obrigado por seu comentário! Ele será exibido no site depois de aprovado." comment_error_msg : "Desculpe, houve um erro com o seu envio. Certifique-se de que todos os campos obrigatórios foram preenchidos e tente novamente." loading_label : "Carregando..." pt-BR: <<: *DEFAULT_PT pt-PT: <<: *DEFAULT_PT # Italian # ----------------- it: &DEFAULT_IT page : "Pagina" pagination_previous : "Precedente" pagination_next : "Prossima" breadcrumb_home_label : "Home" breadcrumb_separator : "/" toc_label : "Indice della pagina" ext_link_label : "Link" less_than : "meno di" minute_read : "minuto/i di lettura" share_on_label : "Condividi" meta_label : tags_label : "Tags:" categories_label : "Categorie:" date_label : "Aggiornato:" comments_label : "Scrivi un commento" comments_title : more_label : "Scopri di più" related_label : "Potrebbe Piacerti Anche" follow_label : "Segui:" feed_label : "Feed" powered_by : "Powered by" website_label : "Website" email_label : "Email" recent_posts : "Articoli Recenti" undefined_wpm : "Parametro words_per_minute non definito in _config.yml" comment_form_info : comment_form_comment_label : comment_form_md_info : comment_form_name_label : comment_form_email_label : comment_form_website_label : comment_btn_submit : comment_btn_submitted : comment_success_msg : comment_error_msg : loading_label : it-IT: <<: *DEFAULT_IT # Chinese (simplified) # ----------------- zh: &DEFAULT_ZH page : "页面" pagination_previous : "上一页" pagination_next : "下一页" breadcrumb_home_label : "主页" breadcrumb_separator : "/" toc_label : "本页内容" ext_link_label : "直接链接" less_than : "少于" minute_read : "分钟阅读时长" share_on_label : "分享到" meta_label : tags_label : "标签:" categories_label : "分类:" date_label : "发布时间:" comments_label : "发表评论" comments_title : "评论" more_label : "了解更多" related_label : "你可能感兴趣的" follow_label : "关注:" feed_label : "打赏" powered_by : "技术支持:" website_label : "网站" email_label : "电子邮件" recent_posts : "最新文章" undefined_wpm : "_config.yml中未定义words_per_minute参数" comment_form_info : "您的电子邮件地址不会被公开。(必填项已标注)" comment_form_comment_label : "评论" comment_form_md_info : "支持Markdown格式" comment_form_name_label : "姓名" comment_form_email_label : "电子邮件地址" comment_form_website_label : "网站(可选)" comment_btn_submit : "提交评论" comment_btn_submitted : "已提交" comment_success_msg : "感谢您的评论!审核通过后会显示在网站上。" comment_error_msg : "抱歉,提交时出错。请确保所有必填项已完成,并重试。" loading_label : "加载中..." zh-CN: <<: *DEFAULT_ZH # Chinese (traditional) # ----------------- zh-HK: &DEFAULT_ZH_HK page : "頁面" pagination_previous : "上一頁" pagination_next : "下一頁" breadcrumb_home_label : "主頁" breadcrumb_separator : "/" toc_label : "本頁內容" ext_link_label : "直接連結" less_than : "少於" minute_read : "分鐘閱讀時長" share_on_label : "分享到" meta_label : tags_label : "標籤:" categories_label : "分類:" date_label : "發布時間:" comments_label : "發表評論" comments_title : "評論" more_label : "了解更多" related_label : "你可能感興趣的" follow_label : "關注:" feed_label : "打賞" powered_by : "技術支持:" website_label : "網站" email_label : "電子郵件" recent_posts : "最新文章" undefined_wpm : "_config.yml中未定義words_per_minute參數" comment_form_info : "您的電子郵件地址不會被公開。(必填項已標註)" comment_form_comment_label : "評論" comment_form_md_info : "支持Markdown格式" comment_form_name_label : "姓名" comment_form_email_label : "電子郵件地址" comment_form_website_label : "網站(可選)" comment_btn_submit : "提交評論" comment_btn_submitted : "已提交" comment_success_msg : "感謝您的評論!審核通過後會顯示在網站上。" comment_error_msg : "抱歉,提交時出錯。請確保所有必填項已完成,並重試。" loading_label : "加載中..." zh-TW: <<: *DEFAULT_ZH_HK # Another locale # -------------- ================================================ FILE: _drafts/post-draft.md ================================================ --- layout: single title: "Draft Post" header: teaser: "unsplash-gallery-image-2-th.jpg" categories: - Jekyll tags: - edge case --- Monocle ipsum dolor sit amet handsome pariatur aliqua, hub remarkable irure commodo classic deserunt bespoke. Sunt commodo signature, Swiss minim flat white Tsutaya excepteur artisanal et Nordic laborum joy ANA. Beams mollit exquisite Ginza efficient dolore qui Comme des Garçons Winkreative Lufthansa bulletin global. Iconic sed liveable duis. Mollit dolore eu laboris Comme des Garçons hub pintxos sed eiusmod tote bag Shinkansen nisi consectetur pariatur. Nordic international quis finest Baggu dolore, bureaux hub hand-crafted ut joy sint Airbus A380. Conversation handsome hub cosy, enim emerging sed K-pop velit Gaggenau charming proident et boulevard ryokan. Remarkable airport deserunt international est, nulla minim magna emerging discerning in exclusive dolor. Commodo dolore deserunt cosy, global Nordic culpa uniforms signature charming. Smart ryokan commodo, eiusmod global occaecat incididunt aliqua Beams. Boulevard conversation excepteur finest Swiss non veniam Comme des Garçons essential artisanal. Destination Scandinavian international, anim Boeing 787 in duis Baggu irure essential. Fugiat exclusive laborum, Gaggenau ad Winkreative sharp elit labore. Remarkable officia ryokan Boeing 787, consectetur boutique Nordic Singapore espresso elit iconic perfect izakaya soft power excepteur. Ut veniam carefully curated K-pop dolore, uniforms in voluptate. Craftsmanship Ettinger Lufthansa sophisticated esse boutique veniam exquisite. Aute cillum bespoke, intricate consectetur in exquisite international lovely bulletin irure Washlet Gaggenau deserunt. Efficient eu quality of life wardrobe labore, dolor emerging airport concierge reprehenderit izakaya dolore liveable Baggu. Commodo elegant essential consectetur Gaggenau culpa consequat id sophisticated St Moritz sunt conversation duis non velit. Nulla business class non ut Marylebone ANA soft power fugiat carefully curated. Bureaux sed punctual handsome Washlet impeccable hand-crafted aute extraordinary tote bag enim boulevard soft power sleepy. Dolore conversation irure Zürich the best adipisicing, vibrant finest hub anim premium aliqua. Cupidatat smart international, bureaux Baggu id efficient punctual. Tempor nulla flat white enim, K-pop incididunt elit efficient Toto uniforms concierge discerning. Concierge sleepy extraordinary, deserunt Melbourne commodo Nordic Winkreative Washlet Ginza exercitation espresso. Tsutaya sed in business class sharp. Do Beams in adipisicing Lufthansa. Business class occaecat Melbourne, irure Singapore commodo espresso carefully curated quis quality of life adipisicing. Impeccable laborum efficient classic proident in. Beams Helsinki ullamco Marylebone dolore sophisticated concierge Muji anim duis joy ut. Comme des Garçons aute Muji in aliquip ryokan soft power Nordic essential ANA culpa elegant. ================================================ FILE: _includes/analytics-providers/custom.html ================================================ ================================================ FILE: _includes/analytics-providers/google-analytics-4.html ================================================ ================================================ FILE: _includes/analytics-providers/google-universal.html ================================================ ================================================ FILE: _includes/analytics-providers/google.html ================================================ ================================================ FILE: _includes/analytics.html ================================================ {% if site.analytics.provider and page.analytics != false %} {% case site.analytics.provider %} {% when "google" %} {% include /analytics-providers/google.html %} {% when "google-universal" %} {% include /analytics-providers/google-universal.html %} {% when "google-analytics-4" %} {% include /analytics-providers/google-analytics-4.html %} {% when "custom" %} {% include /analytics-providers/custom.html %} {% endcase %} {% endif %} ================================================ FILE: _includes/archive-single-cv.html ================================================ {% include base_path %} {% if post.header.teaser %} {% capture teaser %}{{ post.header.teaser }}{% endcapture %} {% else %} {% assign teaser = site.teaser %} {% endif %} {% if post.id %} {% assign title = post.title | markdownify | remove: "

" | remove: "

" %} {% else %} {% assign title = post.title %} {% endif %}
  • {% if include.type == "grid" and teaser %}
    {% endif %}

    {% if post.link %} {{ title }} Permalink {% else %} {{ title }} {% endif %}

    {% if post.read_time %}

    {% include read-time.html %}

    {% endif %} {% if post.venue%}

    {{ post.citation }}

    {% endif %}
  • ================================================ FILE: _includes/archive-single-talk-cv.html ================================================ {% include base_path %} {% if post.header.teaser %} {% capture teaser %}{{ post.header.teaser }}{% endcapture %} {% else %} {% assign teaser = site.teaser %} {% endif %} {% if post.id %} {% assign title = post.title | markdownify | remove: "

    " | remove: "

    " %} {% else %} {% assign title = post.title %} {% endif %}
  • {% if include.type == "grid" and teaser %}
    {% endif %}

    {% if post.link %} {{ title }} Permalink {% else %} {{ title }} {% endif %}

    {% if post.date %}

    {{ post.date | date: '%B %d, %Y' }}

    {% endif %} {% if post.venue%}

    {{post.type}} at {{ post.venue }}, {{post.location}}

    {% endif %}
  • ================================================ FILE: _includes/archive-single-talk.html ================================================ {% include base_path %} {% if post.header.teaser %} {% capture teaser %}{{ post.header.teaser }}{% endcapture %} {% else %} {% assign teaser = site.teaser %} {% endif %} {% if post.id %} {% assign title = post.title | markdownify | remove: "

    " | remove: "

    " %} {% else %} {% assign title = post.title %} {% endif %}
    {% if include.type == "grid" and teaser %}
    {% endif %}

    {% if post.link %} {{ title }} Permalink {% else %} {{ title }} {% endif %}

    {% if post.read_time %}

    {% include read-time.html %}

    {% endif %} {% if post.date %}

    {{ post.date | date: '%B %d, %Y' }}

    {% endif %} {% if post.venue %}

    {{post.type}}, {{ post.venue }}, {{post.location}} {% endif %} {% if post.excerpt %}

    {{ post.excerpt | markdownify }}

    {% endif %}
    ================================================ FILE: _includes/archive-single.html ================================================ {% include base_path %} {% if post.header.teaser %} {% capture teaser %}{{ post.header.teaser }}{% endcapture %} {% else %} {% assign teaser = site.teaser %} {% endif %} {% if post.id %} {% assign title = post.title | markdownify | remove: "

    " | remove: "

    " %} {% else %} {% assign title = post.title %} {% endif %}
    {% if include.type == "grid" and teaser %}
    {% endif %}

    {% if post.link %} {{ title }} Permalink {% else %} {{ title }} {% endif %}

    {% if post.read_time %}

    {% include read-time.html %}

    {% endif %} {% if post.collection == 'teaching' %}

    {{ post.type }}, {{ post.venue }}, {{ post.date | default: "1900-01-01" | date: "%Y" }}

    {% elsif post.collection == 'publications' %}

    Published in {{ post.venue }}, {{ post.date | default: "1900-01-01" | date: "%Y" }}

    {% elsif post.date %}

    {{ site.data.ui-text[site.locale].date_label | default: "Published:" }}

    {% endif %} {% if post.excerpt and site.read_more != 'enabled' %}

    {{ post.excerpt | markdownify }}

    {% elsif post.excerpt and site.read_more == 'enabled' %}

    {{ post.excerpt | markdownify | remove: '

    ' | remove: '

    ' }} Read more

    {% endif %} {% if post.citation and post.paperurl and post.slidesurl and post.bibtexurl %}

    Recommended citation: {{ post.citation }}
    Download Paper | Download Slides | Download Bibtex

    {% elsif post.citation and post.paperurl and post.slidesurl %}

    Recommended citation: {{ post.citation }}
    Download Paper | Download Slides

    {% elsif post.citation and post.paperurl and post.bibtexurl %}

    Recommended citation: {{ post.citation }}
    Download Paper | Download Bibtex

    {% elsif post.citation and post.paperurl %}

    Recommended citation: {{ post.citation }}
    Download Paper

    {% elsif post.citation and post.slidesurl and post.bibtexurl %}

    Recommended citation: {{ post.citation }}
    Download Slides | Download Bibtex

    {% elsif post.citation and post.slidesurl %}

    Recommended citation: {{ post.citation }}
    Download Slides

    {% elsif post.citation and post.bibtexurl %}

    Recommended citation: {{ post.citation }}
    Download Bibtex

    {% elsif post.citation %}

    Recommended citation: {{ post.citation }}

    {% elsif post.paperurl and post.bibtexurl %}

    Download Paper | Download Bibtex

    {% elsif post.paperurl %}

    Download Paper

    {% elsif post.slidesurl and post.bibtexurl %}

    Download Slides | Download Bibtex

    {% elsif post.slidesurl %}

    Download Slides

    {% elsif post.bibtexurl %}

    Download Bibtex

    {% endif %}
    ================================================ FILE: _includes/author-profile.html ================================================ {% include base_path %} {% if page.author and site.data.authors[page.author] %} {% assign author = site.data.authors[page.author] %}{% else %}{% assign author = site.author %} {% endif %}
    {% if author.avatar contains "://" %} {{ author.name }} {% else %} {{ author.name }} {% endif %}

    {{ author.name }}

    {% if author.pronouns %}

    {{ author.pronouns }}

    {% endif %} {% if author.bio %}

    {{ author.bio }}

    {% endif %}
    ================================================ FILE: _includes/base_path ================================================ {% if site.url %} {% assign base_path = site.url | append: site.baseurl %} {% else %} {% assign base_path = site.github.url %} {% endif %} ================================================ FILE: _includes/breadcrumbs.html ================================================ {% include base_path %} {% case site.categories.type %} {% when "liquid" %} {% assign path_type = "#" %} {% when "jekyll-archives" %} {% assign path_type = nil %} {% endcase %} {% if page.collection != 'posts' %} {% assign path_type = nil %} {% assign crumb_path = '/' %} {% else %} {% assign crumb_path = site.categories.path %} {% endif %} ================================================ FILE: _includes/browser-upgrade.html ================================================ ================================================ FILE: _includes/category-list.html ================================================ {% include base_path %} {% include base_path %} {% case site.category_archive.type %} {% when "liquid" %} {% assign path_type = "#" %} {% when "jekyll-archives" %} {% assign path_type = nil %} {% endcase %} {% if site.category_archive.path %} {% comment %} {% endcomment %} {% capture page_categories %}{% for category in page.categories %}{{ category | downcase }}#{{ category }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %} {% assign category_hashes = (page_categories | split: ',' | sort:0) %}

    {{ site.data.ui-text[site.locale].categories_label | default: "Categories:" }} {% for hash in category_hashes %} {% assign keyValue = hash | split: '#' %} {% capture category_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %} {% unless forloop.last %}, {% endunless %} {% endfor %}

    {% endif %} ================================================ FILE: _includes/comment.html ================================================ ================================================ FILE: _includes/comments-providers/custom.html ================================================ ================================================ FILE: _includes/comments-providers/discourse.html ================================================ {% if site.comments.discourse.server %} {% include base_path %} {% capture canonical %}{{ base_path }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %} {% endif %} ================================================ FILE: _includes/comments-providers/disqus.html ================================================ {% if site.comments.disqus.shortname %} {% endif %} ================================================ FILE: _includes/comments-providers/facebook.html ================================================
    ================================================ FILE: _includes/comments-providers/google-plus.html ================================================ ================================================ FILE: _includes/comments-providers/scripts.html ================================================ {% if site.comments.provider and page.comments %} {% case site.comments.provider %} {% when "disqus" %} {% include /comments-providers/disqus.html %} {% when "discourse" %} {% include /comments-providers/discourse.html %} {% when "facebook" %} {% include /comments-providers/facebook.html %} {% when "google-plus" %} {% include /comments-providers/google-plus.html %} {% when "staticman" %} {% include /comments-providers/staticman.html %} {% when "custom" %} {% include /comments-providers/custom.html %} {% endcase %} {% endif %} ================================================ FILE: _includes/comments-providers/staticman.html ================================================ {% if site.repository and site.staticman.branch %} {% endif %} ================================================ FILE: _includes/comments.html ================================================ {% include base_path %}
    {% capture comments_label %}{{ site.data.ui-text[site.locale].comments_label | default: "Comments" }}{% endcapture %} {% case site.comments.provider %} {% when "disqus" %}

    {{ comments_label }}

    {% include /comments-providers/disqus.html %} {% when "facebook" %}

    {{ comments_label }}

    {% when "google-plus" %}

    {{ comments_label }}

    Loading Google+ Comments ...
    {% when "staticman" %}
    {% if site.repository and site.staticman.branch %}
    {% if site.data.comments[page.slug] %}

    {{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}

    {% assign comments = site.data.comments[page.slug] | sort %} {% for comment in comments %} {% assign email = comment[1].email %} {% assign name = comment[1].name %} {% assign url = comment[1].url %} {% assign date = comment[1].date %} {% assign message = comment[1].message %} {% include comment.html index=forloop.index email=email name=name url=url date=date message=message %} {% endfor %} {% endif %}

    {{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}

    {{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} *

    {{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}
    {% endif %}
    {% when "custom" %}

    {{ comments_label }}

    {% include /comments-providers/scripts.html %} {% endcase %}
    ================================================ FILE: _includes/cv-template.html ================================================ {% assign cv = site.data.cv %}

    {{ cv.basics.name }}

    {% if cv.basics.label %}

    {{ cv.basics.label }}

    {% endif %}
    {% if cv.basics.email %}
    {{ cv.basics.email }}
    {% endif %} {% if cv.basics.phone %}
    {{ cv.basics.phone }}
    {% endif %} {% if cv.basics.website %} {% endif %} {% if cv.basics.location.city %}
    {{ cv.basics.location.city }}{% if cv.basics.location.region %}, {{ cv.basics.location.region }}{% endif %}{% if cv.basics.location.countryCode %}, {{ cv.basics.location.countryCode }}{% endif %}
    {% endif %}
    {% if cv.basics.profiles.size > 0 %}
    {% for profile in cv.basics.profiles %} {{ profile.network }} {% endfor %}
    {% endif %}
    {% if cv.basics.summary %}

    Summary

    {{ cv.basics.summary }}

    {% endif %} {% if cv.education.size > 0 %}

    Education

      {% for education in cv.education %}
    • {{ education.area }}
      {{ education.endDate }}
      {{ education.institution }}
      {% if education.gpa %}
      GPA: {{ education.gpa }}
      {% endif %} {% if education.courses.size > 0 %}
      Courses: {{ education.courses | join: ", " }}
      {% endif %}
    • {% endfor %}
    {% endif %} {% if cv.work.size > 0 %}

    Work Experience

      {% for work in cv.work %}
    • {{ work.position }}
      {{ work.startDate }}{% if work.endDate %} - {{ work.endDate }}{% endif %}
      {{ work.company }}
      {% if work.summary %}
      {{ work.summary }}
      {% endif %} {% if work.highlights.size > 0 %}
        {% for highlight in work.highlights %}
      • {{ highlight }}
      • {% endfor %}
      {% endif %}
    • {% endfor %}
    {% endif %} {% if cv.skills.size > 0 %}

    Skills

    {% for skill in cv.skills %}

    {{ skill.name }}

      {% for keyword in skill.keywords %}
    • {{ keyword }}
    • {% endfor %}
    {% endfor %}
    {% endif %} {% if cv.publications.size > 0 %}

    Publications

      {% for publication in cv.publications %}
    • {{ publication.name }}
      {{ publication.releaseDate | slice: 0, 4 }}
      {{ publication.publisher }}
      {% if publication.summary %}
      {{ publication.summary }}
      {% endif %} {% if publication.website %} {% endif %}
    • {% endfor %}
    {% endif %} {% if cv.presentations.size > 0 %}

    Presentations

      {% for talk in cv.presentations %}
    • {{ talk.name }}
      {{ talk.date | slice: 0, 4 }}
      {{ talk.event }}
      {% if talk.location %}
      {{ talk.location }}
      {% endif %} {% if talk.description %}
      {{ talk.description }}
      {% endif %}
    • {% endfor %}
    {% endif %} {% if cv.teaching.size > 0 %}

    Teaching

      {% for teaching in cv.teaching %}
    • {{ teaching.course }}
      {{ teaching.date | slice: 0, 4 }}
      {{ teaching.institution }}
      {% if teaching.role %}
      Role: {{ teaching.role }}
      {% endif %} {% if teaching.description %}
      {{ teaching.description }}
      {% endif %}
    • {% endfor %}
    {% endif %} {% if cv.portfolio.size > 0 %}

    Portfolio

      {% for item in cv.portfolio %}
    • {{ item.name }}
      {{ item.date | slice: 0, 4 }}
      {{ item.category | capitalize }}
      {% if item.description %}
      {{ item.description }}
      {% endif %} {% if item.url %} {% endif %}
    • {% endfor %}
    {% endif %} {% if cv.languages.size > 0 %}

    Languages

      {% for language in cv.languages %}
    • {{ language.language }}
      {{ language.fluency }}
    • {% endfor %}
    {% endif %} {% if cv.interests.size > 0 %}

    Interests

      {% for interest in cv.interests %}
    • {{ interest.name }}
      {% if interest.keywords.size > 0 %}
      {{ interest.keywords | join: ", " }}
      {% endif %}
    • {% endfor %}
    {% endif %} {% if cv.references.size > 0 %}

    References

      {% for reference in cv.references %}
    • {{ reference.name }}
      {% if reference.reference %}
      {{ reference.reference }}
      {% endif %}
    • {% endfor %}
    {% endif %}
    ================================================ FILE: _includes/feature_row ================================================ {% include base_path %} {% if include.id %} {% assign feature_row = page.[include.id] %} {% else %} {% assign feature_row = page.feature_row %} {% endif %}
    {% for f in feature_row %} {% if f.url contains "://" %} {% capture f_url %}{{ f.url }}{% endcapture %} {% else %} {% capture f_url %}{{ f.url | prepend: base_path }}{% endcapture %} {% endif %}
    {% if f.image_path %}
    {% if f.alt %}{{ f.alt }}{% endif %}
    {% endif %}
    {% if f.title %}

    {{ f.title }}

    {% endif %} {% if f.excerpt %}
    {{ f.excerpt | markdownify }}
    {% endif %} {% if f.url %}

    {{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

    {% endif %}
    {% endfor %}
    ================================================ FILE: _includes/footer/custom.html ================================================ Sitemap ================================================ FILE: _includes/footer.html ================================================ {% include base_path %} {% if site.author.github or site.author.bitbucket or site.atom_feed.hide != true %} {% endif %} ================================================ FILE: _includes/gallery ================================================ {% include base_path %} {% if include.id %} {% assign gallery = page.[include.id] %} {% else %} {% assign gallery = page.gallery %} {% endif %} {% if gallery.size == 2 %} {% assign gallery_layout = 'half' %} {% elsif gallery.size >= 3 %} {% assign gallery_layout = 'third' %} {% else %} {% assign gallery_layout = '' %} {% endif %} ================================================ FILE: _includes/group-by-array ================================================ {% assign __empty_array = '' | split: ',' %} {% assign group_names = __empty_array %} {% assign group_items = __empty_array %} {% assign __names = include.collection | map: include.field %} {% assign __names = __names | join: ',' | join: ',' | split: ',' %} {% assign __names = __names | sort %} {% for name in __names | sort %} {% unless name == previous %} {% assign group_names = group_names | push: name %} {% endunless %} {% assign previous = name %} {% endfor %} {% for name in group_names %} {% assign __item = __empty_array %} {% for __element in include.collection %} {% if __element[include.field] contains name %} {% assign __item = __item | push: __element %} {% endif %} {% endfor %} {% assign group_items = group_items | push: __item %} {% endfor %} ================================================ FILE: _includes/head/custom.html ================================================ {% include base_path %} ================================================ FILE: _includes/head.html ================================================ {% include base_path %} {% include seo.html %} ================================================ FILE: _includes/masthead.html ================================================ {% include base_path %}
    ================================================ FILE: _includes/nav_list ================================================ {% include base_path %} {% assign navigation = site.data.navigation[include.nav] %} ================================================ FILE: _includes/page__hero.html ================================================ {% include base_path %} {% if page.header.image contains "://" %} {% capture img_path %}{{ page.header.image }}{% endcapture %} {% else %} {% capture img_path %}{{ page.header.image | prepend: "/images/" | prepend: base_path }}{% endcapture %} {% endif %} {% if page.header.cta_url contains "://" %} {% capture cta_path %}{{ page.header.cta_url }}{% endcapture %} {% else %} {% capture cta_path %}{{ page.header.cta_url | prepend: base_path }}{% endcapture %} {% endif %} {% if page.header.overlay_image contains "://" %} {% capture overlay_img_path %}{{ page.header.overlay_image }}{% endcapture %} {% elsif page.header.overlay_image %} {% capture overlay_img_path %}{{ page.header.overlay_image | prepend: "/images/" | prepend: base_path }}{% endcapture %} {% endif %} {% if page.header.overlay_filter contains "rgba" %} {% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %} {% elsif page.header.overlay_filter %} {% capture overlay_filter %}rgba(0, 0, 0, {{ page.header.overlay_filter }}){% endcapture %} {% endif %}
    {% if page.header.overlay_color or page.header.overlay_image %}

    {% if paginator %} {{ site.title }}{% unless paginator.page == 1 %} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %} {% else %} {{ page.title | default: site.title | markdownify | remove: "

    " | remove: "

    " }} {% endif %}

    {% if page.excerpt %}

    {{ page.excerpt | markdownify | remove: "

    " | remove: "

    " }}

    {% endif %} {% if site.read_time and page.read_time %}

    {% include read-time.html %}

    {% endif %} {% if page.header.cta_url %}

    {{ page.header.cta_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

    {% endif %}
    {% else %} {{ page.title }} {% endif %} {% if page.header.caption %} {{ page.header.caption | markdownify | remove: "

    " | remove: "

    " }}
    {% endif %}
    ================================================ FILE: _includes/page__taxonomy.html ================================================ {% include base_path %} {% if site.tag_archive.type and page.tags[0] %} {% include tag-list.html %} {% endif %} {% if site.category_archive.type and page.categories[0] and page.collection != 'publications' %} {% include category-list.html %} {% endif %} ================================================ FILE: _includes/paginator.html ================================================ {% include base_path %} {% if paginator.total_pages > 1 %} {% endif %} ================================================ FILE: _includes/post_pagination.html ================================================ {% include base_path %} {% if page.previous or page.next %} {% endif %} ================================================ FILE: _includes/read-time.html ================================================ {% if post.read_time %} {% assign words = post.content | strip_html | number_of_words %} {% elsif page.read_time %} {% assign words = page.content | strip_html | number_of_words %} {% endif %} {% if site.words_per_minute %} {% if words < 180 %} {{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} {% elsif words < 360 %} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} {% else %} {{ words | divided_by:site.words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} {% endif %} {% else %} {{ site.data.ui-text[site.locale].undefined_wpm | "Undefined parameter words_per_minute at _config.yml" }} {% endif %} ================================================ FILE: _includes/scripts.html ================================================ {% include analytics.html %} ================================================ FILE: _includes/seo.html ================================================ {% include base_path %} {% if site.url %} {% assign seo_url = site.url | append: site.baseurl %} {% endif %} {% assign seo_url = seo_url | default: site.github.url %} {% if page.title %} {% assign seo_title = page.title | append: " " | append: site.title_separator | append: " " | append: site.title %} {% endif %} {% if seo_title %} {% assign seo_title = seo_title | markdownify | strip_html | strip_newlines | escape_once %} {% endif %} {% if site.url %} {% assign canonical_url = page.url | replace: "index.html", "" | prepend: site.url %} {% endif %} {{ seo_title | default: site.title }}{% if paginator %}{% unless paginator.page == 1 %} {{ site.title_separator }} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}{% endif %} {% assign seo_description = page.description | default: page.excerpt | default: site.description %} {% if seo_description %} {% assign seo_description = seo_description | markdownify | strip_html | strip_newlines | escape_once %} {% endif %} {% assign seo_author = page.author | default: page.author[0] | default: site.author[0] %} {% if seo_author %} {% if seo_author.twitter %} {% assign seo_author_twitter = seo_author.twitter %} {% else %} {% if site.data.authors and site.data.authors[seo_author] %} {% assign seo_author_twitter = site.data.authors[seo_author].twitter %} {% else %} {% assign seo_author_twitter = seo_author %} {% endif %} {% endif %} {% assign seo_author_twitter = seo_author_twitter | replace: "@", "" %} {% endif %} {% if page.date %} {% endif %} {% if seo_url %} {% endif %} {% if site.twitter.username %} {% if page.header.image %} {% else %} {% if site.og_image %} {% endif %} {% endif %} {% if seo_author_twitter %} {% endif %} {% endif %} {% if site.facebook %} {% if site.facebook.publisher %} {% endif %} {% if site.facebook.app_id %} {% endif %} {% endif %} {% if paginator.previous_page %} {% endif %} {% if paginator.next_page %} {% endif %} {% if site.social %} {% endif %} {% if site.google_site_verification %} {% endif %} {% if site.bing_site_verification %} {% endif %} {% if site.alexa_site_verification %} {% endif %} {% if site.yandex_site_verification %} {% endif %} {% if page.date %} {% endif %} {% if page.excerpt %} {% elsif site.og_description %} {% endif %} {% if seo_url %} {% endif %} {% if site.og_image %} {% endif %} {% if page.header.image %} {% elsif page.header.overlay_image %} {% endif %} ================================================ FILE: _includes/sidebar.html ================================================ {% include base_path %} {% if page.author_profile or layout.author_profile or page.sidebar %} {% endif %} ================================================ FILE: _includes/social-share.html ================================================ {% include base_path %} ================================================ FILE: _includes/tag-list.html ================================================ {% include base_path %} {% case site.tag_archive.type %} {% when "liquid" %} {% assign path_type = "#" %} {% when "jekyll-archives" %} {% assign path_type = nil %} {% endcase %} {% if site.tag_archive.path %} {% comment %} {% endcomment %} {% capture page_tags %}{% for tag in page.tags %}{{ tag | downcase }}#{{ tag }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %} {% assign tag_hashes = (page_tags | split: ',' | sort:0) %}

    {{ site.data.ui-text[site.locale].tags_label | default: "Tags:" }} {% for hash in tag_hashes %} {% assign keyValue = hash | split: '#' %} {% capture tag_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %} {% unless forloop.last %}, {% endunless %} {% endfor %}

    {% endif %} ================================================ FILE: _includes/toc ================================================ ================================================ FILE: _layouts/archive-taxonomy.html ================================================ --- layout: default author_profile: false ---
    {% include sidebar.html %}

    {{ page.title }}

    {% include base_path %} {% for post in page.posts %} {% include archive-single.html %} {% endfor %}
    ================================================ FILE: _layouts/archive.html ================================================ --- layout: default --- {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} {% include page__hero.html %} {% endif %} {% if page.url != "/" and site.breadcrumbs %} {% unless paginator %} {% include breadcrumbs.html %} {% endunless %} {% endif %}
    {% include sidebar.html %}
    {% unless page.header.overlay_color or page.header.overlay_image %}

    {{ page.title }}

    {% endunless %} {{ content }}
    ================================================ FILE: _layouts/compress.html ================================================ --- # Jekyll layout that compresses HTML # v3.0.2 # https://jch.penibelst.de/ # © 2014–2015 Anatol Broder # MIT License --- {% capture _LINE_FEED %} {% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd p rt rp optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "" %}{% endif %}{% unless _pre_before contains "" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ;; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %}
    Step Bytes
    raw {{ content | size }}{% if _profile_endings %}
    endings {{ _profile_endings }}{% endif %}{% if _profile_startings %}
    startings {{ _profile_startings }}{% endif %}{% if _profile_comments %}
    comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %}
    collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %}
    clippings {{ _profile_clippings }}{% endif %}
    {% endif %}{% endif %} ================================================ FILE: _layouts/cv-layout.html ================================================ --- layout: compress --- {% include base_path %} {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} | {{ site.name | default: site.title }} {% include head.html %} {% include head/custom.html %} {% include browser-upgrade.html %} {% include masthead.html %}
    {{ content }}
    {% include scripts.html %} ================================================ FILE: _layouts/default.html ================================================ --- layout: compress --- {% include base_path %} {% include head.html %} {% include head/custom.html %} {% include browser-upgrade.html %} {% include masthead.html %} {{ content }} {% include scripts.html %} ================================================ FILE: _layouts/single.html ================================================ --- layout: default --- {% include base_path %} {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} {% include page__hero.html %} {% endif %} {% if page.url != "/" and site.breadcrumbs %} {% unless paginator %} {% include breadcrumbs.html %} {% endunless %} {% endif %}
    {% include sidebar.html %}
    {% if page.title %}{% endif %} {% if page.excerpt %}{% endif %} {% if page.date %}{% endif %} {% if page.modified %}{% endif %}
    {% unless page.header.overlay_color or page.header.overlay_image %}
    {% if page.title %}

    {{ page.title | markdownify | remove: "

    " | remove: "

    " }}

    {% endif %} {% if page.read_time %}

    {% include read-time.html %}

    {% endif %} {% if page.modified %}

    {{ site.data.ui-text[site.locale].date_label | default: "Published:" }}

    {% endif %} {% if page.collection == 'teaching' %}

    {{ page.type }}, {{ page.venue }}, {{ page.date | default: "1900-01-01" | date: "%Y" }}

    {% elsif page.venue and page.date %}

    Published in {{ page.venue }}, {{ page.date | default: "1900-01-01" | date: "%Y" }}

    {% elsif page.date %}

    {{ site.data.ui-text[site.locale].date_label | default: "Published:" }}

    {% endif %}
    {% endunless %}
    {{ content }} {% if page.citation and page.paperurl and page.slidesurl and page.bibtexurl %}

    Recommended citation: {{ page.citation }}
    Download Paper | Download Slides | Download Bibtex

    {% elsif page.citation and page.paperurl and page.slidesurl %}

    Recommended citation: {{ page.citation }}
    Download Paper | Download Slides

    {% elsif page.citation and page.paperurl and page.bibtexurl %}

    Recommended citation: {{ page.citation }}
    Download Paper | Download Bibtex

    {% elsif page.citation and page.paperurl %}

    Recommended citation: {{ page.citation }}
    Download Paper

    {% elsif page.citation and page.slidesurl and page.bibtexurl %}

    Recommended citation: {{ page.citation }}
    Download Slides | Download Bibtex

    {% elsif page.citation and page.slidesurl %}

    Recommended citation: {{ page.citation }}
    Download Slides

    {% elsif page.slidesurl and page.bibtexurl %}

    Download Slides | Download Bibtex

    {% elsif page.paperurl and page.bibtexurl %}

    Download Paper | Download Bibtex

    {% elsif page.citation and page.bibtexurl %}

    Recommended citation: {{ page.citation }}
    Download Bibtex

    {% elsif page.citation %}

    Recommended citation: {{ page.citation }}

    {% elsif page.slidesurl %}

    Download Slides

    {% elsif page.bibtexurl %}

    Download Bibtex

    {% endif %} {% if page.link %}{% endif %}
    {% if site.data.ui-text[site.locale].meta_label %}

    {{ site.data.ui-text[site.locale].meta_label }}

    {% endif %} {% include page__taxonomy.html %}
    {% if page.share %}{% include social-share.html %}{% endif %} {% include post_pagination.html %}
    {% if site.comments.provider and page.comments %} {% include comments.html %} {% endif %}
    {% comment %}{% endcomment %} {% if page.id and page.related and site.related_posts.size > 0 %} {% endif %}
    ================================================ FILE: _layouts/splash.html ================================================ --- layout: default --- {% include base_path %} {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} {% include page__hero.html %} {% endif %}
    {% if page.title %}{% endif %} {% if page.excerpt %}{% endif %} {% if page.date %}{% endif %} {% if page.modified %}{% endif %}
    {{ content }}
    ================================================ FILE: _layouts/talk.html ================================================ --- layout: default --- {% include base_path %} {% if page.header.overlay_color or page.header.overlay_image or page.header.image %} {% include page__hero.html %} {% endif %} {% if page.url != "/" and site.breadcrumbs %} {% unless paginator %} {% include breadcrumbs.html %} {% endunless %} {% endif %}
    {% include sidebar.html %}
    {% if page.title %}{% endif %} {% if page.excerpt %}{% endif %} {% if page.date %}{% endif %} {% if page.modified %}{% endif %}
    {% unless page.header.overlay_color or page.header.overlay_image %}
    {% if page.title %}

    {{ page.title | markdownify | remove: "

    " | remove: "

    " }}

    {% endif %} {% if page.read_time %}

    {% include read-time.html %}

    {% endif %} {% if page.modified %}

    Date:

    {% elsif page.date %}

    Date:

    {% endif %} {% if page.talk_type %}

    {{page.talk_type}} at {{ page.venue }}, {{page.location}} {% endif %}

    {% endunless %}
    {{ content }} {% if page.link %}{% endif %}
    {% if site.data.ui-text[site.locale].meta_label %}

    {{ site.data.ui-text[site.locale].meta_label }}

    {% endif %} {% include page__taxonomy.html %}
    {% if page.share %}{% include social-share.html %}{% endif %} {% include post_pagination.html %}
    {% if site.comments.provider and page.comments %} {% include comments.html %} {% endif %}
    {% comment %}{% endcomment %} {% if page.id and page.related and site.related_posts.size > 0 %} {% endif %}
    ================================================ FILE: _pages/404.md ================================================ --- title: "Page Not Found" sitemap: false permalink: /404.html --- Sorry, but the page you were trying to view does not exist. ================================================ FILE: _pages/about.md ================================================ --- permalink: / title: "Academic Pages is a ready-to-fork GitHub Pages template for academic personal websites" author_profile: true redirect_from: - /about/ - /about.html --- This is the front page of a website that is powered by the [Academic Pages template](https://github.com/academicpages/academicpages.github.io) and hosted on GitHub pages. [GitHub pages](https://pages.github.com) is a free service in which websites are built and hosted from code and data stored in a GitHub repository, automatically updating when a new commit is made to the repository. This template was forked from the [Minimal Mistakes Jekyll Theme](https://mmistakes.github.io/minimal-mistakes/) created by Michael Rose, and then extended to support the kinds of content that academics have: publications, talks, teaching, a portfolio, blog posts, and a dynamically-generated CV. Incidentally, these same features make it a great template for anyone that needs to show off a professional template! You can fork [this template](https://github.com/academicpages/academicpages.github.io) right now, modify the configuration and Markdown files, add your own PDFs and other content, and have your own site for free, with no ads! A data-driven personal website ====== Like many other Jekyll-based GitHub Pages templates, Academic Pages makes you separate the website's content from its form. The content & metadata of your website are in structured Markdown files, while various other files constitute the theme, specifying how to transform that content & metadata into HTML pages. You keep these various Markdown (.md), YAML (.yml), HTML, and CSS files in a public GitHub repository. Each time you commit and push an update to the repository, the [GitHub pages](https://pages.github.com/) service creates static HTML pages based on these files, which are hosted on GitHub's servers free of charge. Many of the features of dynamic content management systems (like Wordpress) can be achieved in this fashion, using a fraction of the computational resources and with far less vulnerability to hacking and DDoSing. You can also modify the theme to your heart's content without touching the content of your site. If you get to a point where you've broken something in Jekyll/HTML/CSS beyond repair, your Markdown files describing your talks, publications, etc. are safe. You can rollback the changes or even delete the repository and start over - just be sure to save the Markdown files! You can also write scripts that process the structured data on the site, such as [this one](https://github.com/academicpages/academicpages.github.io/blob/master/talkmap.ipynb) that analyzes metadata in pages about talks to display [a map of every location you've given a talk](https://academicpages.github.io/talkmap.html). For those users that need more advanced functionality, the template also supports the following popular tools: - [MathJax](https://www.mathjax.org/) for mathematical equations - [Mermaid](https://mermaid.js.org/) for diagraming - [Plotly](https://plotly.com/javascript/) for plotting Getting started ====== 1. Register a GitHub account if you don't have one and confirm your e-mail (required!) 1. Fork [this template](https://github.com/academicpages/academicpages.github.io) by clicking the "Use this template" button in the top right. 1. Go to the repository's settings (rightmost item in the tabs that start with "Code", should be below "Unwatch"). Rename the repository "[your GitHub username].github.io", which will also be your website's URL. 1. Set site-wide configuration and create content & metadata (see below -- also see [this set of diffs](https://archive.is/3TPas) showing what files were changed to set up [an example site](https://getorg-testacct.github.io) for a user with the username "getorg-testacct") 1. Upload any files (like PDFs, .zip files, etc.) to the files/ directory. They will appear at https://[your GitHub username].github.io/files/example.pdf. 1. Check status by going to the repository settings, in the "GitHub pages" section Site-wide configuration ------ The main configuration file for the site is in the base directory in [_config.yml](https://github.com/academicpages/academicpages.github.io/blob/master/_config.yml), which defines the content in the sidebars and other site-wide features. You will need to replace the default variables with ones about yourself and your site's github repository. The configuration file for the top menu is in [_data/navigation.yml](https://github.com/academicpages/academicpages.github.io/blob/master/_data/navigation.yml). For example, if you don't have a portfolio or blog posts, you can remove those items from that navigation.yml file to remove them from the header. Create content & metadata ------ For site content, there is one Markdown file for each type of content, which are stored in directories like _publications, _talks, _posts, _teaching, or _pages. For example, each talk is a Markdown file in the [_talks directory](https://github.com/academicpages/academicpages.github.io/tree/master/_talks). At the top of each Markdown file is structured data in YAML about the talk, which the theme will parse to do lots of cool stuff. The same structured data about a talk is used to generate the list of talks on the [Talks page](https://academicpages.github.io/talks), each [individual page](https://academicpages.github.io/talks/2012-03-01-talk-1) for specific talks, the talks section for the [CV page](https://academicpages.github.io/cv), and the [map of places you've given a talk](https://academicpages.github.io/talkmap.html) (if you run this [python file](https://github.com/academicpages/academicpages.github.io/blob/master/talkmap.py) or [Jupyter notebook](https://github.com/academicpages/academicpages.github.io/blob/master/talkmap.ipynb), which creates the HTML for the map based on the contents of the _talks directory). **Markdown generator** The repository includes [a set of Jupyter notebooks](https://github.com/academicpages/academicpages.github.io/tree/master/markdown_generator ) that converts a CSV containing structured data about talks or presentations into individual Markdown files that will be properly formatted for the Academic Pages template. The sample CSVs in that directory are the ones I used to create my own personal website at stuartgeiger.com. My usual workflow is that I keep a spreadsheet of my publications and talks, then run the code in these notebooks to generate the Markdown files, then commit and push them to the GitHub repository. How to edit your site's GitHub repository ------ Many people use a git client to create files on their local computer and then push them to GitHub's servers. If you are not familiar with git, you can directly edit these configuration and Markdown files directly in the github.com interface. Navigate to a file (like [this one](https://github.com/academicpages/academicpages.github.io/blob/master/_talks/2012-03-01-talk-1.md) and click the pencil icon in the top right of the content preview (to the right of the "Raw | Blame | History" buttons). You can delete a file by clicking the trashcan icon to the right of the pencil icon. You can also create new files or upload files by navigating to a directory and clicking the "Create new file" or "Upload files" buttons. Example: editing a Markdown file for a talk ![Editing a Markdown file for a talk](/images/editing-talk.png) For more info ------ More info about configuring Academic Pages can be found in [the guide](https://academicpages.github.io/markdown/), the [growing wiki](https://github.com/academicpages/academicpages.github.io/wiki), and you can always [ask a question on GitHub](https://github.com/academicpages/academicpages.github.io/discussions). The [guides for the Minimal Mistakes theme](https://mmistakes.github.io/minimal-mistakes/docs/configuration/) (which this theme was forked from) might also be helpful. ================================================ FILE: _pages/archive-layout-with-content.md ================================================ --- title: "Archive Layout with Content" layout: archive permalink: /archive-layout-with-content/ --- A variety of common markup showing how the theme styles them. # Header one ## Header two ### Header three #### Header four ##### Header five ###### Header six ## Blockquotes Single line blockquote: > Quotes are cool. ## Tables | Entry | Item | | | -------- | ------ | ------------------------------------------------------------ | | [John Doe](#) | 2016 | Description of the item in the list | | [Jane Doe](#) | 2019 | Description of the item in the list | | [Doe Doe](#) | 2022 | Description of the item in the list | | Header1 | Header2 | Header3 | |:--------|:-------:|--------:| | cell1 | cell2 | cell3 | | cell4 | cell5 | cell6 | |-----------------------------| | cell1 | cell2 | cell3 | | cell4 | cell5 | cell6 | |=============================| | Foot1 | Foot2 | Foot3 | ## Definition Lists Definition List Title : Definition list division. Startup : A startup company or startup is a company or temporary organization designed to search for a repeatable and scalable business model. #dowork : Coined by Rob Dyrdek and his personal body guard Christopher "Big Black" Boykins, "Do Work" works as a self motivator, to motivating your friends. Do It Live : I'll let Bill O'Reilly [explain](https://www.youtube.com/watch?v=O_HyZ5aW76c "We'll Do It Live") this one. ## Unordered Lists (Nested) * List item one * List item one * List item one * List item two * List item three * List item four * List item two * List item three * List item four * List item two * List item three * List item four ## Ordered List (Nested) 1. List item one 1. List item one 1. List item one 2. List item two 3. List item three 4. List item four 2. List item two 3. List item three 4. List item four 2. List item two 3. List item three 4. List item four ## Buttons Make any link standout more when applying the `.btn` class. ## Notices **Watch out!** You can also add notices by appending `{: .notice}` to a paragraph. {: .notice} ## HTML Tags ### Address Tag
    1 Infinite Loop
    Cupertino, CA 95014
    United States
    ### Anchor Tag (aka. Link) This is an example of a [link](https://github.com "GitHub"). ### Abbreviation Tag The abbreviation CSS stands for "Cascading Style Sheets". *[CSS]: Cascading Style Sheets ### Cite Tag "Code is poetry." ---Automattic ### Code Tag You will learn later on in these tests that `word-wrap: break-word;` will be your best friend. ### Strike Tag This tag will let you strikeout text. ### Emphasize Tag The emphasize tag should _italicize_ text. ### Insert Tag This tag should denote inserted text. ### Keyboard Tag This scarcely known tag emulates keyboard text, which is usually styled like the `` tag. ### Preformatted Tag This tag styles large blocks of code.
    .post-title {
      margin: 0 0 5px;
      font-weight: bold;
      font-size: 38px;
      line-height: 1.2;
      and here's a line of some really, really, really, really long text, just to see how the PRE tag handles it and to find out how it overflows;
    }
    
    ### Quote Tag Developers, developers, developers… –Steve Ballmer ### Strong Tag This tag shows **bold text**. ### Subscript Tag Getting our science styling on with H2O, which should push the "2" down. ### Superscript Tag Still sticking with science and Isaac Newton's E = MC2, which should lift the 2 up. ### Variable Tag This allows you to denote variables. {% include base_path %} {% for post in site.pages %} {% include archive-single.html %} {% endfor %} ================================================ FILE: _pages/category-archive.html ================================================ --- layout: archive permalink: /categories/ title: "Posts by Category" author_profile: true --- {% include base_path %} {% include group-by-array collection=site.posts field="categories" %} {% for category in group_names %} {% assign posts = group_items[forloop.index0] %}

    {{ category }}

    {% for post in posts %} {% include archive-single.html %} {% endfor %} {% endfor %} ================================================ FILE: _pages/collection-archive.html ================================================ --- layout: archive title: "Posts by Collection" permalink: /collection-archive/ author_profile: true --- {% include base_path %} {% capture written_label %}'None'{% endcapture %} {% for collection in site.collections %} {% unless collection.output == false or collection.label == "posts" %} {% capture label %}{{ collection.label }}{% endcapture %} {% if label != written_label %}

    {{ label }}

    {% capture written_label %}{{ label }}{% endcapture %} {% endif %} {% endunless %} {% for post in collection.docs %} {% unless collection.output == false or collection.label == "posts" %} {% include archive-single.html %} {% endunless %} {% endfor %} {% endfor %} ================================================ FILE: _pages/cv-json.md ================================================ --- layout: archive title: "CV" permalink: /cv-json/ author_profile: false redirect_from: - /resume-json --- {% include base_path %} {% include cv-template.html %} ================================================ FILE: _pages/cv.md ================================================ --- layout: archive title: "CV" permalink: /cv/ author_profile: true redirect_from: - /resume --- {% include base_path %} Education ====== * Ph.D in Version Control Theory, GitHub University, 2018 (expected) * M.S. in Jekyll, GitHub University, 2014 * B.S. in GitHub, GitHub University, 2012 Work experience ====== * Spring 2024: Academic Pages Collaborator * GitHub University * Duties includes: Updates and improvements to template * Supervisor: The Users * Fall 2015: Research Assistant * GitHub University * Duties included: Merging pull requests * Supervisor: Professor Hub * Summer 2015: Research Assistant * GitHub University * Duties included: Tagging issues * Supervisor: Professor Git Skills ====== * Skill 1 * Skill 2 * Sub-skill 2.1 * Sub-skill 2.2 * Sub-skill 2.3 * Skill 3 Publications ======
      {% for post in site.publications reversed %} {% include archive-single-cv.html %} {% endfor %}
    Talks ======
      {% for post in site.talks reversed %} {% include archive-single-talk-cv.html %} {% endfor %}
    Teaching ======
      {% for post in site.teaching reversed %} {% include archive-single-cv.html %} {% endfor %}
    Service and leadership ====== * Currently signed in to 43 different slack teams ================================================ FILE: _pages/markdown.md ================================================ --- permalink: /markdown/ title: "Markdown" author_profile: true redirect_from: - /md/ - /markdown.html --- {% include toc %} ## Locations of key files/directories * Basic config options: _config.yml * Top navigation bar config: _data/navigation.yml * Single pages: _pages/ * Collections of pages are .md or .html files in: * _publications/ * _portfolio/ * _posts/ * _teaching/ * _talks/ * Footer: _includes/footer.html * Static files (like PDFs): /files/ * Profile image (can set in _config.yml): images/profile.png ## Tips and hints * Name a file ".md" to have it render in markdown, name it ".html" to render in HTML. * Go to the [commit list](https://github.com/academicpages/academicpages.github.io/commits/master) (on your repo) to find the last version GitHub built with Jekyll. * Green check: successful build * Orange circle: building * Red X: error * No icon: not built * Academic Pages uses [Jekyll Kramdown](https://jekyllrb.com/docs/configuration/markdown/), GitHub Flavored Markdown (GFM) parser, which is similar to the version of Markdown used on GitHub, but may have some minor differences. * Some of emoji supported on GitHub should be supposed via the [Jemoji](https://github.com/jekyll/jemoji) plugin :computer:. * The best list of the supported emoji can be found in the [Emojis for Jekyll via Jemoji](https://www.fabriziomusacchio.com/blog/2021-08-16-emojis_for_Jekyll/#computer) blog post. * While GitHub Pages prevents server side code from running, client-side scripts are supported. * This means that Google Analytics is supported, and [the wiki](https://github.com/academicpages/academicpages.github.io/wiki/Adding-Google-Analytics) should contain the most up-to-date information on getting it working. * Your CV can be written using either Markdown ([preview](https://academicpages.github.io/cv/)) or generated via JSON ([preview](https://academicpages.github.io/cv-json/)) and the layouts are slightly different. You can update the path to the one being used in `_data/navigation.yml` with the JSON formatted CV being hidden by default. * The [Liquid syntax guide](https://shopify.github.io/liquid/tags/control-flow/) is a useful guide for those that want to add functionality to the template or to become contributors to the [template on GitHub](https://github.com/academicpages/academicpages.github.io). ## MathJax Support for MathJax (version 3.* via [jsDelivr](https://www.jsdelivr.com/), [documentation](https://docs.mathjax.org/en/latest/)) is included in the template: $$ \displaylines{ \nabla \cdot E= \frac{\rho}{\epsilon_0} \\\ \nabla \cdot B=0 \\\ \nabla \times E= -\partial_tB \\\ \nabla \times B = \mu_0 \left(J + \varepsilon_0 \partial_t E \right) } $$ The default delimiters of `$$...$$` and `\\[...\\]` are supported for displayed mathematics, while `\\(...\\)` should be used for in-line mathematics (ex., \\(a^2 + b^2 = c^2\\)) **Note** that since Academic Pages uses Markdown which cases some interference with MathJax and LaTeX for escaping characters and new lines, although [some workarounds exist](https://math.codidact.com/posts/278763/278772#answer-278772). In some cases, such as when you are including MathJax in a `citation` field for publications, it may be necessary to use `\(...\)` for inline delineation. ## Mermaid diagrams Academic Pages includes support for [Mermaid diagrams](https://mermaid.js.org/) (version 11.* via [jsDelivr](https://www.jsdelivr.com/)) and in addition to their [tutorials](https://mermaid.js.org/ecosystem/tutorials.html) and [GitHub documentation](https://github.com/mermaid-js/mermaid) the basic syntax is as follows: ```markdown ```mermaid graph LR A-->B ``` ``` Which produces the following plot with the [default theme](https://mermaid.js.org/config/theming.html) applied: ```mermaid graph LR A-->B ``` While a more advanced plot with the `forest` theme applied looks like the following: ```mermaid --- config: theme: 'forest' --- graph TD; A-->B; A-->C; B-->D; C-->D; ``` ## Plotly Academic Pages includes support for Plotly diagrams via a hook in the Markdown code elements, although those that are comfortable with HTML and JavaScript can also access it [via those routes](https://plotly.com/javascript/getting-started/). Plotly is included via an `npm` [package](https://www.npmjs.com/package/plotly.js?activeTab=readme) and is distributed as part of the minimized JavaScript that is part of the template. In order to render a Plotly plot via Markdown the relevant plot data need to be added as follows: ```markdown ```plotly { "data": [ { "x": [1, 2, 3, 4], "y": [10, 15, 13, 17], "type": "scatter" }, { "x": [1, 2, 3, 4], "y": [16, 5, 11, 9], "type": "scatter" } ] } ``` ``` **Important!** Since the data is parsed as JSON *all* of the keys will need to be quoted for the plot to render. The use of a tool like [JSONLint](https://jsonlint.com/) to check syntax is highly recommended. {: .notice} Which produces the following: ```plotly { "data": [ { "x": [1, 2, 3, 4], "y": [10, 15, 13, 17], "type": "scatter" }, { "x": [1, 2, 3, 4], "y": [16, 5, 11, 9], "type": "scatter" } ] } ``` Essentially what is taking place is that the [Plotly attributes](https://plotly.com/javascript/reference/index/) are being taken from the code block as JSON data, parsed, and passed to Plotly along with a theme that matches the current site theme (i.e., a light theme, or a dark theme). This allows all plots that can be described via the `data` attribute to rendered with some limitations for the theme of the plot. ```plotly { "data": [ { "x": [1, 2, 3, 4, 5], "y": [1, 6, 3, 6, 1], "mode": "markers", "type": "scatter", "name": "Team A", "text": ["A-1", "A-2", "A-3", "A-4", "A-5"], "marker": { "size": 12 } }, { "x": [1.5, 2.5, 3.5, 4.5, 5.5], "y": [4, 1, 7, 1, 4], "mode": "markers", "type": "scatter", "name": "Team B", "text": ["B-a", "B-b", "B-c", "B-d", "B-e"], "marker": { "size": 12 } } ], "layout": { "xaxis": { "range": [ 0.75, 5.25 ] }, "yaxis": { "range": [0, 8] }, "title": {"text": "Data Labels Hover"} } } ``` ```plotly { "data": [{ "x": [1, 2, 3], "y": [4, 5, 6], "type": "scatter" }, { "x": [20, 30, 40], "y": [50, 60, 70], "xaxis": "x2", "yaxis": "y2", "type": "scatter" }], "layout": { "grid": { "rows": 1, "columns": 2, "pattern": "independent" }, "title": { "text": "Simple Subplot" } } } ``` ```plotly { "data": [{ "z": [[10, 10.625, 12.5, 15.625, 20], [5.625, 6.25, 8.125, 11.25, 15.625], [2.5, 3.125, 5.0, 8.125, 12.5], [0.625, 1.25, 3.125, 6.25, 10.625], [0, 0.625, 2.5, 5.625, 10]], "type": "contour" }], "layout": { "title": { "text": "Basic Contour Plot" } } } ``` ## Markdown guide Academic Pages uses [kramdown](https://kramdown.gettalong.org/index.html) for Markdown rendering, which has some differences from other Markdown implementations such as GitHub's. In addition to this guide, please see the [kramdown Syntax page](https://kramdown.gettalong.org/syntax.html) for full documentation. ### Header three #### Header four ##### Header five ###### Header six ## Blockquotes Single line blockquote: > Quotes are cool. ## Tables ### Table 1 | Entry | Item | | | -------- | ------ | ------------------------------------------------------------ | | [John Doe](#) | 2016 | Description of the item in the list | | [Jane Doe](#) | 2019 | Description of the item in the list | | [Doe Doe](#) | 2022 | Description of the item in the list | ### Table 2 | Header1 | Header2 | Header3 | |:--------|:-------:|--------:| | cell1 | cell2 | cell3 | | cell4 | ce ll5 | cell6 | |-----------------------------| | cell1 | cell2 | cell3 | | cell4 | cell5 | cell6 | |=============================| | Foot1 | Foot2 | Foot3 | ## Definition Lists Definition List Title : Definition list division. Startup : A startup company or startup is a company or temporary organization designed to search for a repeatable and scalable business model. #dowork : Coined by Rob Dyrdek and his personal body guard Christopher "Big Black" Boykins, "Do Work" works as a self motivator, to motivating your friends. Do It Live : I'll let Bill O'Reilly [explain](https://www.youtube.com/watch?v=O_HyZ5aW76c "We'll Do It Live") this one. ## Unordered Lists (Nested) * List item one * List item one * List item one * List item two * List item three * List item four * List item two * List item three * List item four * List item two * List item three * List item four ## Ordered List (Nested) 1. List item one 1. List item one 1. List item one 2. List item two 3. List item three 4. List item four 2. List item two 3. List item three 4. List item four 2. List item two 3. List item three 4. List item four ## Buttons Make any link standout more when applying the `.btn` class. ## Notices Basic notices or call-outs are supported using the following syntax: ```markdown **Watch out!** You can also add notices by appending `{: .notice}` to the line following paragraph. {: .notice} ``` which wil render as: **Watch out!** You can also add notices by appending `{: .notice}` to the line following paragraph. {: .notice} ### Footnotes Footnotes can be useful for clarifying points in the text, or citing information.[^1] Markdown support numeric footnotes, as well as text as long as the values are unique.[^note] ```markdown This is the regular text.[^1] This is more regular text.[^note] [^1]: This is the footnote itself. [^note]: This is another footnote. ``` [^1]: Such as this footnote. [^note]: When using text for footnotes markers, no spaces are permitted in the name. ## HTML Tags ### Address Tag
    1 Infinite Loop
    Cupertino, CA 95014
    United States
    ### Anchor Tag (aka. Link) This is an example of a [link](https://github.com "GitHub"). ### Abbreviation Tag The abbreviation CSS stands for "Cascading Style Sheets". *[CSS]: Cascading Style Sheets ### Cite Tag "Code is poetry." ---Automattic ### Code Tag You will learn later on in these tests that `word-wrap: break-word;` will be your best friend. You can also write larger blocks of code with syntax highlighting supported for some languages, such as Python: ```python print('Hello World!') ``` or R: ```R print("Hello World!", quote = FALSE) ``` ### Details Tag (collapsible sections) The HTML `
    ` tag works well with Markdown and allows you to include collapsible sections, see [W3Schools](https://www.w3schools.com/tags/tag_details.asp) for more information on how to use the tag.
    Collapsed by default This section was collapsed by default!
    The source code: ```HTML
    Collapsed by default This section was collapsed by default!
    ``` Or, you can leave a section open by default by including the `open` attribute in the tag:
    Open by default This section is open by default thanks to open in the <details open> tag!
    ### Emphasize Tag The emphasize tag should _italicize_ text. ### Insert Tag This tag should denote inserted text. ### Keyboard Tag This scarcely known tag emulates keyboard text, which is usually styled like the `` tag. ### Preformatted Tag This tag styles large blocks of code.
    .post-title {
      margin: 0 0 5px;
      font-weight: bold;
      font-size: 38px;
      line-height: 1.2;
      and here's a line of some really, really, really, really long text, just to see how the PRE tag handles it and to find out how it overflows;
    }
    
    ### Quote Tag Developers, developers, developers… –Steve Ballmer ### Strike Tag This tag will let you strikeout text. ### Strong Tag This tag shows **bold text**. ### Subscript Tag Getting our science styling on with H2O, which should push the "2" down. ### Superscript Tag Still sticking with science and Isaac Newton's E = MC2, which should lift the 2 up. ### Variable Tag This allows you to denote variables. *** **Footnotes** The footnotes in the page will be returned following this line, return to the section on Markdown Footnotes. ================================================ FILE: _pages/non-menu-page.md ================================================ --- permalink: /non-menu-page/ title: "Page not in menu" author_profile: true redirect_from: - "/nmp/" - "/nmp.html" --- This is a page not in the menu. You can use markdown in this page. Heading 1 ====== Heading 2 ====== ================================================ FILE: _pages/page-archive.html ================================================ --- layout: archive title: "Page Archive" permalink: /page-archive/ author_profile: false --- {% include base_path %} {% for post in site.pages %} {% include archive-single.html %} {% endfor %} ================================================ FILE: _pages/portfolio.html ================================================ --- layout: archive title: "Portfolio" permalink: /portfolio/ author_profile: true --- {% include base_path %} {% for post in site.portfolio %} {% include archive-single.html %} {% endfor %} ================================================ FILE: _pages/publications.html ================================================ --- layout: archive title: "Publications" permalink: /publications/ author_profile: true --- {% if site.author.googlescholar %}
    You can also find my articles on my Google Scholar profile.
    {% endif %} {% include base_path %} {% if site.publication_category %} {% for category in site.publication_category %} {% assign title_shown = false %} {% for post in site.publications reversed %} {% if post.category != category[0] %} {% continue %} {% endif %} {% unless title_shown %}

    {{ category[1].title }}


    {% assign title_shown = true %} {% endunless %} {% include archive-single.html %} {% endfor %} {% endfor %} {% else %} {% for post in site.publications reversed %} {% include archive-single.html %} {% endfor %} {% endif %} ================================================ FILE: _pages/sitemap.md ================================================ --- layout: archive title: "Sitemap" permalink: /sitemap/ author_profile: true --- {% include base_path %} A list of all the posts and pages found on the site. For you robots out there, there is an [XML version]({{ base_path }}/sitemap.xml) available for digesting as well.

    Pages

    {% for post in site.pages %} {% include archive-single.html %} {% endfor %}

    Posts

    {% for post in site.posts %} {% include archive-single.html %} {% endfor %} {% capture written_label %}'None'{% endcapture %} {% for collection in site.collections %} {% unless collection.output == false or collection.label == "posts" %} {% capture label %}{{ collection.label }}{% endcapture %} {% if label != written_label %}

    {{ label }}

    {% capture written_label %}{{ label }}{% endcapture %} {% endif %} {% endunless %} {% for post in collection.docs %} {% unless collection.output == false or collection.label == "posts" %} {% include archive-single.html %} {% endunless %} {% endfor %} {% endfor %} ================================================ FILE: _pages/tag-archive.html ================================================ --- layout: archive permalink: /tags/ title: "Posts by Tags" author_profile: true --- {% include base_path %} {% include group-by-array collection=site.posts field="tags" %} {% for tag in group_names %} {% assign posts = group_items[forloop.index0] %}

    {{ tag }}

    {% for post in posts %} {% include archive-single.html %} {% endfor %} {% endfor %} ================================================ FILE: _pages/talkmap.html ================================================ --- layout: archive title: "Talk map" permalink: /talkmap.html author_profile: true ---

    This map is generated from a Jupyter Notebook file in talkmap.ipynb, which mines the location fields in the .md files in _talks/.

    ================================================ FILE: _pages/talks.html ================================================ --- layout: archive title: "Talks and presentations" permalink: /talks/ author_profile: true --- {% if site.talkmap_link == true %}

    See a map of all the places I've given a talk!

    {% endif %} {% for post in site.talks reversed %} {% include archive-single-talk.html %} {% endfor %} ================================================ FILE: _pages/teaching.html ================================================ --- layout: archive title: "Teaching" permalink: /teaching/ author_profile: true --- {% include base_path %} {% for post in site.teaching reversed %} {% include archive-single.html %} {% endfor %} ================================================ FILE: _pages/terms.md ================================================ --- permalink: /terms/ title: "Terms and Privacy Policy" modified: 2016-06-06 --- {% include base_path %} {% include toc %} ## Privacy Policy The privacy of my visitors is extremely important. This Privacy Policy outlines the types of personal information that is received and collected and how it is used. First and foremost, I will never share your email address or any other personal information to anyone without your direct consent. ### Log Files Like many other websites, this site uses log files to help learn about when, from where, and how often traffic flows to this site. The information in these log files include: * Internet Protocol addresses (IP) * Types of browser * Internet Service Provider (ISP) * Date and time stamp * Referring and exit pages * Number of clicks All of this information is not linked to anything that is personally identifiable. ### Cookies and Web Beacons When you visit this site "convenience" cookies are stored on your computer when you submit a comment to help you log in faster to [Disqus](https://disqus.com) the next time you leave a comment. Third-party advertisers may also place and read cookies on your browser and/or use web beacons to collect information. This site has no access or control over these cookies. You should review the respective privacy policies on any and all third-party ad servers for more information regarding their practices and how to opt-out. If you wish to disable cookies, you may do so through your web browser options. Instructions for doing so can be found on the specific web browsers' websites. #### Google Analytics Google Analytics is a web analytics tool I use to help understand how visitors engage with this website. It reports website trends using cookies and web beacons without identifying individual visitors. You can read [Google Analytics Privacy Policy](https://www.google.com/analytics/learn/privacy.html). ================================================ FILE: _pages/year-archive.html ================================================ --- layout: archive permalink: /year-archive/ title: "Blog posts" author_profile: true redirect_from: - /wordpress/blog-posts/ --- {% include base_path %} {% capture written_year %}'None'{% endcapture %} {% for post in site.posts %} {% capture year %}{{ post.date | date: '%Y' }}{% endcapture %} {% if year != written_year %}

    {{ year }}

    {% capture written_year %}{{ year }}{% endcapture %} {% endif %} {% include archive-single.html %} {% endfor %} ================================================ FILE: _portfolio/portfolio-1.md ================================================ --- title: "Portfolio item number 1" excerpt: "Short description of portfolio item number 1
    " collection: portfolio --- This is an item in your portfolio. It can be have images or nice text. If you name the file .md, it will be parsed as markdown. If you name the file .html, it will be parsed as HTML. ================================================ FILE: _portfolio/portfolio-2.html ================================================ --- title: "Portfolio item number 2" excerpt: "Short description of portfolio item number 2
    " collection: portfolio --- This is an item in your portfolio. It can be have images or nice text. If you name the file .md, it will be parsed as markdown. If you name the file .html, it will be parsed as HTML. ================================================ FILE: _posts/2012-08-14-blog-post-1.md ================================================ --- title: 'Blog Post number 1' date: 2012-08-14 permalink: /posts/2012/08/blog-post-1/ tags: - cool posts - category1 - category2 --- This is a sample blog post. Lorem ipsum I can't remember the rest of lorem ipsum and don't have an internet connection right now. Testing testing testing this blog post. Blog posts are cool. Headings are cool ====== You can have many headings ====== Aren't headings cool? ------ ================================================ FILE: _posts/2013-08-14-blog-post-2.md ================================================ --- title: 'Blog Post number 2' date: 2013-08-14 permalink: /posts/2013/08/blog-post-2/ tags: - cool posts - category1 - category2 --- This is a sample blog post. Lorem ipsum I can't remember the rest of lorem ipsum and don't have an internet connection right now. Testing testing testing this blog post. Blog posts are cool. Headings are cool ====== You can have many headings ====== Aren't headings cool? ------ ================================================ FILE: _posts/2014-08-14-blog-post-3.md ================================================ --- title: 'Blog Post number 3' date: 2014-08-14 permalink: /posts/2014/08/blog-post-3/ tags: - cool posts - category1 - category2 --- This is a sample blog post. Lorem ipsum I can't remember the rest of lorem ipsum and don't have an internet connection right now. Testing testing testing this blog post. Blog posts are cool. Headings are cool ====== You can have many headings ====== Aren't headings cool? ------ ================================================ FILE: _posts/2015-08-14-blog-post-4.md ================================================ --- title: 'Blog Post number 4' date: 2015-08-14 permalink: /posts/2012/08/blog-post-4/ tags: - cool posts - category1 - category2 --- This is a sample blog post. Lorem ipsum I can't remember the rest of lorem ipsum and don't have an internet connection right now. Testing testing testing this blog post. Blog posts are cool. Headings are cool ====== You can have many headings ====== Aren't headings cool? ------ ================================================ FILE: _posts/2199-01-01-future-post.md ================================================ --- title: 'Future Blog Post' date: 2199-01-01 permalink: /posts/2012/08/blog-post-4/ tags: - cool posts - category1 - category2 --- This post will show up by default. To disable scheduling of future posts, edit `config.yml` and set `future: false`. ================================================ FILE: _publications/2009-10-01-paper-title-number-1.md ================================================ --- title: "Paper Title Number 1" collection: publications category: manuscripts permalink: /publication/2009-10-01-paper-title-number-1 excerpt: 'This paper is about the number 1. The number 2 is left for future work.' date: 2009-10-01 venue: 'Journal 1' slidesurl: 'https://academicpages.github.io/files/slides1.pdf' paperurl: 'https://academicpages.github.io/files/paper1.pdf' bibtexurl: 'https://academicpages.github.io/files/bibtex1.bib' citation: 'Your Name, You. (2009). "Paper Title Number 1." Journal 1. 1(1).' --- The contents above will be part of a list of publications, if the user clicks the link for the publication than the contents of section will be rendered as a full page, allowing you to provide more information about the paper for the reader. When publications are displayed as a single page, the contents of the above "citation" field will automatically be included below this section in a smaller font. ================================================ FILE: _publications/2010-10-01-paper-title-number-2.md ================================================ --- title: "Paper Title Number 2" collection: publications category: manuscripts permalink: /publication/2010-10-01-paper-title-number-2 excerpt: 'This paper is about the number 2. The number 3 is left for future work.' date: 2010-10-01 venue: 'Journal 1' slidesurl: 'https://academicpages.github.io/files/slides2.pdf' paperurl: 'https://academicpages.github.io/files/paper2.pdf' citation: 'Your Name, You. (2010). "Paper Title Number 2." Journal 1. 1(2).' --- The contents above will be part of a list of publications, if the user clicks the link for the publication than the contents of section will be rendered as a full page, allowing you to provide more information about the paper for the reader. When publications are displayed as a single page, the contents of the above "citation" field will automatically be included below this section in a smaller font. ================================================ FILE: _publications/2015-10-01-paper-title-number-3.md ================================================ --- title: "Paper Title Number 3" collection: publications category: manuscripts permalink: /publication/2015-10-01-paper-title-number-3 excerpt: 'This paper is about the number 3. The number 4 is left for future work.' date: 2015-10-01 venue: 'Journal 1' slidesurl: 'https://academicpages.github.io/files/slides3.pdf' paperurl: 'https://academicpages.github.io/files/paper3.pdf' citation: 'Your Name, You. (2015). "Paper Title Number 3." Journal 1. 1(3).' --- The contents above will be part of a list of publications, if the user clicks the link for the publication than the contents of section will be rendered as a full page, allowing you to provide more information about the paper for the reader. When publications are displayed as a single page, the contents of the above "citation" field will automatically be included below this section in a smaller font. ================================================ FILE: _publications/2024-02-17-paper-title-number-4.md ================================================ --- title: "Paper Title Number 4" collection: publications category: conferences permalink: /publication/2024-02-17-paper-title-number-4 excerpt: 'This paper is about fixing template issue #693.' date: 2024-02-17 venue: 'GitHub Journal of Bugs' paperurl: 'https://academicpages.github.io/files/paper3.pdf' citation: 'Your Name, You. (2024). "Paper Title Number 3." GitHub Journal of Bugs. 1(3).' --- The contents above will be part of a list of publications, if the user clicks the link for the publication than the contents of section will be rendered as a full page, allowing you to provide more information about the paper for the reader. When publications are displayed as a single page, the contents of the above "citation" field will automatically be included below this section in a smaller font. ================================================ FILE: _publications/2025-06-08-paper-title-number-5.md ================================================ --- title: "Paper Title Number 5, with math $$E=mc^2$$" collection: publications category: conferences permalink: /publication/2024-02-17-paper-title-number-4 excerpt: 'This paper is about a famous math equation, $$E=mc^2$$' date: 2024-02-17 venue: 'GitHub Journal of Bugs' paperurl: 'https://academicpages.github.io/files/paper3.pdf' citation: 'Your Name, You. (2024). "Paper Title Number 3." GitHub Journal of Bugs. 1(3).' --- Using [MathJax](https://www.mathjax.org/) in the description is supported - $$E=mc^2$$ - however, the use must be mindful that the default delimiters are `$$...$$` and `\\[...\\]` which differs from the `$...$` that is typically expected. ================================================ FILE: _sass/_syntax.scss ================================================ /* ========================================================================== Syntax highlighting ========================================================================== */ div.highlighter-rouge, figure.highlight { position: relative; margin-bottom: 1em; padding: 1em; border: 1px solid var(--global-border-color); border-radius: $border-radius; background-color: var(--global-code-background-color); box-shadow: $box-shadow; font-size: $type-size-4; &:before { position: absolute; top: 0; right: 0; padding: 0.5em; background-color: mix(#fff, #7a8288, 90%); content: "\f121"; font-family: "Font Awesome 6 Free" !important; font-size: $type-size-6; line-height: 1; text-transform: none; speak: none; } .highlight { margin: 0; font-family: $monospace; font-size: $type-size-6; line-height: 1.8; } } .highlight table td { padding: 5px; } .highlight table pre { margin: 0; } /* Solarized Light http://ethanschoonover.com/solarized SOLARIZED HEX ROLE --------- -------- ------------------------------------------ base01 #586e75 body text / default code / primary content base1 #93a1a1 comments / secondary content base3 #fdf6e3 background orange #cb4b16 constants red #dc322f regex, special keywords blue #22b3eb reserved keywords cyan #2aa198 strings, numbers green #859900 operators, other keywords ========================================================================== */ .highlight .c { color: #93a1a1 } /* Comment */ .highlight .err { color: #586e75 } /* Error */ .highlight .g { color: #586e75 } /* Generic */ .highlight .k { color: #859900 } /* Keyword */ .highlight .l { color: #586e75 } /* Literal */ .highlight .n { color: #586e75 } /* Name */ .highlight .o { color: #859900 } /* Operator */ .highlight .x { color: #cb4b16 } /* Other */ .highlight .p { color: #586e75 } /* Punctuation */ .highlight .cm { color: #93a1a1 } /* Comment.Multiline */ .highlight .cp { color: #859900 } /* Comment.Preproc */ .highlight .c1 { color: #93a1a1 } /* Comment.Single */ .highlight .cs { color: #859900 } /* Comment.Special */ .highlight .gd { color: #2aa198 } /* Generic.Deleted */ .highlight .ge { color: #586e75; font-style: italic } /* Generic.Emph */ .highlight .gr { color: #dc322f } /* Generic.Error */ .highlight .gh { color: #cb4b16 } /* Generic.Heading */ .highlight .gi { color: #859900 } /* Generic.Inserted */ .highlight .go { color: #586e75 } /* Generic.Output */ .highlight .gp { color: #586e75 } /* Generic.Prompt */ .highlight .gs { color: #586e75; font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #cb4b16 } /* Generic.Subheading */ .highlight .gt { color: #586e75 } /* Generic.Traceback */ .highlight .kc { color: #cb4b16 } /* Keyword.Constant */ .highlight .kd { color: #22b3eb } /* Keyword.Declaration */ .highlight .kn { color: #859900 } /* Keyword.Namespace */ .highlight .kp { color: #859900 } /* Keyword.Pseudo */ .highlight .kr { color: #22b3eb } /* Keyword.Reserved */ .highlight .kt { color: #dc322f } /* Keyword.Type */ .highlight .ld { color: #586e75 } /* Literal.Date */ .highlight .m { color: #2aa198 } /* Literal.Number */ .highlight .s { color: #2aa198 } /* Literal.String */ .highlight .na { color: #586e75 } /* Name.Attribute */ .highlight .nb { color: #B58900 } /* Name.Builtin */ .highlight .nc { color: #22b3eb } /* Name.Class */ .highlight .no { color: #cb4b16 } /* Name.Constant */ .highlight .nd { color: #22b3eb } /* Name.Decorator */ .highlight .ni { color: #cb4b16 } /* Name.Entity */ .highlight .ne { color: #cb4b16 } /* Name.Exception */ .highlight .nf { color: #22b3eb } /* Name.Function */ .highlight .nl { color: #586e75 } /* Name.Label */ .highlight .nn { color: #586e75 } /* Name.Namespace */ .highlight .nx { color: #586e75 } /* Name.Other */ .highlight .py { color: #586e75 } /* Name.Property */ .highlight .nt { color: #22b3eb } /* Name.Tag */ .highlight .nv { color: #22b3eb } /* Name.Variable */ .highlight .ow { color: #859900 } /* Operator.Word */ .highlight .w { color: #586e75 } /* Text.Whitespace */ .highlight .mf { color: #2aa198 } /* Literal.Number.Float */ .highlight .mh { color: #2aa198 } /* Literal.Number.Hex */ .highlight .mi { color: #2aa198 } /* Literal.Number.Integer */ .highlight .mo { color: #2aa198 } /* Literal.Number.Oct */ .highlight .sb { color: #93a1a1 } /* Literal.String.Backtick */ .highlight .sc { color: #2aa198 } /* Literal.String.Char */ .highlight .sd { color: #586e75 } /* Literal.String.Doc */ .highlight .s2 { color: #2aa198 } /* Literal.String.Double */ .highlight .se { color: #cb4b16 } /* Literal.String.Escape */ .highlight .sh { color: #586e75 } /* Literal.String.Heredoc */ .highlight .si { color: #2aa198 } /* Literal.String.Interpol */ .highlight .sx { color: #2aa198 } /* Literal.String.Other */ .highlight .sr { color: #dc322f } /* Literal.String.Regex */ .highlight .s1 { color: #2aa198 } /* Literal.String.Single */ .highlight .ss { color: #2aa198 } /* Literal.String.Symbol */ .highlight .bp { color: #22b3eb } /* Name.Builtin.Pseudo */ .highlight .vc { color: #22b3eb } /* Name.Variable.Class */ .highlight .vg { color: #22b3eb } /* Name.Variable.Global */ .highlight .vi { color: #22b3eb } /* Name.Variable.Instance */ .highlight .il { color: #2aa198 } /* Literal.Number.Integer.Long */ ================================================ FILE: _sass/_themes.scss ================================================ /* ========================================================================== SHARED THEME SETTINGS ========================================================================== */ /* ========================================================================== TYPOGRAPHY ========================================================================== */ /* Used to set the size for */ $doc-font-size : 16; /* Paragraph indention */ $paragraph-indent : false; // true, false (default) $indent-var : 1.3em; /* System typefaces */ $serif : Georgia, Times, serif; $sans-serif : -apple-system, ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", Arial, sans-serif; $monospace : Monaco, Consolas, "Lucida Console", monospace; /* Sans serif typefaces */ $sans-serif-narrow : $sans-serif; $helvetica : Helvetica, "Helvetica Neue", Arial, sans-serif; /* Serif typefaces */ $georgia : Georgia, serif; $times : Times, serif; $bodoni : "Bodoni MT", serif; $calisto : "Calisto MT", serif; $garamond : Garamond, serif; /* Type scale */ $type-size-1 : 2.441em; // ~39.056px $type-size-2 : 1.953em; // ~31.248px $type-size-3 : 1.563em; // ~25.008px $type-size-4 : 1.25em; // ~20px $type-size-5 : 1em; // ~16px $type-size-6 : 0.75em; // ~12px $type-size-7 : 0.6875em; // ~11px $type-size-8 : 0.625em; // ~10px $global-font-family : $sans-serif; $header-font-family : $sans-serif; $caption-font-family : $serif; /* ========================================================================== Breakpoints ========================================================================== */ @include breakpoint-set("to ems", true); $small : 600px !default; $medium : 768px !default; $medium-wide : 900px !default; $large : 925px !default; $x-large : 1280px !default; /* ========================================================================== Grid ========================================================================== */ $right-sidebar-width-narrow : auto; $right-sidebar-width : auto; $right-sidebar-width-wide : auto; $susy: ( columns: 12, column-width: 120px, gutters: 1/4, math: fluid, output: float, gutter-position: after, container: $large, global-box-sizing: border-box, ); /* ========================================================================== BRAND COLORS ========================================================================== */ $behance-color : #1769FF; $bluesky-color : #1184fe; $dribbble-color : #ea4c89; $facebook-color : #3b5998; $flickr-color : #ff0084; $foursquare-color : #0072b1; $google-plus-color : #dd4b39; $instagram-color : #517fa4; $kaggle-color : #20c0ff; $lastfm-color : #d51007; $linkedin-color : #007bb6; $mastodon-color : #6364ff; $orcid-color : #a6ce39; $pinterest-color : #cb2027; $rss-color : #fa9b39; $soundcloud-color : #ff3300; $stackoverflow-color : #fe7a15; $tumblr-color : #32506d; $twitter-color : #55acee; $vimeo-color : #1ab7ea; $vine-color : #00bf8f; $youtube-color : #bb0000; $xing-color : #006567; ================================================ FILE: _sass/include/_mixins.scss ================================================ /* ========================================================================== MIXINS ========================================================================== */ %tab-focus { /* Default*/ outline: thin dotted $warning-color; /* Webkit*/ outline: 5px auto $warning-color; outline-offset: -2px; } /* em function ========================================================================== */ @function em($target, $context: $doc-font-size) { @return ($target / $context) * 1em; } /* Bourbon clearfix ========================================================================== */ /* * Provides an easy way to include a clearfix for containing floats. * link http://cssmojo.com/latest_new_clearfix_so_far/ * * example scss - Usage * * .element { * @include clearfix; * } * * example css - CSS Output * * .element::after { * clear: both; * content: ""; * display: table; * } */ @mixin clearfix { clear: both; &::after { clear: both; content: ""; display: table; } } ================================================ FILE: _sass/include/_utilities.scss ================================================ /* ========================================================================== UTILITY CLASSES ========================================================================== */ /* Visibility ========================================================================== */ /* http://www.456bereastreet.com/archive/200711/screen_readers_sometimes_ignore_displaynone/ */ .hidden { display: none; visibility: hidden; } /* for preloading images */ .load { display: none; } .transparent { opacity: 0; } /* https://developer.yahoo.com/blogs/ydn/clip-hidden-content-better-accessibility-53456.html */ .visually-hidden, .screen-reader-text, .screen-reader-text span, .screen-reader-shortcut { position: absolute !important; clip: rect(1px, 1px, 1px, 1px); height: 1px !important; width: 1px !important; border: 0 !important; overflow: hidden; } body:hover .visually-hidden a, body:hover .visually-hidden input, body:hover .visually-hidden button { display: none !important; } /* screen readers */ .screen-reader-text:focus, .screen-reader-shortcut:focus { clip: auto !important; height: auto !important; width: auto !important; display: block; font-size: 1em; font-weight: bold; padding: 15px 23px 14px; background: var(--global-text-color); z-index: 100000; text-decoration: none; box-shadow: 0 0 2px 2px rgba(0,0,0,.6); } /* Skip links ========================================================================== */ .skip-link { position: fixed; z-index: 20; margin: 0; font-family: $sans-serif; white-space: nowrap; } .skip-link li { height: 0; width: 0; list-style: none; } /* Type ========================================================================== */ .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } /* Alignment ========================================================================== */ /* clearfix */ .cf { clear: both; } .wrapper { @include container(); } /* Source: http://snipplr.com/view/10979/css-cross-browser-word-wrap */ .wordwrap { white-space: pre-wrap; /* CSS3 */ white-space: -moz-pre-wrap; /* Firefox */ white-space: -pre-wrap; /* Opera <7 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* IE */ } /* Images ========================================================================== */ /* image align left */ .align-left { display: block; margin-left: auto; margin-right: auto; @include breakpoint($small) { float: left; margin-right: 1em; } } /* image align right */ .align-right { display: block; margin-left: auto; margin-right: auto; @include breakpoint($small) { float: right; margin-left: 1em; } } /* image align center */ .align-center { display: block; margin-left: auto; margin-right: auto; } /* file page content container */ .full { @include breakpoint($large){ margin-right: -1 * span(2.5 of 12) !important; } } /* Icons ========================================================================== */ .icon { display: inline-block; fill: currentColor; width: 1em; height: 1.1em; line-height: 1; position: relative; top: -0.1em; vertical-align: middle; } /* Adjust this setting to control the space between an icon and text in the sidebar */ .icon-pad-right { padding-right: 0.5em; margin-right: 0.5em; } /* social icons*/ .social-icons { .fa { color: #000; } .fa-bluesky, .fa-bluesky-square { color: $bluesky-color; } .fa-behance, .fa-behance-square { color: $behance-color; } .fa-dribbble { color: $dribbble-color; } .fa-facebook, .fa-facebook-square { color: $facebook-color; } .fa-flickr { color: $flickr-color; } .fa-foursquare { color: $foursquare-color; } .fa-google-plus, .fa-google-plus-square { color: $google-plus-color; } .fa-instagram { color: $instagram-color; } .fa-kaggle, .fa-kaggle-square { color: $kaggle-color; } .fa-lastfm, .fa-lastfm-square { color: $lastfm-color; } .fa-linkedin, .fa-linkedin-square { color: $linkedin-color; } .fa-mastodon, .fa-mastodon-square { color: $mastodon-color; } .ai-orcid, .ai-orcid-square { color: $orcid-color; } .fa-pinterest, .fa-pinterest-p, .fa-pinterest-square { color: $pinterest-color; } .fa-rss, .fa-rss-square { color: $rss-color; } .fa-soundcloud { color: $soundcloud-color; } .fa-stack-exchange, .fa-stack-overflow { color: $stackoverflow-color; } .fa-tumblr, .fa-tumblr-square { color: $tumblr-color; } .fa-twitter, .fa-twitter-square { color: $twitter-color; } .fa-vimeo, .fa-vimeo-square { color: $vimeo-color; } .fa-vine { color: $vine-color; } .fa-youtube, .fa-youtube-square, .fa-youtube-play { color: $youtube-color; } .fa-xing, .fa-xing-square { color: $xing-color; } } /* Navicons ========================================================================== */ .navicon { position: relative; display: inline-block; vertical-align: middle; width: $navicon-width; height: $navicon-height; background: var(--global-masthead-link-color); margin: auto; -webkit-transition: 0.3s; transition: 0.3s; &:before, &:after { content: ""; position: absolute; left: 0; width: $navicon-width; height: $navicon-height; background: var(--global-masthead-link-color); -webkit-transition: 0.3s; transition: 0.3s; } &:before { top: (-2 * $navicon-height); } &:after { bottom: (-2 * $navicon-height); } } .close .navicon { /* hide the middle line*/ background: transparent; /* overlay the lines by setting both their top values to 0*/ &:before, &:after{ -webkit-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; top: 0; width: $navicon-width; } /* rotate the lines to form the x shape*/ &:before{ -webkit-transform: rotate3d(0,0,1,45deg); transform: rotate3d(0,0,1,45deg); } &:after{ -webkit-transform: rotate3d(0,0,1,-45deg); transform: rotate3d(0,0,1,-45deg); } } /* Sticky, fixed to top content ========================================================================== */ .sticky { @include breakpoint($large) { @include clearfix(); position: -webkit-sticky; position: sticky; top: 2em; > * { display: block; } } } /* Wells ========================================================================== */ .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: $border-radius; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } /* Modals ========================================================================== */ .show-modal { overflow: hidden; position: relative; &:before { position: absolute; content: ""; top: 0; left: 0; width: 100%; height: 100%; z-index: 999; background-color: rgba(255, 255, 255, 0.85); } .modal { display: block; } } .modal { display: none; position: fixed; width: 300px; top: 50%; left: 50%; margin-left: -150px; margin-top: -150px; min-height: 0; z-index: 9999; background: var(--global-text-color); border: 1px solid var(--global-border-color); border-radius: $border-radius; box-shadow: $box-shadow; &__title { margin: 0; padding: 0.5em 1em; } &__supporting-text { padding: 0 1em 0.5em 1em; } &__actions { padding: 0.5em 1em; border-top: 1px solid var(--global-border-color); } } /* Footnotes ========================================================================== */ .footnote { color: var(--global-text-color-light); text-decoration: none; } .footnotes { color: var(--global-text-color-light); ol, li, p { margin-bottom: 0; font-size: $type-size-6; } } a.reversefootnote { color: var(--global-text-color-light); text-decoration: none; &:hover { text-decoration: underline; } } /* Required ========================================================================== */ .required { color: $danger-color; font-weight: bold; } ================================================ FILE: _sass/layout/_archive.scss ================================================ /* ========================================================================== ARCHIVE ========================================================================== */ .archive { margin-bottom: 2em; @include breakpoint($medium) { @include span(12 of 12); } @include breakpoint($large) { @include span(10 of 12 last); @include prefix(0.5 of 12); } a { text-decoration: underline; &:hover { text-decoration: underline; img { box-shadow: 0 0 10px rgba(#000, 0.25); } } } } .archive__subtitle { margin: 1.414em 0 0; padding-bottom: 0.5em; font-size: $type-size-5; color: var(--global-text-color-light); border-bottom: 1px solid var(--global-border-color); + .list__item .archive__item-title { margin-top: 0.5em; } } .archive__item-title { margin-bottom: 0.25em; font-family: $sans-serif-narrow; a + a { opacity: 0.5; } } /* remove border*/ .page__content { .archive__item-title { margin-top: 1em; border-bottom: none; } } .archive__item-excerpt { margin-top: 0; font-size: $type-size-6; & + p { text-indent: 0; } } .archive__item-teaser { border-radius: $border-radius; overflow: hidden; img { width: 100%; } } .archive__item:hover { .archive__item-teaser { box-shadow: 0 0 10px rgba(#000, 0.25); } .archive__item-title { text-decoration: underline; } } /* List view ========================================================================== */ .list__item { @include breakpoint($medium) { padding-right: $right-sidebar-width-narrow; } @include breakpoint($large) { padding-right: $right-sidebar-width; } @include breakpoint($x-large) { padding-right: $right-sidebar-width-wide; } .page__meta { margin: 0 0 4px; } } /* Grid view ========================================================================== */ .grid__item { margin-bottom: 2em; .page__meta { margin: 0 0 4px; } .archive__item-title { margin-top: 0.5em; font-size: $type-size-5; } .archive__item-excerpt { display: none; } @include breakpoint($small) { @include gallery(5 of 10); .archive__item-teaser { max-height: 200px; } } @include breakpoint($medium) { margin-left: 0; /* reset before mixin does its thing*/ margin-right: 0; /* reset before mixin does its thing*/ @include gallery(2.5 of 10); .archive__item-teaser { max-height: 120px; } .archive__item-excerpt { display: block; font-size: $type-size-6; } } } /* Features ========================================================================== */ .feature__wrapper { @include clearfix(); margin-bottom: 2em; border-bottom: 1px solid var(--global-border-color); } .feature__item { margin-bottom: 2em; font-size: 1.25rem; @include breakpoint($small) { margin-bottom: 0; @include gallery(4 of 12); .feature__item-teaser { max-height: 200px; overflow: hidden; } } &--left { @include full(); font-size: 1.25rem; .archive__item-teaser { margin-bottom: 2em; } @include breakpoint($small) { .archive__item-teaser { @include span(5 of 12); } .archive__item-body { @include span(7 of 12 last); @include prefix(0.5 of 12); @include suffix(1 of 12); } } } &--right { @include full(); font-size: 1.25rem; .archive__item-teaser { margin-bottom: 2em; } @include breakpoint($small) { text-align: right; .archive__item-teaser { @include span(5 of 12 rtl); } .archive__item-body { @include span(7 of 12 last rtl); @include prefix(0.5 of 12); @include suffix(1 of 12); } } } &--center { @include full(); font-size: 1.25rem; .archive__item-teaser { margin-bottom: 2em; } @include breakpoint($small) { text-align: center; .archive__item-teaser { margin: 0 auto; width: span(5 of 12); } .archive__item-body { margin: 0 auto; width: span(7 of 12); } } } } ================================================ FILE: _sass/layout/_base.scss ================================================ /* ========================================================================== BASE ELEMENTS ========================================================================== */ html { /* sticky footer fix */ position: relative; min-height: 100%; } body { /* Set via _themes.scss */ color: var(--global-text-color); background-color: var(--global-bg-color); margin: 0; padding: $masthead-height 0 0; padding-bottom: 9em; font-family: $global-font-family; line-height: 1.5; &.overflow--hidden { /* when primary navigation is visible, the content in the background won't scroll */ overflow: hidden; } } h1, h2, h3, h4, h5, h6 { margin: 2em 0 0.5em; line-height: 1.2; font-family: $header-font-family; font-weight: bold; } h1 { margin-top: 0; font-size: $type-size-3; } h2 { font-size: $type-size-4; } h3 { font-size: $type-size-5; } h4 { font-size: $type-size-6; } h5 { font-size: $type-size-6; } h6 { font-size: $type-size-6; } small, .small { font-size: $type-size-6; } p { margin-bottom: 1.3em; } u, ins { text-decoration: none; border-bottom: 1px solid var(--global-text-color); a { color: inherit; } } del a { color: inherit; } /* reduce orphans and widows when printing */ p, pre, blockquote, ul, ol, dl, figure, table, fieldset { orphans: 3; widows: 3; } /* abbreviations */ abbr[title], abbr[data-original-title] { text-decoration: none; cursor: help; border-bottom: 1px dotted var(--global-text-color); } /* blockquotes */ blockquote { margin: 2em 1em 2em 0; padding-left: 1em; padding-right: 1em; font-style: italic; border-left: 0.25em solid var(--global-border-color); cite { font-style: italic; &:before { content: "\2014"; padding-right: 5px; } } } /* links */ a { &:focus { @extend %tab-focus; } &:hover, &:active { outline: 0; } } /* code */ tt, code, kbd, samp, pre { font-family: $monospace; } pre { overflow-x: auto; /* add scrollbars to wide code blocks*/ } a > code, figcaption > code, li > code, p > code, td > code { color: var(--global-code-text-color); padding-top: 0.1rem; padding-bottom: 0.1rem; font-size: $type-size-6; background: var(--global-code-background-color); border: 1px solid var(--global-thead-color); border-radius: $border-radius; box-shadow: $box-shadow; &:before, &:after { letter-spacing: -0.2em; content: "\00a0"; /* non-breaking space*/ } } a > code { color: inherit; } pre > code { color: var(--global-code-text-color); } /* horizontal rule */ hr { display: block; margin: 1em 0; border: 0; border-top: 1px solid var(--global-border-color); } /* lists */ ul li, ol li { margin-bottom: 0.5em; } li ul, li ol { margin-top: 0.5em; } /* Media and embeds ========================================================================== */ /* Figures and images */ figure { display: -webkit-box; display: flex; -webkit-box-pack: justify; justify-content: space-between; -webkit-box-align: start; align-items: flex-start; flex-wrap: wrap; margin: 2em 0; img, iframe, .fluid-width-video-wrapper { margin-bottom: 1em; } img { width: 100%; border-radius: $border-radius; -webkit-transition: $global-transition; transition: $global-transition; } > a { display: block; } &.half { > a, > img { @include breakpoint($small) { width: calc(50% - 0.5em); } } figcaption { width: 100%; } } &.third { > a, > img { @include breakpoint($small) { width: calc(33.3333% - 0.5em); } } figcaption { width: 100%; } } } /* Figure captions */ figcaption { margin-bottom: 0.5em; color: var(--global-fig-caption-color); font-family: $caption-font-family; font-size: $type-size-6; a { color: inherit; text-decoration: none; border-bottom: 1px solid var(--global-border-color ); -webkit-transition: $global-transition; transition: $global-transition; &:hover { color: #000; border-bottom-color: #000; } } } /* Fix IE9 SVG bug */ svg:not(:root) { overflow: hidden; } /* Navigation lists ========================================================================== */ /** * Removes margins, padding, and bullet points from navigation lists * * Example usage: * */ nav { ul { margin: 0; padding: 0; } li { list-style: none; } a { text-decoration: none; } /* override white-space for nested lists */ ul li, ol li { margin-bottom: 0; } li ul, li ol { margin-top: 0; } } /* ========================================================================== ANIMATIONS ========================================================================== */ @-webkit-keyframes intro { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes intro { 0% { opacity: 0; } 100% { opacity: 1; } } /* Global animation transition */ b, i, strong, em, blockquote, p, q, span, figure, img, h1, h2, header, input, a, tr, td, form button, input[type="submit"], .btn, .highlight, .archive__item-teaser { -webkit-transition: $global-transition; transition: $global-transition; } /* ========================================================================== PRINT STYLES ========================================================================== */ /* Hide the following elements on print ========================================================================== */ @media print { .masthead, .toc, .page__share, .page__related, .ads, .page__footer { display: none; } } ================================================ FILE: _sass/layout/_buttons.scss ================================================ /* ========================================================================== BUTTONS ========================================================================== */ /* Default button ========================================================================== */ .btn { /* default button */ display: inline-block; margin-bottom: 0.25em; padding: 0.5em 1em; color: #fff !important; font-family: $sans-serif; font-size: $type-size-6; font-weight: bold; text-align: center; text-decoration: none; background-color: var(--global-base-color); border: 0 !important; border-radius: $border-radius; cursor: pointer; &:hover { background-color: mix(white, #000, 20%); } .icon { margin-right: 0.5em; } .icon + .hidden { margin-left: -0.5em; /* override for hidden text*/ } /* fills width of parent container */ &--block { display: block; width: 100%; + .btn--block { margin-top: 0.25em; } } /* for dark backgrounds */ &--inverse { color: var(--global-text-color-light) !important; border: 1px solid var(--global-border-color) !important; /* override*/ background-color: var(--global-bg-color); &:hover { color: #fff !important; border-color: var(--global-text-color-light); } } /* light outline */ &--light-outline { border: 1px solid #fff !important; /* override*/ background-color: transparent; } /* information */ &--info { background-color: $info-color; &:hover { background-color: mix(#000, $info-color, 20%); } } /* warning */ &--warning { background-color: $warning-color; &:hover { background-color: mix(#000, $warning-color, 20%); } } /* success */ &--success { background-color: $success-color; &:hover { background-color: mix(#000, $success-color, 20%); } } /* danger */ &--danger { background-color: $danger-color; &:hover { background-color: mix(#000, $danger-color, 20%); } } /* disabled */ &--disabled { pointer-events: none; cursor: not-allowed; filter: alpha(opacity=65); box-shadow: none; opacity: 0.65; } /* social buttons */ $social: (bluesky, $bluesky-color), (facebook, $facebook-color), (google-plus, $google-plus-color), (linkedin, $linkedin-color), (mastodon, $mastodon-color), (twitter, $twitter-color); @each $socialnetwork, $color in $social { &--#{$socialnetwork} { background-color: $color; &:hover { background-color: mix(#000, $color, 20%); } } } /* extra large button */ &--x-large { font-size: $type-size-4; } /* large button */ &--large { font-size: $type-size-5; } /* small button */ &--small { font-size: $type-size-7; } } ================================================ FILE: _sass/layout/_footer.scss ================================================ /* ========================================================================== FOOTER ========================================================================== */ .page__footer { @include clearfix; background-color: var(--global-footer-bg-color); color: var(--global-text-color-light); float: left; margin-left: 0; margin-right: 0; width: 100%; clear: both; /* sticky footer fix start */ position: absolute; bottom: 0em; height: auto; /* sticky footer fix end */ margin-top: 3em; -webkit-animation: intro 0.3s both; animation: intro 0.3s both; -webkit-animation-delay: 0.45s; animation-delay: 0.45s; border-top: 1px solid var(--global-dark-border-color); footer { @include clearfix; margin-left: auto; margin-right: auto; margin-top: 1em; max-width: 100%; padding: 0 1em 1em; @include breakpoint($x-large) { max-width: $x-large; } } a { color: inherit; text-decoration: none; &:hover { text-decoration: underline; } } .fas, .fab, .far, .fal { color: var(--global-text-color-light); } } .page__footer-copyright { font-family: $global-font-family; font-size: $type-size-7; } .page__footer-follow { ul { margin: 0; padding: 0; list-style-type: none; } li { display: inline-block; padding-top: 5px; padding-bottom: 5px; font-family: $sans-serif-narrow; font-size: $type-size-6; text-transform: uppercase; } li + li:before { content: ""; padding-right: 5px; } a { padding-right: 10px; font-weight: bold; } .social-icons { a { white-space: nowrap; } } } ================================================ FILE: _sass/layout/_forms.scss ================================================ /* ========================================================================== Forms ========================================================================== */ form { margin: 0 0 5px 0; fieldset { margin-bottom: 5px; padding: 0; border-width: 0; } legend { display: block; width: 100%; margin-bottom: 5px * 2; *margin-left: -7px; padding: 0; color: var(--global-text-color); border: 0; border-bottom: 1px solid mix(#fff, #000, 80%); white-space: normal; } p { margin-bottom: 5px / 2; } ul { list-style-type: none; margin: 0 0 5px 0; padding: 0; } br { display: none; } } label, input, button, select, textarea { vertical-align: baseline; *vertical-align: middle; } input, button, select, textarea { box-sizing: border-box; font-family: $sans-serif; } label { display: block; margin-bottom: 0.25em; color: var(--global-text-color); cursor: pointer; small { font-size: $type-size-6; } input, textarea, select { display: block; } } input, textarea, select { display: inline-block; width: 100%; padding: 0.25em; margin-bottom: 0.5em; color: var(--global-text-color); background-color: #fff; border: 1px solid mix(#fff, #000, 80%); border-radius: $border-radius; box-shadow: $box-shadow; &:hover { border-color: var(--global-base-color); } } .input-mini { width: 60px; } .input-small { width: 90px; } input[type="image"], input[type="checkbox"], input[type="radio"] { width: auto; height: auto; padding: 0; margin: 3px 0; *margin-top: 0; line-height: normal; cursor: pointer; border-radius: 0; border: 0 \9; } input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; *width: 13px; *height: 13px; } input[type="image"] { border: 0; box-shadow: none; } input[type="file"] { width: auto; padding: initial; line-height: initial; border: initial; background-color: transparent; background-color: initial; box-shadow: none; } input[type="button"], input[type="reset"], input[type="submit"] { width: auto; height: auto; cursor: pointer; *overflow: visible; } select, input[type="file"] { *margin-top: 4px; } select { width: auto; background-color: #fff; } select[multiple], select[size] { height: auto; } textarea { resize: vertical; height: auto; overflow: auto; vertical-align: top; } input[type="hidden"] { display: none; } .form { position: relative; } .radio, .checkbox { padding-left: 18px; font-weight: normal; } .radio input[type="radio"], .checkbox input[type="checkbox"] { float: left; margin-left: -18px; } .radio.inline, .checkbox.inline { display: inline-block; padding-top: 5px; margin-bottom: 0; vertical-align: middle; } .radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { margin-left: 10px; } /* Disabled state ========================================================================== */ input[disabled], select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] { opacity: 0.5; cursor: not-allowed; } /* Focus & active state ========================================================================== */ input:focus, textarea:focus { border-color: var(--global-border-color); outline: 0; outline: thin dotted \9; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus, select:focus { box-shadow: none; } /* Help text ========================================================================== */ .help-block, .help-inline { color: $info-color; } .help-block { display: block; margin-bottom: 1em; line-height: 1em; } .help-inline { display: inline-block; vertical-align: middle; padding-left: 5px; } /* .form-inline ========================================================================== */ .form-inline input, .form-inline textarea, .form-inline select { display: inline-block; margin-bottom: 0; } .form-inline label { display: inline-block; } .form-inline .radio, .form-inline .checkbox, .form-inline .radio { padding-left: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: left; margin-left: 0; margin-right: 3px; } /* .form-search ========================================================================== */ .form-search input, .form-search textarea, .form-search select { display: inline-block; margin-bottom: 0; } .form-search .search-query { padding-left: 14px; padding-right: 14px; margin-bottom: 0; border-radius: 14px; } .form-search label { display: inline-block; } .form-search .radio, .form-search .checkbox, .form-inline .radio { padding-left: 0; margin-bottom: 0; vertical-align: middle; } .form-search .radio input[type="radio"], .form-search .checkbox input[type="checkbox"] { float: left; margin-left: 0; margin-right: 3px; } /* .form--loading ========================================================================== */ .form--loading:before { content: ''; } .form--loading .form__spinner { display: block; } .form:before { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255, 255, 255, 0.7); z-index: 10; } .form__spinner { display: none; position: absolute; top: 50%; left: 50%; z-index: 11; } /* Google search form ========================================================================== */ #goog-fixurl { ul { list-style: none; margin-left: 0; padding-left: 0; li { list-style-type: none; } } } #goog-wm-qt { width: auto; margin-right: 10px; margin-bottom: 20px; padding: 8px 20px; display: inline-block; font-size: $type-size-6; background-color: #fff; color: #000; border-width: 2px !important; border-style: solid !important; border-color: lighten(#000,50); border-radius: $border-radius; } #goog-wm-sb { @extend .btn; } ================================================ FILE: _sass/layout/_json_cv.scss ================================================ /* ========================================================================== JSON CV ========================================================================== */ /* CV Template Styles */ .cv-container { max-width: 1000px; margin: 0 auto; font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: var(--global-text-color); line-height: 1.6; } /* Header Styles */ .cv-header { margin-bottom: 2rem; border-bottom: 2px solid var(--global-thead-color ); padding-bottom: 1rem; } .cv-header h1 { margin-bottom: 0.5rem; color: var(--global-text-color ); } .cv-contact-info { display: flex; flex-wrap: wrap; gap: 1rem; margin-bottom: 0.5rem; } .cv-contact-item { display: flex; align-items: center; gap: 0.5rem; } .cv-profiles { display: flex; gap: 1rem; margin-top: 0.5rem; } .cv-profile-item { display: flex; align-items: center; gap: 0.5rem; } .cv-profile-item a { color: var(--global-link-color); text-decoration: none; } .cv-profile-item a:hover { text-decoration: underline; } /* Section Styles */ .cv-section { margin-bottom: 2rem; } .cv-section h2 { border-bottom: 1px solid var(--global-border-color); padding-bottom: 0.5rem; margin-bottom: 1rem; display: flex; align-items: center; gap: 0.5rem; color: var(--global-text-color); } .cv-section h2 i { color: var(--global-text-color); } /* Item Styles */ .cv-item { margin-bottom: 1.5rem; } .cv-list { list-style-type: none; } .cv-item-header { display: flex; justify-content: space-between; margin-bottom: 0.5rem; } .cv-item-title { font-weight: bold; font-size: 1.1rem; } .cv-item-date { color: var(--global-text-color); } .cv-item-subtitle { color: var(--global-text-color); margin-bottom: 0.5rem; } .cv-item-summary { margin-bottom: 0.5rem; } .cv-item-highlights { margin-top: 0.5rem; padding-left: 1.5rem; } .cv-item-highlights li { margin-bottom: 0.25rem; } .cv-item-courses li { margin-bottom: 0.25rem; } /* Skills Styles */ .cv-skills { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1.5rem; } .cv-skill-category h3 { margin-bottom: 0.5rem; color: var(--global-text-color); } .cv-skill-keywords { display: flex; flex-wrap: wrap; gap: 0.5rem; } .cv-skill-keyword { background-color: var(--global-bg-color); padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.9rem; } /* Project Styles */ .cv-project-keywords { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.5rem; } .cv-project-keyword { background-color: var(--global-bg-color); color: var(--global-thead-color); padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.9rem; } /* Languages Styles */ .cv-languages { display: flex; flex-wrap: wrap; gap: 1rem; } .cv-language { display: flex; flex-direction: column; } .cv-language-name { font-weight: bold; } .cv-language-fluency { color: var(--global-text-color); font-size: 0.9rem; } /* Interests Styles */ .cv-interests { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1.5rem; } .cv-interest h3 { margin-bottom: 0.5rem; color: var(--global-text-color); } .cv-interest-keywords { display: flex; flex-wrap: wrap; gap: 0.5rem; } .cv-interest-keyword { background-color: var(--global-bg-color); padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.9rem; } /* References Styles */ .cv-references { font-style: italic; color: var(--global-text-color); } /* Print Styles */ @media print { .cv-container { max-width: 100%; } .cv-header { border-bottom-color: var(--global-border-color); } .cv-section h2 { border-bottom-color: var(--global-border-color); } .cv-skill-keyword, .cv-project-keyword, .cv-interest-keyword { border: 1px solid var(--global-border-color); background-color: transparent; } } ================================================ FILE: _sass/layout/_masthead.scss ================================================ /* ========================================================================== MASTHEAD ========================================================================== */ .masthead { position: fixed; background: var(--global-bg-color); height: fit-content; top: 0; width: 100%; -webkit-animation: intro 0.3s both; animation: intro 0.3s both; -webkit-animation-delay: 0.15s; animation-delay: 0.15s; z-index: 20; &::after { content: ""; position: absolute; bottom: 0; height: 1px; background: var(--global-border-color); width: 100%; } &__inner-wrap { @include container; @include clearfix; padding: 0.5em 1em; font-family: $sans-serif-narrow; @include breakpoint($x-large) { max-width: $x-large; } nav { z-index: 10; } a { text-decoration: none; } } } .masthead__menu { ul { margin: 0; padding: 0; clear: both; list-style-type: none; } } .masthead__menu-item { background-color: var(--global-bg-color); display: block; list-style-type: none; white-space: nowrap; &--lg { padding-right: 2em; font-weight: 700; } } .masthead__menu-item.selected a { color: var(--global-text-color); font-weight: 700; border-bottom: 2px solid var(--global-text-color); pointer-events: none; /* Move this here */ cursor: default; /* Move this here too */ } .masthead__menu-item.selected a:hover { color: var(--global-text-color); border-bottom: 2px solid var(--global-text-color); /* No need to repeat pointer-events and cursor here */ } ================================================ FILE: _sass/layout/_navigation.scss ================================================ /* ========================================================================== NAVIGATION ========================================================================== */ /* Breadcrumb navigation links ========================================================================== */ .breadcrumbs { @include container; @include clearfix; margin-top: 0; margin-bottom: 0; padding-left: 2em; padding-right: 2em; font-family: $sans-serif; -webkit-animation: intro 0.3s both; animation: intro 0.3s both; -webkit-animation-delay: 0.30s; animation-delay: 0.30s; @include breakpoint($large) { padding-left: 1em; padding-right: 1em; } @include breakpoint($x-large) { max-width: $x-large; } ol { padding: 0; list-style: none; font-size: $type-size-6; @include breakpoint($large) { @include span(10 of 12 last); } @include breakpoint($x-large) { @include prefix(0.5 of 12); } } li { display: inline; } .current { font-weight: bold; } } /* Post pagination navigation links ========================================================================== */ .pagination { @include full(); @include clearfix(); margin-top: 1em; padding-top: 1em; ul { margin: 0; padding: 0; list-style-type: none; font-family: $sans-serif; } li { display: block; float: left; margin-left: -1px; a { margin-bottom: 0.25em; padding: 0.5em 1em; font-family: $sans-serif; font-size: 14px; font-weight: bold; line-height: 1.5; text-align: center; text-decoration: none; color: var(--global-text-color-light); border: 1px solid var(--global-border-color); border-radius: 0; &:hover { color: var(--global-link-color-hover); } &.current { color: #fff; background: var(--global-base-color); } &.disabled { color: var(--global-text-color-light); pointer-events: none; cursor: not-allowed; } } &:first-child { margin-left: 0; a { border-top-left-radius: $border-radius; border-bottom-left-radius: $border-radius; } } &:last-child { a { border-top-right-radius: $border-radius; border-bottom-right-radius: $border-radius; } } } /* next/previous buttons */ &--pager { display: block; padding: 1em 2em; float: left; width: 50%; font-family: $sans-serif; font-size: $type-size-5; font-weight: bold; text-align: center; text-decoration: none; color: var(--global-text-color-light); border: 1px solid var(--global-border-color); border-radius: $border-radius; &:hover { color: var(--global-link-color-hover); } &:first-child { border-top-right-radius: 0; border-bottom-right-radius: 0; } &:last-child { margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; } &.disabled { color: var(--global-text-color-light); pointer-events: none; cursor: not-allowed; } } } .page__content + .pagination, .page__meta + .pagination, .page__share + .pagination, .page__comments + .pagination { margin-top: 2em; padding-top: 2em; border-top: 1px solid var(--global-border-color); } /* Priority plus navigation ========================================================================== */ .greedy-nav { position: relative; min-width: 250px; background: var(--global-bg-color); a { display: block; margin: 0 1rem; padding: 0.5rem 0; color: var(--global-masthead-link-color); text-decoration: none; &:hover { color: var(--global-masthead-link-color-hover); } } button { position: absolute; height: 2.5rem; right: 0; padding: 0 0.5rem; border: 0; outline: none; background-color: var(--global-bg-color); color: var(--global-text-color); cursor: pointer; z-index: 100; } .visible-links { display: table; li { display: table-cell; vertical-align: middle; &:first-child { font-weight: bold; text-wrap: wrap; a { margin-left: 0; } } &:last-child { a { margin-right: 0; } } } #theme-toggle { a { width: 25px; display: flex; justify-content: center; cursor: pointer; } } a { position: relative; &:before { content: ""; position: absolute; left: 0; bottom: 0; height: 4px; background: var(--global-border-color); width: 100%; -webkit-transition: $global-transition; transition: $global-transition; -webkit-transform: scaleX(0); -ms-transform: scaleX(0); transform: scaleX(0); /* hide*/ } &:hover:before { -webkit-transform: scaleX(1); -ms-transform: scaleX(1); transform: scaleX(1); /* reveal*/ } } } .hidden-links { position: absolute; top: 100%; right: 0; margin-top: 15px; padding: 5px; border: 1px solid var(--global-border-color); border-radius: $border-radius; background: var(--global-bg-color); box-shadow: 0 0 10px rgba(#000, 0.25); a { margin: 0; padding: 10px 20px; font-size: $type-size-5; &:hover { color: var(--global-masthead-link-color-hover); background: var(--global-border-color); } } &:before { content: ""; position: absolute; top: -11px; right: 10px; width: 0; border-style: solid; border-width: 0 10px 10px; border-color: var(--global-border-color) transparent; display: block; z-index: 0; } &:after { content: ""; position: absolute; top: -10px; right: 10px; width: 0; border-style: solid; border-width: 0 10px 10px; border-color: var(--global-bg-color) transparent; display: block; z-index: 1; } li { display: block; border-bottom: 1px solid var(--global-border-color); &:last-child { border-bottom: none; } } } } /* Navigation list ========================================================================== */ .nav__list { font-size: 1.25rem; ul { margin-bottom: 1em; } a { display: block; padding: 0.125em 0; color: inherit; &:hover { text-decoration: underline; } } .active { margin-left: -0.5em; padding-left: 0.5em; padding-right: 0.5em; color: #fff; font-weight: bold; background: var(--global-base-color); border-radius: $border-radius; &:hover { color: #fff; } } } .nav__title { margin: 0; padding: 0.5rem 1rem; font-family: $sans-serif-narrow; font-size: $type-size-5; font-weight: bold; } .nav__sub-title { display: block; margin: 0.5rem 0; padding: 0.5rem 0; font-family: $sans-serif-narrow; font-size: $type-size-6; font-weight: bold; text-transform: uppercase; border-bottom: 1px solid var(--global-border-color); } /* Table of contents navigation ========================================================================== */ .toc { font-family: $sans-serif-narrow; color: var(--global-text-color-light); text-transform: uppercase; letter-spacing: 1px; background-color: #fff; border: 1px solid var(--global-border-color); border-radius: $border-radius; box-shadow: $box-shadow; .nav__title { color: #fff; font-size: $type-size-6; background: var(--global-base-color); border-top-left-radius: $border-radius; border-top-right-radius: $border-radius; } } .toc__menu { margin: 0; padding: 0; width: 100%; list-style: none; font-size: 0.8rem; a { display: block; padding: 0.5rem 1rem; color: var(--global-code-text-color); font-size: $type-size-7; font-weight: bold; line-height: 1.5; border-bottom: 1px solid var(--global-border-color); text-decoration-line: none !important; &:hover { color: #000; background: var(--global-link-color-hover); } } > li:last-child { a { border-bottom: none; } } li ul > li a { padding-left: 2rem; font-weight: normal; } /* hide sub sub links on small screens*/ li > ul li { display: none; @include breakpoint($medium) { display: block; } } } ================================================ FILE: _sass/layout/_notices.scss ================================================ /* ========================================================================== NOTICE TEXT BLOCKS ========================================================================== */ /** * Default Kramdown usage (no indents!): *
    * #### Headline for the Notice * Text for the notice *
    */ @mixin notice($notice-color) { margin: 2em 0 !important; /* override*/ padding: 1em; font-family: $global-font-family; font-size: $type-size-6 !important; text-indent: initial; /* override*/ background-color: mix(#fff, $notice-color, 90%); border-radius: $border-radius; box-shadow: 0 1px 1px rgba($notice-color, 0.25); color: var(--global-code-text-color); h4 { margin-top: 0 !important; /* override*/ margin-bottom: 0.75em; } @at-root .page__content #{&} h4 { /* using at-root to override .page-content h4 font size*/ margin-bottom: 0; font-size: 1em; } p { &:last-child { margin-bottom: 0 !important; /* override*/ } } h4 + p { /* remove space above paragraphs that appear directly after notice headline*/ margin-top: 0; padding-top: 0; } a { color: $notice-color; &:hover { color: mix(#000, $notice-color, 40%); } } code { background-color: mix(#fff, $notice-color, 95%) } ul { &:last-child { margin-bottom: 0; /* override*/ } } } /* Default notice */ .notice { @include notice($notice-color); } /* Primary notice */ .notice--primary { @include notice($notice-color); } /* Info notice */ .notice--info { @include notice($info-color); } /* Warning notice */ .notice--warning { @include notice($warning-color); } /* Success notice */ .notice--success { @include notice($success-color); } /* Danger notice */ .notice--danger { @include notice($danger-color); } ================================================ FILE: _sass/layout/_page.scss ================================================ /* ========================================================================== SINGLE PAGE/POST ========================================================================== */ #main { @include container; @include clearfix; margin-top: 2em; padding-left: 1em; padding-right: 1em; animation: intro 0.3s both; animation-delay: 0.35s; @include breakpoint($x-large) { max-width: $x-large; } } .page { @include breakpoint($large) { @include span(10 of 12 last); @include prefix(0.5 of 12); @include suffix(2 of 12); } .page__inner-wrap { @include full(); .page__content, .page__meta, .page__share { @include full(); } } } .page__title { margin-top: 0; line-height: 1; & + .page__meta { margin-top: -0.5em; } } .page__lead { font-family: $global-font-family; font-size: $type-size-4; } .page__content { h2 { padding-bottom: 0.5em; border-bottom: 1px solid var(--global-border-color); } p, li, dl { font-size: 1em; } /* paragraph indents */ p { margin: 0 0 $indent-var; /* sibling indentation*/ @if $paragraph-indent == true { & + p { text-indent: $indent-var; margin-top: -($indent-var); } } } a { text-decoration: underline; &:hover { text-decoration: underline; img { box-shadow: 0 0 10px rgba(#000, 0.25); } } } dt { margin-top: 1em; font-family: $sans-serif; font-weight: bold; } dd { margin-left: 1em; font-family: $sans-serif; font-size: $type-size-6; } .small { font-size: $type-size-6; } /* blockquote citations */ blockquote + .small { margin-top: -1.5em; padding-left: 1.25rem; } } .page__hero { position: relative; margin-bottom: 2em; @include clearfix; animation: intro 0.3s both; animation-delay: 0.25s; &--overlay { position: relative; margin-bottom: 2em; padding: 3em 0; @include clearfix; background-size: cover; background-repeat: no-repeat; background-position: center; animation: intro 0.3s both; animation-delay: 0.25s; a { color: #fff; } .wrapper { padding-left: 1em; padding-right: 1em; @include breakpoint($x-large) { max-width: $x-large; } } .page__title, .page__meta, .page__lead, .btn { color: #fff; text-shadow: 1px 1px 4px rgba(#000, 0.5); } .page__lead { max-width: $medium; } .page__title { font-size: $type-size-2; @include breakpoint($small) { font-size: $type-size-1; } } } } .page__hero-image { width: 100%; height: auto; -ms-interpolation-mode: bicubic; } .page__hero-caption { position: absolute; bottom: 0; right: 0; margin: 0 auto; padding: 2px 5px; color: #fff; font-family: $caption-font-family; font-size: $type-size-7; background: #000; text-align: right; z-index: 5; opacity: 0.5; border-radius: $border-radius 0 $border-radius 0; @include breakpoint($large) { padding: 5px 10px; } a { color: #fff; text-decoration: none; } } /* Social sharing ========================================================================== */ .page__share { margin-top: 2em; padding-top: 1em; border-top: 1px solid var(--global-border-color); @include breakpoint(max-width $small) { .btn span { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } } } .page__share-title { margin-bottom: 10px; font-size: $type-size-6; text-transform: uppercase; } /* Page meta ========================================================================== */ .page__meta { margin-top: 2em; color: var(--global-text-color-light); font-family: $sans-serif; font-size: $type-size-6; p { margin: 0; } a { color: inherit; } } .page__meta-title { margin-bottom: 10px; font-size: $type-size-6; text-transform: uppercase; } /* Page taxonomy ========================================================================== */ .page__taxonomy { .sep { display: none; } strong { margin-right: 10px; } } .page__taxonomy-item { display: inline-block; margin-right: 5px; margin-bottom: 8px; padding: 5px 10px; text-decoration: none; border: 1px solid var(--global-border-color); border-radius: $border-radius; &:hover { text-decoration: none; color: var(--global-link-color-hover); } } /* Comments ========================================================================== */ .page__comments { @include full(); } .page__comments-title { margin-top: 2rem; margin-bottom: 10px; padding-top: 2rem; font-size: $type-size-6; border-top: 1px solid var(--global-border-color); text-transform: uppercase; } .page__comments-form { padding: 1em; background: var(--global-border-color); transition: $global-transition; &.disabled { input, button, textarea, label { pointer-events: none; cursor: not-allowed; filter: alpha(opacity=65); box-shadow: none; opacity: 0.65; } } } .comment { @include clearfix(); margin: 1em 0; &:not(:last-child) { border-bottom: 1px solid var(--global-border-color); } } .comment__avatar-wrapper { float: left; width: 60px; height: 60px; @include breakpoint($large) { width: 100px; height: 100px; } } .comment__avatar { width: 40px; height: 40px; border-radius: 50%; @include breakpoint($large) { width: 80px; height: 80px; padding: 5px; border: 1px solid var(--global-border-color); } } .comment__content-wrapper { float: right; width: calc(100% - 60px); @include breakpoint($large) { width: calc(100% - 100px); } } .comment__author { margin: 0; a { text-decoration: none; } } .comment__date { @extend .page__meta; margin: 0; a { text-decoration: none; } } /* Related ========================================================================== */ .page__related { margin-top: 2em; padding-top: 1em; border-top: 1px solid var(--global-border-color); @include clearfix(); float: left; @include breakpoint($large) { @include pre(2.5 of 12); } a { color: inherit; text-decoration: none; } } .page__related-title { margin-bottom: 10px; font-size: $type-size-6; text-transform: uppercase; } ================================================ FILE: _sass/layout/_reset.scss ================================================ /* ========================================================================== STYLE RESETS ========================================================================== */ @include border-box-sizing; html { /* apply a natural box layout model to all elements */ box-sizing: border-box; background-color: var(--global-bg-color); font-size: 16px; @include breakpoint($medium) { font-size: 18px; } -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } /* Remove margin */ body { margin: 0; } /* Selected elements */ ::-moz-selection { color: #fff; background: #000; } ::selection { color: #fff; background: #000; } /* Display HTML5 elements in IE6-9 and FF3 */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section { display: block; } /* Display block in IE6-9 and FF3 */ audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } /* Prevents modern browsers from displaying 'audio' without controls */ audio:not([controls]) { display: none; } a { color: var(--global-link-color); } /* Apply focus state */ a:focus { @extend %tab-focus; } /* Remove outline from links */ a:hover, a:active { outline: 0; } /* Prevent sub and sup affecting line-height in all browsers */ sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* img border in anchor's and image quality */ img { /* Responsive images (ensure images don't scale beyond their parents) */ max-width: 100%; /* part 1: Set a maximum relative to the parent*/ width: auto\9; /* IE7-8 need help adjusting responsive images*/ height: auto; /* part 2: Scale the height according to the width, otherwise you get stretching*/ vertical-align: middle; border: 0; -ms-interpolation-mode: bicubic; } /* Prevent max-width from affecting Google Maps */ #map_canvas img, .google-maps img { max-width: none; } /* Consistent form font size in all browsers, margin changes, misc */ button, input, select, textarea { margin: 0; font-size: 100%; vertical-align: middle; } button, input { *overflow: visible; /* inner spacing ie IE6/7*/ line-height: normal; /* FF3/4 have !important on line-height in UA stylesheet*/ } button::-moz-focus-inner, input::-moz-focus-inner { /* inner padding and border oddities in FF3/4*/ padding: 0; border: 0; } button, html input[type="button"], // avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* corrects inability to style clickable `input` types in iOS*/ cursor: pointer; /* improves usability and consistency of cursor style between image-type `input` and others*/ } label, select, button, input[type="button"], input[type="reset"], input[type="submit"], input[type="radio"], input[type="checkbox"] { cursor: pointer; /* improves usability and consistency of cursor style between image-type `input` and others*/ } input[type="search"] { /* Appearance in Safari/Chrome*/ box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; /* inner-padding issues in Chrome OSX, Safari 5*/ } textarea { overflow: auto; /* remove vertical scrollbar in IE6-9*/ vertical-align: top; /* readability and alignment cross-browser*/ } ================================================ FILE: _sass/layout/_sidebar.scss ================================================ /* ========================================================================== SIDEBAR ========================================================================== */ /* Default ========================================================================== */ .sidebar { -webkit-transform: translate3d(0, 0 , 0); transform: translate3d(0, 0 , 0); @include clearfix(); margin-bottom: 1em; @media (orientation: portrait) { margin-top: 1em; } @media screen and (min-width: $sidebar-screen-min-width) { height: 100vh; overflow-y: auto; // Add scrollbar if the sidebar is too long position: fixed; padding-top: $masthead-height; } @include breakpoint($large) { @include span(2 of 12); opacity: 1; -webkit-transition: opacity 0.2s ease-in-out; transition: opacity 0.2s ease-in-out; &:hover { opacity: 1; } } @include breakpoint($x-large) { max-width: $sidebar-link-max-width; padding-right: 0; } h2, h3, h4, h5, h6 { margin-bottom: 0; font-family: $sans-serif-narrow; } h3, h4 { font-size: $type-size-5; } p, li { font-family: $sans-serif; font-size: $type-size-6; line-height: 1.5; } img { width: 100%; } } .sidebar__right { margin-bottom: 1em; @include breakpoint($large) { position: relative; float: right; width: $right-sidebar-width-narrow; margin-left: span(0.5 of 12); z-index: 10; } @include breakpoint($x-large) { width: $right-sidebar-width; } } /* Table of contents ========================================================================== */ .toc { background-color: var(--global-toc-bg-color); border: 1px solid var(--global-border-color); border-radius: $border-radius; box-shadow: $box-shadow; padding: 1em; .nav__title { color: var(--global-text-color); font-size: $type-size-6; background: transparent; border: 0; padding: 0; } .toc__menu { margin: 0; padding: 0; width: 100%; list-style: none; font-size: $type-size-6; a { display: block; padding: 0.25rem 0; color: var(--global-text-color); font-size: $type-size-7; font-weight: normal; line-height: 1.5; border-bottom: 0; &:hover { text-decoration: underline; } } > li > a { font-weight: bold; } li ul > li a { padding-left: 1rem; font-weight: normal; } li ul li ul > li a { padding-left: 2rem; } li ul li ul li ul > li a { padding-left: 3rem; } } } /* Author profile and links ========================================================================== */ .author__avatar { display: table-cell; vertical-align: top; width: 36px; // set width only, for non-square avatars // height: 36px; @include breakpoint($large) { display: block; width: auto; height: auto; } img { max-width: 175px; border-radius: 50%; @include breakpoint($large) { padding: 5px; border: 1px solid var(--global-border-color); } } } .author__content { display: table-cell; vertical-align: top; padding-left: 15px; padding-right: 25px; line-height: 1; @include breakpoint($large) { display: block; width: 100%; padding-left: 0; padding-right: 0; } } .author__name { margin: 0; @include breakpoint($large) { margin-top: 10px; margin-bottom: 10px; } } .sidebar .author__name { font-family: $sans-serif; font-size: $type-size-5; } .sidebar .author__desktop { display: none; @media screen and (min-width: 1024px) { display: block; } } .author__pronouns { margin: 0; @include breakpoint($large) { margin-top: 10px; margin-bottom: 10px; } } .author__bio { margin: 0; @include breakpoint($large) { margin-top: 10px; margin-bottom: 20px; } } .author__urls-wrapper { position: relative; display: table-cell; vertical-align: middle; font-family: $sans-serif; z-index: 10; position: relative; cursor: pointer; li:last-child { a { margin-bottom: 0; } } @include breakpoint($large) { display: block; } button { margin-bottom: 0; @include breakpoint($large) { display: none; } } } .author__urls { display: none; position: absolute; right: 0; margin-top: 15px; padding: 10px; list-style-type: none; border: 1px solid var(--global-border-color); border-radius: $border-radius; background: var(--global-bg-color); z-index: -1; box-shadow: 0 0 10px rgba(#000, 0.25); cursor: default; @include breakpoint($large) { display: block; position: relative; margin: 0; padding: 0; border: 0; background: transparent; box-shadow: none; } &:before { display: block; content: ""; position: absolute; top: -11px; left: calc(50% - 10px); width: 0; border-style: solid; border-width: 0 10px 10px; border-color: var(--global-border-color) transparent; z-index: 0; @include breakpoint($large) { display: none; } } &:after { display: block; content: ""; position: absolute; top: -10px; left: calc(50% - 10px); width: 0; border-style: solid; border-width: 0 10px 10px; border-color: #fff transparent; z-index: 1; @include breakpoint($large) { display: none; } } li { white-space: nowrap; } a { display: block; margin-bottom: 5px; padding-right: 5px; padding-top: 2px; padding-bottom: 2px; color: inherit; font-size: $type-size-5; text-decoration: none; &:hover { text-decoration: underline; } } } ================================================ FILE: _sass/layout/_tables.scss ================================================ /* ========================================================================== TABLES ========================================================================== */ table { margin-bottom: 1em; width: 100%; font-family: $global-font-family; font-size: $type-size-6; border-collapse: collapse; border: 1px solid var(--global-border-color); & + table { margin-top: 1em; } } thead { background-color: var(--global-border-color); border-bottom: 1px solid var(--global-border-color); } th { padding: 0.5em; font-weight: bold; text-align: left; border-right: 1px solid var(--global-border-color); } td { padding: 0.5em; border-bottom: 1px solid var(--global-border-color); border-right: 1px solid var(--global-border-color); } tr, td, th { vertical-align: middle; } ================================================ FILE: _sass/theme/_air_dark.scss ================================================ /* ========================================================================== AIR THEME - DARK VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #00adb5; $dark-primary-color : mix(#000, $primary-color, 40%); $darker-primary-color : mix(#000, $primary-color, 60%); $light-primary-color : mix(#000, $primary-color, 50%); $background : #252a34; $background-light : mix(#fff, $background, 20%); $background-lighter : mix(#fff, $background, 90%); $text : #eaeaea; $link : mix($primary-color, $text, 40%); $link-dark : mix(#000, $link, 25%); $link-light : mix(#fff, $link, 25%); $footer : mix(#000, $background, 30%); /* Color codes used for the site */ $danger-color : #ee5f5b; $info-color : #2f7f93; $notice-color : #7a8288; $success-color : #62c462; $warning-color : #f89406; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Dark theme for the site */ html[data-theme="dark"] { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$light-primary-color}; --global-dark-border-color : #{$background-light}; --global-code-background-color : #fafafa; --global-code-text-color : #{$darker-primary-color}; --global-fig-caption-color : #{$light-primary-color}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #{$light-primary-color}; --global-thead-color : #{$background-lighter}; } ================================================ FILE: _sass/theme/_air_light.scss ================================================ /* ========================================================================== AIR THEME - LIGHT VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #0092ca; $dark-primary-color : mix(#000, $primary-color, 40%); $darker-primary-color : mix(#000, $primary-color, 60%); $light-primary-color : mix(#000, $primary-color, 50%); $background : #eeeeee; $background-light : mix(#fff, $background, 20%); $background-lighter : mix(#fff, $background, 90%); $text : #222831; $link : #393e46; $link-dark : mix(#000, $link, 25%); $link-light : mix(#fff, $link, 25%); $footer : $primary-color; /* Color codes used for the site */ $danger-color : #ee5f5b; $info-color : #2f7f93; $notice-color : #7a8288; $success-color : #62c462; $warning-color : #f89406; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Light theme for the site */ :root { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$light-primary-color}; --global-dark-border-color : #{$background-light}; --global-code-background-color : #fafafa; --global-code-text-color : #{$darker-primary-color}; --global-fig-caption-color : #{$light-primary-color}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #{$light-primary-color}; --global-thead-color : #{$background-lighter}; } ================================================ FILE: _sass/theme/_contrast_dark.scss ================================================ /* ========================================================================== CONTRAST THEME - DARK VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #ff6c60; $background : #000000; $background-light : #1a1a1a; $background-lighter : #2a2a2a; $text : #ffffff; $text-muted : #d9d9d9; $link : #96cbfe; $link-dark : #c6c5fe; $link-light : #ff73fd; $footer : #000000; $border : #4d4d4d; $border-light : #666666; $selection-bg : #264f78; $selection-text : #ffffff; /* Color codes used for the site */ $danger-color : #ff6c60; $info-color : #96cbfe; $notice-color : #ffffff; $success-color : #a8ff60; $warning-color : #e9c062; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Dark theme for the site */ html[data-theme="dark"] { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$border}; --global-dark-border-color : #{$border-light}; --global-code-background-color : #{$background-light}; --global-code-text-color : #{$text-muted}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$background-lighter}; --global-toc-bg-color : #{$background-light}; --global-selection-bg-color : #{$selection-bg}; --global-selection-text-color : #{$selection-text}; } /* Text selection styling for dark theme */ html[data-theme="dark"] ::selection { background-color: var(--global-selection-bg-color); color: var(--global-selection-text-color); } html[data-theme="dark"] ::-moz-selection { background-color: var(--global-selection-bg-color); color: var(--global-selection-text-color); } /* Override notice colors for high contrast in dark mode */ html[data-theme="dark"] { .page__content { .notice, .notice--primary, .notice--info, .notice--warning, .notice--success, .notice { background-color: mix($background, $notice-color, 85%); color: #{$text}; border-color: #{$text}; } .notice--primary { background-color: mix($background, $notice-color, 85%); color: #{$text}; border-color: #{$text}; } .notice--info { background-color: mix($background, $info-color, 85%); color: #{$text}; border-color: #{$text}; } .notice--warning { background-color: mix($background, $warning-color, 85%); color: #{$text}; border-color: #{$text}; } .notice--success { background-color: mix($background, $success-color, 85%); color: #{$text}; border-color: #{$text}; } .notice--danger { background-color: mix($background, $danger-color, 85%); color: #{$text}; border-color: #{$text}; } } .page__footer { color: #{$text}; } } ================================================ FILE: _sass/theme/_contrast_light.scss ================================================ /* ========================================================================== CONTRAST THEME - LIGHT VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #b60000; $dark-primary-color : mix(#000, $primary-color, 40%); $darker-primary-color : mix(#000, $primary-color, 60%); $light-primary-color : mix(#fff, $primary-color, 50%); $lighter-primary-color : mix(#fff, $primary-color, 90%); $background : #ffffff; $background-light : #fafafa; $background-lighter : #ffffff; $text : #000000; $text-muted : #404040; $link : #0000ff; $link-dark : #0000cc; $link-light : #3333ff; $footer : #ffffff; $border : #c0c0c0; $border-dark : #808080; $selection-bg : #b3d4fc; $selection-text : #000000; /* Color codes used for the site */ $danger-color : #ff0000; $info-color : #0000ff; $notice-color : #000000; $success-color : #008000; $warning-color : #ff8800; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Light theme for the site */ :root { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$border}; --global-dark-border-color : #{$border-dark}; --global-code-background-color : #{$background-light}; --global-code-text-color : #{$text}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$primary-color}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$border}; --global-toc-bg-color : #{$background-light}; --global-selection-bg-color : #{$selection-bg}; --global-selection-text-color : #{$selection-text}; } /* Text selection styling for light theme */ ::selection { background-color: var(--global-selection-bg-color); color: var(--global-selection-text-color); } ::-moz-selection { background-color: var(--global-selection-bg-color); color: var(--global-selection-text-color); } /* Override notice colors for high contrast */ .page__content { .notice, .notice--primary, .notice--info, .notice--warning, .notice--success, .notice--danger { color: #{$text}; border-color: #{$text}; } } html:not([data-theme="dark"]) footer { color: #000000; } // Do not change the color of the social icons in the feed icons .page__footer-follow .social-icons i:not(.fa-rss-square), .page__footer-follow .social-icons .svg-inline--fa:not(.fa-rss-square) { color: inherit; } ================================================ FILE: _sass/theme/_default_dark.scss ================================================ /* ========================================================================== DEFAULT THEME - DARK VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #0ea1c5; $gray : #7a8288; $dark-gray : mix(#000, $gray, 40%); $darker-gray : mix(#000, $gray, 60%); $light-gray : mix(#fff, $gray, 50%); $background : #474747; $background-light : mix(#fff, $background, 80%); $background-lighter : mix(#fff, $background, 90%); $text : #ffffff; $link : #0ea1c5; $link-dark : mix(#000, $link, 25%); $link-light : mix(#fff, $link, 25%); /* Color codes used for the site */ $danger-color : #ee5f5b; $info-color : #2f7f93; $notice-color : #7a8288; $success-color : #62c462; $warning-color : #f89406; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Dark theme for the site */ html[data-theme="dark"] { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$background}; --global-border-color : #{$light-gray}; --global-dark-border-color : #{$background-light}; --global-code-background-color : #fafafa; --global-code-text-color : #{$darker-gray}; --global-fig-caption-color : #{$light-gray}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #f3f3f3; --global-thead-color : #{$background-lighter}; } ================================================ FILE: _sass/theme/_default_light.scss ================================================ /* ========================================================================== DEFAULT THEME - LIGHT VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #2f7f93; $gray : #7a8288; $dark-gray : mix(#000, $gray, 40%); $darker-gray : mix(#000, $gray, 60%); $light-gray : mix(#fff, $gray, 50%); $lighter-gray : mix(#fff, $gray, 90%); /* Color codes used for the site */ $danger-color : #ee5f5b; $info-color : #2f7f93; $notice-color : #7a8288; $success-color : #62c462; $warning-color : #f89406; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Default light theme for the site */ :root { --global-base-color : #{$primary-color}; --global-bg-color : #fff; --global-footer-bg-color : #f2f3f3; --global-border-color : #{$lighter-gray}; --global-dark-border-color : #bdc1c4; --global-code-background-color : #fafafa; --global-code-text-color : #{$darker-gray}; --global-fig-caption-color : mix(#fff, #{$dark-gray}, 25%); --global-link-color : #52adc8; --global-link-color-hover : mix(#000, #2f7f93, 25%); --global-link-color-visited : mix(#fff, #2f7f93, 25%); --global-masthead-link-color : #{$dark-gray}; --global-masthead-link-color-hover : mix(#000, #{$gray}, 25%); --global-text-color : #{$dark-gray}; --global-text-color-light : #{$light-gray}; --global-thead-color : #{$lighter-gray}; } ================================================ FILE: _sass/theme/_dirt_dark.scss ================================================ /* ========================================================================== DIRT THEME - DARK VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #b49368; $dark-primary-color : mix(#000, $primary-color, 40%); $darker-primary-color : mix(#000, $primary-color, 60%); $light-primary-color : mix(#fff, $primary-color, 50%); $lighter-primary-color : mix(#fff, $primary-color, 90%); $background : #231e18; $background-light : #302b25; $background-lighter : #48413a; $text : #e4d4c8; $text-muted : #cabcb1; $link : #d7c8bc; $link-dark : #e4d4c8; $link-light : #b4a490; $footer : #302b25; $border : #48413a; $border-light : #5c5346; /* Color codes used for the site */ $danger-color : #d35c5c; $info-color : #88a4d3; $notice-color : #ca7f32; $success-color : #b7ba53; $warning-color : #e0ac16; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Dark theme for the site */ html[data-theme="dark"] { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$border}; --global-dark-border-color : #{$border-light}; --global-code-background-color : #{$background-light}; --global-code-text-color : #{$text-muted}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$background-lighter}; } /* Footer styling for dark mode */ html[data-theme="dark"] { footer { color: #{$text}; }} ================================================ FILE: _sass/theme/_dirt_light.scss ================================================ $primary-color : #343434; $dark-primary-color : mix(#000, $primary-color, 40%); $darker-primary-color : mix(#000, $primary-color, 60%); $light-primary-color : mix(#fff, $primary-color, 50%); $lighter-primary-color : mix(#fff, $primary-color, 90%); $background : #f3f3f3; $background-light : #fafafa; $background-lighter : #ffffff; $text : #343434; $text-muted : #8e8b82; $link : #343434; $link-dark : mix(#000, $link, 25%); $link-light : mix(#fff, $link, 25%); $footer : #e9dcbe; $border : #e9dcbe; $border-light : mix(#fff, $border, 50%); /* Color codes used for the site */ $danger-color : #d35c5c; $info-color : #88a4d3; $notice-color : #b49368; $success-color : #6eb958; $warning-color : #e0ac16; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Light theme for the site */ :root { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$border}; --global-dark-border-color : #{$text-muted}; --global-code-background-color : #{$background-lighter}; --global-code-text-color : #{$darker-primary-color}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$text-muted}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$border-light}; } footer { color: #{$text}; } // Do not change the color of the social icons in the feed icons .page__footer-follow .social-icons i:not(.fa-rss-square), .page__footer-follow .social-icons .svg-inline--fa:not(.fa-rss-square) { color: inherit; } ================================================ FILE: _sass/theme/_mint_dark.scss ================================================ /* ========================================================================== MINT THEME - DARK VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #30e3ca; $background : #1a2421; $background-light : #243430; $background-lighter : #2e443f; $text : #e8f5f3; $text-muted : #b8d5d1; $link : #4effd9; $link-dark : #7cffdf; $link-light : #2bd4bd; $footer : #0f1614; $border : #2e443f; $border-light : #3d5950; /* Color codes used for the site */ $danger-color : #e74c3c; $info-color : #4effd9; $notice-color : #30e3ca; $success-color : #2ecc71; $warning-color : #f39c12; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Dark theme for the site */ html[data-theme="dark"] { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$border}; --global-dark-border-color : #{$border-light}; --global-code-background-color : #{$background-light}; --global-code-text-color : #{$text-muted}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$background-lighter}; } /* Footer styling for dark mode */ html[data-theme="dark"] { footer { color: #{$text}; } } ================================================ FILE: _sass/theme/_mint_light.scss ================================================ /* ========================================================================== MINT THEME - LIGHT VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #11999e; $dark-primary-color : mix(#000, $primary-color, 40%); $darker-primary-color : mix(#000, $primary-color, 60%); $light-primary-color : mix(#fff, $primary-color, 50%); $lighter-primary-color : mix(#fff, $primary-color, 90%); $background : #f3f6f6; $background-light : #ffffff; $background-lighter : #fafbfb; $text : #40514e; $text-muted : #5c6d6a; $link : #11999e; $link-dark : mix(#000, $link, 25%); $link-light : mix(#fff, $link, 25%); $footer : #30e3ca; $border : mix(#fff, #40514e, 75%); $border-dark : mix(#fff, #40514e, 60%); /* Color codes used for the site */ $danger-color : #e74c3c; $info-color : #11999e; $notice-color : #30e3ca; $success-color : #2ecc71; $warning-color : #f39c12; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Light theme for the site */ :root { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$border}; --global-dark-border-color : #{$border-dark}; --global-code-background-color : #{$background-light}; --global-code-text-color : #{$darker-primary-color}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-dark}; --global-link-color-visited : #{$link-light}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$primary-color}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$lighter-primary-color}; } footer { color: #{$text}; } ================================================ FILE: _sass/theme/_sunrise_dark.scss ================================================ /* ========================================================================== SUNRISE THEME - DARK VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #ff8793; $dark-primary-color : #ff5568; $darker-primary-color : #d4741f; $light-primary-color : #ffb3bb; $lighter-primary-color : #ffd4d9; $background : #1a0f0a; $background-light : #2d1912; $background-lighter : #3d2a1a; $text : #e8d5b7; $text-muted : #b8a590; $link : #ff8793; $link-hover : #ffb3bb; $link-visited : #ff5568; $footer : #2d1912; $border : #3d2a1a; $border-dark : #5a3f28; $code-bg : #0d0806; $code-bg-dark : #0f0907; /* Color codes used for the site */ $danger-color : #ff6b7f; $info-color : #52adc8; $notice-color : #f9b248; $success-color : #78c978; $warning-color : #f9b248; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(255, 255, 255, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Sunset dark theme CSS variables */ html[data-theme="dark"] { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$light-primary-color}; --global-dark-border-color : #{$background-light}; --global-code-background-color : #{$code-bg}; --global-code-text-color : #{$text}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-hover}; --global-link-color-visited : #{$link-visited}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$link-hover}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$background-lighter}; } ================================================ FILE: _sass/theme/_sunrise_light.scss ================================================ /* ========================================================================== SUNRISE THEME - LIGHT VERSION ========================================================================== */ /* Color codes used for the theme */ $primary-color : #fc3a52; $dark-primary-color : mix(#000, $primary-color, 40%); $darker-primary-color : mix(#000, $primary-color, 60%); $light-primary-color : mix(#fff, $primary-color, 50%); $lighter-primary-color : mix(#fff, $primary-color, 90%); $background : #e8d5b7; $background-light : mix(#fff, $background, 20%); $background-lighter : #ffffff; $text : #000000; $text-muted : #0e2431; $link : mix(#000, $primary-color, 10%); $link-dark : mix(#000, $link, 25%); $link-light : mix(#fff, $link, 25%); $footer : #f9b248; $border : mix(#000, $background, 20%); $border-dark : mix(#000, $background, 30%); /* Color codes used for the site */ $danger-color : #cc6666; $info-color : #81a2be; $notice-color : #de935f; $success-color : #b5bd68; $warning-color : #f0c674; /* Other basic settings for the template */ $border-radius : 4px; $box-shadow : 0 1px 1px rgba(0, 0, 0, 0.125); $global-transition : all 0.2s ease-in-out; $masthead-height : 70px; $navicon-width : 28px; $navicon-height : 4px; $sidebar-link-max-width : 250px; $sidebar-screen-min-width : 1024px; /* Light theme for the site */ :root { --global-base-color : #{$primary-color}; --global-bg-color : #{$background}; --global-footer-bg-color : #{$footer}; --global-border-color : #{$border}; --global-dark-border-color : #{$border-dark}; --global-code-background-color : #{$background-light}; --global-code-text-color : #{$text-muted}; --global-fig-caption-color : #{$text-muted}; --global-link-color : #{$link}; --global-link-color-hover : #{$link-light}; --global-link-color-visited : #{$link-dark}; --global-masthead-link-color : #{$text}; --global-masthead-link-color-hover : #{$text-muted}; --global-text-color : #{$text}; --global-text-color-light : #{$text-muted}; --global-thead-color : #{$background-light}; } .page__footer-follow .social-icons i, .page__footer-follow .social-icons .svg-inline--fa { color: inherit; } ================================================ FILE: _sass/vendor/breakpoint/_breakpoint.scss ================================================ ////////////////////////////// // Default Variables ////////////////////////////// $Breakpoint-Settings: ( 'default media': all, 'default feature': min-width, 'default pair': width, 'force all media type': false, 'to ems': false, 'transform resolutions': true, 'no queries': false, 'no query fallbacks': false, 'base font size': 16px, 'legacy syntax': false ); $breakpoint: () !default; ////////////////////////////// // Imports ////////////////////////////// @import "settings"; @import "context"; @import "helpers"; @import "parsers"; @import "no-query"; @import "respond-to"; @import "legacy-settings"; ////////////////////////////// // Breakpoint Mixin ////////////////////////////// @mixin breakpoint($query, $no-query: false) { @include legacy-settings-warning; // Reset contexts @include private-breakpoint-reset-contexts(); $breakpoint: breakpoint($query, false); $query-string: map-get($breakpoint, 'query'); $query-fallback: map-get($breakpoint, 'fallback'); $private-breakpoint-context-holder: map-get($breakpoint, 'context holder') !global; $private-breakpoint-query-count: map-get($breakpoint, 'query count') !global; // Allow for an as-needed override or usage of no query fallback. @if $no-query != false { $query-fallback: $no-query; } @if $query-fallback != false { $context-setter: private-breakpoint-set-context('no-query', $query-fallback); } // Print Out Query String @if not breakpoint-get('no queries') { @media #{$query-string} { @content; } } @if breakpoint-get('no query fallbacks') != false or breakpoint-get('no queries') == true { $type: type-of(breakpoint-get('no query fallbacks')); $print: false; @if ($type == 'bool') { $print: true; } @else if ($type == 'string') { @if $query-fallback == breakpoint-get('no query fallbacks') { $print: true; } } @else if ($type == 'list') { @each $wrapper in breakpoint-get('no query fallbacks') { @if $query-fallback == $wrapper { $print: true; } } } // Write Fallback @if ($query-fallback != false) and ($print == true) { $type-fallback: type-of($query-fallback); @if ($type-fallback != 'bool') { #{$query-fallback} & { @content; } } @else { @content; } } } @include private-breakpoint-reset-contexts(); } @mixin mq($query, $no-query: false) { @include breakpoint($query, $no-query) { @content; } } ================================================ FILE: _sass/vendor/breakpoint/_context.scss ================================================ ////////////////////////////// // Private Breakpoint Variables ////////////////////////////// $private-breakpoint-context-holder: (); $private-breakpoint-query-count: 0 !default; ////////////////////////////// // Breakpoint Has Context // Returns whether or not you are inside a Breakpoint query ////////////////////////////// @function breakpoint-has-context() { @if length($private-breakpoint-query-count) { @return true; } @else { @return false; } } ////////////////////////////// // Breakpoint Get Context // $feature: Input feature to get it's current MQ context. Returns false if no context ////////////////////////////// @function breakpoint-get-context($feature) { @if map-has-key($private-breakpoint-context-holder, $feature) { $get: map-get($private-breakpoint-context-holder, $feature); // Special handling of no-query from get side so /false/ prepends aren't returned @if $feature == 'no-query' { @if type-of($get) == 'list' and length($get) > 1 and nth($get, 1) == false { $get: nth($get, length($get)); } } @return $get; } @else { @if breakpoint-has-context() and $feature == 'media' { @return breakpoint-get('default media'); } @else { @return false; } } } ////////////////////////////// // Private function to set context ////////////////////////////// @function private-breakpoint-set-context($feature, $value) { @if $value == 'monochrome' { $feature: 'monochrome'; } $current: map-get($private-breakpoint-context-holder, $feature); @if $current and length($current) == $private-breakpoint-query-count { @warn "You have already queried against `#{$feature}`. Unexpected things may happen if you query against the same feature more than once in the same `and` query. Breakpoint is overwriting the current context with `#{$value}`"; } @if not map-has-key($private-breakpoint-context-holder, $feature) { $v-holder: (); @for $i from 1 to $private-breakpoint-query-count { @if $feature == 'media' { $v-holder: append($v-holder, breakpoint-get('default media')); } @else { $v-holder: append($v-holder, false); } } $v-holder: append($v-holder, $value); $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; } @else { $v-holder: map-get($private-breakpoint-context-holder, $feature); $length: length($v-holder); @for $i from $length to $private-breakpoint-query-count - 1 { @if $feature == 'media' { $v-holder: append($v-holder, breakpoint-get('default media')); } @else { $v-holder: append($v-holder, false); } } $v-holder: append($v-holder, $value); $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; } @return true; } ////////////////////////////// // Private function to reset context ////////////////////////////// @mixin private-breakpoint-reset-contexts { $private-breakpoint-context-holder: () !global; $private-breakpoint-query-count: 0 !global; } ================================================ FILE: _sass/vendor/breakpoint/_helpers.scss ================================================ ////////////////////////////// // Converts the input value to Base EMs ////////////////////////////// @function breakpoint-to-base-em($value) { $value-unit: unit($value); // Will convert relative EMs into root EMs. @if breakpoint-get('base font size') and type-of(breakpoint-get('base font size')) == 'number' and $value-unit == 'em' { $base-unit: unit(breakpoint-get('base font size')); @if $base-unit == 'px' or $base-unit == '%' or $base-unit == 'em' or $base-unit == 'pt' { @return base-conversion($value) / base-conversion(breakpoint-get('base font size')) * 1em; } @else { @warn '#{breakpoint-get(\'base font size\')} is not set in valid units for font size!'; @return false; } } @else { @return base-conversion($value); } } @function base-conversion($value) { $unit: unit($value); @if $unit == 'px' { @return $value / 16px * 1em; } @else if $unit == '%' { @return $value / 100% * 1em; } @else if $unit == 'em' { @return $value; } @else if $unit == 'pt' { @return $value / 12pt * 1em; } @else { @return $value; // @warn 'Everything is terrible! What have you done?!'; } } ////////////////////////////// // Returns whether the feature can have a min/max pair ////////////////////////////// $breakpoint-min-max-features: 'color', 'color-index', 'aspect-ratio', 'device-aspect-ratio', 'device-height', 'device-width', 'height', 'monochrome', 'resolution', 'width'; @function breakpoint-min-max($feature) { @each $item in $breakpoint-min-max-features { @if $feature == $item { @return true; } } @return false; } ////////////////////////////// // Returns whether the feature can have a string value ////////////////////////////// $breakpoint-string-features: 'orientation', 'scan', 'color', 'aspect-ratio', 'device-aspect-ratio', 'pointer', 'luminosity'; @function breakpoint-string-value($feature) { @each $item in $breakpoint-string-features { @if breakpoint-min-max($item) { @if $feature == 'min-#{$item}' or $feature == 'max-#{$item}' { @return true; } } @else if $feature == $item { @return true; } } @return false; } ////////////////////////////// // Returns whether the feature is a media type ////////////////////////////// $breakpoint-media-types: 'all', 'braille', 'embossed', 'handheld', 'print', 'projection', 'screen', 'speech', 'tty', 'tv'; @function breakpoint-is-media($feature) { @each $media in $breakpoint-media-types { @if ($feature == $media) or ($feature == 'not #{$media}') or ($feature == 'only #{$media}') { @return true; } } @return false; } ////////////////////////////// // Returns whether the feature can stand alone ////////////////////////////// $breakpoint-single-string-features: 'color', 'color-index', 'grid', 'monochrome'; @function breakpoint-single-string($feature) { @each $item in $breakpoint-single-string-features { @if $feature == $item { @return true; } } @return false; } ////////////////////////////// // Returns whether the feature ////////////////////////////// @function breakpoint-is-resolution($feature) { $resolutions: 'device-pixel-ratio', 'dpr'; @if breakpoint-get('transform resolutions') { $resolutions: append($resolutions, 'resolution'); } @each $reso in $resolutions { @if index($feature, $reso) or index($feature, 'min-#{$reso}') or index($feature, 'max-#{$reso}') { @return true; } } @return false; } ================================================ FILE: _sass/vendor/breakpoint/_legacy-settings.scss ================================================ @mixin legacy-settings-warning { $legacyVars: ( 'default-media': 'default media', 'default-feature': 'default feature', 'force-media-all': 'force all media type', 'to-ems': 'to ems', 'resolutions': 'transform resolutions', 'no-queries': 'no queries', 'no-query-fallbacks': 'no query fallbacks', 'base-font-size': 'base font size', 'legacy-syntax': 'legacy syntax' ); @each $legacy, $new in $legacyVars { @if global-variable-exists('breakpoint-' + $legacy) { @warn "In order to avoid variable namspace collisions, we have updated the way to change settings for Breakpoint. Please change all instances of `$breakpoint-#{$legacy}: {{setting}}` to `@include breakpoint-set('#{$new}', {{setting}})`. Variable settings, as well as this warning will be deprecated in a future release." } }; ////////////////////////////// // Hand correct each setting ////////////////////////////// @if global-variable-exists('breakpoint-default-media') and $breakpoint-default-media != breakpoint-get('default media') { @include breakpoint-set('default media', $breakpoint-default-media); } @if global-variable-exists('breakpoint-default-feature') and $breakpoint-default-feature != breakpoint-get('default feature') { @include breakpoint-set('default feature', $breakpoint-default-feature); } @if global-variable-exists('breakpoint-force-media-all') and $breakpoint-force-media-all != breakpoint-get('force all media type') { @include breakpoint-set('force all media type', $breakpoint-force-media-all); } @if global-variable-exists('breakpoint-to-ems') and $breakpoint-to-ems != breakpoint-get('to ems') { @include breakpoint-set('to ems', $breakpoint-to-ems); } @if global-variable-exists('breakpoint-resolutions') and $breakpoint-resolutions != breakpoint-get('transform resolutions') { @include breakpoint-set('transform resolutions', $breakpoint-resolutions); } @if global-variable-exists('breakpoint-no-queries') and $breakpoint-no-queries != breakpoint-get('no queries') { @include breakpoint-set('no queries', $breakpoint-no-queries); } @if global-variable-exists('breakpoint-no-query-fallbacks') and $breakpoint-no-query-fallbacks != breakpoint-get('no query fallbacks') { @include breakpoint-set('no query fallbacks', $breakpoint-no-query-fallbacks); } @if global-variable-exists('breakpoint-base-font-size') and $breakpoint-base-font-size != breakpoint-get('base font size') { @include breakpoint-set('base font size', $breakpoint-base-font-size); } @if global-variable-exists('breakpoint-legacy-syntax') and $breakpoint-legacy-syntax != breakpoint-get('legacy syntax') { @include breakpoint-set('legacy syntax', $breakpoint-legacy-syntax); } } ================================================ FILE: _sass/vendor/breakpoint/_no-query.scss ================================================ @function breakpoint-no-query($query) { @if type-of($query) == 'list' { $keyword: nth($query, 1); @if type-of($keyword) == 'string' and ($keyword == 'no-query' or $keyword == 'no query' or $keyword == 'fallback') { @return nth($query, 2); } @else { @return false; } } @else { @return false; } } ================================================ FILE: _sass/vendor/breakpoint/_parsers.scss ================================================ ////////////////////////////// // Import Parser Pieces ////////////////////////////// @import "parsers/query"; @import "parsers/single"; @import "parsers/double"; @import "parsers/triple"; @import "parsers/resolution"; $Memo-Exists: function-exists(memo-get) and function-exists(memo-set); ////////////////////////////// // Breakpoint Function ////////////////////////////// @function breakpoint($query, $contexts...) { $run: true; $return: (); // Grab the Memo Output if Memoization can be a thing @if $Memo-Exists { $return: memo-get(breakpoint, breakpoint $query $contexts); @if $return != null { $run: false; } } @if not $Memo-Exists or $run { // Internal Variables $query-string: ''; $query-fallback: false; $return: (); // Reserve Global Private Breakpoint Context $holder-context: $private-breakpoint-context-holder; $holder-query-count: $private-breakpoint-query-count; // Reset Global Private Breakpoint Context $private-breakpoint-context-holder: () !global; $private-breakpoint-query-count: 0 !global; // Test to see if it's a comma-separated list $or-list: if(list-separator($query) == 'comma', true, false); @if ($or-list == false and breakpoint-get('legacy syntax') == false) { $query-string: breakpoint-parse($query); } @else { $length: length($query); $last: nth($query, $length); $query-fallback: breakpoint-no-query($last); @if ($query-fallback != false) { $length: $length - 1; } @if (breakpoint-get('legacy syntax') == true) { $mq: (); @for $i from 1 through $length { $mq: append($mq, nth($query, $i), comma); } $query-string: breakpoint-parse($mq); } @else { $query-string: ''; @for $i from 1 through $length { $query-string: $query-string + if($i == 1, '', ', ') + breakpoint-parse(nth($query, $i)); } } } $return: ('query': $query-string, 'fallback': $query-fallback, 'context holder': $private-breakpoint-context-holder, 'query count': $private-breakpoint-query-count ); @if length($contexts) > 0 and nth($contexts, 1) != false { @if $query-fallback != false { $context-setter: private-breakpoint-set-context('no-query', $query-fallback); } $context-map: (); @each $context in $contexts { $context-map: map-merge($context-map, ($context: breakpoint-get-context($context))); } $return: map-merge($return, (context: $context-map)); } // Reset Global Private Breakpoint Context $private-breakpoint-context-holder: () !global; $private-breakpoint-query-count: 0 !global; @if $Memo-Exists { $holder: memo-set(breakpoint, breakpoint $query $contexts, $return); } } @return $return; } ////////////////////////////// // General Breakpoint Parser ////////////////////////////// @function breakpoint-parse($query) { // Increase number of 'and' queries $private-breakpoint-query-count: $private-breakpoint-query-count + 1 !global; // Set up Media Type $query-print: ''; $force-all: ((breakpoint-get('force all media type') == true) and (breakpoint-get('default media') == 'all')); $empty-media: true; @if ($force-all == true) or (breakpoint-get('default media') != 'all') { // Force the print of the default media type if (force all is true and default media type is all) or (default media type is not all) $query-print: breakpoint-get('default media'); $empty-media: false; } $query-resolution: false; $query-holder: breakpoint-parse-query($query); // Loop over each parsed out query and write it to $query-print $first: true; @each $feature in $query-holder { $length: length($feature); // Parse a single feature @if ($length == 1) { // Feature is currently a list, grab the actual value $feature: nth($feature, 1); // Media Type must by convention be the first item, so it's safe to flat override $query-print, which right now should only be the default media type @if (breakpoint-is-media($feature)) { @if ($force-all == true) or ($feature != 'all') { // Force the print of the default media type if (force all is true and default media type is all) or (default media type is not all) $query-print: $feature; $empty-media: false; // Set Context $context-setter: private-breakpoint-set-context(media, $query-print); } } @else { $parsed: breakpoint-parse-single($feature, $empty-media, $first); $query-print: '#{$query-print} #{$parsed}'; $first: false; } } // Parse a double feature @else if ($length == 2) { @if (breakpoint-is-resolution($feature) != false) { $query-resolution: $feature; } @else { $parsed: null; // If it's a string/number pair, // we check to see if one is a single-string value, // then we parse it as a normal double $alpha: nth($feature, 1); $beta: nth($feature, 2); @if breakpoint-single-string($alpha) or breakpoint-single-string($beta) { $parsed: breakpoint-parse-single($alpha, $empty-media, $first); $query-print: '#{$query-print} #{$parsed}'; $first: false; $parsed: breakpoint-parse-single($beta, $empty-media, $first); $query-print: '#{$query-print} #{$parsed}'; } @else { $parsed: breakpoint-parse-double($feature, $empty-media, $first); $query-print: '#{$query-print} #{$parsed}'; $first: false; } } } // Parse a triple feature @else if ($length == 3) { $parsed: breakpoint-parse-triple($feature, $empty-media, $first); $query-print: '#{$query-print} #{$parsed}'; $first: false; } } @if ($query-resolution != false) { $query-print: breakpoint-build-resolution($query-print, $query-resolution, $empty-media, $first); } // Loop through each feature that's been detected so far and append 'false' to the the value list to increment their counters @each $f, $v in $private-breakpoint-context-holder { $v-holder: $v; $length: length($v-holder); @if length($v-holder) < $private-breakpoint-query-count { @for $i from $length to $private-breakpoint-query-count { @if $f == 'media' { $v-holder: append($v-holder, breakpoint-get('default media')); } @else { $v-holder: append($v-holder, false); } } } $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($f: $v-holder)) !global; } @return $query-print; } ================================================ FILE: _sass/vendor/breakpoint/_respond-to.scss ================================================ //////////////////////// // Default the Breakpoints variable //////////////////////// $breakpoints: () !default; $BREAKPOINTS: () !default; //////////////////////// // Respond-to API Mixin //////////////////////// @mixin respond-to($context, $no-query: false) { @if length($breakpoints) > 0 and length($BREAKPOINTS) == 0 { @warn "In order to avoid variable namespace collisions, we have updated the way to add breakpoints for respond-to. Please change all instances of `$breakpoints: add-breakpoint()` to `@include add-breakpoint()`. The `add-breakpoint()` function will be deprecated in a future release."; $BREAKPOINTS: $breakpoints !global; $breakpoints: () !global; } @if type-of($BREAKPOINTS) != 'map' { // Just in case someone writes gibberish to the $breakpoints variable. @warn "Your breakpoints aren't a map! `respond-to` expects a map. Please check the value of $BREAKPOINTS variable."; @content; } @else if map-has-key($BREAKPOINTS, $context) { @include breakpoint(map-get($BREAKPOINTS, $context), $no-query) { @content; } } @else if not map-has-key($BREAKPOINTS, $context) { @warn "`#{$context}` isn't a defined breakpoint! Please add it using `$breakpoints: add-breakpoint(`#{$context}`, $value);`"; @content; } @else { @warn "You haven't created any breakpoints yet! Make some already! `@include add-breakpoint($name, $bkpt)`"; @content; } } ////////////////////////////// // Add Breakpoint to Breakpoints // TODO: Remove function in next release ////////////////////////////// @function add-breakpoint($name, $bkpt, $overwrite: false) { $output: ($name: $bkpt); @if length($breakpoints) == 0 { @return $output; } @else { @if map-has-key($breakpoints, $name) and $overwrite != true { @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; @return $breakpoints; } @else if not map-has-key($breakpoints, $name) or $overwrite == true { @return map-merge($breakpoints, $output); } } } @mixin add-breakpoint($name, $bkpt, $overwrite: false) { $output: ($name: $bkpt); @if length($BREAKPOINTS) == 0 { $BREAKPOINTS: $output !global; } @else { @if map-has-key($BREAKPOINTS, $name) and $overwrite != true { @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; $BREAKPOINTS: $BREAKPOINTS !global; } @else if not map-has-key($BREAKPOINTS, $name) or $overwrite == true { $BREAKPOINTS: map-merge($BREAKPOINTS, $output) !global; } } } @function get-breakpoint($name: false) { @if $name == false { @return $BREAKPOINTS; } @else { @return map-get($BREAKPOINTS, $name); } } ================================================ FILE: _sass/vendor/breakpoint/_settings.scss ================================================ ////////////////////////////// // Has Setting ////////////////////////////// @function breakpoint-has($setting) { @if map-has-key($breakpoint, $setting) { @return true; } @else { @return false; } } ////////////////////////////// // Get Settings ////////////////////////////// @function breakpoint-get($setting) { @if breakpoint-has($setting) { @return map-get($breakpoint, $setting); } @else { @return map-get($Breakpoint-Settings, $setting); } } ////////////////////////////// // Set Settings ////////////////////////////// @function breakpoint-set($setting, $value) { @if (str-index($setting, '-') or str-index($setting, '_')) and str-index($setting, ' ') == null { @warn "Words in Breakpoint settings should be separated by spaces, not dashes or underscores. Please replace dashes and underscores between words with spaces. Settings will not work as expected until changed."; } $breakpoint: map-merge($breakpoint, ($setting: $value)) !global; @return true; } @mixin breakpoint-change($setting, $value) { $breakpoint-change: breakpoint-set($setting, $value); } @mixin breakpoint-set($setting, $value) { @include breakpoint-change($setting, $value); } @mixin bkpt-change($setting, $value) { @include breakpoint-change($setting, $value); } @mixin bkpt-set($setting, $value) { @include breakpoint-change($setting, $value); } ////////////////////////////// // Remove Setting ////////////////////////////// @function breakpoint-reset($settings...) { @if length($settings) == 1 { $settings: nth($settings, 1); } @each $setting in $settings { $breakpoint: map-remove($breakpoint, $setting) !global; } @return true; } @mixin breakpoint-reset($settings...) { $breakpoint-reset: breakpoint-reset($settings); } @mixin bkpt-reset($settings...) { $breakpoint-reset: breakpoint-reset($settings); } ================================================ FILE: _sass/vendor/breakpoint/parsers/_double.scss ================================================ ////////////////////////////// // Import Pieces ////////////////////////////// @import "double/default-pair"; @import "double/double-string"; @import "double/default"; @function breakpoint-parse-double($feature, $empty-media, $first) { $parsed: ''; $leader: ''; // If we're forcing @if not ($empty-media) or not ($first) { $leader: 'and '; } $first: nth($feature, 1); $second: nth($feature, 2); // If we've got two numbers, we know we need to use the default pair because there are no media queries that has a media feature that is a number @if type-of($first) == 'number' and type-of($second) == 'number' { $parsed: breakpoint-parse-default-pair($first, $second); } // If they are both strings, we send it through the string parser @else if type-of($first) == 'string' and type-of($second) == 'string' { $parsed: breakpoint-parse-double-string($first, $second); } // If it's a string/number pair, we parse it as a normal double @else { $parsed: breakpoint-parse-double-default($first, $second); } @return $leader + $parsed; } ================================================ FILE: _sass/vendor/breakpoint/parsers/_query.scss ================================================ @function breakpoint-parse-query($query) { // Parse features out of an individual query $feature-holder: (); $query-holder: (); $length: length($query); @if $length == 2 { // If we've got a string/number, number/string, check to see if it's a valid string/number pair or two singles @if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'number') or (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'string') { $number: ''; $value: ''; @if type-of(nth($query, 1)) == 'string' { $number: nth($query, 2); $value: nth($query, 1); } @else { $number: nth($query, 1); $value: nth($query, 2); } // If the string value can be a single value, check to see if the number passed in is a valid input for said single value. Fortunately, all current single-value options only accept unitless numbers, so this check is easy. @if breakpoint-single-string($value) { @if unitless($number) { $feature-holder: append($value, $number, space); $query-holder: append($query-holder, $feature-holder, comma); @return $query-holder; } } // If the string is a media type, split the query @if breakpoint-is-media($value) { $query-holder: append($query-holder, nth($query, 1)); $query-holder: append($query-holder, nth($query, 2)); @return $query-holder; } // If it's not a single feature, we're just going to assume it's a proper string/value pair, and roll with it. @else { $feature-holder: append($value, $number, space); $query-holder: append($query-holder, $feature-holder, comma); @return $query-holder; } } // If they're both numbers, we assume it's a double and roll with that @else if (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'number') { $feature-holder: append(nth($query, 1), nth($query, 2), space); $query-holder: append($query-holder, $feature-holder, comma); @return $query-holder; } // If they're both strings and neither are singles, we roll with that. @else if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'string') { @if not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) { $feature-holder: append(nth($query, 1), nth($query, 2), space); $query-holder: append($query-holder, $feature-holder, comma); @return $query-holder; } } } @else if $length == 3 { // If we've got three items and none is a list, we check to see @if type-of(nth($query, 1)) != 'list' and type-of(nth($query, 2)) != 'list' and type-of(nth($query, 3)) != 'list' { // If none of the items are single string values and none of the values are media values, we're good. @if (not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) and not breakpoint-single-string(nth($query, 3))) and ((not breakpoint-is-media(nth($query, 1)) and not breakpoint-is-media(nth($query, 2)) and not breakpoint-is-media(nth($query, 3)))) { $feature-holder: append(nth($query, 1), nth($query, 2), space); $feature-holder: append($feature-holder, nth($query, 3), space); $query-holder: append($query-holder, $feature-holder, comma); @return $query-holder; } // let's check to see if the first item is a media type @else if breakpoint-is-media(nth($query, 1)) { $query-holder: append($query-holder, nth($query, 1)); $feature-holder: append(nth($query, 2), nth($query, 3), space); $query-holder: append($query-holder, $feature-holder); @return $query-holder; } } } // If it's a single item, or if it's not a special case double or triple, we can simply return the query. @return $query; } ================================================ FILE: _sass/vendor/breakpoint/parsers/_resolution.scss ================================================ @import "resolution/resolution"; @function breakpoint-build-resolution($query-print, $query-resolution, $empty-media, $first) { $leader: ''; // If we're forcing @if not ($empty-media) or not ($first) { $leader: 'and '; } @if breakpoint-get('transform resolutions') and $query-resolution { $resolutions: breakpoint-make-resolutions($query-resolution); $length: length($resolutions); $query-holder: ''; @for $i from 1 through $length { $query: '#{$query-print} #{$leader}#{nth($resolutions, $i)}'; @if $i == 1 { $query-holder: $query; } @else { $query-holder: '#{$query-holder}, #{$query}'; } } @return $query-holder; } @else { // Return with attached resolution @return $query-print; } } ================================================ FILE: _sass/vendor/breakpoint/parsers/_single.scss ================================================ ////////////////////////////// // Import Pieces ////////////////////////////// @import "single/default"; @function breakpoint-parse-single($feature, $empty-media, $first) { $parsed: ''; $leader: ''; // If we're forcing @if not ($empty-media) or not ($first) { $leader: 'and '; } // If it's a single feature that can stand alone, we let it @if (breakpoint-single-string($feature)) { $parsed: $feature; // Set Context $context-setter: private-breakpoint-set-context($feature, $feature); } // If it's not a stand alone feature, we pass it off to the default handler. @else { $parsed: breakpoint-parse-default($feature); } @return $leader + '(' + $parsed + ')'; } ================================================ FILE: _sass/vendor/breakpoint/parsers/_triple.scss ================================================ ////////////////////////////// // Import Pieces ////////////////////////////// @import "triple/default"; @function breakpoint-parse-triple($feature, $empty-media, $first) { $parsed: ''; $leader: ''; // If we're forcing @if not ($empty-media) or not ($first) { $leader: 'and '; } // separate the string features from the value numbers $string: null; $numbers: null; @each $val in $feature { @if type-of($val) == string { $string: $val; } @else { @if type-of($numbers) == 'null' { $numbers: $val; } @else { $numbers: append($numbers, $val); } } } $parsed: breakpoint-parse-triple-default($string, nth($numbers, 1), nth($numbers, 2)); @return $leader + $parsed; } ================================================ FILE: _sass/vendor/breakpoint/parsers/double/_default-pair.scss ================================================ @function breakpoint-parse-default-pair($first, $second) { $default: breakpoint-get('default pair'); $min: ''; $max: ''; // Sort into min and max $min: min($first, $second); $max: max($first, $second); // Set Context $context-setter: private-breakpoint-set-context(min-#{$default}, $min); $context-setter: private-breakpoint-set-context(max-#{$default}, $max); // Make them EMs if need be @if (breakpoint-get('to ems') == true) { $min: breakpoint-to-base-em($min); $max: breakpoint-to-base-em($max); } @return '(min-#{$default}: #{$min}) and (max-#{$default}: #{$max})'; } ================================================ FILE: _sass/vendor/breakpoint/parsers/double/_default.scss ================================================ @function breakpoint-parse-double-default($first, $second) { $feature: ''; $value: ''; @if type-of($first) == 'string' { $feature: $first; $value: $second; } @else { $feature: $second; $value: $first; } // Set Context $context-setter: private-breakpoint-set-context($feature, $value); @if (breakpoint-get('to ems') == true) { $value: breakpoint-to-base-em($value); } @return '(#{$feature}: #{$value})' } ================================================ FILE: _sass/vendor/breakpoint/parsers/double/_double-string.scss ================================================ @function breakpoint-parse-double-string($first, $second) { $feature: ''; $value: ''; // Test to see which is the feature and which is the value @if (breakpoint-string-value($first) == true) { $feature: $first; $value: $second; } @else if (breakpoint-string-value($second) == true) { $feature: $second; $value: $first; } @else { @warn "Neither #{$first} nor #{$second} is a valid media query name."; } // Set Context $context-setter: private-breakpoint-set-context($feature, $value); @return '(#{$feature}: #{$value})'; } ================================================ FILE: _sass/vendor/breakpoint/parsers/resolution/_resolution.scss ================================================ @function breakpoint-make-resolutions($resolution) { $length: length($resolution); $output: (); @if $length == 2 { $feature: ''; $value: ''; // Find which is number @if type-of(nth($resolution, 1)) == 'number' { $value: nth($resolution, 1); } @else { $value: nth($resolution, 2); } // Determine min/max/standard @if index($resolution, 'min-resolution') { $feature: 'min-'; } @else if index($resolution, 'max-resolution') { $feature: 'max-'; } $standard: '(#{$feature}resolution: #{$value})'; // If we're not dealing with dppx, @if unit($value) != 'dppx' { $base: 96dpi; @if unit($value) == 'dpcm' { $base: 243.84dpcm; } // Write out feature tests $webkit: ''; $moz: ''; $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / $base})'; $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / $base})'; // Append to output $output: append($output, $standard, space); $output: append($output, $webkit, space); $output: append($output, $moz, space); } @else { $webkit: ''; $moz: ''; $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / 1dppx})'; $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / 1dppx})'; $fallback: '(#{$feature}resolution: #{$value / 1dppx * 96dpi})'; // Append to output $output: append($output, $standard, space); $output: append($output, $webkit, space); $output: append($output, $moz, space); $output: append($output, $fallback, space); } } @return $output; } ================================================ FILE: _sass/vendor/breakpoint/parsers/single/_default.scss ================================================ @function breakpoint-parse-default($feature) { $default: breakpoint-get('default feature'); // Set Context $context-setter: private-breakpoint-set-context($default, $feature); @if (breakpoint-get('to ems') == true) and (type-of($feature) == 'number') { @return '#{$default}: #{breakpoint-to-base-em($feature)}'; } @else { @return '#{$default}: #{$feature}'; } } ================================================ FILE: _sass/vendor/breakpoint/parsers/triple/_default.scss ================================================ @function breakpoint-parse-triple-default($feature, $first, $second) { // Sort into min and max $min: min($first, $second); $max: max($first, $second); // Set Context $context-setter: private-breakpoint-set-context(min-#{$feature}, $min); $context-setter: private-breakpoint-set-context(max-#{$feature}, $max); // Make them EMs if need be @if (breakpoint-get('to ems') == true) { $min: breakpoint-to-base-em($min); $max: breakpoint-to-base-em($max); } @return '(min-#{$feature}: #{$min}) and (max-#{$feature}: #{$max})'; } ================================================ FILE: _sass/vendor/font-awesome/_animated.scss ================================================ // animating icons // -------------------------- .#{$fa-css-prefix}-beat { animation-name: #{$fa-css-prefix}-beat; animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s); animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, ease-in-out); } .#{$fa-css-prefix}-bounce { animation-name: #{$fa-css-prefix}-bounce; animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s); animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(0.280, 0.840, 0.420, 1)); } .#{$fa-css-prefix}-fade { animation-name: #{$fa-css-prefix}-fade; animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s); animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1)); } .#{$fa-css-prefix}-beat-fade { animation-name: #{$fa-css-prefix}-beat-fade; animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s); animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, cubic-bezier(.4,0,.6,1)); } .#{$fa-css-prefix}-flip { animation-name: #{$fa-css-prefix}-flip; animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s); animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, ease-in-out); } .#{$fa-css-prefix}-shake { animation-name: #{$fa-css-prefix}-shake; animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s); animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, linear); } .#{$fa-css-prefix}-spin { animation-name: #{$fa-css-prefix}-spin; animation-delay: var(--#{$fa-css-prefix}-animation-delay, 0s); animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 2s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, linear); } .#{$fa-css-prefix}-spin-reverse { --#{$fa-css-prefix}-animation-direction: reverse; } .#{$fa-css-prefix}-pulse, .#{$fa-css-prefix}-spin-pulse { animation-name: #{$fa-css-prefix}-spin; animation-direction: var(--#{$fa-css-prefix}-animation-direction, normal); animation-duration: var(--#{$fa-css-prefix}-animation-duration, 1s); animation-iteration-count: var(--#{$fa-css-prefix}-animation-iteration-count, infinite); animation-timing-function: var(--#{$fa-css-prefix}-animation-timing, steps(8)); } // if agent or operating system prefers reduced motion, disable animations // see: https://www.smashingmagazine.com/2020/09/design-reduced-motion-sensitivities/ // see: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion @media (prefers-reduced-motion: reduce) { .#{$fa-css-prefix}-beat, .#{$fa-css-prefix}-bounce, .#{$fa-css-prefix}-fade, .#{$fa-css-prefix}-beat-fade, .#{$fa-css-prefix}-flip, .#{$fa-css-prefix}-pulse, .#{$fa-css-prefix}-shake, .#{$fa-css-prefix}-spin, .#{$fa-css-prefix}-spin-pulse { animation-delay: -1ms; animation-duration: 1ms; animation-iteration-count: 1; transition-delay: 0s; transition-duration: 0s; } } @keyframes #{$fa-css-prefix}-beat { 0%, 90% { transform: scale(1); } 45% { transform: scale(var(--#{$fa-css-prefix}-beat-scale, 1.25)); } } @keyframes #{$fa-css-prefix}-bounce { 0% { transform: scale(1,1) translateY(0); } 10% { transform: scale(var(--#{$fa-css-prefix}-bounce-start-scale-x, 1.1),var(--#{$fa-css-prefix}-bounce-start-scale-y, 0.9)) translateY(0); } 30% { transform: scale(var(--#{$fa-css-prefix}-bounce-jump-scale-x, 0.9),var(--#{$fa-css-prefix}-bounce-jump-scale-y, 1.1)) translateY(var(--#{$fa-css-prefix}-bounce-height, -0.5em)); } 50% { transform: scale(var(--#{$fa-css-prefix}-bounce-land-scale-x, 1.05),var(--#{$fa-css-prefix}-bounce-land-scale-y, 0.95)) translateY(0); } 57% { transform: scale(1,1) translateY(var(--#{$fa-css-prefix}-bounce-rebound, -0.125em)); } 64% { transform: scale(1,1) translateY(0); } 100% { transform: scale(1,1) translateY(0); } } @keyframes #{$fa-css-prefix}-fade { 50% { opacity: var(--#{$fa-css-prefix}-fade-opacity, 0.4); } } @keyframes #{$fa-css-prefix}-beat-fade { 0%, 100% { opacity: var(--#{$fa-css-prefix}-beat-fade-opacity, 0.4); transform: scale(1); } 50% { opacity: 1; transform: scale(var(--#{$fa-css-prefix}-beat-fade-scale, 1.125)); } } @keyframes #{$fa-css-prefix}-flip { 50% { transform: rotate3d(var(--#{$fa-css-prefix}-flip-x, 0), var(--#{$fa-css-prefix}-flip-y, 1), var(--#{$fa-css-prefix}-flip-z, 0), var(--#{$fa-css-prefix}-flip-angle, -180deg)); } } @keyframes #{$fa-css-prefix}-shake { 0% { transform: rotate(-15deg); } 4% { transform: rotate(15deg); } 8%, 24% { transform: rotate(-18deg); } 12%, 28% { transform: rotate(18deg); } 16% { transform: rotate(-22deg); } 20% { transform: rotate(22deg); } 32% { transform: rotate(-12deg); } 36% { transform: rotate(12deg); } 40%, 100% { transform: rotate(0deg); } } @keyframes #{$fa-css-prefix}-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } ================================================ FILE: _sass/vendor/font-awesome/_bordered-pulled.scss ================================================ // bordered + pulled icons // ------------------------- .#{$fa-css-prefix}-border { border-color: var(--#{$fa-css-prefix}-border-color, #{$fa-border-color}); border-radius: var(--#{$fa-css-prefix}-border-radius, #{$fa-border-radius}); border-style: var(--#{$fa-css-prefix}-border-style, #{$fa-border-style}); border-width: var(--#{$fa-css-prefix}-border-width, #{$fa-border-width}); padding: var(--#{$fa-css-prefix}-border-padding, #{$fa-border-padding}); } .#{$fa-css-prefix}-pull-left { float: left; margin-right: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin}); } .#{$fa-css-prefix}-pull-right { float: right; margin-left: var(--#{$fa-css-prefix}-pull-margin, #{$fa-pull-margin}); } ================================================ FILE: _sass/vendor/font-awesome/_core.scss ================================================ // base icon class definition // ------------------------- .#{$fa-css-prefix} { font-family: var(--#{$fa-css-prefix}-style-family, '#{$fa-style-family}'); font-weight: var(--#{$fa-css-prefix}-style, #{$fa-style}); } .#{$fa-css-prefix}, .#{$fa-css-prefix}-classic, .#{$fa-css-prefix}-sharp, .fas, .#{$fa-css-prefix}-solid, .far, .#{$fa-css-prefix}-regular, .fab, .#{$fa-css-prefix}-brands { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; display: var(--#{$fa-css-prefix}-display, #{$fa-display}); font-style: normal; font-variant: normal; line-height: 1; text-rendering: auto; } .fas, .#{$fa-css-prefix}-classic, .#{$fa-css-prefix}-solid, .far, .#{$fa-css-prefix}-regular { font-family: 'Font Awesome 6 Free'; } .fab, .#{$fa-css-prefix}-brands { font-family: 'Font Awesome 6 Brands'; } %fa-icon { @include fa-icon; } ================================================ FILE: _sass/vendor/font-awesome/_fixed-width.scss ================================================ // fixed-width icons // ------------------------- .#{$fa-css-prefix}-fw { text-align: center; width: $fa-fw-width; } ================================================ FILE: _sass/vendor/font-awesome/_functions.scss ================================================ // functions // -------------------------- // fa-content: convenience function used to set content property @function fa-content($fa-var) { @return unquote("\"#{ $fa-var }\""); } // fa-divide: Originally obtained from the Bootstrap https://github.com/twbs/bootstrap // // Licensed under: The MIT License (MIT) // // Copyright (c) 2011-2021 Twitter, Inc. // Copyright (c) 2011-2021 The Bootstrap Authors // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. @function fa-divide($dividend, $divisor, $precision: 10) { $sign: if($dividend > 0 and $divisor > 0, 1, -1); $dividend: abs($dividend); $divisor: abs($divisor); $quotient: 0; $remainder: $dividend; @if $dividend == 0 { @return 0; } @if $divisor == 0 { @error "Cannot divide by 0"; } @if $divisor == 1 { @return $dividend; } @while $remainder >= $divisor { $quotient: $quotient + 1; $remainder: $remainder - $divisor; } @if $remainder > 0 and $precision > 0 { $remainder: fa-divide($remainder * 10, $divisor, $precision - 1) * .1; } @return ($quotient + $remainder) * $sign; } ================================================ FILE: _sass/vendor/font-awesome/_icons.scss ================================================ // specific icon class definition // ------------------------- /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ @each $name, $icon in $fa-icons { .#{$fa-css-prefix}-#{$name}::before { content: unquote("\"#{ $icon }\""); } } ================================================ FILE: _sass/vendor/font-awesome/_list.scss ================================================ // icons in a list // ------------------------- .#{$fa-css-prefix}-ul { list-style-type: none; margin-left: var(--#{$fa-css-prefix}-li-margin, #{$fa-li-margin}); padding-left: 0; > li { position: relative; } } .#{$fa-css-prefix}-li { left: calc(var(--#{$fa-css-prefix}-li-width, #{$fa-li-width}) * -1); position: absolute; text-align: center; width: var(--#{$fa-css-prefix}-li-width, #{$fa-li-width}); line-height: inherit; } ================================================ FILE: _sass/vendor/font-awesome/_mixins.scss ================================================ // mixins // -------------------------- // base rendering for an icon @mixin fa-icon { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; display: inline-block; font-style: normal; font-variant: normal; font-weight: normal; line-height: 1; } // sets relative font-sizing and alignment (in _sizing) @mixin fa-size ($font-size) { font-size: fa-divide($font-size, $fa-size-scale-base) * 1em; // converts step in sizing scale into an em-based value that's relative to the scale's base line-height: fa-divide(1, $font-size) * 1em; // sets the line-height of the icon back to that of it's parent vertical-align: (fa-divide(6, $font-size) - fa-divide(3, 8)) * 1em; // vertically centers the icon taking into account the surrounding text's descender } // only display content to screen readers // see: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/ // see: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/ @mixin fa-sr-only() { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } // use in conjunction with .sr-only to only display content when it's focused @mixin fa-sr-only-focusable() { &:not(:focus) { @include fa-sr-only(); } } // sets a specific icon family to use alongside style + icon mixins // convenience mixins for declaring pseudo-elements by CSS variable, // including all style-specific font properties, and both the ::before // and ::after elements in the duotone case. @mixin fa-icon-solid($fa-var) { @extend %fa-icon; @extend .fa-solid; &::before { content: unquote("\"#{ $fa-var }\""); } } @mixin fa-icon-regular($fa-var) { @extend %fa-icon; @extend .fa-regular; &::before { content: unquote("\"#{ $fa-var }\""); } } @mixin fa-icon-brands($fa-var) { @extend %fa-icon; @extend .fa-brands; &::before { content: unquote("\"#{ $fa-var }\""); } } ================================================ FILE: _sass/vendor/font-awesome/_rotated-flipped.scss ================================================ // rotating + flipping icons // ------------------------- .#{$fa-css-prefix}-rotate-90 { transform: rotate(90deg); } .#{$fa-css-prefix}-rotate-180 { transform: rotate(180deg); } .#{$fa-css-prefix}-rotate-270 { transform: rotate(270deg); } .#{$fa-css-prefix}-flip-horizontal { transform: scale(-1, 1); } .#{$fa-css-prefix}-flip-vertical { transform: scale(1, -1); } .#{$fa-css-prefix}-flip-both, .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { transform: scale(-1, -1); } .#{$fa-css-prefix}-rotate-by { transform: rotate(var(--#{$fa-css-prefix}-rotate-angle, 0)); } ================================================ FILE: _sass/vendor/font-awesome/_screen-reader.scss ================================================ // screen-reader utilities // ------------------------- // only display content to screen readers .sr-only, .#{$fa-css-prefix}-sr-only { @include fa-sr-only; } // use in conjunction with .sr-only to only display content when it's focused .sr-only-focusable, .#{$fa-css-prefix}-sr-only-focusable { @include fa-sr-only-focusable; } ================================================ FILE: _sass/vendor/font-awesome/_shims.scss ================================================ .#{$fa-css-prefix}.#{$fa-css-prefix}-glass:before { content: unquote("\"#{ $fa-var-martini-glass-empty }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-o:before { content: unquote("\"#{ $fa-var-envelope }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-o:before { content: unquote("\"#{ $fa-var-star }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-remove:before { content: unquote("\"#{ $fa-var-xmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-close:before { content: unquote("\"#{ $fa-var-xmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-gear:before { content: unquote("\"#{ $fa-var-gear }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-trash-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-trash-o:before { content: unquote("\"#{ $fa-var-trash-can }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-home:before { content: unquote("\"#{ $fa-var-house }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-o:before { content: unquote("\"#{ $fa-var-file }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-clock-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-clock-o:before { content: unquote("\"#{ $fa-var-clock }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-down { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-down:before { content: unquote("\"#{ $fa-var-circle-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-up { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-up:before { content: unquote("\"#{ $fa-var-circle-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-play-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-play-circle-o:before { content: unquote("\"#{ $fa-var-circle-play }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-repeat:before { content: unquote("\"#{ $fa-var-arrow-rotate-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-rotate-right:before { content: unquote("\"#{ $fa-var-arrow-rotate-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-refresh:before { content: unquote("\"#{ $fa-var-arrows-rotate }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-list-alt { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-list-alt:before { content: unquote("\"#{ $fa-var-rectangle-list }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-dedent:before { content: unquote("\"#{ $fa-var-outdent }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-video-camera:before { content: unquote("\"#{ $fa-var-video }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-picture-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-picture-o:before { content: unquote("\"#{ $fa-var-image }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-photo { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-photo:before { content: unquote("\"#{ $fa-var-image }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-image { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-image:before { content: unquote("\"#{ $fa-var-image }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-map-marker:before { content: unquote("\"#{ $fa-var-location-dot }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square-o:before { content: unquote("\"#{ $fa-var-pen-to-square }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-edit { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-edit:before { content: unquote("\"#{ $fa-var-pen-to-square }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-share-square-o:before { content: unquote("\"#{ $fa-var-share-from-square }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-check-square-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-check-square-o:before { content: unquote("\"#{ $fa-var-square-check }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrows:before { content: unquote("\"#{ $fa-var-up-down-left-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-times-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-times-circle-o:before { content: unquote("\"#{ $fa-var-circle-xmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-check-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-check-circle-o:before { content: unquote("\"#{ $fa-var-circle-check }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-mail-forward:before { content: unquote("\"#{ $fa-var-share }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-expand:before { content: unquote("\"#{ $fa-var-up-right-and-down-left-from-center }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-compress:before { content: unquote("\"#{ $fa-var-down-left-and-up-right-to-center }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-eye { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-eye-slash { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-warning:before { content: unquote("\"#{ $fa-var-triangle-exclamation }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar:before { content: unquote("\"#{ $fa-var-calendar-days }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-v:before { content: unquote("\"#{ $fa-var-up-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-h:before { content: unquote("\"#{ $fa-var-left-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart:before { content: unquote("\"#{ $fa-var-chart-column }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart-o:before { content: unquote("\"#{ $fa-var-chart-column }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-twitter-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-twitter-square:before { content: unquote("\"#{ $fa-var-square-twitter }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-square:before { content: unquote("\"#{ $fa-var-square-facebook }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-gears:before { content: unquote("\"#{ $fa-var-gears }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-up { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-up:before { content: unquote("\"#{ $fa-var-thumbs-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-down { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-down:before { content: unquote("\"#{ $fa-var-thumbs-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-heart-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-heart-o:before { content: unquote("\"#{ $fa-var-heart }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sign-out:before { content: unquote("\"#{ $fa-var-right-from-bracket }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin-square:before { content: unquote("\"#{ $fa-var-linkedin }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thumb-tack:before { content: unquote("\"#{ $fa-var-thumbtack }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-external-link:before { content: unquote("\"#{ $fa-var-up-right-from-square }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sign-in:before { content: unquote("\"#{ $fa-var-right-to-bracket }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-github-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-github-square:before { content: unquote("\"#{ $fa-var-square-github }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-lemon-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-lemon-o:before { content: unquote("\"#{ $fa-var-lemon }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-square-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-square-o:before { content: unquote("\"#{ $fa-var-square }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bookmark-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bookmark-o:before { content: unquote("\"#{ $fa-var-bookmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-twitter { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook:before { content: unquote("\"#{ $fa-var-facebook-f }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-f { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-f:before { content: unquote("\"#{ $fa-var-facebook-f }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-github { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-credit-card { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-feed:before { content: unquote("\"#{ $fa-var-rss }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hdd-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hdd-o:before { content: unquote("\"#{ $fa-var-hard-drive }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-right { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-right:before { content: unquote("\"#{ $fa-var-hand-point-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-left { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-left:before { content: unquote("\"#{ $fa-var-hand-point-left }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-up { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-up:before { content: unquote("\"#{ $fa-var-hand-point-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-down { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-down:before { content: unquote("\"#{ $fa-var-hand-point-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-globe:before { content: unquote("\"#{ $fa-var-earth-americas }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-tasks:before { content: unquote("\"#{ $fa-var-bars-progress }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-alt:before { content: unquote("\"#{ $fa-var-maximize }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-group:before { content: unquote("\"#{ $fa-var-users }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-chain:before { content: unquote("\"#{ $fa-var-link }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-cut:before { content: unquote("\"#{ $fa-var-scissors }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-files-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-files-o:before { content: unquote("\"#{ $fa-var-copy }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-floppy-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-floppy-o:before { content: unquote("\"#{ $fa-var-floppy-disk }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-save { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-save:before { content: unquote("\"#{ $fa-var-floppy-disk }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-navicon:before { content: unquote("\"#{ $fa-var-bars }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-reorder:before { content: unquote("\"#{ $fa-var-bars }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-magic:before { content: unquote("\"#{ $fa-var-wand-magic-sparkles }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest-square:before { content: unquote("\"#{ $fa-var-square-pinterest }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-square:before { content: unquote("\"#{ $fa-var-square-google-plus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus:before { content: unquote("\"#{ $fa-var-google-plus-g }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-money:before { content: unquote("\"#{ $fa-var-money-bill-1 }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-unsorted:before { content: unquote("\"#{ $fa-var-sort }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-desc:before { content: unquote("\"#{ $fa-var-sort-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-asc:before { content: unquote("\"#{ $fa-var-sort-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin:before { content: unquote("\"#{ $fa-var-linkedin-in }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-rotate-left:before { content: unquote("\"#{ $fa-var-arrow-rotate-left }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-legal:before { content: unquote("\"#{ $fa-var-gavel }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-tachometer:before { content: unquote("\"#{ $fa-var-gauge-high }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-dashboard:before { content: unquote("\"#{ $fa-var-gauge-high }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-comment-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-comment-o:before { content: unquote("\"#{ $fa-var-comment }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-comments-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-comments-o:before { content: unquote("\"#{ $fa-var-comments }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-flash:before { content: unquote("\"#{ $fa-var-bolt }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-clipboard:before { content: unquote("\"#{ $fa-var-paste }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-lightbulb-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-lightbulb-o:before { content: unquote("\"#{ $fa-var-lightbulb }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-exchange:before { content: unquote("\"#{ $fa-var-right-left }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-cloud-download:before { content: unquote("\"#{ $fa-var-cloud-arrow-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-cloud-upload:before { content: unquote("\"#{ $fa-var-cloud-arrow-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bell-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bell-o:before { content: unquote("\"#{ $fa-var-bell }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-cutlery:before { content: unquote("\"#{ $fa-var-utensils }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-text-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-text-o:before { content: unquote("\"#{ $fa-var-file-lines }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-building-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-building-o:before { content: unquote("\"#{ $fa-var-building }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hospital-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hospital-o:before { content: unquote("\"#{ $fa-var-hospital }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-tablet:before { content: unquote("\"#{ $fa-var-tablet-screen-button }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-mobile:before { content: unquote("\"#{ $fa-var-mobile-screen-button }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-mobile-phone:before { content: unquote("\"#{ $fa-var-mobile-screen-button }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o:before { content: unquote("\"#{ $fa-var-circle }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-mail-reply:before { content: unquote("\"#{ $fa-var-reply }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-github-alt { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-folder-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-folder-o:before { content: unquote("\"#{ $fa-var-folder }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-folder-open-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-folder-open-o:before { content: unquote("\"#{ $fa-var-folder-open }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-smile-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-smile-o:before { content: unquote("\"#{ $fa-var-face-smile }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-frown-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-frown-o:before { content: unquote("\"#{ $fa-var-face-frown }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-meh-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-meh-o:before { content: unquote("\"#{ $fa-var-face-meh }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-keyboard-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-keyboard-o:before { content: unquote("\"#{ $fa-var-keyboard }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-flag-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-flag-o:before { content: unquote("\"#{ $fa-var-flag }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-mail-reply-all:before { content: unquote("\"#{ $fa-var-reply-all }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-o:before { content: unquote("\"#{ $fa-var-star-half-stroke }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-empty { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-empty:before { content: unquote("\"#{ $fa-var-star-half-stroke }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-full { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-full:before { content: unquote("\"#{ $fa-var-star-half-stroke }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-code-fork:before { content: unquote("\"#{ $fa-var-code-branch }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-chain-broken:before { content: unquote("\"#{ $fa-var-link-slash }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-unlink:before { content: unquote("\"#{ $fa-var-link-slash }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-o:before { content: unquote("\"#{ $fa-var-calendar }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-maxcdn { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-html5 { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-css3 { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-unlock-alt:before { content: unquote("\"#{ $fa-var-unlock }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-minus-square-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-minus-square-o:before { content: unquote("\"#{ $fa-var-square-minus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-level-up:before { content: unquote("\"#{ $fa-var-turn-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-level-down:before { content: unquote("\"#{ $fa-var-turn-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square:before { content: unquote("\"#{ $fa-var-square-pen }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-external-link-square:before { content: unquote("\"#{ $fa-var-square-up-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-compass { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-down { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-down:before { content: unquote("\"#{ $fa-var-square-caret-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-down { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-down:before { content: unquote("\"#{ $fa-var-square-caret-down }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-up { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-up:before { content: unquote("\"#{ $fa-var-square-caret-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-up { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-up:before { content: unquote("\"#{ $fa-var-square-caret-up }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-right { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-right:before { content: unquote("\"#{ $fa-var-square-caret-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-right { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-right:before { content: unquote("\"#{ $fa-var-square-caret-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-eur:before { content: unquote("\"#{ $fa-var-euro-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-euro:before { content: unquote("\"#{ $fa-var-euro-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-gbp:before { content: unquote("\"#{ $fa-var-sterling-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-usd:before { content: unquote("\"#{ $fa-var-dollar-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-dollar:before { content: unquote("\"#{ $fa-var-dollar-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-inr:before { content: unquote("\"#{ $fa-var-indian-rupee-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-rupee:before { content: unquote("\"#{ $fa-var-indian-rupee-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-jpy:before { content: unquote("\"#{ $fa-var-yen-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-cny:before { content: unquote("\"#{ $fa-var-yen-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-rmb:before { content: unquote("\"#{ $fa-var-yen-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-yen:before { content: unquote("\"#{ $fa-var-yen-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-rub:before { content: unquote("\"#{ $fa-var-ruble-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-ruble:before { content: unquote("\"#{ $fa-var-ruble-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-rouble:before { content: unquote("\"#{ $fa-var-ruble-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-krw:before { content: unquote("\"#{ $fa-var-won-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-won:before { content: unquote("\"#{ $fa-var-won-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-btc { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bitcoin { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bitcoin:before { content: unquote("\"#{ $fa-var-btc }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-text:before { content: unquote("\"#{ $fa-var-file-lines }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-alpha-asc:before { content: unquote("\"#{ $fa-var-arrow-down-a-z }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-alpha-desc:before { content: unquote("\"#{ $fa-var-arrow-down-z-a }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-amount-asc:before { content: unquote("\"#{ $fa-var-arrow-down-short-wide }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-amount-desc:before { content: unquote("\"#{ $fa-var-arrow-down-wide-short }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-numeric-asc:before { content: unquote("\"#{ $fa-var-arrow-down-1-9 }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sort-numeric-desc:before { content: unquote("\"#{ $fa-var-arrow-down-9-1 }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-square:before { content: unquote("\"#{ $fa-var-square-youtube }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-youtube { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-xing { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-xing-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-xing-square:before { content: unquote("\"#{ $fa-var-square-xing }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-play { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-play:before { content: unquote("\"#{ $fa-var-youtube }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-dropbox { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-stack-overflow { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-instagram { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-flickr { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-adn { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket-square:before { content: unquote("\"#{ $fa-var-bitbucket }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-tumblr { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-tumblr-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-tumblr-square:before { content: unquote("\"#{ $fa-var-square-tumblr }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-down:before { content: unquote("\"#{ $fa-var-down-long }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-up:before { content: unquote("\"#{ $fa-var-up-long }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-left:before { content: unquote("\"#{ $fa-var-left-long }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-right:before { content: unquote("\"#{ $fa-var-right-long }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-apple { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-windows { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-android { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-linux { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-dribbble { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-skype { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-foursquare { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-trello { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-gratipay { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-gittip { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-gittip:before { content: unquote("\"#{ $fa-var-gratipay }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sun-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-sun-o:before { content: unquote("\"#{ $fa-var-sun }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-moon-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-moon-o:before { content: unquote("\"#{ $fa-var-moon }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-vk { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-weibo { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-renren { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pagelines { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-stack-exchange { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-right { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-right:before { content: unquote("\"#{ $fa-var-circle-right }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-left { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-left:before { content: unquote("\"#{ $fa-var-circle-left }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-left { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-left:before { content: unquote("\"#{ $fa-var-square-caret-left }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-left { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-left:before { content: unquote("\"#{ $fa-var-square-caret-left }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-dot-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-dot-circle-o:before { content: unquote("\"#{ $fa-var-circle-dot }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo-square:before { content: unquote("\"#{ $fa-var-square-vimeo }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-try:before { content: unquote("\"#{ $fa-var-turkish-lira-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-turkish-lira:before { content: unquote("\"#{ $fa-var-turkish-lira-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-plus-square-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-plus-square-o:before { content: unquote("\"#{ $fa-var-square-plus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-slack { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wordpress { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-openid { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-institution:before { content: unquote("\"#{ $fa-var-building-columns }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bank:before { content: unquote("\"#{ $fa-var-building-columns }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-mortar-board:before { content: unquote("\"#{ $fa-var-graduation-cap }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-yahoo { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-google { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-reddit { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-reddit-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-reddit-square:before { content: unquote("\"#{ $fa-var-square-reddit }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-stumbleupon-circle { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-stumbleupon { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-delicious { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-digg { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper-pp { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper-alt { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-drupal { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-joomla { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-behance { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-behance-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-behance-square:before { content: unquote("\"#{ $fa-var-square-behance }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-steam { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-steam-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-steam-square:before { content: unquote("\"#{ $fa-var-square-steam }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-automobile:before { content: unquote("\"#{ $fa-var-car }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-cab:before { content: unquote("\"#{ $fa-var-taxi }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-spotify { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-deviantart { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-soundcloud { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-pdf-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-pdf-o:before { content: unquote("\"#{ $fa-var-file-pdf }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-word-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-word-o:before { content: unquote("\"#{ $fa-var-file-word }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-excel-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-excel-o:before { content: unquote("\"#{ $fa-var-file-excel }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-powerpoint-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-powerpoint-o:before { content: unquote("\"#{ $fa-var-file-powerpoint }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-image-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-image-o:before { content: unquote("\"#{ $fa-var-file-image }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-photo-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-photo-o:before { content: unquote("\"#{ $fa-var-file-image }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-picture-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-picture-o:before { content: unquote("\"#{ $fa-var-file-image }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-archive-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-archive-o:before { content: unquote("\"#{ $fa-var-file-zipper }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-zip-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-zip-o:before { content: unquote("\"#{ $fa-var-file-zipper }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-audio-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-audio-o:before { content: unquote("\"#{ $fa-var-file-audio }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-sound-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-sound-o:before { content: unquote("\"#{ $fa-var-file-audio }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-video-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-video-o:before { content: unquote("\"#{ $fa-var-file-video }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-movie-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-movie-o:before { content: unquote("\"#{ $fa-var-file-video }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-code-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-file-code-o:before { content: unquote("\"#{ $fa-var-file-code }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-vine { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-codepen { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-jsfiddle { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-life-bouy:before { content: unquote("\"#{ $fa-var-life-ring }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-life-buoy:before { content: unquote("\"#{ $fa-var-life-ring }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-life-saver:before { content: unquote("\"#{ $fa-var-life-ring }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-support:before { content: unquote("\"#{ $fa-var-life-ring }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o-notch:before { content: unquote("\"#{ $fa-var-circle-notch }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-rebel { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-ra { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-ra:before { content: unquote("\"#{ $fa-var-rebel }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-resistance { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-resistance:before { content: unquote("\"#{ $fa-var-rebel }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-empire { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-ge { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-ge:before { content: unquote("\"#{ $fa-var-empire }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-git-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-git-square:before { content: unquote("\"#{ $fa-var-square-git }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-git { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hacker-news { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator-square:before { content: unquote("\"#{ $fa-var-hacker-news }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-yc-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-yc-square:before { content: unquote("\"#{ $fa-var-hacker-news }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-tencent-weibo { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-qq { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-weixin { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wechat { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wechat:before { content: unquote("\"#{ $fa-var-weixin }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-send:before { content: unquote("\"#{ $fa-var-paper-plane }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-paper-plane-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-paper-plane-o:before { content: unquote("\"#{ $fa-var-paper-plane }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-send-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-send-o:before { content: unquote("\"#{ $fa-var-paper-plane }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-circle-thin { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-circle-thin:before { content: unquote("\"#{ $fa-var-circle }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-header:before { content: unquote("\"#{ $fa-var-heading }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-futbol-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-futbol-o:before { content: unquote("\"#{ $fa-var-futbol }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-soccer-ball-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-soccer-ball-o:before { content: unquote("\"#{ $fa-var-futbol }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-slideshare { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-twitch { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-yelp { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-newspaper-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-newspaper-o:before { content: unquote("\"#{ $fa-var-newspaper }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-paypal { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-wallet { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-visa { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-mastercard { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-discover { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-amex { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-paypal { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-stripe { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bell-slash-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bell-slash-o:before { content: unquote("\"#{ $fa-var-bell-slash }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-trash:before { content: unquote("\"#{ $fa-var-trash-can }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-copyright { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-eyedropper:before { content: unquote("\"#{ $fa-var-eye-dropper }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-area-chart:before { content: unquote("\"#{ $fa-var-chart-area }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-pie-chart:before { content: unquote("\"#{ $fa-var-chart-pie }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-line-chart:before { content: unquote("\"#{ $fa-var-chart-line }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-lastfm { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-lastfm-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-lastfm-square:before { content: unquote("\"#{ $fa-var-square-lastfm }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-ioxhost { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-angellist { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc:before { content: unquote("\"#{ $fa-var-closed-captioning }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-ils:before { content: unquote("\"#{ $fa-var-shekel-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-shekel:before { content: unquote("\"#{ $fa-var-shekel-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-sheqel:before { content: unquote("\"#{ $fa-var-shekel-sign }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-buysellads { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-connectdevelop { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-dashcube { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-forumbee { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-leanpub { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-sellsy { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-shirtsinbulk { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-simplybuilt { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-skyatlas { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-diamond { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-diamond:before { content: unquote("\"#{ $fa-var-gem }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-transgender:before { content: unquote("\"#{ $fa-var-mars-and-venus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-intersex:before { content: unquote("\"#{ $fa-var-mars-and-venus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-transgender-alt:before { content: unquote("\"#{ $fa-var-transgender }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-official { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-official:before { content: unquote("\"#{ $fa-var-facebook }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest-p { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-whatsapp { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hotel:before { content: unquote("\"#{ $fa-var-bed }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-viacoin { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-medium { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-yc { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-yc:before { content: unquote("\"#{ $fa-var-y-combinator }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-optin-monster { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-opencart { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-expeditedssl { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-battery-4:before { content: unquote("\"#{ $fa-var-battery-full }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-battery:before { content: unquote("\"#{ $fa-var-battery-full }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-battery-3:before { content: unquote("\"#{ $fa-var-battery-three-quarters }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-battery-2:before { content: unquote("\"#{ $fa-var-battery-half }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-battery-1:before { content: unquote("\"#{ $fa-var-battery-quarter }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-battery-0:before { content: unquote("\"#{ $fa-var-battery-empty }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-object-group { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-object-ungroup { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-sticky-note-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-sticky-note-o:before { content: unquote("\"#{ $fa-var-note-sticky }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-jcb { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-cc-diners-club { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-clone { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-o:before { content: unquote("\"#{ $fa-var-hourglass }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-1:before { content: unquote("\"#{ $fa-var-hourglass-start }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-2:before { content: unquote("\"#{ $fa-var-hourglass-half }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-3:before { content: unquote("\"#{ $fa-var-hourglass-end }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-rock-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-rock-o:before { content: unquote("\"#{ $fa-var-hand-back-fist }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-grab-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-grab-o:before { content: unquote("\"#{ $fa-var-hand-back-fist }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-paper-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-paper-o:before { content: unquote("\"#{ $fa-var-hand }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-stop-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-stop-o:before { content: unquote("\"#{ $fa-var-hand }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-scissors-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-scissors-o:before { content: unquote("\"#{ $fa-var-hand-scissors }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-lizard-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-lizard-o:before { content: unquote("\"#{ $fa-var-hand-lizard }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-spock-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-spock-o:before { content: unquote("\"#{ $fa-var-hand-spock }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-pointer-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-pointer-o:before { content: unquote("\"#{ $fa-var-hand-pointer }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-peace-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-hand-peace-o:before { content: unquote("\"#{ $fa-var-hand-peace }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-registered { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-creative-commons { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-gg { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-gg-circle { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-odnoklassniki { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-odnoklassniki-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-odnoklassniki-square:before { content: unquote("\"#{ $fa-var-square-odnoklassniki }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-get-pocket { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wikipedia-w { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-safari { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-chrome { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-firefox { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-opera { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-internet-explorer { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-television:before { content: unquote("\"#{ $fa-var-tv }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-contao { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-500px { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-amazon { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-plus-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-plus-o:before { content: unquote("\"#{ $fa-var-calendar-plus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-minus-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-minus-o:before { content: unquote("\"#{ $fa-var-calendar-minus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-times-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-times-o:before { content: unquote("\"#{ $fa-var-calendar-xmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-check-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-check-o:before { content: unquote("\"#{ $fa-var-calendar-check }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-map-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-map-o:before { content: unquote("\"#{ $fa-var-map }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-commenting:before { content: unquote("\"#{ $fa-var-comment-dots }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-commenting-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-commenting-o:before { content: unquote("\"#{ $fa-var-comment-dots }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-houzz { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo:before { content: unquote("\"#{ $fa-var-vimeo-v }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-black-tie { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-fonticons { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-reddit-alien { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-edge { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-credit-card-alt:before { content: unquote("\"#{ $fa-var-credit-card }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-codiepie { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-modx { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-fort-awesome { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-usb { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-product-hunt { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-mixcloud { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-scribd { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pause-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-pause-circle-o:before { content: unquote("\"#{ $fa-var-circle-pause }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-stop-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-stop-circle-o:before { content: unquote("\"#{ $fa-var-circle-stop }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bluetooth { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-bluetooth-b { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-gitlab { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wpbeginner { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wpforms { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-envira { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wheelchair-alt { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wheelchair-alt:before { content: unquote("\"#{ $fa-var-accessible-icon }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-question-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-question-circle-o:before { content: unquote("\"#{ $fa-var-circle-question }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-volume-control-phone:before { content: unquote("\"#{ $fa-var-phone-volume }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-asl-interpreting:before { content: unquote("\"#{ $fa-var-hands-asl-interpreting }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-deafness:before { content: unquote("\"#{ $fa-var-ear-deaf }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-hard-of-hearing:before { content: unquote("\"#{ $fa-var-ear-deaf }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-glide { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-glide-g { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-signing:before { content: unquote("\"#{ $fa-var-hands }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-viadeo { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-viadeo-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-viadeo-square:before { content: unquote("\"#{ $fa-var-square-viadeo }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-ghost { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-ghost:before { content: unquote("\"#{ $fa-var-snapchat }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-square { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-square:before { content: unquote("\"#{ $fa-var-square-snapchat }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-first-order { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-yoast { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-themeisle { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-official { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-official:before { content: unquote("\"#{ $fa-var-google-plus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-circle { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-circle:before { content: unquote("\"#{ $fa-var-google-plus }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-font-awesome { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-fa { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-fa:before { content: unquote("\"#{ $fa-var-font-awesome }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-handshake-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-handshake-o:before { content: unquote("\"#{ $fa-var-handshake }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-open-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-open-o:before { content: unquote("\"#{ $fa-var-envelope-open }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-linode { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-address-book-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-address-book-o:before { content: unquote("\"#{ $fa-var-address-book }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-vcard:before { content: unquote("\"#{ $fa-var-address-card }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-address-card-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-address-card-o:before { content: unquote("\"#{ $fa-var-address-card }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-vcard-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-vcard-o:before { content: unquote("\"#{ $fa-var-address-card }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-user-circle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-user-circle-o:before { content: unquote("\"#{ $fa-var-circle-user }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-user-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-user-o:before { content: unquote("\"#{ $fa-var-user }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-id-badge { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license:before { content: unquote("\"#{ $fa-var-id-card }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-id-card-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-id-card-o:before { content: unquote("\"#{ $fa-var-id-card }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license-o:before { content: unquote("\"#{ $fa-var-id-card }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-quora { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-free-code-camp { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-telegram { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-4:before { content: unquote("\"#{ $fa-var-temperature-full }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer:before { content: unquote("\"#{ $fa-var-temperature-full }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-3:before { content: unquote("\"#{ $fa-var-temperature-three-quarters }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-2:before { content: unquote("\"#{ $fa-var-temperature-half }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-1:before { content: unquote("\"#{ $fa-var-temperature-quarter }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-0:before { content: unquote("\"#{ $fa-var-temperature-empty }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bathtub:before { content: unquote("\"#{ $fa-var-bath }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-s15:before { content: unquote("\"#{ $fa-var-bath }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-window-maximize { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-window-restore { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle:before { content: unquote("\"#{ $fa-var-rectangle-xmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-window-close-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-window-close-o:before { content: unquote("\"#{ $fa-var-rectangle-xmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle-o:before { content: unquote("\"#{ $fa-var-rectangle-xmark }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-bandcamp { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-grav { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-etsy { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-imdb { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-ravelry { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-eercast { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-eercast:before { content: unquote("\"#{ $fa-var-sellcast }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-snowflake-o { font-family: 'Font Awesome 6 Free'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-snowflake-o:before { content: unquote("\"#{ $fa-var-snowflake }\""); } .#{$fa-css-prefix}.#{$fa-css-prefix}-superpowers { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-wpexplorer { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } .#{$fa-css-prefix}.#{$fa-css-prefix}-meetup { font-family: 'Font Awesome 6 Brands'; font-weight: 400; } ================================================ FILE: _sass/vendor/font-awesome/_sizing.scss ================================================ // sizing icons // ------------------------- // literal magnification scale @for $i from 1 through 10 { .#{$fa-css-prefix}-#{$i}x { font-size: $i * 1em; } } // step-based scale (with alignment) @each $size, $value in $fa-sizes { .#{$fa-css-prefix}-#{$size} { @include fa-size($value); } } ================================================ FILE: _sass/vendor/font-awesome/_stacked.scss ================================================ // stacking icons // ------------------------- .#{$fa-css-prefix}-stack { display: inline-block; height: 2em; line-height: 2em; position: relative; vertical-align: $fa-stack-vertical-align; width: $fa-stack-width; } .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { left: 0; position: absolute; text-align: center; width: 100%; z-index: var(--#{$fa-css-prefix}-stack-z-index, #{$fa-stack-z-index}); } .#{$fa-css-prefix}-stack-1x { line-height: inherit; } .#{$fa-css-prefix}-stack-2x { font-size: 2em; } .#{$fa-css-prefix}-inverse { color: var(--#{$fa-css-prefix}-inverse, #{$fa-inverse}); } ================================================ FILE: _sass/vendor/font-awesome/_variables.scss ================================================ // variables // -------------------------- $fa-css-prefix : fa !default; $fa-style : 900 !default; $fa-style-family : "Font Awesome 6 Free" !default; $fa-display : inline-block !default; $fa-fw-width : fa-divide(20em, 16) !default; $fa-inverse : #fff !default; $fa-border-color : #eee !default; $fa-border-padding : .2em .25em .15em !default; $fa-border-radius : .1em !default; $fa-border-style : solid !default; $fa-border-width : .08em !default; $fa-size-scale-2xs : 10 !default; $fa-size-scale-xs : 12 !default; $fa-size-scale-sm : 14 !default; $fa-size-scale-base : 16 !default; $fa-size-scale-lg : 20 !default; $fa-size-scale-xl : 24 !default; $fa-size-scale-2xl : 32 !default; $fa-sizes: ( "2xs" : $fa-size-scale-2xs, "xs" : $fa-size-scale-xs, "sm" : $fa-size-scale-sm, "lg" : $fa-size-scale-lg, "xl" : $fa-size-scale-xl, "2xl" : $fa-size-scale-2xl ) !default; $fa-li-width : 2em !default; $fa-li-margin : $fa-li-width * fa-divide(5, 4) !default; $fa-pull-margin : .3em !default; $fa-primary-opacity : 1 !default; $fa-secondary-opacity : .4 !default; $fa-stack-vertical-align: middle !default; $fa-stack-width : ($fa-fw-width * 2) !default; $fa-stack-z-index : auto !default; $fa-font-display : block !default; $fa-font-path : "../webfonts" !default; $fa-var-0: \30; $fa-var-1: \31; $fa-var-2: \32; $fa-var-3: \33; $fa-var-4: \34; $fa-var-5: \35; $fa-var-6: \36; $fa-var-7: \37; $fa-var-8: \38; $fa-var-9: \39; $fa-var-fill-drip: \f576; $fa-var-arrows-to-circle: \e4bd; $fa-var-circle-chevron-right: \f138; $fa-var-chevron-circle-right: \f138; $fa-var-at: \40; $fa-var-trash-can: \f2ed; $fa-var-trash-alt: \f2ed; $fa-var-text-height: \f034; $fa-var-user-xmark: \f235; $fa-var-user-times: \f235; $fa-var-stethoscope: \f0f1; $fa-var-message: \f27a; $fa-var-comment-alt: \f27a; $fa-var-info: \f129; $fa-var-down-left-and-up-right-to-center: \f422; $fa-var-compress-alt: \f422; $fa-var-explosion: \e4e9; $fa-var-file-lines: \f15c; $fa-var-file-alt: \f15c; $fa-var-file-text: \f15c; $fa-var-wave-square: \f83e; $fa-var-ring: \f70b; $fa-var-building-un: \e4d9; $fa-var-dice-three: \f527; $fa-var-calendar-days: \f073; $fa-var-calendar-alt: \f073; $fa-var-anchor-circle-check: \e4aa; $fa-var-building-circle-arrow-right: \e4d1; $fa-var-volleyball: \f45f; $fa-var-volleyball-ball: \f45f; $fa-var-arrows-up-to-line: \e4c2; $fa-var-sort-down: \f0dd; $fa-var-sort-desc: \f0dd; $fa-var-circle-minus: \f056; $fa-var-minus-circle: \f056; $fa-var-door-open: \f52b; $fa-var-right-from-bracket: \f2f5; $fa-var-sign-out-alt: \f2f5; $fa-var-atom: \f5d2; $fa-var-soap: \e06e; $fa-var-icons: \f86d; $fa-var-heart-music-camera-bolt: \f86d; $fa-var-microphone-lines-slash: \f539; $fa-var-microphone-alt-slash: \f539; $fa-var-bridge-circle-check: \e4c9; $fa-var-pump-medical: \e06a; $fa-var-fingerprint: \f577; $fa-var-hand-point-right: \f0a4; $fa-var-magnifying-glass-location: \f689; $fa-var-search-location: \f689; $fa-var-forward-step: \f051; $fa-var-step-forward: \f051; $fa-var-face-smile-beam: \f5b8; $fa-var-smile-beam: \f5b8; $fa-var-flag-checkered: \f11e; $fa-var-football: \f44e; $fa-var-football-ball: \f44e; $fa-var-school-circle-exclamation: \e56c; $fa-var-crop: \f125; $fa-var-angles-down: \f103; $fa-var-angle-double-down: \f103; $fa-var-users-rectangle: \e594; $fa-var-people-roof: \e537; $fa-var-people-line: \e534; $fa-var-beer-mug-empty: \f0fc; $fa-var-beer: \f0fc; $fa-var-diagram-predecessor: \e477; $fa-var-arrow-up-long: \f176; $fa-var-long-arrow-up: \f176; $fa-var-fire-flame-simple: \f46a; $fa-var-burn: \f46a; $fa-var-person: \f183; $fa-var-male: \f183; $fa-var-laptop: \f109; $fa-var-file-csv: \f6dd; $fa-var-menorah: \f676; $fa-var-truck-plane: \e58f; $fa-var-record-vinyl: \f8d9; $fa-var-face-grin-stars: \f587; $fa-var-grin-stars: \f587; $fa-var-bong: \f55c; $fa-var-spaghetti-monster-flying: \f67b; $fa-var-pastafarianism: \f67b; $fa-var-arrow-down-up-across-line: \e4af; $fa-var-spoon: \f2e5; $fa-var-utensil-spoon: \f2e5; $fa-var-jar-wheat: \e517; $fa-var-envelopes-bulk: \f674; $fa-var-mail-bulk: \f674; $fa-var-file-circle-exclamation: \e4eb; $fa-var-circle-h: \f47e; $fa-var-hospital-symbol: \f47e; $fa-var-pager: \f815; $fa-var-address-book: \f2b9; $fa-var-contact-book: \f2b9; $fa-var-strikethrough: \f0cc; $fa-var-k: \4b; $fa-var-landmark-flag: \e51c; $fa-var-pencil: \f303; $fa-var-pencil-alt: \f303; $fa-var-backward: \f04a; $fa-var-caret-right: \f0da; $fa-var-comments: \f086; $fa-var-paste: \f0ea; $fa-var-file-clipboard: \f0ea; $fa-var-code-pull-request: \e13c; $fa-var-clipboard-list: \f46d; $fa-var-truck-ramp-box: \f4de; $fa-var-truck-loading: \f4de; $fa-var-user-check: \f4fc; $fa-var-vial-virus: \e597; $fa-var-sheet-plastic: \e571; $fa-var-blog: \f781; $fa-var-user-ninja: \f504; $fa-var-person-arrow-up-from-line: \e539; $fa-var-scroll-torah: \f6a0; $fa-var-torah: \f6a0; $fa-var-broom-ball: \f458; $fa-var-quidditch: \f458; $fa-var-quidditch-broom-ball: \f458; $fa-var-toggle-off: \f204; $fa-var-box-archive: \f187; $fa-var-archive: \f187; $fa-var-person-drowning: \e545; $fa-var-arrow-down-9-1: \f886; $fa-var-sort-numeric-desc: \f886; $fa-var-sort-numeric-down-alt: \f886; $fa-var-face-grin-tongue-squint: \f58a; $fa-var-grin-tongue-squint: \f58a; $fa-var-spray-can: \f5bd; $fa-var-truck-monster: \f63b; $fa-var-w: \57; $fa-var-earth-africa: \f57c; $fa-var-globe-africa: \f57c; $fa-var-rainbow: \f75b; $fa-var-circle-notch: \f1ce; $fa-var-tablet-screen-button: \f3fa; $fa-var-tablet-alt: \f3fa; $fa-var-paw: \f1b0; $fa-var-cloud: \f0c2; $fa-var-trowel-bricks: \e58a; $fa-var-face-flushed: \f579; $fa-var-flushed: \f579; $fa-var-hospital-user: \f80d; $fa-var-tent-arrow-left-right: \e57f; $fa-var-gavel: \f0e3; $fa-var-legal: \f0e3; $fa-var-binoculars: \f1e5; $fa-var-microphone-slash: \f131; $fa-var-box-tissue: \e05b; $fa-var-motorcycle: \f21c; $fa-var-bell-concierge: \f562; $fa-var-concierge-bell: \f562; $fa-var-pen-ruler: \f5ae; $fa-var-pencil-ruler: \f5ae; $fa-var-people-arrows: \e068; $fa-var-people-arrows-left-right: \e068; $fa-var-mars-and-venus-burst: \e523; $fa-var-square-caret-right: \f152; $fa-var-caret-square-right: \f152; $fa-var-scissors: \f0c4; $fa-var-cut: \f0c4; $fa-var-sun-plant-wilt: \e57a; $fa-var-toilets-portable: \e584; $fa-var-hockey-puck: \f453; $fa-var-table: \f0ce; $fa-var-magnifying-glass-arrow-right: \e521; $fa-var-tachograph-digital: \f566; $fa-var-digital-tachograph: \f566; $fa-var-users-slash: \e073; $fa-var-clover: \e139; $fa-var-reply: \f3e5; $fa-var-mail-reply: \f3e5; $fa-var-star-and-crescent: \f699; $fa-var-house-fire: \e50c; $fa-var-square-minus: \f146; $fa-var-minus-square: \f146; $fa-var-helicopter: \f533; $fa-var-compass: \f14e; $fa-var-square-caret-down: \f150; $fa-var-caret-square-down: \f150; $fa-var-file-circle-question: \e4ef; $fa-var-laptop-code: \f5fc; $fa-var-swatchbook: \f5c3; $fa-var-prescription-bottle: \f485; $fa-var-bars: \f0c9; $fa-var-navicon: \f0c9; $fa-var-people-group: \e533; $fa-var-hourglass-end: \f253; $fa-var-hourglass-3: \f253; $fa-var-heart-crack: \f7a9; $fa-var-heart-broken: \f7a9; $fa-var-square-up-right: \f360; $fa-var-external-link-square-alt: \f360; $fa-var-face-kiss-beam: \f597; $fa-var-kiss-beam: \f597; $fa-var-film: \f008; $fa-var-ruler-horizontal: \f547; $fa-var-people-robbery: \e536; $fa-var-lightbulb: \f0eb; $fa-var-caret-left: \f0d9; $fa-var-circle-exclamation: \f06a; $fa-var-exclamation-circle: \f06a; $fa-var-school-circle-xmark: \e56d; $fa-var-arrow-right-from-bracket: \f08b; $fa-var-sign-out: \f08b; $fa-var-circle-chevron-down: \f13a; $fa-var-chevron-circle-down: \f13a; $fa-var-unlock-keyhole: \f13e; $fa-var-unlock-alt: \f13e; $fa-var-cloud-showers-heavy: \f740; $fa-var-headphones-simple: \f58f; $fa-var-headphones-alt: \f58f; $fa-var-sitemap: \f0e8; $fa-var-circle-dollar-to-slot: \f4b9; $fa-var-donate: \f4b9; $fa-var-memory: \f538; $fa-var-road-spikes: \e568; $fa-var-fire-burner: \e4f1; $fa-var-flag: \f024; $fa-var-hanukiah: \f6e6; $fa-var-feather: \f52d; $fa-var-volume-low: \f027; $fa-var-volume-down: \f027; $fa-var-comment-slash: \f4b3; $fa-var-cloud-sun-rain: \f743; $fa-var-compress: \f066; $fa-var-wheat-awn: \e2cd; $fa-var-wheat-alt: \e2cd; $fa-var-ankh: \f644; $fa-var-hands-holding-child: \e4fa; $fa-var-asterisk: \2a; $fa-var-square-check: \f14a; $fa-var-check-square: \f14a; $fa-var-peseta-sign: \e221; $fa-var-heading: \f1dc; $fa-var-header: \f1dc; $fa-var-ghost: \f6e2; $fa-var-list: \f03a; $fa-var-list-squares: \f03a; $fa-var-square-phone-flip: \f87b; $fa-var-phone-square-alt: \f87b; $fa-var-cart-plus: \f217; $fa-var-gamepad: \f11b; $fa-var-circle-dot: \f192; $fa-var-dot-circle: \f192; $fa-var-face-dizzy: \f567; $fa-var-dizzy: \f567; $fa-var-egg: \f7fb; $fa-var-house-medical-circle-xmark: \e513; $fa-var-campground: \f6bb; $fa-var-folder-plus: \f65e; $fa-var-futbol: \f1e3; $fa-var-futbol-ball: \f1e3; $fa-var-soccer-ball: \f1e3; $fa-var-paintbrush: \f1fc; $fa-var-paint-brush: \f1fc; $fa-var-lock: \f023; $fa-var-gas-pump: \f52f; $fa-var-hot-tub-person: \f593; $fa-var-hot-tub: \f593; $fa-var-map-location: \f59f; $fa-var-map-marked: \f59f; $fa-var-house-flood-water: \e50e; $fa-var-tree: \f1bb; $fa-var-bridge-lock: \e4cc; $fa-var-sack-dollar: \f81d; $fa-var-pen-to-square: \f044; $fa-var-edit: \f044; $fa-var-car-side: \f5e4; $fa-var-share-nodes: \f1e0; $fa-var-share-alt: \f1e0; $fa-var-heart-circle-minus: \e4ff; $fa-var-hourglass-half: \f252; $fa-var-hourglass-2: \f252; $fa-var-microscope: \f610; $fa-var-sink: \e06d; $fa-var-bag-shopping: \f290; $fa-var-shopping-bag: \f290; $fa-var-arrow-down-z-a: \f881; $fa-var-sort-alpha-desc: \f881; $fa-var-sort-alpha-down-alt: \f881; $fa-var-mitten: \f7b5; $fa-var-person-rays: \e54d; $fa-var-users: \f0c0; $fa-var-eye-slash: \f070; $fa-var-flask-vial: \e4f3; $fa-var-hand: \f256; $fa-var-hand-paper: \f256; $fa-var-om: \f679; $fa-var-worm: \e599; $fa-var-house-circle-xmark: \e50b; $fa-var-plug: \f1e6; $fa-var-chevron-up: \f077; $fa-var-hand-spock: \f259; $fa-var-stopwatch: \f2f2; $fa-var-face-kiss: \f596; $fa-var-kiss: \f596; $fa-var-bridge-circle-xmark: \e4cb; $fa-var-face-grin-tongue: \f589; $fa-var-grin-tongue: \f589; $fa-var-chess-bishop: \f43a; $fa-var-face-grin-wink: \f58c; $fa-var-grin-wink: \f58c; $fa-var-ear-deaf: \f2a4; $fa-var-deaf: \f2a4; $fa-var-deafness: \f2a4; $fa-var-hard-of-hearing: \f2a4; $fa-var-road-circle-check: \e564; $fa-var-dice-five: \f523; $fa-var-square-rss: \f143; $fa-var-rss-square: \f143; $fa-var-land-mine-on: \e51b; $fa-var-i-cursor: \f246; $fa-var-stamp: \f5bf; $fa-var-stairs: \e289; $fa-var-i: \49; $fa-var-hryvnia-sign: \f6f2; $fa-var-hryvnia: \f6f2; $fa-var-pills: \f484; $fa-var-face-grin-wide: \f581; $fa-var-grin-alt: \f581; $fa-var-tooth: \f5c9; $fa-var-v: \56; $fa-var-bangladeshi-taka-sign: \e2e6; $fa-var-bicycle: \f206; $fa-var-staff-snake: \e579; $fa-var-rod-asclepius: \e579; $fa-var-rod-snake: \e579; $fa-var-staff-aesculapius: \e579; $fa-var-head-side-cough-slash: \e062; $fa-var-truck-medical: \f0f9; $fa-var-ambulance: \f0f9; $fa-var-wheat-awn-circle-exclamation: \e598; $fa-var-snowman: \f7d0; $fa-var-mortar-pestle: \f5a7; $fa-var-road-barrier: \e562; $fa-var-school: \f549; $fa-var-igloo: \f7ae; $fa-var-joint: \f595; $fa-var-angle-right: \f105; $fa-var-horse: \f6f0; $fa-var-q: \51; $fa-var-g: \47; $fa-var-notes-medical: \f481; $fa-var-temperature-half: \f2c9; $fa-var-temperature-2: \f2c9; $fa-var-thermometer-2: \f2c9; $fa-var-thermometer-half: \f2c9; $fa-var-dong-sign: \e169; $fa-var-capsules: \f46b; $fa-var-poo-storm: \f75a; $fa-var-poo-bolt: \f75a; $fa-var-face-frown-open: \f57a; $fa-var-frown-open: \f57a; $fa-var-hand-point-up: \f0a6; $fa-var-money-bill: \f0d6; $fa-var-bookmark: \f02e; $fa-var-align-justify: \f039; $fa-var-umbrella-beach: \f5ca; $fa-var-helmet-un: \e503; $fa-var-bullseye: \f140; $fa-var-bacon: \f7e5; $fa-var-hand-point-down: \f0a7; $fa-var-arrow-up-from-bracket: \e09a; $fa-var-folder: \f07b; $fa-var-folder-blank: \f07b; $fa-var-file-waveform: \f478; $fa-var-file-medical-alt: \f478; $fa-var-radiation: \f7b9; $fa-var-chart-simple: \e473; $fa-var-mars-stroke: \f229; $fa-var-vial: \f492; $fa-var-gauge: \f624; $fa-var-dashboard: \f624; $fa-var-gauge-med: \f624; $fa-var-tachometer-alt-average: \f624; $fa-var-wand-magic-sparkles: \e2ca; $fa-var-magic-wand-sparkles: \e2ca; $fa-var-e: \45; $fa-var-pen-clip: \f305; $fa-var-pen-alt: \f305; $fa-var-bridge-circle-exclamation: \e4ca; $fa-var-user: \f007; $fa-var-school-circle-check: \e56b; $fa-var-dumpster: \f793; $fa-var-van-shuttle: \f5b6; $fa-var-shuttle-van: \f5b6; $fa-var-building-user: \e4da; $fa-var-square-caret-left: \f191; $fa-var-caret-square-left: \f191; $fa-var-highlighter: \f591; $fa-var-key: \f084; $fa-var-bullhorn: \f0a1; $fa-var-globe: \f0ac; $fa-var-synagogue: \f69b; $fa-var-person-half-dress: \e548; $fa-var-road-bridge: \e563; $fa-var-location-arrow: \f124; $fa-var-c: \43; $fa-var-tablet-button: \f10a; $fa-var-building-lock: \e4d6; $fa-var-pizza-slice: \f818; $fa-var-money-bill-wave: \f53a; $fa-var-chart-area: \f1fe; $fa-var-area-chart: \f1fe; $fa-var-house-flag: \e50d; $fa-var-person-circle-minus: \e540; $fa-var-ban: \f05e; $fa-var-cancel: \f05e; $fa-var-camera-rotate: \e0d8; $fa-var-spray-can-sparkles: \f5d0; $fa-var-air-freshener: \f5d0; $fa-var-star: \f005; $fa-var-repeat: \f363; $fa-var-cross: \f654; $fa-var-box: \f466; $fa-var-venus-mars: \f228; $fa-var-arrow-pointer: \f245; $fa-var-mouse-pointer: \f245; $fa-var-maximize: \f31e; $fa-var-expand-arrows-alt: \f31e; $fa-var-charging-station: \f5e7; $fa-var-shapes: \f61f; $fa-var-triangle-circle-square: \f61f; $fa-var-shuffle: \f074; $fa-var-random: \f074; $fa-var-person-running: \f70c; $fa-var-running: \f70c; $fa-var-mobile-retro: \e527; $fa-var-grip-lines-vertical: \f7a5; $fa-var-spider: \f717; $fa-var-hands-bound: \e4f9; $fa-var-file-invoice-dollar: \f571; $fa-var-plane-circle-exclamation: \e556; $fa-var-x-ray: \f497; $fa-var-spell-check: \f891; $fa-var-slash: \f715; $fa-var-computer-mouse: \f8cc; $fa-var-mouse: \f8cc; $fa-var-arrow-right-to-bracket: \f090; $fa-var-sign-in: \f090; $fa-var-shop-slash: \e070; $fa-var-store-alt-slash: \e070; $fa-var-server: \f233; $fa-var-virus-covid-slash: \e4a9; $fa-var-shop-lock: \e4a5; $fa-var-hourglass-start: \f251; $fa-var-hourglass-1: \f251; $fa-var-blender-phone: \f6b6; $fa-var-building-wheat: \e4db; $fa-var-person-breastfeeding: \e53a; $fa-var-right-to-bracket: \f2f6; $fa-var-sign-in-alt: \f2f6; $fa-var-venus: \f221; $fa-var-passport: \f5ab; $fa-var-heart-pulse: \f21e; $fa-var-heartbeat: \f21e; $fa-var-people-carry-box: \f4ce; $fa-var-people-carry: \f4ce; $fa-var-temperature-high: \f769; $fa-var-microchip: \f2db; $fa-var-crown: \f521; $fa-var-weight-hanging: \f5cd; $fa-var-xmarks-lines: \e59a; $fa-var-file-prescription: \f572; $fa-var-weight-scale: \f496; $fa-var-weight: \f496; $fa-var-user-group: \f500; $fa-var-user-friends: \f500; $fa-var-arrow-up-a-z: \f15e; $fa-var-sort-alpha-up: \f15e; $fa-var-chess-knight: \f441; $fa-var-face-laugh-squint: \f59b; $fa-var-laugh-squint: \f59b; $fa-var-wheelchair: \f193; $fa-var-circle-arrow-up: \f0aa; $fa-var-arrow-circle-up: \f0aa; $fa-var-toggle-on: \f205; $fa-var-person-walking: \f554; $fa-var-walking: \f554; $fa-var-l: \4c; $fa-var-fire: \f06d; $fa-var-bed-pulse: \f487; $fa-var-procedures: \f487; $fa-var-shuttle-space: \f197; $fa-var-space-shuttle: \f197; $fa-var-face-laugh: \f599; $fa-var-laugh: \f599; $fa-var-folder-open: \f07c; $fa-var-heart-circle-plus: \e500; $fa-var-code-fork: \e13b; $fa-var-city: \f64f; $fa-var-microphone-lines: \f3c9; $fa-var-microphone-alt: \f3c9; $fa-var-pepper-hot: \f816; $fa-var-unlock: \f09c; $fa-var-colon-sign: \e140; $fa-var-headset: \f590; $fa-var-store-slash: \e071; $fa-var-road-circle-xmark: \e566; $fa-var-user-minus: \f503; $fa-var-mars-stroke-up: \f22a; $fa-var-mars-stroke-v: \f22a; $fa-var-champagne-glasses: \f79f; $fa-var-glass-cheers: \f79f; $fa-var-clipboard: \f328; $fa-var-house-circle-exclamation: \e50a; $fa-var-file-arrow-up: \f574; $fa-var-file-upload: \f574; $fa-var-wifi: \f1eb; $fa-var-wifi-3: \f1eb; $fa-var-wifi-strong: \f1eb; $fa-var-bath: \f2cd; $fa-var-bathtub: \f2cd; $fa-var-underline: \f0cd; $fa-var-user-pen: \f4ff; $fa-var-user-edit: \f4ff; $fa-var-signature: \f5b7; $fa-var-stroopwafel: \f551; $fa-var-bold: \f032; $fa-var-anchor-lock: \e4ad; $fa-var-building-ngo: \e4d7; $fa-var-manat-sign: \e1d5; $fa-var-not-equal: \f53e; $fa-var-border-top-left: \f853; $fa-var-border-style: \f853; $fa-var-map-location-dot: \f5a0; $fa-var-map-marked-alt: \f5a0; $fa-var-jedi: \f669; $fa-var-square-poll-vertical: \f681; $fa-var-poll: \f681; $fa-var-mug-hot: \f7b6; $fa-var-car-battery: \f5df; $fa-var-battery-car: \f5df; $fa-var-gift: \f06b; $fa-var-dice-two: \f528; $fa-var-chess-queen: \f445; $fa-var-glasses: \f530; $fa-var-chess-board: \f43c; $fa-var-building-circle-check: \e4d2; $fa-var-person-chalkboard: \e53d; $fa-var-mars-stroke-right: \f22b; $fa-var-mars-stroke-h: \f22b; $fa-var-hand-back-fist: \f255; $fa-var-hand-rock: \f255; $fa-var-square-caret-up: \f151; $fa-var-caret-square-up: \f151; $fa-var-cloud-showers-water: \e4e4; $fa-var-chart-bar: \f080; $fa-var-bar-chart: \f080; $fa-var-hands-bubbles: \e05e; $fa-var-hands-wash: \e05e; $fa-var-less-than-equal: \f537; $fa-var-train: \f238; $fa-var-eye-low-vision: \f2a8; $fa-var-low-vision: \f2a8; $fa-var-crow: \f520; $fa-var-sailboat: \e445; $fa-var-window-restore: \f2d2; $fa-var-square-plus: \f0fe; $fa-var-plus-square: \f0fe; $fa-var-torii-gate: \f6a1; $fa-var-frog: \f52e; $fa-var-bucket: \e4cf; $fa-var-image: \f03e; $fa-var-microphone: \f130; $fa-var-cow: \f6c8; $fa-var-caret-up: \f0d8; $fa-var-screwdriver: \f54a; $fa-var-folder-closed: \e185; $fa-var-house-tsunami: \e515; $fa-var-square-nfi: \e576; $fa-var-arrow-up-from-ground-water: \e4b5; $fa-var-martini-glass: \f57b; $fa-var-glass-martini-alt: \f57b; $fa-var-rotate-left: \f2ea; $fa-var-rotate-back: \f2ea; $fa-var-rotate-backward: \f2ea; $fa-var-undo-alt: \f2ea; $fa-var-table-columns: \f0db; $fa-var-columns: \f0db; $fa-var-lemon: \f094; $fa-var-head-side-mask: \e063; $fa-var-handshake: \f2b5; $fa-var-gem: \f3a5; $fa-var-dolly: \f472; $fa-var-dolly-box: \f472; $fa-var-smoking: \f48d; $fa-var-minimize: \f78c; $fa-var-compress-arrows-alt: \f78c; $fa-var-monument: \f5a6; $fa-var-snowplow: \f7d2; $fa-var-angles-right: \f101; $fa-var-angle-double-right: \f101; $fa-var-cannabis: \f55f; $fa-var-circle-play: \f144; $fa-var-play-circle: \f144; $fa-var-tablets: \f490; $fa-var-ethernet: \f796; $fa-var-euro-sign: \f153; $fa-var-eur: \f153; $fa-var-euro: \f153; $fa-var-chair: \f6c0; $fa-var-circle-check: \f058; $fa-var-check-circle: \f058; $fa-var-circle-stop: \f28d; $fa-var-stop-circle: \f28d; $fa-var-compass-drafting: \f568; $fa-var-drafting-compass: \f568; $fa-var-plate-wheat: \e55a; $fa-var-icicles: \f7ad; $fa-var-person-shelter: \e54f; $fa-var-neuter: \f22c; $fa-var-id-badge: \f2c1; $fa-var-marker: \f5a1; $fa-var-face-laugh-beam: \f59a; $fa-var-laugh-beam: \f59a; $fa-var-helicopter-symbol: \e502; $fa-var-universal-access: \f29a; $fa-var-circle-chevron-up: \f139; $fa-var-chevron-circle-up: \f139; $fa-var-lari-sign: \e1c8; $fa-var-volcano: \f770; $fa-var-person-walking-dashed-line-arrow-right: \e553; $fa-var-sterling-sign: \f154; $fa-var-gbp: \f154; $fa-var-pound-sign: \f154; $fa-var-viruses: \e076; $fa-var-square-person-confined: \e577; $fa-var-user-tie: \f508; $fa-var-arrow-down-long: \f175; $fa-var-long-arrow-down: \f175; $fa-var-tent-arrow-down-to-line: \e57e; $fa-var-certificate: \f0a3; $fa-var-reply-all: \f122; $fa-var-mail-reply-all: \f122; $fa-var-suitcase: \f0f2; $fa-var-person-skating: \f7c5; $fa-var-skating: \f7c5; $fa-var-filter-circle-dollar: \f662; $fa-var-funnel-dollar: \f662; $fa-var-camera-retro: \f083; $fa-var-circle-arrow-down: \f0ab; $fa-var-arrow-circle-down: \f0ab; $fa-var-file-import: \f56f; $fa-var-arrow-right-to-file: \f56f; $fa-var-square-arrow-up-right: \f14c; $fa-var-external-link-square: \f14c; $fa-var-box-open: \f49e; $fa-var-scroll: \f70e; $fa-var-spa: \f5bb; $fa-var-location-pin-lock: \e51f; $fa-var-pause: \f04c; $fa-var-hill-avalanche: \e507; $fa-var-temperature-empty: \f2cb; $fa-var-temperature-0: \f2cb; $fa-var-thermometer-0: \f2cb; $fa-var-thermometer-empty: \f2cb; $fa-var-bomb: \f1e2; $fa-var-registered: \f25d; $fa-var-address-card: \f2bb; $fa-var-contact-card: \f2bb; $fa-var-vcard: \f2bb; $fa-var-scale-unbalanced-flip: \f516; $fa-var-balance-scale-right: \f516; $fa-var-subscript: \f12c; $fa-var-diamond-turn-right: \f5eb; $fa-var-directions: \f5eb; $fa-var-burst: \e4dc; $fa-var-house-laptop: \e066; $fa-var-laptop-house: \e066; $fa-var-face-tired: \f5c8; $fa-var-tired: \f5c8; $fa-var-money-bills: \e1f3; $fa-var-smog: \f75f; $fa-var-crutch: \f7f7; $fa-var-cloud-arrow-up: \f0ee; $fa-var-cloud-upload: \f0ee; $fa-var-cloud-upload-alt: \f0ee; $fa-var-palette: \f53f; $fa-var-arrows-turn-right: \e4c0; $fa-var-vest: \e085; $fa-var-ferry: \e4ea; $fa-var-arrows-down-to-people: \e4b9; $fa-var-seedling: \f4d8; $fa-var-sprout: \f4d8; $fa-var-left-right: \f337; $fa-var-arrows-alt-h: \f337; $fa-var-boxes-packing: \e4c7; $fa-var-circle-arrow-left: \f0a8; $fa-var-arrow-circle-left: \f0a8; $fa-var-group-arrows-rotate: \e4f6; $fa-var-bowl-food: \e4c6; $fa-var-candy-cane: \f786; $fa-var-arrow-down-wide-short: \f160; $fa-var-sort-amount-asc: \f160; $fa-var-sort-amount-down: \f160; $fa-var-cloud-bolt: \f76c; $fa-var-thunderstorm: \f76c; $fa-var-text-slash: \f87d; $fa-var-remove-format: \f87d; $fa-var-face-smile-wink: \f4da; $fa-var-smile-wink: \f4da; $fa-var-file-word: \f1c2; $fa-var-file-powerpoint: \f1c4; $fa-var-arrows-left-right: \f07e; $fa-var-arrows-h: \f07e; $fa-var-house-lock: \e510; $fa-var-cloud-arrow-down: \f0ed; $fa-var-cloud-download: \f0ed; $fa-var-cloud-download-alt: \f0ed; $fa-var-children: \e4e1; $fa-var-chalkboard: \f51b; $fa-var-blackboard: \f51b; $fa-var-user-large-slash: \f4fa; $fa-var-user-alt-slash: \f4fa; $fa-var-envelope-open: \f2b6; $fa-var-handshake-simple-slash: \e05f; $fa-var-handshake-alt-slash: \e05f; $fa-var-mattress-pillow: \e525; $fa-var-guarani-sign: \e19a; $fa-var-arrows-rotate: \f021; $fa-var-refresh: \f021; $fa-var-sync: \f021; $fa-var-fire-extinguisher: \f134; $fa-var-cruzeiro-sign: \e152; $fa-var-greater-than-equal: \f532; $fa-var-shield-halved: \f3ed; $fa-var-shield-alt: \f3ed; $fa-var-book-atlas: \f558; $fa-var-atlas: \f558; $fa-var-virus: \e074; $fa-var-envelope-circle-check: \e4e8; $fa-var-layer-group: \f5fd; $fa-var-arrows-to-dot: \e4be; $fa-var-archway: \f557; $fa-var-heart-circle-check: \e4fd; $fa-var-house-chimney-crack: \f6f1; $fa-var-house-damage: \f6f1; $fa-var-file-zipper: \f1c6; $fa-var-file-archive: \f1c6; $fa-var-square: \f0c8; $fa-var-martini-glass-empty: \f000; $fa-var-glass-martini: \f000; $fa-var-couch: \f4b8; $fa-var-cedi-sign: \e0df; $fa-var-italic: \f033; $fa-var-table-cells-column-lock: \e678; $fa-var-church: \f51d; $fa-var-comments-dollar: \f653; $fa-var-democrat: \f747; $fa-var-z: \5a; $fa-var-person-skiing: \f7c9; $fa-var-skiing: \f7c9; $fa-var-road-lock: \e567; $fa-var-a: \41; $fa-var-temperature-arrow-down: \e03f; $fa-var-temperature-down: \e03f; $fa-var-feather-pointed: \f56b; $fa-var-feather-alt: \f56b; $fa-var-p: \50; $fa-var-snowflake: \f2dc; $fa-var-newspaper: \f1ea; $fa-var-rectangle-ad: \f641; $fa-var-ad: \f641; $fa-var-circle-arrow-right: \f0a9; $fa-var-arrow-circle-right: \f0a9; $fa-var-filter-circle-xmark: \e17b; $fa-var-locust: \e520; $fa-var-sort: \f0dc; $fa-var-unsorted: \f0dc; $fa-var-list-ol: \f0cb; $fa-var-list-1-2: \f0cb; $fa-var-list-numeric: \f0cb; $fa-var-person-dress-burst: \e544; $fa-var-money-check-dollar: \f53d; $fa-var-money-check-alt: \f53d; $fa-var-vector-square: \f5cb; $fa-var-bread-slice: \f7ec; $fa-var-language: \f1ab; $fa-var-face-kiss-wink-heart: \f598; $fa-var-kiss-wink-heart: \f598; $fa-var-filter: \f0b0; $fa-var-question: \3f; $fa-var-file-signature: \f573; $fa-var-up-down-left-right: \f0b2; $fa-var-arrows-alt: \f0b2; $fa-var-house-chimney-user: \e065; $fa-var-hand-holding-heart: \f4be; $fa-var-puzzle-piece: \f12e; $fa-var-money-check: \f53c; $fa-var-star-half-stroke: \f5c0; $fa-var-star-half-alt: \f5c0; $fa-var-code: \f121; $fa-var-whiskey-glass: \f7a0; $fa-var-glass-whiskey: \f7a0; $fa-var-building-circle-exclamation: \e4d3; $fa-var-magnifying-glass-chart: \e522; $fa-var-arrow-up-right-from-square: \f08e; $fa-var-external-link: \f08e; $fa-var-cubes-stacked: \e4e6; $fa-var-won-sign: \f159; $fa-var-krw: \f159; $fa-var-won: \f159; $fa-var-virus-covid: \e4a8; $fa-var-austral-sign: \e0a9; $fa-var-f: \46; $fa-var-leaf: \f06c; $fa-var-road: \f018; $fa-var-taxi: \f1ba; $fa-var-cab: \f1ba; $fa-var-person-circle-plus: \e541; $fa-var-chart-pie: \f200; $fa-var-pie-chart: \f200; $fa-var-bolt-lightning: \e0b7; $fa-var-sack-xmark: \e56a; $fa-var-file-excel: \f1c3; $fa-var-file-contract: \f56c; $fa-var-fish-fins: \e4f2; $fa-var-building-flag: \e4d5; $fa-var-face-grin-beam: \f582; $fa-var-grin-beam: \f582; $fa-var-object-ungroup: \f248; $fa-var-poop: \f619; $fa-var-location-pin: \f041; $fa-var-map-marker: \f041; $fa-var-kaaba: \f66b; $fa-var-toilet-paper: \f71e; $fa-var-helmet-safety: \f807; $fa-var-hard-hat: \f807; $fa-var-hat-hard: \f807; $fa-var-eject: \f052; $fa-var-circle-right: \f35a; $fa-var-arrow-alt-circle-right: \f35a; $fa-var-plane-circle-check: \e555; $fa-var-face-rolling-eyes: \f5a5; $fa-var-meh-rolling-eyes: \f5a5; $fa-var-object-group: \f247; $fa-var-chart-line: \f201; $fa-var-line-chart: \f201; $fa-var-mask-ventilator: \e524; $fa-var-arrow-right: \f061; $fa-var-signs-post: \f277; $fa-var-map-signs: \f277; $fa-var-cash-register: \f788; $fa-var-person-circle-question: \e542; $fa-var-h: \48; $fa-var-tarp: \e57b; $fa-var-screwdriver-wrench: \f7d9; $fa-var-tools: \f7d9; $fa-var-arrows-to-eye: \e4bf; $fa-var-plug-circle-bolt: \e55b; $fa-var-heart: \f004; $fa-var-mars-and-venus: \f224; $fa-var-house-user: \e1b0; $fa-var-home-user: \e1b0; $fa-var-dumpster-fire: \f794; $fa-var-house-crack: \e3b1; $fa-var-martini-glass-citrus: \f561; $fa-var-cocktail: \f561; $fa-var-face-surprise: \f5c2; $fa-var-surprise: \f5c2; $fa-var-bottle-water: \e4c5; $fa-var-circle-pause: \f28b; $fa-var-pause-circle: \f28b; $fa-var-toilet-paper-slash: \e072; $fa-var-apple-whole: \f5d1; $fa-var-apple-alt: \f5d1; $fa-var-kitchen-set: \e51a; $fa-var-r: \52; $fa-var-temperature-quarter: \f2ca; $fa-var-temperature-1: \f2ca; $fa-var-thermometer-1: \f2ca; $fa-var-thermometer-quarter: \f2ca; $fa-var-cube: \f1b2; $fa-var-bitcoin-sign: \e0b4; $fa-var-shield-dog: \e573; $fa-var-solar-panel: \f5ba; $fa-var-lock-open: \f3c1; $fa-var-elevator: \e16d; $fa-var-money-bill-transfer: \e528; $fa-var-money-bill-trend-up: \e529; $fa-var-house-flood-water-circle-arrow-right: \e50f; $fa-var-square-poll-horizontal: \f682; $fa-var-poll-h: \f682; $fa-var-circle: \f111; $fa-var-backward-fast: \f049; $fa-var-fast-backward: \f049; $fa-var-recycle: \f1b8; $fa-var-user-astronaut: \f4fb; $fa-var-plane-slash: \e069; $fa-var-trademark: \f25c; $fa-var-basketball: \f434; $fa-var-basketball-ball: \f434; $fa-var-satellite-dish: \f7c0; $fa-var-circle-up: \f35b; $fa-var-arrow-alt-circle-up: \f35b; $fa-var-mobile-screen-button: \f3cd; $fa-var-mobile-alt: \f3cd; $fa-var-volume-high: \f028; $fa-var-volume-up: \f028; $fa-var-users-rays: \e593; $fa-var-wallet: \f555; $fa-var-clipboard-check: \f46c; $fa-var-file-audio: \f1c7; $fa-var-burger: \f805; $fa-var-hamburger: \f805; $fa-var-wrench: \f0ad; $fa-var-bugs: \e4d0; $fa-var-rupee-sign: \f156; $fa-var-rupee: \f156; $fa-var-file-image: \f1c5; $fa-var-circle-question: \f059; $fa-var-question-circle: \f059; $fa-var-plane-departure: \f5b0; $fa-var-handshake-slash: \e060; $fa-var-book-bookmark: \e0bb; $fa-var-code-branch: \f126; $fa-var-hat-cowboy: \f8c0; $fa-var-bridge: \e4c8; $fa-var-phone-flip: \f879; $fa-var-phone-alt: \f879; $fa-var-truck-front: \e2b7; $fa-var-cat: \f6be; $fa-var-anchor-circle-exclamation: \e4ab; $fa-var-truck-field: \e58d; $fa-var-route: \f4d7; $fa-var-clipboard-question: \e4e3; $fa-var-panorama: \e209; $fa-var-comment-medical: \f7f5; $fa-var-teeth-open: \f62f; $fa-var-file-circle-minus: \e4ed; $fa-var-tags: \f02c; $fa-var-wine-glass: \f4e3; $fa-var-forward-fast: \f050; $fa-var-fast-forward: \f050; $fa-var-face-meh-blank: \f5a4; $fa-var-meh-blank: \f5a4; $fa-var-square-parking: \f540; $fa-var-parking: \f540; $fa-var-house-signal: \e012; $fa-var-bars-progress: \f828; $fa-var-tasks-alt: \f828; $fa-var-faucet-drip: \e006; $fa-var-cart-flatbed: \f474; $fa-var-dolly-flatbed: \f474; $fa-var-ban-smoking: \f54d; $fa-var-smoking-ban: \f54d; $fa-var-terminal: \f120; $fa-var-mobile-button: \f10b; $fa-var-house-medical-flag: \e514; $fa-var-basket-shopping: \f291; $fa-var-shopping-basket: \f291; $fa-var-tape: \f4db; $fa-var-bus-simple: \f55e; $fa-var-bus-alt: \f55e; $fa-var-eye: \f06e; $fa-var-face-sad-cry: \f5b3; $fa-var-sad-cry: \f5b3; $fa-var-audio-description: \f29e; $fa-var-person-military-to-person: \e54c; $fa-var-file-shield: \e4f0; $fa-var-user-slash: \f506; $fa-var-pen: \f304; $fa-var-tower-observation: \e586; $fa-var-file-code: \f1c9; $fa-var-signal: \f012; $fa-var-signal-5: \f012; $fa-var-signal-perfect: \f012; $fa-var-bus: \f207; $fa-var-heart-circle-xmark: \e501; $fa-var-house-chimney: \e3af; $fa-var-home-lg: \e3af; $fa-var-window-maximize: \f2d0; $fa-var-face-frown: \f119; $fa-var-frown: \f119; $fa-var-prescription: \f5b1; $fa-var-shop: \f54f; $fa-var-store-alt: \f54f; $fa-var-floppy-disk: \f0c7; $fa-var-save: \f0c7; $fa-var-vihara: \f6a7; $fa-var-scale-unbalanced: \f515; $fa-var-balance-scale-left: \f515; $fa-var-sort-up: \f0de; $fa-var-sort-asc: \f0de; $fa-var-comment-dots: \f4ad; $fa-var-commenting: \f4ad; $fa-var-plant-wilt: \e5aa; $fa-var-diamond: \f219; $fa-var-face-grin-squint: \f585; $fa-var-grin-squint: \f585; $fa-var-hand-holding-dollar: \f4c0; $fa-var-hand-holding-usd: \f4c0; $fa-var-bacterium: \e05a; $fa-var-hand-pointer: \f25a; $fa-var-drum-steelpan: \f56a; $fa-var-hand-scissors: \f257; $fa-var-hands-praying: \f684; $fa-var-praying-hands: \f684; $fa-var-arrow-rotate-right: \f01e; $fa-var-arrow-right-rotate: \f01e; $fa-var-arrow-rotate-forward: \f01e; $fa-var-redo: \f01e; $fa-var-biohazard: \f780; $fa-var-location-crosshairs: \f601; $fa-var-location: \f601; $fa-var-mars-double: \f227; $fa-var-child-dress: \e59c; $fa-var-users-between-lines: \e591; $fa-var-lungs-virus: \e067; $fa-var-face-grin-tears: \f588; $fa-var-grin-tears: \f588; $fa-var-phone: \f095; $fa-var-calendar-xmark: \f273; $fa-var-calendar-times: \f273; $fa-var-child-reaching: \e59d; $fa-var-head-side-virus: \e064; $fa-var-user-gear: \f4fe; $fa-var-user-cog: \f4fe; $fa-var-arrow-up-1-9: \f163; $fa-var-sort-numeric-up: \f163; $fa-var-door-closed: \f52a; $fa-var-shield-virus: \e06c; $fa-var-dice-six: \f526; $fa-var-mosquito-net: \e52c; $fa-var-bridge-water: \e4ce; $fa-var-person-booth: \f756; $fa-var-text-width: \f035; $fa-var-hat-wizard: \f6e8; $fa-var-pen-fancy: \f5ac; $fa-var-person-digging: \f85e; $fa-var-digging: \f85e; $fa-var-trash: \f1f8; $fa-var-gauge-simple: \f629; $fa-var-gauge-simple-med: \f629; $fa-var-tachometer-average: \f629; $fa-var-book-medical: \f7e6; $fa-var-poo: \f2fe; $fa-var-quote-right: \f10e; $fa-var-quote-right-alt: \f10e; $fa-var-shirt: \f553; $fa-var-t-shirt: \f553; $fa-var-tshirt: \f553; $fa-var-cubes: \f1b3; $fa-var-divide: \f529; $fa-var-tenge-sign: \f7d7; $fa-var-tenge: \f7d7; $fa-var-headphones: \f025; $fa-var-hands-holding: \f4c2; $fa-var-hands-clapping: \e1a8; $fa-var-republican: \f75e; $fa-var-arrow-left: \f060; $fa-var-person-circle-xmark: \e543; $fa-var-ruler: \f545; $fa-var-align-left: \f036; $fa-var-dice-d6: \f6d1; $fa-var-restroom: \f7bd; $fa-var-j: \4a; $fa-var-users-viewfinder: \e595; $fa-var-file-video: \f1c8; $fa-var-up-right-from-square: \f35d; $fa-var-external-link-alt: \f35d; $fa-var-table-cells: \f00a; $fa-var-th: \f00a; $fa-var-file-pdf: \f1c1; $fa-var-book-bible: \f647; $fa-var-bible: \f647; $fa-var-o: \4f; $fa-var-suitcase-medical: \f0fa; $fa-var-medkit: \f0fa; $fa-var-user-secret: \f21b; $fa-var-otter: \f700; $fa-var-person-dress: \f182; $fa-var-female: \f182; $fa-var-comment-dollar: \f651; $fa-var-business-time: \f64a; $fa-var-briefcase-clock: \f64a; $fa-var-table-cells-large: \f009; $fa-var-th-large: \f009; $fa-var-book-tanakh: \f827; $fa-var-tanakh: \f827; $fa-var-phone-volume: \f2a0; $fa-var-volume-control-phone: \f2a0; $fa-var-hat-cowboy-side: \f8c1; $fa-var-clipboard-user: \f7f3; $fa-var-child: \f1ae; $fa-var-lira-sign: \f195; $fa-var-satellite: \f7bf; $fa-var-plane-lock: \e558; $fa-var-tag: \f02b; $fa-var-comment: \f075; $fa-var-cake-candles: \f1fd; $fa-var-birthday-cake: \f1fd; $fa-var-cake: \f1fd; $fa-var-envelope: \f0e0; $fa-var-angles-up: \f102; $fa-var-angle-double-up: \f102; $fa-var-paperclip: \f0c6; $fa-var-arrow-right-to-city: \e4b3; $fa-var-ribbon: \f4d6; $fa-var-lungs: \f604; $fa-var-arrow-up-9-1: \f887; $fa-var-sort-numeric-up-alt: \f887; $fa-var-litecoin-sign: \e1d3; $fa-var-border-none: \f850; $fa-var-circle-nodes: \e4e2; $fa-var-parachute-box: \f4cd; $fa-var-indent: \f03c; $fa-var-truck-field-un: \e58e; $fa-var-hourglass: \f254; $fa-var-hourglass-empty: \f254; $fa-var-mountain: \f6fc; $fa-var-user-doctor: \f0f0; $fa-var-user-md: \f0f0; $fa-var-circle-info: \f05a; $fa-var-info-circle: \f05a; $fa-var-cloud-meatball: \f73b; $fa-var-camera: \f030; $fa-var-camera-alt: \f030; $fa-var-square-virus: \e578; $fa-var-meteor: \f753; $fa-var-car-on: \e4dd; $fa-var-sleigh: \f7cc; $fa-var-arrow-down-1-9: \f162; $fa-var-sort-numeric-asc: \f162; $fa-var-sort-numeric-down: \f162; $fa-var-hand-holding-droplet: \f4c1; $fa-var-hand-holding-water: \f4c1; $fa-var-water: \f773; $fa-var-calendar-check: \f274; $fa-var-braille: \f2a1; $fa-var-prescription-bottle-medical: \f486; $fa-var-prescription-bottle-alt: \f486; $fa-var-landmark: \f66f; $fa-var-truck: \f0d1; $fa-var-crosshairs: \f05b; $fa-var-person-cane: \e53c; $fa-var-tent: \e57d; $fa-var-vest-patches: \e086; $fa-var-check-double: \f560; $fa-var-arrow-down-a-z: \f15d; $fa-var-sort-alpha-asc: \f15d; $fa-var-sort-alpha-down: \f15d; $fa-var-money-bill-wheat: \e52a; $fa-var-cookie: \f563; $fa-var-arrow-rotate-left: \f0e2; $fa-var-arrow-left-rotate: \f0e2; $fa-var-arrow-rotate-back: \f0e2; $fa-var-arrow-rotate-backward: \f0e2; $fa-var-undo: \f0e2; $fa-var-hard-drive: \f0a0; $fa-var-hdd: \f0a0; $fa-var-face-grin-squint-tears: \f586; $fa-var-grin-squint-tears: \f586; $fa-var-dumbbell: \f44b; $fa-var-rectangle-list: \f022; $fa-var-list-alt: \f022; $fa-var-tarp-droplet: \e57c; $fa-var-house-medical-circle-check: \e511; $fa-var-person-skiing-nordic: \f7ca; $fa-var-skiing-nordic: \f7ca; $fa-var-calendar-plus: \f271; $fa-var-plane-arrival: \f5af; $fa-var-circle-left: \f359; $fa-var-arrow-alt-circle-left: \f359; $fa-var-train-subway: \f239; $fa-var-subway: \f239; $fa-var-chart-gantt: \e0e4; $fa-var-indian-rupee-sign: \e1bc; $fa-var-indian-rupee: \e1bc; $fa-var-inr: \e1bc; $fa-var-crop-simple: \f565; $fa-var-crop-alt: \f565; $fa-var-money-bill-1: \f3d1; $fa-var-money-bill-alt: \f3d1; $fa-var-left-long: \f30a; $fa-var-long-arrow-alt-left: \f30a; $fa-var-dna: \f471; $fa-var-virus-slash: \e075; $fa-var-minus: \f068; $fa-var-subtract: \f068; $fa-var-chess: \f439; $fa-var-arrow-left-long: \f177; $fa-var-long-arrow-left: \f177; $fa-var-plug-circle-check: \e55c; $fa-var-street-view: \f21d; $fa-var-franc-sign: \e18f; $fa-var-volume-off: \f026; $fa-var-hands-asl-interpreting: \f2a3; $fa-var-american-sign-language-interpreting: \f2a3; $fa-var-asl-interpreting: \f2a3; $fa-var-hands-american-sign-language-interpreting: \f2a3; $fa-var-gear: \f013; $fa-var-cog: \f013; $fa-var-droplet-slash: \f5c7; $fa-var-tint-slash: \f5c7; $fa-var-mosque: \f678; $fa-var-mosquito: \e52b; $fa-var-star-of-david: \f69a; $fa-var-person-military-rifle: \e54b; $fa-var-cart-shopping: \f07a; $fa-var-shopping-cart: \f07a; $fa-var-vials: \f493; $fa-var-plug-circle-plus: \e55f; $fa-var-place-of-worship: \f67f; $fa-var-grip-vertical: \f58e; $fa-var-arrow-turn-up: \f148; $fa-var-level-up: \f148; $fa-var-u: \55; $fa-var-square-root-variable: \f698; $fa-var-square-root-alt: \f698; $fa-var-clock: \f017; $fa-var-clock-four: \f017; $fa-var-backward-step: \f048; $fa-var-step-backward: \f048; $fa-var-pallet: \f482; $fa-var-faucet: \e005; $fa-var-baseball-bat-ball: \f432; $fa-var-s: \53; $fa-var-timeline: \e29c; $fa-var-keyboard: \f11c; $fa-var-caret-down: \f0d7; $fa-var-house-chimney-medical: \f7f2; $fa-var-clinic-medical: \f7f2; $fa-var-temperature-three-quarters: \f2c8; $fa-var-temperature-3: \f2c8; $fa-var-thermometer-3: \f2c8; $fa-var-thermometer-three-quarters: \f2c8; $fa-var-mobile-screen: \f3cf; $fa-var-mobile-android-alt: \f3cf; $fa-var-plane-up: \e22d; $fa-var-piggy-bank: \f4d3; $fa-var-battery-half: \f242; $fa-var-battery-3: \f242; $fa-var-mountain-city: \e52e; $fa-var-coins: \f51e; $fa-var-khanda: \f66d; $fa-var-sliders: \f1de; $fa-var-sliders-h: \f1de; $fa-var-folder-tree: \f802; $fa-var-network-wired: \f6ff; $fa-var-map-pin: \f276; $fa-var-hamsa: \f665; $fa-var-cent-sign: \e3f5; $fa-var-flask: \f0c3; $fa-var-person-pregnant: \e31e; $fa-var-wand-sparkles: \f72b; $fa-var-ellipsis-vertical: \f142; $fa-var-ellipsis-v: \f142; $fa-var-ticket: \f145; $fa-var-power-off: \f011; $fa-var-right-long: \f30b; $fa-var-long-arrow-alt-right: \f30b; $fa-var-flag-usa: \f74d; $fa-var-laptop-file: \e51d; $fa-var-tty: \f1e4; $fa-var-teletype: \f1e4; $fa-var-diagram-next: \e476; $fa-var-person-rifle: \e54e; $fa-var-house-medical-circle-exclamation: \e512; $fa-var-closed-captioning: \f20a; $fa-var-person-hiking: \f6ec; $fa-var-hiking: \f6ec; $fa-var-venus-double: \f226; $fa-var-images: \f302; $fa-var-calculator: \f1ec; $fa-var-people-pulling: \e535; $fa-var-n: \4e; $fa-var-cable-car: \f7da; $fa-var-tram: \f7da; $fa-var-cloud-rain: \f73d; $fa-var-building-circle-xmark: \e4d4; $fa-var-ship: \f21a; $fa-var-arrows-down-to-line: \e4b8; $fa-var-download: \f019; $fa-var-face-grin: \f580; $fa-var-grin: \f580; $fa-var-delete-left: \f55a; $fa-var-backspace: \f55a; $fa-var-eye-dropper: \f1fb; $fa-var-eye-dropper-empty: \f1fb; $fa-var-eyedropper: \f1fb; $fa-var-file-circle-check: \e5a0; $fa-var-forward: \f04e; $fa-var-mobile: \f3ce; $fa-var-mobile-android: \f3ce; $fa-var-mobile-phone: \f3ce; $fa-var-face-meh: \f11a; $fa-var-meh: \f11a; $fa-var-align-center: \f037; $fa-var-book-skull: \f6b7; $fa-var-book-dead: \f6b7; $fa-var-id-card: \f2c2; $fa-var-drivers-license: \f2c2; $fa-var-outdent: \f03b; $fa-var-dedent: \f03b; $fa-var-heart-circle-exclamation: \e4fe; $fa-var-house: \f015; $fa-var-home: \f015; $fa-var-home-alt: \f015; $fa-var-home-lg-alt: \f015; $fa-var-calendar-week: \f784; $fa-var-laptop-medical: \f812; $fa-var-b: \42; $fa-var-file-medical: \f477; $fa-var-dice-one: \f525; $fa-var-kiwi-bird: \f535; $fa-var-arrow-right-arrow-left: \f0ec; $fa-var-exchange: \f0ec; $fa-var-rotate-right: \f2f9; $fa-var-redo-alt: \f2f9; $fa-var-rotate-forward: \f2f9; $fa-var-utensils: \f2e7; $fa-var-cutlery: \f2e7; $fa-var-arrow-up-wide-short: \f161; $fa-var-sort-amount-up: \f161; $fa-var-mill-sign: \e1ed; $fa-var-bowl-rice: \e2eb; $fa-var-skull: \f54c; $fa-var-tower-broadcast: \f519; $fa-var-broadcast-tower: \f519; $fa-var-truck-pickup: \f63c; $fa-var-up-long: \f30c; $fa-var-long-arrow-alt-up: \f30c; $fa-var-stop: \f04d; $fa-var-code-merge: \f387; $fa-var-upload: \f093; $fa-var-hurricane: \f751; $fa-var-mound: \e52d; $fa-var-toilet-portable: \e583; $fa-var-compact-disc: \f51f; $fa-var-file-arrow-down: \f56d; $fa-var-file-download: \f56d; $fa-var-caravan: \f8ff; $fa-var-shield-cat: \e572; $fa-var-bolt: \f0e7; $fa-var-zap: \f0e7; $fa-var-glass-water: \e4f4; $fa-var-oil-well: \e532; $fa-var-vault: \e2c5; $fa-var-mars: \f222; $fa-var-toilet: \f7d8; $fa-var-plane-circle-xmark: \e557; $fa-var-yen-sign: \f157; $fa-var-cny: \f157; $fa-var-jpy: \f157; $fa-var-rmb: \f157; $fa-var-yen: \f157; $fa-var-ruble-sign: \f158; $fa-var-rouble: \f158; $fa-var-rub: \f158; $fa-var-ruble: \f158; $fa-var-sun: \f185; $fa-var-guitar: \f7a6; $fa-var-face-laugh-wink: \f59c; $fa-var-laugh-wink: \f59c; $fa-var-horse-head: \f7ab; $fa-var-bore-hole: \e4c3; $fa-var-industry: \f275; $fa-var-circle-down: \f358; $fa-var-arrow-alt-circle-down: \f358; $fa-var-arrows-turn-to-dots: \e4c1; $fa-var-florin-sign: \e184; $fa-var-arrow-down-short-wide: \f884; $fa-var-sort-amount-desc: \f884; $fa-var-sort-amount-down-alt: \f884; $fa-var-less-than: \3c; $fa-var-angle-down: \f107; $fa-var-car-tunnel: \e4de; $fa-var-head-side-cough: \e061; $fa-var-grip-lines: \f7a4; $fa-var-thumbs-down: \f165; $fa-var-user-lock: \f502; $fa-var-arrow-right-long: \f178; $fa-var-long-arrow-right: \f178; $fa-var-anchor-circle-xmark: \e4ac; $fa-var-ellipsis: \f141; $fa-var-ellipsis-h: \f141; $fa-var-chess-pawn: \f443; $fa-var-kit-medical: \f479; $fa-var-first-aid: \f479; $fa-var-person-through-window: \e5a9; $fa-var-toolbox: \f552; $fa-var-hands-holding-circle: \e4fb; $fa-var-bug: \f188; $fa-var-credit-card: \f09d; $fa-var-credit-card-alt: \f09d; $fa-var-car: \f1b9; $fa-var-automobile: \f1b9; $fa-var-hand-holding-hand: \e4f7; $fa-var-book-open-reader: \f5da; $fa-var-book-reader: \f5da; $fa-var-mountain-sun: \e52f; $fa-var-arrows-left-right-to-line: \e4ba; $fa-var-dice-d20: \f6cf; $fa-var-truck-droplet: \e58c; $fa-var-file-circle-xmark: \e5a1; $fa-var-temperature-arrow-up: \e040; $fa-var-temperature-up: \e040; $fa-var-medal: \f5a2; $fa-var-bed: \f236; $fa-var-square-h: \f0fd; $fa-var-h-square: \f0fd; $fa-var-podcast: \f2ce; $fa-var-temperature-full: \f2c7; $fa-var-temperature-4: \f2c7; $fa-var-thermometer-4: \f2c7; $fa-var-thermometer-full: \f2c7; $fa-var-bell: \f0f3; $fa-var-superscript: \f12b; $fa-var-plug-circle-xmark: \e560; $fa-var-star-of-life: \f621; $fa-var-phone-slash: \f3dd; $fa-var-paint-roller: \f5aa; $fa-var-handshake-angle: \f4c4; $fa-var-hands-helping: \f4c4; $fa-var-location-dot: \f3c5; $fa-var-map-marker-alt: \f3c5; $fa-var-file: \f15b; $fa-var-greater-than: \3e; $fa-var-person-swimming: \f5c4; $fa-var-swimmer: \f5c4; $fa-var-arrow-down: \f063; $fa-var-droplet: \f043; $fa-var-tint: \f043; $fa-var-eraser: \f12d; $fa-var-earth-americas: \f57d; $fa-var-earth: \f57d; $fa-var-earth-america: \f57d; $fa-var-globe-americas: \f57d; $fa-var-person-burst: \e53b; $fa-var-dove: \f4ba; $fa-var-battery-empty: \f244; $fa-var-battery-0: \f244; $fa-var-socks: \f696; $fa-var-inbox: \f01c; $fa-var-section: \e447; $fa-var-gauge-high: \f625; $fa-var-tachometer-alt: \f625; $fa-var-tachometer-alt-fast: \f625; $fa-var-envelope-open-text: \f658; $fa-var-hospital: \f0f8; $fa-var-hospital-alt: \f0f8; $fa-var-hospital-wide: \f0f8; $fa-var-wine-bottle: \f72f; $fa-var-chess-rook: \f447; $fa-var-bars-staggered: \f550; $fa-var-reorder: \f550; $fa-var-stream: \f550; $fa-var-dharmachakra: \f655; $fa-var-hotdog: \f80f; $fa-var-person-walking-with-cane: \f29d; $fa-var-blind: \f29d; $fa-var-drum: \f569; $fa-var-ice-cream: \f810; $fa-var-heart-circle-bolt: \e4fc; $fa-var-fax: \f1ac; $fa-var-paragraph: \f1dd; $fa-var-check-to-slot: \f772; $fa-var-vote-yea: \f772; $fa-var-star-half: \f089; $fa-var-boxes-stacked: \f468; $fa-var-boxes: \f468; $fa-var-boxes-alt: \f468; $fa-var-link: \f0c1; $fa-var-chain: \f0c1; $fa-var-ear-listen: \f2a2; $fa-var-assistive-listening-systems: \f2a2; $fa-var-tree-city: \e587; $fa-var-play: \f04b; $fa-var-font: \f031; $fa-var-table-cells-row-lock: \e67a; $fa-var-rupiah-sign: \e23d; $fa-var-magnifying-glass: \f002; $fa-var-search: \f002; $fa-var-table-tennis-paddle-ball: \f45d; $fa-var-ping-pong-paddle-ball: \f45d; $fa-var-table-tennis: \f45d; $fa-var-person-dots-from-line: \f470; $fa-var-diagnoses: \f470; $fa-var-trash-can-arrow-up: \f82a; $fa-var-trash-restore-alt: \f82a; $fa-var-naira-sign: \e1f6; $fa-var-cart-arrow-down: \f218; $fa-var-walkie-talkie: \f8ef; $fa-var-file-pen: \f31c; $fa-var-file-edit: \f31c; $fa-var-receipt: \f543; $fa-var-square-pen: \f14b; $fa-var-pen-square: \f14b; $fa-var-pencil-square: \f14b; $fa-var-suitcase-rolling: \f5c1; $fa-var-person-circle-exclamation: \e53f; $fa-var-chevron-down: \f078; $fa-var-battery-full: \f240; $fa-var-battery: \f240; $fa-var-battery-5: \f240; $fa-var-skull-crossbones: \f714; $fa-var-code-compare: \e13a; $fa-var-list-ul: \f0ca; $fa-var-list-dots: \f0ca; $fa-var-school-lock: \e56f; $fa-var-tower-cell: \e585; $fa-var-down-long: \f309; $fa-var-long-arrow-alt-down: \f309; $fa-var-ranking-star: \e561; $fa-var-chess-king: \f43f; $fa-var-person-harassing: \e549; $fa-var-brazilian-real-sign: \e46c; $fa-var-landmark-dome: \f752; $fa-var-landmark-alt: \f752; $fa-var-arrow-up: \f062; $fa-var-tv: \f26c; $fa-var-television: \f26c; $fa-var-tv-alt: \f26c; $fa-var-shrimp: \e448; $fa-var-list-check: \f0ae; $fa-var-tasks: \f0ae; $fa-var-jug-detergent: \e519; $fa-var-circle-user: \f2bd; $fa-var-user-circle: \f2bd; $fa-var-user-shield: \f505; $fa-var-wind: \f72e; $fa-var-car-burst: \f5e1; $fa-var-car-crash: \f5e1; $fa-var-y: \59; $fa-var-person-snowboarding: \f7ce; $fa-var-snowboarding: \f7ce; $fa-var-truck-fast: \f48b; $fa-var-shipping-fast: \f48b; $fa-var-fish: \f578; $fa-var-user-graduate: \f501; $fa-var-circle-half-stroke: \f042; $fa-var-adjust: \f042; $fa-var-clapperboard: \e131; $fa-var-circle-radiation: \f7ba; $fa-var-radiation-alt: \f7ba; $fa-var-baseball: \f433; $fa-var-baseball-ball: \f433; $fa-var-jet-fighter-up: \e518; $fa-var-diagram-project: \f542; $fa-var-project-diagram: \f542; $fa-var-copy: \f0c5; $fa-var-volume-xmark: \f6a9; $fa-var-volume-mute: \f6a9; $fa-var-volume-times: \f6a9; $fa-var-hand-sparkles: \e05d; $fa-var-grip: \f58d; $fa-var-grip-horizontal: \f58d; $fa-var-share-from-square: \f14d; $fa-var-share-square: \f14d; $fa-var-child-combatant: \e4e0; $fa-var-child-rifle: \e4e0; $fa-var-gun: \e19b; $fa-var-square-phone: \f098; $fa-var-phone-square: \f098; $fa-var-plus: \2b; $fa-var-add: \2b; $fa-var-expand: \f065; $fa-var-computer: \e4e5; $fa-var-xmark: \f00d; $fa-var-close: \f00d; $fa-var-multiply: \f00d; $fa-var-remove: \f00d; $fa-var-times: \f00d; $fa-var-arrows-up-down-left-right: \f047; $fa-var-arrows: \f047; $fa-var-chalkboard-user: \f51c; $fa-var-chalkboard-teacher: \f51c; $fa-var-peso-sign: \e222; $fa-var-building-shield: \e4d8; $fa-var-baby: \f77c; $fa-var-users-line: \e592; $fa-var-quote-left: \f10d; $fa-var-quote-left-alt: \f10d; $fa-var-tractor: \f722; $fa-var-trash-arrow-up: \f829; $fa-var-trash-restore: \f829; $fa-var-arrow-down-up-lock: \e4b0; $fa-var-lines-leaning: \e51e; $fa-var-ruler-combined: \f546; $fa-var-copyright: \f1f9; $fa-var-equals: \3d; $fa-var-blender: \f517; $fa-var-teeth: \f62e; $fa-var-shekel-sign: \f20b; $fa-var-ils: \f20b; $fa-var-shekel: \f20b; $fa-var-sheqel: \f20b; $fa-var-sheqel-sign: \f20b; $fa-var-map: \f279; $fa-var-rocket: \f135; $fa-var-photo-film: \f87c; $fa-var-photo-video: \f87c; $fa-var-folder-minus: \f65d; $fa-var-store: \f54e; $fa-var-arrow-trend-up: \e098; $fa-var-plug-circle-minus: \e55e; $fa-var-sign-hanging: \f4d9; $fa-var-sign: \f4d9; $fa-var-bezier-curve: \f55b; $fa-var-bell-slash: \f1f6; $fa-var-tablet: \f3fb; $fa-var-tablet-android: \f3fb; $fa-var-school-flag: \e56e; $fa-var-fill: \f575; $fa-var-angle-up: \f106; $fa-var-drumstick-bite: \f6d7; $fa-var-holly-berry: \f7aa; $fa-var-chevron-left: \f053; $fa-var-bacteria: \e059; $fa-var-hand-lizard: \f258; $fa-var-notdef: \e1fe; $fa-var-disease: \f7fa; $fa-var-briefcase-medical: \f469; $fa-var-genderless: \f22d; $fa-var-chevron-right: \f054; $fa-var-retweet: \f079; $fa-var-car-rear: \f5de; $fa-var-car-alt: \f5de; $fa-var-pump-soap: \e06b; $fa-var-video-slash: \f4e2; $fa-var-battery-quarter: \f243; $fa-var-battery-2: \f243; $fa-var-radio: \f8d7; $fa-var-baby-carriage: \f77d; $fa-var-carriage-baby: \f77d; $fa-var-traffic-light: \f637; $fa-var-thermometer: \f491; $fa-var-vr-cardboard: \f729; $fa-var-hand-middle-finger: \f806; $fa-var-percent: \25; $fa-var-percentage: \25; $fa-var-truck-moving: \f4df; $fa-var-glass-water-droplet: \e4f5; $fa-var-display: \e163; $fa-var-face-smile: \f118; $fa-var-smile: \f118; $fa-var-thumbtack: \f08d; $fa-var-thumb-tack: \f08d; $fa-var-trophy: \f091; $fa-var-person-praying: \f683; $fa-var-pray: \f683; $fa-var-hammer: \f6e3; $fa-var-hand-peace: \f25b; $fa-var-rotate: \f2f1; $fa-var-sync-alt: \f2f1; $fa-var-spinner: \f110; $fa-var-robot: \f544; $fa-var-peace: \f67c; $fa-var-gears: \f085; $fa-var-cogs: \f085; $fa-var-warehouse: \f494; $fa-var-arrow-up-right-dots: \e4b7; $fa-var-splotch: \f5bc; $fa-var-face-grin-hearts: \f584; $fa-var-grin-hearts: \f584; $fa-var-dice-four: \f524; $fa-var-sim-card: \f7c4; $fa-var-transgender: \f225; $fa-var-transgender-alt: \f225; $fa-var-mercury: \f223; $fa-var-arrow-turn-down: \f149; $fa-var-level-down: \f149; $fa-var-person-falling-burst: \e547; $fa-var-award: \f559; $fa-var-ticket-simple: \f3ff; $fa-var-ticket-alt: \f3ff; $fa-var-building: \f1ad; $fa-var-angles-left: \f100; $fa-var-angle-double-left: \f100; $fa-var-qrcode: \f029; $fa-var-clock-rotate-left: \f1da; $fa-var-history: \f1da; $fa-var-face-grin-beam-sweat: \f583; $fa-var-grin-beam-sweat: \f583; $fa-var-file-export: \f56e; $fa-var-arrow-right-from-file: \f56e; $fa-var-shield: \f132; $fa-var-shield-blank: \f132; $fa-var-arrow-up-short-wide: \f885; $fa-var-sort-amount-up-alt: \f885; $fa-var-house-medical: \e3b2; $fa-var-golf-ball-tee: \f450; $fa-var-golf-ball: \f450; $fa-var-circle-chevron-left: \f137; $fa-var-chevron-circle-left: \f137; $fa-var-house-chimney-window: \e00d; $fa-var-pen-nib: \f5ad; $fa-var-tent-arrow-turn-left: \e580; $fa-var-tents: \e582; $fa-var-wand-magic: \f0d0; $fa-var-magic: \f0d0; $fa-var-dog: \f6d3; $fa-var-carrot: \f787; $fa-var-moon: \f186; $fa-var-wine-glass-empty: \f5ce; $fa-var-wine-glass-alt: \f5ce; $fa-var-cheese: \f7ef; $fa-var-yin-yang: \f6ad; $fa-var-music: \f001; $fa-var-code-commit: \f386; $fa-var-temperature-low: \f76b; $fa-var-person-biking: \f84a; $fa-var-biking: \f84a; $fa-var-broom: \f51a; $fa-var-shield-heart: \e574; $fa-var-gopuram: \f664; $fa-var-earth-oceania: \e47b; $fa-var-globe-oceania: \e47b; $fa-var-square-xmark: \f2d3; $fa-var-times-square: \f2d3; $fa-var-xmark-square: \f2d3; $fa-var-hashtag: \23; $fa-var-up-right-and-down-left-from-center: \f424; $fa-var-expand-alt: \f424; $fa-var-oil-can: \f613; $fa-var-t: \54; $fa-var-hippo: \f6ed; $fa-var-chart-column: \e0e3; $fa-var-infinity: \f534; $fa-var-vial-circle-check: \e596; $fa-var-person-arrow-down-to-line: \e538; $fa-var-voicemail: \f897; $fa-var-fan: \f863; $fa-var-person-walking-luggage: \e554; $fa-var-up-down: \f338; $fa-var-arrows-alt-v: \f338; $fa-var-cloud-moon-rain: \f73c; $fa-var-calendar: \f133; $fa-var-trailer: \e041; $fa-var-bahai: \f666; $fa-var-haykal: \f666; $fa-var-sd-card: \f7c2; $fa-var-dragon: \f6d5; $fa-var-shoe-prints: \f54b; $fa-var-circle-plus: \f055; $fa-var-plus-circle: \f055; $fa-var-face-grin-tongue-wink: \f58b; $fa-var-grin-tongue-wink: \f58b; $fa-var-hand-holding: \f4bd; $fa-var-plug-circle-exclamation: \e55d; $fa-var-link-slash: \f127; $fa-var-chain-broken: \f127; $fa-var-chain-slash: \f127; $fa-var-unlink: \f127; $fa-var-clone: \f24d; $fa-var-person-walking-arrow-loop-left: \e551; $fa-var-arrow-up-z-a: \f882; $fa-var-sort-alpha-up-alt: \f882; $fa-var-fire-flame-curved: \f7e4; $fa-var-fire-alt: \f7e4; $fa-var-tornado: \f76f; $fa-var-file-circle-plus: \e494; $fa-var-book-quran: \f687; $fa-var-quran: \f687; $fa-var-anchor: \f13d; $fa-var-border-all: \f84c; $fa-var-face-angry: \f556; $fa-var-angry: \f556; $fa-var-cookie-bite: \f564; $fa-var-arrow-trend-down: \e097; $fa-var-rss: \f09e; $fa-var-feed: \f09e; $fa-var-draw-polygon: \f5ee; $fa-var-scale-balanced: \f24e; $fa-var-balance-scale: \f24e; $fa-var-gauge-simple-high: \f62a; $fa-var-tachometer: \f62a; $fa-var-tachometer-fast: \f62a; $fa-var-shower: \f2cc; $fa-var-desktop: \f390; $fa-var-desktop-alt: \f390; $fa-var-m: \4d; $fa-var-table-list: \f00b; $fa-var-th-list: \f00b; $fa-var-comment-sms: \f7cd; $fa-var-sms: \f7cd; $fa-var-book: \f02d; $fa-var-user-plus: \f234; $fa-var-check: \f00c; $fa-var-battery-three-quarters: \f241; $fa-var-battery-4: \f241; $fa-var-house-circle-check: \e509; $fa-var-angle-left: \f104; $fa-var-diagram-successor: \e47a; $fa-var-truck-arrow-right: \e58b; $fa-var-arrows-split-up-and-left: \e4bc; $fa-var-hand-fist: \f6de; $fa-var-fist-raised: \f6de; $fa-var-cloud-moon: \f6c3; $fa-var-briefcase: \f0b1; $fa-var-person-falling: \e546; $fa-var-image-portrait: \f3e0; $fa-var-portrait: \f3e0; $fa-var-user-tag: \f507; $fa-var-rug: \e569; $fa-var-earth-europe: \f7a2; $fa-var-globe-europe: \f7a2; $fa-var-cart-flatbed-suitcase: \f59d; $fa-var-luggage-cart: \f59d; $fa-var-rectangle-xmark: \f410; $fa-var-rectangle-times: \f410; $fa-var-times-rectangle: \f410; $fa-var-window-close: \f410; $fa-var-baht-sign: \e0ac; $fa-var-book-open: \f518; $fa-var-book-journal-whills: \f66a; $fa-var-journal-whills: \f66a; $fa-var-handcuffs: \e4f8; $fa-var-triangle-exclamation: \f071; $fa-var-exclamation-triangle: \f071; $fa-var-warning: \f071; $fa-var-database: \f1c0; $fa-var-share: \f064; $fa-var-mail-forward: \f064; $fa-var-bottle-droplet: \e4c4; $fa-var-mask-face: \e1d7; $fa-var-hill-rockslide: \e508; $fa-var-right-left: \f362; $fa-var-exchange-alt: \f362; $fa-var-paper-plane: \f1d8; $fa-var-road-circle-exclamation: \e565; $fa-var-dungeon: \f6d9; $fa-var-align-right: \f038; $fa-var-money-bill-1-wave: \f53b; $fa-var-money-bill-wave-alt: \f53b; $fa-var-life-ring: \f1cd; $fa-var-hands: \f2a7; $fa-var-sign-language: \f2a7; $fa-var-signing: \f2a7; $fa-var-calendar-day: \f783; $fa-var-water-ladder: \f5c5; $fa-var-ladder-water: \f5c5; $fa-var-swimming-pool: \f5c5; $fa-var-arrows-up-down: \f07d; $fa-var-arrows-v: \f07d; $fa-var-face-grimace: \f57f; $fa-var-grimace: \f57f; $fa-var-wheelchair-move: \e2ce; $fa-var-wheelchair-alt: \e2ce; $fa-var-turn-down: \f3be; $fa-var-level-down-alt: \f3be; $fa-var-person-walking-arrow-right: \e552; $fa-var-square-envelope: \f199; $fa-var-envelope-square: \f199; $fa-var-dice: \f522; $fa-var-bowling-ball: \f436; $fa-var-brain: \f5dc; $fa-var-bandage: \f462; $fa-var-band-aid: \f462; $fa-var-calendar-minus: \f272; $fa-var-circle-xmark: \f057; $fa-var-times-circle: \f057; $fa-var-xmark-circle: \f057; $fa-var-gifts: \f79c; $fa-var-hotel: \f594; $fa-var-earth-asia: \f57e; $fa-var-globe-asia: \f57e; $fa-var-id-card-clip: \f47f; $fa-var-id-card-alt: \f47f; $fa-var-magnifying-glass-plus: \f00e; $fa-var-search-plus: \f00e; $fa-var-thumbs-up: \f164; $fa-var-user-clock: \f4fd; $fa-var-hand-dots: \f461; $fa-var-allergies: \f461; $fa-var-file-invoice: \f570; $fa-var-window-minimize: \f2d1; $fa-var-mug-saucer: \f0f4; $fa-var-coffee: \f0f4; $fa-var-brush: \f55d; $fa-var-mask: \f6fa; $fa-var-magnifying-glass-minus: \f010; $fa-var-search-minus: \f010; $fa-var-ruler-vertical: \f548; $fa-var-user-large: \f406; $fa-var-user-alt: \f406; $fa-var-train-tram: \e5b4; $fa-var-user-nurse: \f82f; $fa-var-syringe: \f48e; $fa-var-cloud-sun: \f6c4; $fa-var-stopwatch-20: \e06f; $fa-var-square-full: \f45c; $fa-var-magnet: \f076; $fa-var-jar: \e516; $fa-var-note-sticky: \f249; $fa-var-sticky-note: \f249; $fa-var-bug-slash: \e490; $fa-var-arrow-up-from-water-pump: \e4b6; $fa-var-bone: \f5d7; $fa-var-user-injured: \f728; $fa-var-face-sad-tear: \f5b4; $fa-var-sad-tear: \f5b4; $fa-var-plane: \f072; $fa-var-tent-arrows-down: \e581; $fa-var-exclamation: \21; $fa-var-arrows-spin: \e4bb; $fa-var-print: \f02f; $fa-var-turkish-lira-sign: \e2bb; $fa-var-try: \e2bb; $fa-var-turkish-lira: \e2bb; $fa-var-dollar-sign: \24; $fa-var-dollar: \24; $fa-var-usd: \24; $fa-var-x: \58; $fa-var-magnifying-glass-dollar: \f688; $fa-var-search-dollar: \f688; $fa-var-users-gear: \f509; $fa-var-users-cog: \f509; $fa-var-person-military-pointing: \e54a; $fa-var-building-columns: \f19c; $fa-var-bank: \f19c; $fa-var-institution: \f19c; $fa-var-museum: \f19c; $fa-var-university: \f19c; $fa-var-umbrella: \f0e9; $fa-var-trowel: \e589; $fa-var-d: \44; $fa-var-stapler: \e5af; $fa-var-masks-theater: \f630; $fa-var-theater-masks: \f630; $fa-var-kip-sign: \e1c4; $fa-var-hand-point-left: \f0a5; $fa-var-handshake-simple: \f4c6; $fa-var-handshake-alt: \f4c6; $fa-var-jet-fighter: \f0fb; $fa-var-fighter-jet: \f0fb; $fa-var-square-share-nodes: \f1e1; $fa-var-share-alt-square: \f1e1; $fa-var-barcode: \f02a; $fa-var-plus-minus: \e43c; $fa-var-video: \f03d; $fa-var-video-camera: \f03d; $fa-var-graduation-cap: \f19d; $fa-var-mortar-board: \f19d; $fa-var-hand-holding-medical: \e05c; $fa-var-person-circle-check: \e53e; $fa-var-turn-up: \f3bf; $fa-var-level-up-alt: \f3bf; $fa-var-monero: \f3d0; $fa-var-hooli: \f427; $fa-var-yelp: \f1e9; $fa-var-cc-visa: \f1f0; $fa-var-lastfm: \f202; $fa-var-shopware: \f5b5; $fa-var-creative-commons-nc: \f4e8; $fa-var-aws: \f375; $fa-var-redhat: \f7bc; $fa-var-yoast: \f2b1; $fa-var-cloudflare: \e07d; $fa-var-ups: \f7e0; $fa-var-pixiv: \e640; $fa-var-wpexplorer: \f2de; $fa-var-dyalog: \f399; $fa-var-bity: \f37a; $fa-var-stackpath: \f842; $fa-var-buysellads: \f20d; $fa-var-first-order: \f2b0; $fa-var-modx: \f285; $fa-var-guilded: \e07e; $fa-var-vnv: \f40b; $fa-var-square-js: \f3b9; $fa-var-js-square: \f3b9; $fa-var-microsoft: \f3ca; $fa-var-qq: \f1d6; $fa-var-orcid: \f8d2; $fa-var-java: \f4e4; $fa-var-invision: \f7b0; $fa-var-creative-commons-pd-alt: \f4ed; $fa-var-centercode: \f380; $fa-var-glide-g: \f2a6; $fa-var-drupal: \f1a9; $fa-var-jxl: \e67b; $fa-var-hire-a-helper: \f3b0; $fa-var-creative-commons-by: \f4e7; $fa-var-unity: \e049; $fa-var-whmcs: \f40d; $fa-var-rocketchat: \f3e8; $fa-var-vk: \f189; $fa-var-untappd: \f405; $fa-var-mailchimp: \f59e; $fa-var-css3-alt: \f38b; $fa-var-square-reddit: \f1a2; $fa-var-reddit-square: \f1a2; $fa-var-vimeo-v: \f27d; $fa-var-contao: \f26d; $fa-var-square-font-awesome: \e5ad; $fa-var-deskpro: \f38f; $fa-var-brave: \e63c; $fa-var-sistrix: \f3ee; $fa-var-square-instagram: \e055; $fa-var-instagram-square: \e055; $fa-var-battle-net: \f835; $fa-var-the-red-yeti: \f69d; $fa-var-square-hacker-news: \f3af; $fa-var-hacker-news-square: \f3af; $fa-var-edge: \f282; $fa-var-threads: \e618; $fa-var-napster: \f3d2; $fa-var-square-snapchat: \f2ad; $fa-var-snapchat-square: \f2ad; $fa-var-google-plus-g: \f0d5; $fa-var-artstation: \f77a; $fa-var-markdown: \f60f; $fa-var-sourcetree: \f7d3; $fa-var-google-plus: \f2b3; $fa-var-diaspora: \f791; $fa-var-foursquare: \f180; $fa-var-stack-overflow: \f16c; $fa-var-github-alt: \f113; $fa-var-phoenix-squadron: \f511; $fa-var-pagelines: \f18c; $fa-var-algolia: \f36c; $fa-var-red-river: \f3e3; $fa-var-creative-commons-sa: \f4ef; $fa-var-safari: \f267; $fa-var-google: \f1a0; $fa-var-square-font-awesome-stroke: \f35c; $fa-var-font-awesome-alt: \f35c; $fa-var-atlassian: \f77b; $fa-var-linkedin-in: \f0e1; $fa-var-digital-ocean: \f391; $fa-var-nimblr: \f5a8; $fa-var-chromecast: \f838; $fa-var-evernote: \f839; $fa-var-hacker-news: \f1d4; $fa-var-creative-commons-sampling: \f4f0; $fa-var-adversal: \f36a; $fa-var-creative-commons: \f25e; $fa-var-watchman-monitoring: \e087; $fa-var-fonticons: \f280; $fa-var-weixin: \f1d7; $fa-var-shirtsinbulk: \f214; $fa-var-codepen: \f1cb; $fa-var-git-alt: \f841; $fa-var-lyft: \f3c3; $fa-var-rev: \f5b2; $fa-var-windows: \f17a; $fa-var-wizards-of-the-coast: \f730; $fa-var-square-viadeo: \f2aa; $fa-var-viadeo-square: \f2aa; $fa-var-meetup: \f2e0; $fa-var-centos: \f789; $fa-var-adn: \f170; $fa-var-cloudsmith: \f384; $fa-var-opensuse: \e62b; $fa-var-pied-piper-alt: \f1a8; $fa-var-square-dribbble: \f397; $fa-var-dribbble-square: \f397; $fa-var-codiepie: \f284; $fa-var-node: \f419; $fa-var-mix: \f3cb; $fa-var-steam: \f1b6; $fa-var-cc-apple-pay: \f416; $fa-var-scribd: \f28a; $fa-var-debian: \e60b; $fa-var-openid: \f19b; $fa-var-instalod: \e081; $fa-var-expeditedssl: \f23e; $fa-var-sellcast: \f2da; $fa-var-square-twitter: \f081; $fa-var-twitter-square: \f081; $fa-var-r-project: \f4f7; $fa-var-delicious: \f1a5; $fa-var-freebsd: \f3a4; $fa-var-vuejs: \f41f; $fa-var-accusoft: \f369; $fa-var-ioxhost: \f208; $fa-var-fonticons-fi: \f3a2; $fa-var-app-store: \f36f; $fa-var-cc-mastercard: \f1f1; $fa-var-itunes-note: \f3b5; $fa-var-golang: \e40f; $fa-var-kickstarter: \f3bb; $fa-var-square-kickstarter: \f3bb; $fa-var-grav: \f2d6; $fa-var-weibo: \f18a; $fa-var-uncharted: \e084; $fa-var-firstdraft: \f3a1; $fa-var-square-youtube: \f431; $fa-var-youtube-square: \f431; $fa-var-wikipedia-w: \f266; $fa-var-wpressr: \f3e4; $fa-var-rendact: \f3e4; $fa-var-angellist: \f209; $fa-var-galactic-republic: \f50c; $fa-var-nfc-directional: \e530; $fa-var-skype: \f17e; $fa-var-joget: \f3b7; $fa-var-fedora: \f798; $fa-var-stripe-s: \f42a; $fa-var-meta: \e49b; $fa-var-laravel: \f3bd; $fa-var-hotjar: \f3b1; $fa-var-bluetooth-b: \f294; $fa-var-square-letterboxd: \e62e; $fa-var-sticker-mule: \f3f7; $fa-var-creative-commons-zero: \f4f3; $fa-var-hips: \f452; $fa-var-behance: \f1b4; $fa-var-reddit: \f1a1; $fa-var-discord: \f392; $fa-var-chrome: \f268; $fa-var-app-store-ios: \f370; $fa-var-cc-discover: \f1f2; $fa-var-wpbeginner: \f297; $fa-var-confluence: \f78d; $fa-var-shoelace: \e60c; $fa-var-mdb: \f8ca; $fa-var-dochub: \f394; $fa-var-accessible-icon: \f368; $fa-var-ebay: \f4f4; $fa-var-amazon: \f270; $fa-var-unsplash: \e07c; $fa-var-yarn: \f7e3; $fa-var-square-steam: \f1b7; $fa-var-steam-square: \f1b7; $fa-var-500px: \f26e; $fa-var-square-vimeo: \f194; $fa-var-vimeo-square: \f194; $fa-var-asymmetrik: \f372; $fa-var-font-awesome: \f2b4; $fa-var-font-awesome-flag: \f2b4; $fa-var-font-awesome-logo-full: \f2b4; $fa-var-gratipay: \f184; $fa-var-apple: \f179; $fa-var-hive: \e07f; $fa-var-gitkraken: \f3a6; $fa-var-keybase: \f4f5; $fa-var-apple-pay: \f415; $fa-var-padlet: \e4a0; $fa-var-amazon-pay: \f42c; $fa-var-square-github: \f092; $fa-var-github-square: \f092; $fa-var-stumbleupon: \f1a4; $fa-var-fedex: \f797; $fa-var-phoenix-framework: \f3dc; $fa-var-shopify: \e057; $fa-var-neos: \f612; $fa-var-square-threads: \e619; $fa-var-hackerrank: \f5f7; $fa-var-researchgate: \f4f8; $fa-var-swift: \f8e1; $fa-var-angular: \f420; $fa-var-speakap: \f3f3; $fa-var-angrycreative: \f36e; $fa-var-y-combinator: \f23b; $fa-var-empire: \f1d1; $fa-var-envira: \f299; $fa-var-google-scholar: \e63b; $fa-var-square-gitlab: \e5ae; $fa-var-gitlab-square: \e5ae; $fa-var-studiovinari: \f3f8; $fa-var-pied-piper: \f2ae; $fa-var-wordpress: \f19a; $fa-var-product-hunt: \f288; $fa-var-firefox: \f269; $fa-var-linode: \f2b8; $fa-var-goodreads: \f3a8; $fa-var-square-odnoklassniki: \f264; $fa-var-odnoklassniki-square: \f264; $fa-var-jsfiddle: \f1cc; $fa-var-sith: \f512; $fa-var-themeisle: \f2b2; $fa-var-page4: \f3d7; $fa-var-hashnode: \e499; $fa-var-react: \f41b; $fa-var-cc-paypal: \f1f4; $fa-var-squarespace: \f5be; $fa-var-cc-stripe: \f1f5; $fa-var-creative-commons-share: \f4f2; $fa-var-bitcoin: \f379; $fa-var-keycdn: \f3ba; $fa-var-opera: \f26a; $fa-var-itch-io: \f83a; $fa-var-umbraco: \f8e8; $fa-var-galactic-senate: \f50d; $fa-var-ubuntu: \f7df; $fa-var-draft2digital: \f396; $fa-var-stripe: \f429; $fa-var-houzz: \f27c; $fa-var-gg: \f260; $fa-var-dhl: \f790; $fa-var-square-pinterest: \f0d3; $fa-var-pinterest-square: \f0d3; $fa-var-xing: \f168; $fa-var-blackberry: \f37b; $fa-var-creative-commons-pd: \f4ec; $fa-var-playstation: \f3df; $fa-var-quinscape: \f459; $fa-var-less: \f41d; $fa-var-blogger-b: \f37d; $fa-var-opencart: \f23d; $fa-var-vine: \f1ca; $fa-var-signal-messenger: \e663; $fa-var-paypal: \f1ed; $fa-var-gitlab: \f296; $fa-var-typo3: \f42b; $fa-var-reddit-alien: \f281; $fa-var-yahoo: \f19e; $fa-var-dailymotion: \e052; $fa-var-affiliatetheme: \f36b; $fa-var-pied-piper-pp: \f1a7; $fa-var-bootstrap: \f836; $fa-var-odnoklassniki: \f263; $fa-var-nfc-symbol: \e531; $fa-var-mintbit: \e62f; $fa-var-ethereum: \f42e; $fa-var-speaker-deck: \f83c; $fa-var-creative-commons-nc-eu: \f4e9; $fa-var-patreon: \f3d9; $fa-var-avianex: \f374; $fa-var-ello: \f5f1; $fa-var-gofore: \f3a7; $fa-var-bimobject: \f378; $fa-var-brave-reverse: \e63d; $fa-var-facebook-f: \f39e; $fa-var-square-google-plus: \f0d4; $fa-var-google-plus-square: \f0d4; $fa-var-web-awesome: \e682; $fa-var-mandalorian: \f50f; $fa-var-first-order-alt: \f50a; $fa-var-osi: \f41a; $fa-var-google-wallet: \f1ee; $fa-var-d-and-d-beyond: \f6ca; $fa-var-periscope: \f3da; $fa-var-fulcrum: \f50b; $fa-var-cloudscale: \f383; $fa-var-forumbee: \f211; $fa-var-mizuni: \f3cc; $fa-var-schlix: \f3ea; $fa-var-square-xing: \f169; $fa-var-xing-square: \f169; $fa-var-bandcamp: \f2d5; $fa-var-wpforms: \f298; $fa-var-cloudversify: \f385; $fa-var-usps: \f7e1; $fa-var-megaport: \f5a3; $fa-var-magento: \f3c4; $fa-var-spotify: \f1bc; $fa-var-optin-monster: \f23c; $fa-var-fly: \f417; $fa-var-aviato: \f421; $fa-var-itunes: \f3b4; $fa-var-cuttlefish: \f38c; $fa-var-blogger: \f37c; $fa-var-flickr: \f16e; $fa-var-viber: \f409; $fa-var-soundcloud: \f1be; $fa-var-digg: \f1a6; $fa-var-tencent-weibo: \f1d5; $fa-var-letterboxd: \e62d; $fa-var-symfony: \f83d; $fa-var-maxcdn: \f136; $fa-var-etsy: \f2d7; $fa-var-facebook-messenger: \f39f; $fa-var-audible: \f373; $fa-var-think-peaks: \f731; $fa-var-bilibili: \e3d9; $fa-var-erlang: \f39d; $fa-var-x-twitter: \e61b; $fa-var-cotton-bureau: \f89e; $fa-var-dashcube: \f210; $fa-var-42-group: \e080; $fa-var-innosoft: \e080; $fa-var-stack-exchange: \f18d; $fa-var-elementor: \f430; $fa-var-square-pied-piper: \e01e; $fa-var-pied-piper-square: \e01e; $fa-var-creative-commons-nd: \f4eb; $fa-var-palfed: \f3d8; $fa-var-superpowers: \f2dd; $fa-var-resolving: \f3e7; $fa-var-xbox: \f412; $fa-var-square-web-awesome-stroke: \e684; $fa-var-searchengin: \f3eb; $fa-var-tiktok: \e07b; $fa-var-square-facebook: \f082; $fa-var-facebook-square: \f082; $fa-var-renren: \f18b; $fa-var-linux: \f17c; $fa-var-glide: \f2a5; $fa-var-linkedin: \f08c; $fa-var-hubspot: \f3b2; $fa-var-deploydog: \f38e; $fa-var-twitch: \f1e8; $fa-var-ravelry: \f2d9; $fa-var-mixer: \e056; $fa-var-square-lastfm: \f203; $fa-var-lastfm-square: \f203; $fa-var-vimeo: \f40a; $fa-var-mendeley: \f7b3; $fa-var-uniregistry: \f404; $fa-var-figma: \f799; $fa-var-creative-commons-remix: \f4ee; $fa-var-cc-amazon-pay: \f42d; $fa-var-dropbox: \f16b; $fa-var-instagram: \f16d; $fa-var-cmplid: \e360; $fa-var-upwork: \e641; $fa-var-facebook: \f09a; $fa-var-gripfire: \f3ac; $fa-var-jedi-order: \f50e; $fa-var-uikit: \f403; $fa-var-fort-awesome-alt: \f3a3; $fa-var-phabricator: \f3db; $fa-var-ussunnah: \f407; $fa-var-earlybirds: \f39a; $fa-var-trade-federation: \f513; $fa-var-autoprefixer: \f41c; $fa-var-whatsapp: \f232; $fa-var-square-upwork: \e67c; $fa-var-slideshare: \f1e7; $fa-var-google-play: \f3ab; $fa-var-viadeo: \f2a9; $fa-var-line: \f3c0; $fa-var-google-drive: \f3aa; $fa-var-servicestack: \f3ec; $fa-var-simplybuilt: \f215; $fa-var-bitbucket: \f171; $fa-var-imdb: \f2d8; $fa-var-deezer: \e077; $fa-var-raspberry-pi: \f7bb; $fa-var-jira: \f7b1; $fa-var-docker: \f395; $fa-var-screenpal: \e570; $fa-var-bluetooth: \f293; $fa-var-gitter: \f426; $fa-var-d-and-d: \f38d; $fa-var-microblog: \e01a; $fa-var-cc-diners-club: \f24c; $fa-var-gg-circle: \f261; $fa-var-pied-piper-hat: \f4e5; $fa-var-kickstarter-k: \f3bc; $fa-var-yandex: \f413; $fa-var-readme: \f4d5; $fa-var-html5: \f13b; $fa-var-sellsy: \f213; $fa-var-square-web-awesome: \e683; $fa-var-sass: \f41e; $fa-var-wirsindhandwerk: \e2d0; $fa-var-wsh: \e2d0; $fa-var-buromobelexperte: \f37f; $fa-var-salesforce: \f83b; $fa-var-octopus-deploy: \e082; $fa-var-medapps: \f3c6; $fa-var-ns8: \f3d5; $fa-var-pinterest-p: \f231; $fa-var-apper: \f371; $fa-var-fort-awesome: \f286; $fa-var-waze: \f83f; $fa-var-bluesky: \e671; $fa-var-cc-jcb: \f24b; $fa-var-snapchat: \f2ab; $fa-var-snapchat-ghost: \f2ab; $fa-var-fantasy-flight-games: \f6dc; $fa-var-rust: \e07a; $fa-var-wix: \f5cf; $fa-var-square-behance: \f1b5; $fa-var-behance-square: \f1b5; $fa-var-supple: \f3f9; $fa-var-webflow: \e65c; $fa-var-rebel: \f1d0; $fa-var-css3: \f13c; $fa-var-staylinked: \f3f5; $fa-var-kaggle: \f5fa; $fa-var-space-awesome: \e5ac; $fa-var-deviantart: \f1bd; $fa-var-cpanel: \f388; $fa-var-goodreads-g: \f3a9; $fa-var-square-git: \f1d2; $fa-var-git-square: \f1d2; $fa-var-square-tumblr: \f174; $fa-var-tumblr-square: \f174; $fa-var-trello: \f181; $fa-var-creative-commons-nc-jp: \f4ea; $fa-var-get-pocket: \f265; $fa-var-perbyte: \e083; $fa-var-grunt: \f3ad; $fa-var-weebly: \f5cc; $fa-var-connectdevelop: \f20e; $fa-var-leanpub: \f212; $fa-var-black-tie: \f27e; $fa-var-themeco: \f5c6; $fa-var-python: \f3e2; $fa-var-android: \f17b; $fa-var-bots: \e340; $fa-var-free-code-camp: \f2c5; $fa-var-hornbill: \f592; $fa-var-js: \f3b8; $fa-var-ideal: \e013; $fa-var-git: \f1d3; $fa-var-dev: \f6cc; $fa-var-sketch: \f7c6; $fa-var-yandex-international: \f414; $fa-var-cc-amex: \f1f3; $fa-var-uber: \f402; $fa-var-github: \f09b; $fa-var-php: \f457; $fa-var-alipay: \f642; $fa-var-youtube: \f167; $fa-var-skyatlas: \f216; $fa-var-firefox-browser: \e007; $fa-var-replyd: \f3e6; $fa-var-suse: \f7d6; $fa-var-jenkins: \f3b6; $fa-var-twitter: \f099; $fa-var-rockrms: \f3e9; $fa-var-pinterest: \f0d2; $fa-var-buffer: \f837; $fa-var-npm: \f3d4; $fa-var-yammer: \f840; $fa-var-btc: \f15a; $fa-var-dribbble: \f17d; $fa-var-stumbleupon-circle: \f1a3; $fa-var-internet-explorer: \f26b; $fa-var-stubber: \e5c7; $fa-var-telegram: \f2c6; $fa-var-telegram-plane: \f2c6; $fa-var-old-republic: \f510; $fa-var-odysee: \e5c6; $fa-var-square-whatsapp: \f40c; $fa-var-whatsapp-square: \f40c; $fa-var-node-js: \f3d3; $fa-var-edge-legacy: \e078; $fa-var-slack: \f198; $fa-var-slack-hash: \f198; $fa-var-medrt: \f3c8; $fa-var-usb: \f287; $fa-var-tumblr: \f173; $fa-var-vaadin: \f408; $fa-var-quora: \f2c4; $fa-var-square-x-twitter: \e61a; $fa-var-reacteurope: \f75d; $fa-var-medium: \f23a; $fa-var-medium-m: \f23a; $fa-var-amilia: \f36d; $fa-var-mixcloud: \f289; $fa-var-flipboard: \f44d; $fa-var-viacoin: \f237; $fa-var-critical-role: \f6c9; $fa-var-sitrox: \e44a; $fa-var-discourse: \f393; $fa-var-joomla: \f1aa; $fa-var-mastodon: \f4f6; $fa-var-airbnb: \f834; $fa-var-wolf-pack-battalion: \f514; $fa-var-buy-n-large: \f8a6; $fa-var-gulp: \f3ae; $fa-var-creative-commons-sampling-plus: \f4f1; $fa-var-strava: \f428; $fa-var-ember: \f423; $fa-var-canadian-maple-leaf: \f785; $fa-var-teamspeak: \f4f9; $fa-var-pushed: \f3e1; $fa-var-wordpress-simple: \f411; $fa-var-nutritionix: \f3d6; $fa-var-wodu: \e088; $fa-var-google-pay: \e079; $fa-var-intercom: \f7af; $fa-var-zhihu: \f63f; $fa-var-korvue: \f42f; $fa-var-pix: \e43a; $fa-var-steam-symbol: \f3f6; $fa-icons: ( "0": $fa-var-0, "1": $fa-var-1, "2": $fa-var-2, "3": $fa-var-3, "4": $fa-var-4, "5": $fa-var-5, "6": $fa-var-6, "7": $fa-var-7, "8": $fa-var-8, "9": $fa-var-9, "fill-drip": $fa-var-fill-drip, "arrows-to-circle": $fa-var-arrows-to-circle, "circle-chevron-right": $fa-var-circle-chevron-right, "chevron-circle-right": $fa-var-chevron-circle-right, "at": $fa-var-at, "trash-can": $fa-var-trash-can, "trash-alt": $fa-var-trash-alt, "text-height": $fa-var-text-height, "user-xmark": $fa-var-user-xmark, "user-times": $fa-var-user-times, "stethoscope": $fa-var-stethoscope, "message": $fa-var-message, "comment-alt": $fa-var-comment-alt, "info": $fa-var-info, "down-left-and-up-right-to-center": $fa-var-down-left-and-up-right-to-center, "compress-alt": $fa-var-compress-alt, "explosion": $fa-var-explosion, "file-lines": $fa-var-file-lines, "file-alt": $fa-var-file-alt, "file-text": $fa-var-file-text, "wave-square": $fa-var-wave-square, "ring": $fa-var-ring, "building-un": $fa-var-building-un, "dice-three": $fa-var-dice-three, "calendar-days": $fa-var-calendar-days, "calendar-alt": $fa-var-calendar-alt, "anchor-circle-check": $fa-var-anchor-circle-check, "building-circle-arrow-right": $fa-var-building-circle-arrow-right, "volleyball": $fa-var-volleyball, "volleyball-ball": $fa-var-volleyball-ball, "arrows-up-to-line": $fa-var-arrows-up-to-line, "sort-down": $fa-var-sort-down, "sort-desc": $fa-var-sort-desc, "circle-minus": $fa-var-circle-minus, "minus-circle": $fa-var-minus-circle, "door-open": $fa-var-door-open, "right-from-bracket": $fa-var-right-from-bracket, "sign-out-alt": $fa-var-sign-out-alt, "atom": $fa-var-atom, "soap": $fa-var-soap, "icons": $fa-var-icons, "heart-music-camera-bolt": $fa-var-heart-music-camera-bolt, "microphone-lines-slash": $fa-var-microphone-lines-slash, "microphone-alt-slash": $fa-var-microphone-alt-slash, "bridge-circle-check": $fa-var-bridge-circle-check, "pump-medical": $fa-var-pump-medical, "fingerprint": $fa-var-fingerprint, "hand-point-right": $fa-var-hand-point-right, "magnifying-glass-location": $fa-var-magnifying-glass-location, "search-location": $fa-var-search-location, "forward-step": $fa-var-forward-step, "step-forward": $fa-var-step-forward, "face-smile-beam": $fa-var-face-smile-beam, "smile-beam": $fa-var-smile-beam, "flag-checkered": $fa-var-flag-checkered, "football": $fa-var-football, "football-ball": $fa-var-football-ball, "school-circle-exclamation": $fa-var-school-circle-exclamation, "crop": $fa-var-crop, "angles-down": $fa-var-angles-down, "angle-double-down": $fa-var-angle-double-down, "users-rectangle": $fa-var-users-rectangle, "people-roof": $fa-var-people-roof, "people-line": $fa-var-people-line, "beer-mug-empty": $fa-var-beer-mug-empty, "beer": $fa-var-beer, "diagram-predecessor": $fa-var-diagram-predecessor, "arrow-up-long": $fa-var-arrow-up-long, "long-arrow-up": $fa-var-long-arrow-up, "fire-flame-simple": $fa-var-fire-flame-simple, "burn": $fa-var-burn, "person": $fa-var-person, "male": $fa-var-male, "laptop": $fa-var-laptop, "file-csv": $fa-var-file-csv, "menorah": $fa-var-menorah, "truck-plane": $fa-var-truck-plane, "record-vinyl": $fa-var-record-vinyl, "face-grin-stars": $fa-var-face-grin-stars, "grin-stars": $fa-var-grin-stars, "bong": $fa-var-bong, "spaghetti-monster-flying": $fa-var-spaghetti-monster-flying, "pastafarianism": $fa-var-pastafarianism, "arrow-down-up-across-line": $fa-var-arrow-down-up-across-line, "spoon": $fa-var-spoon, "utensil-spoon": $fa-var-utensil-spoon, "jar-wheat": $fa-var-jar-wheat, "envelopes-bulk": $fa-var-envelopes-bulk, "mail-bulk": $fa-var-mail-bulk, "file-circle-exclamation": $fa-var-file-circle-exclamation, "circle-h": $fa-var-circle-h, "hospital-symbol": $fa-var-hospital-symbol, "pager": $fa-var-pager, "address-book": $fa-var-address-book, "contact-book": $fa-var-contact-book, "strikethrough": $fa-var-strikethrough, "k": $fa-var-k, "landmark-flag": $fa-var-landmark-flag, "pencil": $fa-var-pencil, "pencil-alt": $fa-var-pencil-alt, "backward": $fa-var-backward, "caret-right": $fa-var-caret-right, "comments": $fa-var-comments, "paste": $fa-var-paste, "file-clipboard": $fa-var-file-clipboard, "code-pull-request": $fa-var-code-pull-request, "clipboard-list": $fa-var-clipboard-list, "truck-ramp-box": $fa-var-truck-ramp-box, "truck-loading": $fa-var-truck-loading, "user-check": $fa-var-user-check, "vial-virus": $fa-var-vial-virus, "sheet-plastic": $fa-var-sheet-plastic, "blog": $fa-var-blog, "user-ninja": $fa-var-user-ninja, "person-arrow-up-from-line": $fa-var-person-arrow-up-from-line, "scroll-torah": $fa-var-scroll-torah, "torah": $fa-var-torah, "broom-ball": $fa-var-broom-ball, "quidditch": $fa-var-quidditch, "quidditch-broom-ball": $fa-var-quidditch-broom-ball, "toggle-off": $fa-var-toggle-off, "box-archive": $fa-var-box-archive, "archive": $fa-var-archive, "person-drowning": $fa-var-person-drowning, "arrow-down-9-1": $fa-var-arrow-down-9-1, "sort-numeric-desc": $fa-var-sort-numeric-desc, "sort-numeric-down-alt": $fa-var-sort-numeric-down-alt, "face-grin-tongue-squint": $fa-var-face-grin-tongue-squint, "grin-tongue-squint": $fa-var-grin-tongue-squint, "spray-can": $fa-var-spray-can, "truck-monster": $fa-var-truck-monster, "w": $fa-var-w, "earth-africa": $fa-var-earth-africa, "globe-africa": $fa-var-globe-africa, "rainbow": $fa-var-rainbow, "circle-notch": $fa-var-circle-notch, "tablet-screen-button": $fa-var-tablet-screen-button, "tablet-alt": $fa-var-tablet-alt, "paw": $fa-var-paw, "cloud": $fa-var-cloud, "trowel-bricks": $fa-var-trowel-bricks, "face-flushed": $fa-var-face-flushed, "flushed": $fa-var-flushed, "hospital-user": $fa-var-hospital-user, "tent-arrow-left-right": $fa-var-tent-arrow-left-right, "gavel": $fa-var-gavel, "legal": $fa-var-legal, "binoculars": $fa-var-binoculars, "microphone-slash": $fa-var-microphone-slash, "box-tissue": $fa-var-box-tissue, "motorcycle": $fa-var-motorcycle, "bell-concierge": $fa-var-bell-concierge, "concierge-bell": $fa-var-concierge-bell, "pen-ruler": $fa-var-pen-ruler, "pencil-ruler": $fa-var-pencil-ruler, "people-arrows": $fa-var-people-arrows, "people-arrows-left-right": $fa-var-people-arrows-left-right, "mars-and-venus-burst": $fa-var-mars-and-venus-burst, "square-caret-right": $fa-var-square-caret-right, "caret-square-right": $fa-var-caret-square-right, "scissors": $fa-var-scissors, "cut": $fa-var-cut, "sun-plant-wilt": $fa-var-sun-plant-wilt, "toilets-portable": $fa-var-toilets-portable, "hockey-puck": $fa-var-hockey-puck, "table": $fa-var-table, "magnifying-glass-arrow-right": $fa-var-magnifying-glass-arrow-right, "tachograph-digital": $fa-var-tachograph-digital, "digital-tachograph": $fa-var-digital-tachograph, "users-slash": $fa-var-users-slash, "clover": $fa-var-clover, "reply": $fa-var-reply, "mail-reply": $fa-var-mail-reply, "star-and-crescent": $fa-var-star-and-crescent, "house-fire": $fa-var-house-fire, "square-minus": $fa-var-square-minus, "minus-square": $fa-var-minus-square, "helicopter": $fa-var-helicopter, "compass": $fa-var-compass, "square-caret-down": $fa-var-square-caret-down, "caret-square-down": $fa-var-caret-square-down, "file-circle-question": $fa-var-file-circle-question, "laptop-code": $fa-var-laptop-code, "swatchbook": $fa-var-swatchbook, "prescription-bottle": $fa-var-prescription-bottle, "bars": $fa-var-bars, "navicon": $fa-var-navicon, "people-group": $fa-var-people-group, "hourglass-end": $fa-var-hourglass-end, "hourglass-3": $fa-var-hourglass-3, "heart-crack": $fa-var-heart-crack, "heart-broken": $fa-var-heart-broken, "square-up-right": $fa-var-square-up-right, "external-link-square-alt": $fa-var-external-link-square-alt, "face-kiss-beam": $fa-var-face-kiss-beam, "kiss-beam": $fa-var-kiss-beam, "film": $fa-var-film, "ruler-horizontal": $fa-var-ruler-horizontal, "people-robbery": $fa-var-people-robbery, "lightbulb": $fa-var-lightbulb, "caret-left": $fa-var-caret-left, "circle-exclamation": $fa-var-circle-exclamation, "exclamation-circle": $fa-var-exclamation-circle, "school-circle-xmark": $fa-var-school-circle-xmark, "arrow-right-from-bracket": $fa-var-arrow-right-from-bracket, "sign-out": $fa-var-sign-out, "circle-chevron-down": $fa-var-circle-chevron-down, "chevron-circle-down": $fa-var-chevron-circle-down, "unlock-keyhole": $fa-var-unlock-keyhole, "unlock-alt": $fa-var-unlock-alt, "cloud-showers-heavy": $fa-var-cloud-showers-heavy, "headphones-simple": $fa-var-headphones-simple, "headphones-alt": $fa-var-headphones-alt, "sitemap": $fa-var-sitemap, "circle-dollar-to-slot": $fa-var-circle-dollar-to-slot, "donate": $fa-var-donate, "memory": $fa-var-memory, "road-spikes": $fa-var-road-spikes, "fire-burner": $fa-var-fire-burner, "flag": $fa-var-flag, "hanukiah": $fa-var-hanukiah, "feather": $fa-var-feather, "volume-low": $fa-var-volume-low, "volume-down": $fa-var-volume-down, "comment-slash": $fa-var-comment-slash, "cloud-sun-rain": $fa-var-cloud-sun-rain, "compress": $fa-var-compress, "wheat-awn": $fa-var-wheat-awn, "wheat-alt": $fa-var-wheat-alt, "ankh": $fa-var-ankh, "hands-holding-child": $fa-var-hands-holding-child, "asterisk": $fa-var-asterisk, "square-check": $fa-var-square-check, "check-square": $fa-var-check-square, "peseta-sign": $fa-var-peseta-sign, "heading": $fa-var-heading, "header": $fa-var-header, "ghost": $fa-var-ghost, "list": $fa-var-list, "list-squares": $fa-var-list-squares, "square-phone-flip": $fa-var-square-phone-flip, "phone-square-alt": $fa-var-phone-square-alt, "cart-plus": $fa-var-cart-plus, "gamepad": $fa-var-gamepad, "circle-dot": $fa-var-circle-dot, "dot-circle": $fa-var-dot-circle, "face-dizzy": $fa-var-face-dizzy, "dizzy": $fa-var-dizzy, "egg": $fa-var-egg, "house-medical-circle-xmark": $fa-var-house-medical-circle-xmark, "campground": $fa-var-campground, "folder-plus": $fa-var-folder-plus, "futbol": $fa-var-futbol, "futbol-ball": $fa-var-futbol-ball, "soccer-ball": $fa-var-soccer-ball, "paintbrush": $fa-var-paintbrush, "paint-brush": $fa-var-paint-brush, "lock": $fa-var-lock, "gas-pump": $fa-var-gas-pump, "hot-tub-person": $fa-var-hot-tub-person, "hot-tub": $fa-var-hot-tub, "map-location": $fa-var-map-location, "map-marked": $fa-var-map-marked, "house-flood-water": $fa-var-house-flood-water, "tree": $fa-var-tree, "bridge-lock": $fa-var-bridge-lock, "sack-dollar": $fa-var-sack-dollar, "pen-to-square": $fa-var-pen-to-square, "edit": $fa-var-edit, "car-side": $fa-var-car-side, "share-nodes": $fa-var-share-nodes, "share-alt": $fa-var-share-alt, "heart-circle-minus": $fa-var-heart-circle-minus, "hourglass-half": $fa-var-hourglass-half, "hourglass-2": $fa-var-hourglass-2, "microscope": $fa-var-microscope, "sink": $fa-var-sink, "bag-shopping": $fa-var-bag-shopping, "shopping-bag": $fa-var-shopping-bag, "arrow-down-z-a": $fa-var-arrow-down-z-a, "sort-alpha-desc": $fa-var-sort-alpha-desc, "sort-alpha-down-alt": $fa-var-sort-alpha-down-alt, "mitten": $fa-var-mitten, "person-rays": $fa-var-person-rays, "users": $fa-var-users, "eye-slash": $fa-var-eye-slash, "flask-vial": $fa-var-flask-vial, "hand": $fa-var-hand, "hand-paper": $fa-var-hand-paper, "om": $fa-var-om, "worm": $fa-var-worm, "house-circle-xmark": $fa-var-house-circle-xmark, "plug": $fa-var-plug, "chevron-up": $fa-var-chevron-up, "hand-spock": $fa-var-hand-spock, "stopwatch": $fa-var-stopwatch, "face-kiss": $fa-var-face-kiss, "kiss": $fa-var-kiss, "bridge-circle-xmark": $fa-var-bridge-circle-xmark, "face-grin-tongue": $fa-var-face-grin-tongue, "grin-tongue": $fa-var-grin-tongue, "chess-bishop": $fa-var-chess-bishop, "face-grin-wink": $fa-var-face-grin-wink, "grin-wink": $fa-var-grin-wink, "ear-deaf": $fa-var-ear-deaf, "deaf": $fa-var-deaf, "deafness": $fa-var-deafness, "hard-of-hearing": $fa-var-hard-of-hearing, "road-circle-check": $fa-var-road-circle-check, "dice-five": $fa-var-dice-five, "square-rss": $fa-var-square-rss, "rss-square": $fa-var-rss-square, "land-mine-on": $fa-var-land-mine-on, "i-cursor": $fa-var-i-cursor, "stamp": $fa-var-stamp, "stairs": $fa-var-stairs, "i": $fa-var-i, "hryvnia-sign": $fa-var-hryvnia-sign, "hryvnia": $fa-var-hryvnia, "pills": $fa-var-pills, "face-grin-wide": $fa-var-face-grin-wide, "grin-alt": $fa-var-grin-alt, "tooth": $fa-var-tooth, "v": $fa-var-v, "bangladeshi-taka-sign": $fa-var-bangladeshi-taka-sign, "bicycle": $fa-var-bicycle, "staff-snake": $fa-var-staff-snake, "rod-asclepius": $fa-var-rod-asclepius, "rod-snake": $fa-var-rod-snake, "staff-aesculapius": $fa-var-staff-aesculapius, "head-side-cough-slash": $fa-var-head-side-cough-slash, "truck-medical": $fa-var-truck-medical, "ambulance": $fa-var-ambulance, "wheat-awn-circle-exclamation": $fa-var-wheat-awn-circle-exclamation, "snowman": $fa-var-snowman, "mortar-pestle": $fa-var-mortar-pestle, "road-barrier": $fa-var-road-barrier, "school": $fa-var-school, "igloo": $fa-var-igloo, "joint": $fa-var-joint, "angle-right": $fa-var-angle-right, "horse": $fa-var-horse, "q": $fa-var-q, "g": $fa-var-g, "notes-medical": $fa-var-notes-medical, "temperature-half": $fa-var-temperature-half, "temperature-2": $fa-var-temperature-2, "thermometer-2": $fa-var-thermometer-2, "thermometer-half": $fa-var-thermometer-half, "dong-sign": $fa-var-dong-sign, "capsules": $fa-var-capsules, "poo-storm": $fa-var-poo-storm, "poo-bolt": $fa-var-poo-bolt, "face-frown-open": $fa-var-face-frown-open, "frown-open": $fa-var-frown-open, "hand-point-up": $fa-var-hand-point-up, "money-bill": $fa-var-money-bill, "bookmark": $fa-var-bookmark, "align-justify": $fa-var-align-justify, "umbrella-beach": $fa-var-umbrella-beach, "helmet-un": $fa-var-helmet-un, "bullseye": $fa-var-bullseye, "bacon": $fa-var-bacon, "hand-point-down": $fa-var-hand-point-down, "arrow-up-from-bracket": $fa-var-arrow-up-from-bracket, "folder": $fa-var-folder, "folder-blank": $fa-var-folder-blank, "file-waveform": $fa-var-file-waveform, "file-medical-alt": $fa-var-file-medical-alt, "radiation": $fa-var-radiation, "chart-simple": $fa-var-chart-simple, "mars-stroke": $fa-var-mars-stroke, "vial": $fa-var-vial, "gauge": $fa-var-gauge, "dashboard": $fa-var-dashboard, "gauge-med": $fa-var-gauge-med, "tachometer-alt-average": $fa-var-tachometer-alt-average, "wand-magic-sparkles": $fa-var-wand-magic-sparkles, "magic-wand-sparkles": $fa-var-magic-wand-sparkles, "e": $fa-var-e, "pen-clip": $fa-var-pen-clip, "pen-alt": $fa-var-pen-alt, "bridge-circle-exclamation": $fa-var-bridge-circle-exclamation, "user": $fa-var-user, "school-circle-check": $fa-var-school-circle-check, "dumpster": $fa-var-dumpster, "van-shuttle": $fa-var-van-shuttle, "shuttle-van": $fa-var-shuttle-van, "building-user": $fa-var-building-user, "square-caret-left": $fa-var-square-caret-left, "caret-square-left": $fa-var-caret-square-left, "highlighter": $fa-var-highlighter, "key": $fa-var-key, "bullhorn": $fa-var-bullhorn, "globe": $fa-var-globe, "synagogue": $fa-var-synagogue, "person-half-dress": $fa-var-person-half-dress, "road-bridge": $fa-var-road-bridge, "location-arrow": $fa-var-location-arrow, "c": $fa-var-c, "tablet-button": $fa-var-tablet-button, "building-lock": $fa-var-building-lock, "pizza-slice": $fa-var-pizza-slice, "money-bill-wave": $fa-var-money-bill-wave, "chart-area": $fa-var-chart-area, "area-chart": $fa-var-area-chart, "house-flag": $fa-var-house-flag, "person-circle-minus": $fa-var-person-circle-minus, "ban": $fa-var-ban, "cancel": $fa-var-cancel, "camera-rotate": $fa-var-camera-rotate, "spray-can-sparkles": $fa-var-spray-can-sparkles, "air-freshener": $fa-var-air-freshener, "star": $fa-var-star, "repeat": $fa-var-repeat, "cross": $fa-var-cross, "box": $fa-var-box, "venus-mars": $fa-var-venus-mars, "arrow-pointer": $fa-var-arrow-pointer, "mouse-pointer": $fa-var-mouse-pointer, "maximize": $fa-var-maximize, "expand-arrows-alt": $fa-var-expand-arrows-alt, "charging-station": $fa-var-charging-station, "shapes": $fa-var-shapes, "triangle-circle-square": $fa-var-triangle-circle-square, "shuffle": $fa-var-shuffle, "random": $fa-var-random, "person-running": $fa-var-person-running, "running": $fa-var-running, "mobile-retro": $fa-var-mobile-retro, "grip-lines-vertical": $fa-var-grip-lines-vertical, "spider": $fa-var-spider, "hands-bound": $fa-var-hands-bound, "file-invoice-dollar": $fa-var-file-invoice-dollar, "plane-circle-exclamation": $fa-var-plane-circle-exclamation, "x-ray": $fa-var-x-ray, "spell-check": $fa-var-spell-check, "slash": $fa-var-slash, "computer-mouse": $fa-var-computer-mouse, "mouse": $fa-var-mouse, "arrow-right-to-bracket": $fa-var-arrow-right-to-bracket, "sign-in": $fa-var-sign-in, "shop-slash": $fa-var-shop-slash, "store-alt-slash": $fa-var-store-alt-slash, "server": $fa-var-server, "virus-covid-slash": $fa-var-virus-covid-slash, "shop-lock": $fa-var-shop-lock, "hourglass-start": $fa-var-hourglass-start, "hourglass-1": $fa-var-hourglass-1, "blender-phone": $fa-var-blender-phone, "building-wheat": $fa-var-building-wheat, "person-breastfeeding": $fa-var-person-breastfeeding, "right-to-bracket": $fa-var-right-to-bracket, "sign-in-alt": $fa-var-sign-in-alt, "venus": $fa-var-venus, "passport": $fa-var-passport, "heart-pulse": $fa-var-heart-pulse, "heartbeat": $fa-var-heartbeat, "people-carry-box": $fa-var-people-carry-box, "people-carry": $fa-var-people-carry, "temperature-high": $fa-var-temperature-high, "microchip": $fa-var-microchip, "crown": $fa-var-crown, "weight-hanging": $fa-var-weight-hanging, "xmarks-lines": $fa-var-xmarks-lines, "file-prescription": $fa-var-file-prescription, "weight-scale": $fa-var-weight-scale, "weight": $fa-var-weight, "user-group": $fa-var-user-group, "user-friends": $fa-var-user-friends, "arrow-up-a-z": $fa-var-arrow-up-a-z, "sort-alpha-up": $fa-var-sort-alpha-up, "chess-knight": $fa-var-chess-knight, "face-laugh-squint": $fa-var-face-laugh-squint, "laugh-squint": $fa-var-laugh-squint, "wheelchair": $fa-var-wheelchair, "circle-arrow-up": $fa-var-circle-arrow-up, "arrow-circle-up": $fa-var-arrow-circle-up, "toggle-on": $fa-var-toggle-on, "person-walking": $fa-var-person-walking, "walking": $fa-var-walking, "l": $fa-var-l, "fire": $fa-var-fire, "bed-pulse": $fa-var-bed-pulse, "procedures": $fa-var-procedures, "shuttle-space": $fa-var-shuttle-space, "space-shuttle": $fa-var-space-shuttle, "face-laugh": $fa-var-face-laugh, "laugh": $fa-var-laugh, "folder-open": $fa-var-folder-open, "heart-circle-plus": $fa-var-heart-circle-plus, "code-fork": $fa-var-code-fork, "city": $fa-var-city, "microphone-lines": $fa-var-microphone-lines, "microphone-alt": $fa-var-microphone-alt, "pepper-hot": $fa-var-pepper-hot, "unlock": $fa-var-unlock, "colon-sign": $fa-var-colon-sign, "headset": $fa-var-headset, "store-slash": $fa-var-store-slash, "road-circle-xmark": $fa-var-road-circle-xmark, "user-minus": $fa-var-user-minus, "mars-stroke-up": $fa-var-mars-stroke-up, "mars-stroke-v": $fa-var-mars-stroke-v, "champagne-glasses": $fa-var-champagne-glasses, "glass-cheers": $fa-var-glass-cheers, "clipboard": $fa-var-clipboard, "house-circle-exclamation": $fa-var-house-circle-exclamation, "file-arrow-up": $fa-var-file-arrow-up, "file-upload": $fa-var-file-upload, "wifi": $fa-var-wifi, "wifi-3": $fa-var-wifi-3, "wifi-strong": $fa-var-wifi-strong, "bath": $fa-var-bath, "bathtub": $fa-var-bathtub, "underline": $fa-var-underline, "user-pen": $fa-var-user-pen, "user-edit": $fa-var-user-edit, "signature": $fa-var-signature, "stroopwafel": $fa-var-stroopwafel, "bold": $fa-var-bold, "anchor-lock": $fa-var-anchor-lock, "building-ngo": $fa-var-building-ngo, "manat-sign": $fa-var-manat-sign, "not-equal": $fa-var-not-equal, "border-top-left": $fa-var-border-top-left, "border-style": $fa-var-border-style, "map-location-dot": $fa-var-map-location-dot, "map-marked-alt": $fa-var-map-marked-alt, "jedi": $fa-var-jedi, "square-poll-vertical": $fa-var-square-poll-vertical, "poll": $fa-var-poll, "mug-hot": $fa-var-mug-hot, "car-battery": $fa-var-car-battery, "battery-car": $fa-var-battery-car, "gift": $fa-var-gift, "dice-two": $fa-var-dice-two, "chess-queen": $fa-var-chess-queen, "glasses": $fa-var-glasses, "chess-board": $fa-var-chess-board, "building-circle-check": $fa-var-building-circle-check, "person-chalkboard": $fa-var-person-chalkboard, "mars-stroke-right": $fa-var-mars-stroke-right, "mars-stroke-h": $fa-var-mars-stroke-h, "hand-back-fist": $fa-var-hand-back-fist, "hand-rock": $fa-var-hand-rock, "square-caret-up": $fa-var-square-caret-up, "caret-square-up": $fa-var-caret-square-up, "cloud-showers-water": $fa-var-cloud-showers-water, "chart-bar": $fa-var-chart-bar, "bar-chart": $fa-var-bar-chart, "hands-bubbles": $fa-var-hands-bubbles, "hands-wash": $fa-var-hands-wash, "less-than-equal": $fa-var-less-than-equal, "train": $fa-var-train, "eye-low-vision": $fa-var-eye-low-vision, "low-vision": $fa-var-low-vision, "crow": $fa-var-crow, "sailboat": $fa-var-sailboat, "window-restore": $fa-var-window-restore, "square-plus": $fa-var-square-plus, "plus-square": $fa-var-plus-square, "torii-gate": $fa-var-torii-gate, "frog": $fa-var-frog, "bucket": $fa-var-bucket, "image": $fa-var-image, "microphone": $fa-var-microphone, "cow": $fa-var-cow, "caret-up": $fa-var-caret-up, "screwdriver": $fa-var-screwdriver, "folder-closed": $fa-var-folder-closed, "house-tsunami": $fa-var-house-tsunami, "square-nfi": $fa-var-square-nfi, "arrow-up-from-ground-water": $fa-var-arrow-up-from-ground-water, "martini-glass": $fa-var-martini-glass, "glass-martini-alt": $fa-var-glass-martini-alt, "rotate-left": $fa-var-rotate-left, "rotate-back": $fa-var-rotate-back, "rotate-backward": $fa-var-rotate-backward, "undo-alt": $fa-var-undo-alt, "table-columns": $fa-var-table-columns, "columns": $fa-var-columns, "lemon": $fa-var-lemon, "head-side-mask": $fa-var-head-side-mask, "handshake": $fa-var-handshake, "gem": $fa-var-gem, "dolly": $fa-var-dolly, "dolly-box": $fa-var-dolly-box, "smoking": $fa-var-smoking, "minimize": $fa-var-minimize, "compress-arrows-alt": $fa-var-compress-arrows-alt, "monument": $fa-var-monument, "snowplow": $fa-var-snowplow, "angles-right": $fa-var-angles-right, "angle-double-right": $fa-var-angle-double-right, "cannabis": $fa-var-cannabis, "circle-play": $fa-var-circle-play, "play-circle": $fa-var-play-circle, "tablets": $fa-var-tablets, "ethernet": $fa-var-ethernet, "euro-sign": $fa-var-euro-sign, "eur": $fa-var-eur, "euro": $fa-var-euro, "chair": $fa-var-chair, "circle-check": $fa-var-circle-check, "check-circle": $fa-var-check-circle, "circle-stop": $fa-var-circle-stop, "stop-circle": $fa-var-stop-circle, "compass-drafting": $fa-var-compass-drafting, "drafting-compass": $fa-var-drafting-compass, "plate-wheat": $fa-var-plate-wheat, "icicles": $fa-var-icicles, "person-shelter": $fa-var-person-shelter, "neuter": $fa-var-neuter, "id-badge": $fa-var-id-badge, "marker": $fa-var-marker, "face-laugh-beam": $fa-var-face-laugh-beam, "laugh-beam": $fa-var-laugh-beam, "helicopter-symbol": $fa-var-helicopter-symbol, "universal-access": $fa-var-universal-access, "circle-chevron-up": $fa-var-circle-chevron-up, "chevron-circle-up": $fa-var-chevron-circle-up, "lari-sign": $fa-var-lari-sign, "volcano": $fa-var-volcano, "person-walking-dashed-line-arrow-right": $fa-var-person-walking-dashed-line-arrow-right, "sterling-sign": $fa-var-sterling-sign, "gbp": $fa-var-gbp, "pound-sign": $fa-var-pound-sign, "viruses": $fa-var-viruses, "square-person-confined": $fa-var-square-person-confined, "user-tie": $fa-var-user-tie, "arrow-down-long": $fa-var-arrow-down-long, "long-arrow-down": $fa-var-long-arrow-down, "tent-arrow-down-to-line": $fa-var-tent-arrow-down-to-line, "certificate": $fa-var-certificate, "reply-all": $fa-var-reply-all, "mail-reply-all": $fa-var-mail-reply-all, "suitcase": $fa-var-suitcase, "person-skating": $fa-var-person-skating, "skating": $fa-var-skating, "filter-circle-dollar": $fa-var-filter-circle-dollar, "funnel-dollar": $fa-var-funnel-dollar, "camera-retro": $fa-var-camera-retro, "circle-arrow-down": $fa-var-circle-arrow-down, "arrow-circle-down": $fa-var-arrow-circle-down, "file-import": $fa-var-file-import, "arrow-right-to-file": $fa-var-arrow-right-to-file, "square-arrow-up-right": $fa-var-square-arrow-up-right, "external-link-square": $fa-var-external-link-square, "box-open": $fa-var-box-open, "scroll": $fa-var-scroll, "spa": $fa-var-spa, "location-pin-lock": $fa-var-location-pin-lock, "pause": $fa-var-pause, "hill-avalanche": $fa-var-hill-avalanche, "temperature-empty": $fa-var-temperature-empty, "temperature-0": $fa-var-temperature-0, "thermometer-0": $fa-var-thermometer-0, "thermometer-empty": $fa-var-thermometer-empty, "bomb": $fa-var-bomb, "registered": $fa-var-registered, "address-card": $fa-var-address-card, "contact-card": $fa-var-contact-card, "vcard": $fa-var-vcard, "scale-unbalanced-flip": $fa-var-scale-unbalanced-flip, "balance-scale-right": $fa-var-balance-scale-right, "subscript": $fa-var-subscript, "diamond-turn-right": $fa-var-diamond-turn-right, "directions": $fa-var-directions, "burst": $fa-var-burst, "house-laptop": $fa-var-house-laptop, "laptop-house": $fa-var-laptop-house, "face-tired": $fa-var-face-tired, "tired": $fa-var-tired, "money-bills": $fa-var-money-bills, "smog": $fa-var-smog, "crutch": $fa-var-crutch, "cloud-arrow-up": $fa-var-cloud-arrow-up, "cloud-upload": $fa-var-cloud-upload, "cloud-upload-alt": $fa-var-cloud-upload-alt, "palette": $fa-var-palette, "arrows-turn-right": $fa-var-arrows-turn-right, "vest": $fa-var-vest, "ferry": $fa-var-ferry, "arrows-down-to-people": $fa-var-arrows-down-to-people, "seedling": $fa-var-seedling, "sprout": $fa-var-sprout, "left-right": $fa-var-left-right, "arrows-alt-h": $fa-var-arrows-alt-h, "boxes-packing": $fa-var-boxes-packing, "circle-arrow-left": $fa-var-circle-arrow-left, "arrow-circle-left": $fa-var-arrow-circle-left, "group-arrows-rotate": $fa-var-group-arrows-rotate, "bowl-food": $fa-var-bowl-food, "candy-cane": $fa-var-candy-cane, "arrow-down-wide-short": $fa-var-arrow-down-wide-short, "sort-amount-asc": $fa-var-sort-amount-asc, "sort-amount-down": $fa-var-sort-amount-down, "cloud-bolt": $fa-var-cloud-bolt, "thunderstorm": $fa-var-thunderstorm, "text-slash": $fa-var-text-slash, "remove-format": $fa-var-remove-format, "face-smile-wink": $fa-var-face-smile-wink, "smile-wink": $fa-var-smile-wink, "file-word": $fa-var-file-word, "file-powerpoint": $fa-var-file-powerpoint, "arrows-left-right": $fa-var-arrows-left-right, "arrows-h": $fa-var-arrows-h, "house-lock": $fa-var-house-lock, "cloud-arrow-down": $fa-var-cloud-arrow-down, "cloud-download": $fa-var-cloud-download, "cloud-download-alt": $fa-var-cloud-download-alt, "children": $fa-var-children, "chalkboard": $fa-var-chalkboard, "blackboard": $fa-var-blackboard, "user-large-slash": $fa-var-user-large-slash, "user-alt-slash": $fa-var-user-alt-slash, "envelope-open": $fa-var-envelope-open, "handshake-simple-slash": $fa-var-handshake-simple-slash, "handshake-alt-slash": $fa-var-handshake-alt-slash, "mattress-pillow": $fa-var-mattress-pillow, "guarani-sign": $fa-var-guarani-sign, "arrows-rotate": $fa-var-arrows-rotate, "refresh": $fa-var-refresh, "sync": $fa-var-sync, "fire-extinguisher": $fa-var-fire-extinguisher, "cruzeiro-sign": $fa-var-cruzeiro-sign, "greater-than-equal": $fa-var-greater-than-equal, "shield-halved": $fa-var-shield-halved, "shield-alt": $fa-var-shield-alt, "book-atlas": $fa-var-book-atlas, "atlas": $fa-var-atlas, "virus": $fa-var-virus, "envelope-circle-check": $fa-var-envelope-circle-check, "layer-group": $fa-var-layer-group, "arrows-to-dot": $fa-var-arrows-to-dot, "archway": $fa-var-archway, "heart-circle-check": $fa-var-heart-circle-check, "house-chimney-crack": $fa-var-house-chimney-crack, "house-damage": $fa-var-house-damage, "file-zipper": $fa-var-file-zipper, "file-archive": $fa-var-file-archive, "square": $fa-var-square, "martini-glass-empty": $fa-var-martini-glass-empty, "glass-martini": $fa-var-glass-martini, "couch": $fa-var-couch, "cedi-sign": $fa-var-cedi-sign, "italic": $fa-var-italic, "table-cells-column-lock": $fa-var-table-cells-column-lock, "church": $fa-var-church, "comments-dollar": $fa-var-comments-dollar, "democrat": $fa-var-democrat, "z": $fa-var-z, "person-skiing": $fa-var-person-skiing, "skiing": $fa-var-skiing, "road-lock": $fa-var-road-lock, "a": $fa-var-a, "temperature-arrow-down": $fa-var-temperature-arrow-down, "temperature-down": $fa-var-temperature-down, "feather-pointed": $fa-var-feather-pointed, "feather-alt": $fa-var-feather-alt, "p": $fa-var-p, "snowflake": $fa-var-snowflake, "newspaper": $fa-var-newspaper, "rectangle-ad": $fa-var-rectangle-ad, "ad": $fa-var-ad, "circle-arrow-right": $fa-var-circle-arrow-right, "arrow-circle-right": $fa-var-arrow-circle-right, "filter-circle-xmark": $fa-var-filter-circle-xmark, "locust": $fa-var-locust, "sort": $fa-var-sort, "unsorted": $fa-var-unsorted, "list-ol": $fa-var-list-ol, "list-1-2": $fa-var-list-1-2, "list-numeric": $fa-var-list-numeric, "person-dress-burst": $fa-var-person-dress-burst, "money-check-dollar": $fa-var-money-check-dollar, "money-check-alt": $fa-var-money-check-alt, "vector-square": $fa-var-vector-square, "bread-slice": $fa-var-bread-slice, "language": $fa-var-language, "face-kiss-wink-heart": $fa-var-face-kiss-wink-heart, "kiss-wink-heart": $fa-var-kiss-wink-heart, "filter": $fa-var-filter, "question": $fa-var-question, "file-signature": $fa-var-file-signature, "up-down-left-right": $fa-var-up-down-left-right, "arrows-alt": $fa-var-arrows-alt, "house-chimney-user": $fa-var-house-chimney-user, "hand-holding-heart": $fa-var-hand-holding-heart, "puzzle-piece": $fa-var-puzzle-piece, "money-check": $fa-var-money-check, "star-half-stroke": $fa-var-star-half-stroke, "star-half-alt": $fa-var-star-half-alt, "code": $fa-var-code, "whiskey-glass": $fa-var-whiskey-glass, "glass-whiskey": $fa-var-glass-whiskey, "building-circle-exclamation": $fa-var-building-circle-exclamation, "magnifying-glass-chart": $fa-var-magnifying-glass-chart, "arrow-up-right-from-square": $fa-var-arrow-up-right-from-square, "external-link": $fa-var-external-link, "cubes-stacked": $fa-var-cubes-stacked, "won-sign": $fa-var-won-sign, "krw": $fa-var-krw, "won": $fa-var-won, "virus-covid": $fa-var-virus-covid, "austral-sign": $fa-var-austral-sign, "f": $fa-var-f, "leaf": $fa-var-leaf, "road": $fa-var-road, "taxi": $fa-var-taxi, "cab": $fa-var-cab, "person-circle-plus": $fa-var-person-circle-plus, "chart-pie": $fa-var-chart-pie, "pie-chart": $fa-var-pie-chart, "bolt-lightning": $fa-var-bolt-lightning, "sack-xmark": $fa-var-sack-xmark, "file-excel": $fa-var-file-excel, "file-contract": $fa-var-file-contract, "fish-fins": $fa-var-fish-fins, "building-flag": $fa-var-building-flag, "face-grin-beam": $fa-var-face-grin-beam, "grin-beam": $fa-var-grin-beam, "object-ungroup": $fa-var-object-ungroup, "poop": $fa-var-poop, "location-pin": $fa-var-location-pin, "map-marker": $fa-var-map-marker, "kaaba": $fa-var-kaaba, "toilet-paper": $fa-var-toilet-paper, "helmet-safety": $fa-var-helmet-safety, "hard-hat": $fa-var-hard-hat, "hat-hard": $fa-var-hat-hard, "eject": $fa-var-eject, "circle-right": $fa-var-circle-right, "arrow-alt-circle-right": $fa-var-arrow-alt-circle-right, "plane-circle-check": $fa-var-plane-circle-check, "face-rolling-eyes": $fa-var-face-rolling-eyes, "meh-rolling-eyes": $fa-var-meh-rolling-eyes, "object-group": $fa-var-object-group, "chart-line": $fa-var-chart-line, "line-chart": $fa-var-line-chart, "mask-ventilator": $fa-var-mask-ventilator, "arrow-right": $fa-var-arrow-right, "signs-post": $fa-var-signs-post, "map-signs": $fa-var-map-signs, "cash-register": $fa-var-cash-register, "person-circle-question": $fa-var-person-circle-question, "h": $fa-var-h, "tarp": $fa-var-tarp, "screwdriver-wrench": $fa-var-screwdriver-wrench, "tools": $fa-var-tools, "arrows-to-eye": $fa-var-arrows-to-eye, "plug-circle-bolt": $fa-var-plug-circle-bolt, "heart": $fa-var-heart, "mars-and-venus": $fa-var-mars-and-venus, "house-user": $fa-var-house-user, "home-user": $fa-var-home-user, "dumpster-fire": $fa-var-dumpster-fire, "house-crack": $fa-var-house-crack, "martini-glass-citrus": $fa-var-martini-glass-citrus, "cocktail": $fa-var-cocktail, "face-surprise": $fa-var-face-surprise, "surprise": $fa-var-surprise, "bottle-water": $fa-var-bottle-water, "circle-pause": $fa-var-circle-pause, "pause-circle": $fa-var-pause-circle, "toilet-paper-slash": $fa-var-toilet-paper-slash, "apple-whole": $fa-var-apple-whole, "apple-alt": $fa-var-apple-alt, "kitchen-set": $fa-var-kitchen-set, "r": $fa-var-r, "temperature-quarter": $fa-var-temperature-quarter, "temperature-1": $fa-var-temperature-1, "thermometer-1": $fa-var-thermometer-1, "thermometer-quarter": $fa-var-thermometer-quarter, "cube": $fa-var-cube, "bitcoin-sign": $fa-var-bitcoin-sign, "shield-dog": $fa-var-shield-dog, "solar-panel": $fa-var-solar-panel, "lock-open": $fa-var-lock-open, "elevator": $fa-var-elevator, "money-bill-transfer": $fa-var-money-bill-transfer, "money-bill-trend-up": $fa-var-money-bill-trend-up, "house-flood-water-circle-arrow-right": $fa-var-house-flood-water-circle-arrow-right, "square-poll-horizontal": $fa-var-square-poll-horizontal, "poll-h": $fa-var-poll-h, "circle": $fa-var-circle, "backward-fast": $fa-var-backward-fast, "fast-backward": $fa-var-fast-backward, "recycle": $fa-var-recycle, "user-astronaut": $fa-var-user-astronaut, "plane-slash": $fa-var-plane-slash, "trademark": $fa-var-trademark, "basketball": $fa-var-basketball, "basketball-ball": $fa-var-basketball-ball, "satellite-dish": $fa-var-satellite-dish, "circle-up": $fa-var-circle-up, "arrow-alt-circle-up": $fa-var-arrow-alt-circle-up, "mobile-screen-button": $fa-var-mobile-screen-button, "mobile-alt": $fa-var-mobile-alt, "volume-high": $fa-var-volume-high, "volume-up": $fa-var-volume-up, "users-rays": $fa-var-users-rays, "wallet": $fa-var-wallet, "clipboard-check": $fa-var-clipboard-check, "file-audio": $fa-var-file-audio, "burger": $fa-var-burger, "hamburger": $fa-var-hamburger, "wrench": $fa-var-wrench, "bugs": $fa-var-bugs, "rupee-sign": $fa-var-rupee-sign, "rupee": $fa-var-rupee, "file-image": $fa-var-file-image, "circle-question": $fa-var-circle-question, "question-circle": $fa-var-question-circle, "plane-departure": $fa-var-plane-departure, "handshake-slash": $fa-var-handshake-slash, "book-bookmark": $fa-var-book-bookmark, "code-branch": $fa-var-code-branch, "hat-cowboy": $fa-var-hat-cowboy, "bridge": $fa-var-bridge, "phone-flip": $fa-var-phone-flip, "phone-alt": $fa-var-phone-alt, "truck-front": $fa-var-truck-front, "cat": $fa-var-cat, "anchor-circle-exclamation": $fa-var-anchor-circle-exclamation, "truck-field": $fa-var-truck-field, "route": $fa-var-route, "clipboard-question": $fa-var-clipboard-question, "panorama": $fa-var-panorama, "comment-medical": $fa-var-comment-medical, "teeth-open": $fa-var-teeth-open, "file-circle-minus": $fa-var-file-circle-minus, "tags": $fa-var-tags, "wine-glass": $fa-var-wine-glass, "forward-fast": $fa-var-forward-fast, "fast-forward": $fa-var-fast-forward, "face-meh-blank": $fa-var-face-meh-blank, "meh-blank": $fa-var-meh-blank, "square-parking": $fa-var-square-parking, "parking": $fa-var-parking, "house-signal": $fa-var-house-signal, "bars-progress": $fa-var-bars-progress, "tasks-alt": $fa-var-tasks-alt, "faucet-drip": $fa-var-faucet-drip, "cart-flatbed": $fa-var-cart-flatbed, "dolly-flatbed": $fa-var-dolly-flatbed, "ban-smoking": $fa-var-ban-smoking, "smoking-ban": $fa-var-smoking-ban, "terminal": $fa-var-terminal, "mobile-button": $fa-var-mobile-button, "house-medical-flag": $fa-var-house-medical-flag, "basket-shopping": $fa-var-basket-shopping, "shopping-basket": $fa-var-shopping-basket, "tape": $fa-var-tape, "bus-simple": $fa-var-bus-simple, "bus-alt": $fa-var-bus-alt, "eye": $fa-var-eye, "face-sad-cry": $fa-var-face-sad-cry, "sad-cry": $fa-var-sad-cry, "audio-description": $fa-var-audio-description, "person-military-to-person": $fa-var-person-military-to-person, "file-shield": $fa-var-file-shield, "user-slash": $fa-var-user-slash, "pen": $fa-var-pen, "tower-observation": $fa-var-tower-observation, "file-code": $fa-var-file-code, "signal": $fa-var-signal, "signal-5": $fa-var-signal-5, "signal-perfect": $fa-var-signal-perfect, "bus": $fa-var-bus, "heart-circle-xmark": $fa-var-heart-circle-xmark, "house-chimney": $fa-var-house-chimney, "home-lg": $fa-var-home-lg, "window-maximize": $fa-var-window-maximize, "face-frown": $fa-var-face-frown, "frown": $fa-var-frown, "prescription": $fa-var-prescription, "shop": $fa-var-shop, "store-alt": $fa-var-store-alt, "floppy-disk": $fa-var-floppy-disk, "save": $fa-var-save, "vihara": $fa-var-vihara, "scale-unbalanced": $fa-var-scale-unbalanced, "balance-scale-left": $fa-var-balance-scale-left, "sort-up": $fa-var-sort-up, "sort-asc": $fa-var-sort-asc, "comment-dots": $fa-var-comment-dots, "commenting": $fa-var-commenting, "plant-wilt": $fa-var-plant-wilt, "diamond": $fa-var-diamond, "face-grin-squint": $fa-var-face-grin-squint, "grin-squint": $fa-var-grin-squint, "hand-holding-dollar": $fa-var-hand-holding-dollar, "hand-holding-usd": $fa-var-hand-holding-usd, "bacterium": $fa-var-bacterium, "hand-pointer": $fa-var-hand-pointer, "drum-steelpan": $fa-var-drum-steelpan, "hand-scissors": $fa-var-hand-scissors, "hands-praying": $fa-var-hands-praying, "praying-hands": $fa-var-praying-hands, "arrow-rotate-right": $fa-var-arrow-rotate-right, "arrow-right-rotate": $fa-var-arrow-right-rotate, "arrow-rotate-forward": $fa-var-arrow-rotate-forward, "redo": $fa-var-redo, "biohazard": $fa-var-biohazard, "location-crosshairs": $fa-var-location-crosshairs, "location": $fa-var-location, "mars-double": $fa-var-mars-double, "child-dress": $fa-var-child-dress, "users-between-lines": $fa-var-users-between-lines, "lungs-virus": $fa-var-lungs-virus, "face-grin-tears": $fa-var-face-grin-tears, "grin-tears": $fa-var-grin-tears, "phone": $fa-var-phone, "calendar-xmark": $fa-var-calendar-xmark, "calendar-times": $fa-var-calendar-times, "child-reaching": $fa-var-child-reaching, "head-side-virus": $fa-var-head-side-virus, "user-gear": $fa-var-user-gear, "user-cog": $fa-var-user-cog, "arrow-up-1-9": $fa-var-arrow-up-1-9, "sort-numeric-up": $fa-var-sort-numeric-up, "door-closed": $fa-var-door-closed, "shield-virus": $fa-var-shield-virus, "dice-six": $fa-var-dice-six, "mosquito-net": $fa-var-mosquito-net, "bridge-water": $fa-var-bridge-water, "person-booth": $fa-var-person-booth, "text-width": $fa-var-text-width, "hat-wizard": $fa-var-hat-wizard, "pen-fancy": $fa-var-pen-fancy, "person-digging": $fa-var-person-digging, "digging": $fa-var-digging, "trash": $fa-var-trash, "gauge-simple": $fa-var-gauge-simple, "gauge-simple-med": $fa-var-gauge-simple-med, "tachometer-average": $fa-var-tachometer-average, "book-medical": $fa-var-book-medical, "poo": $fa-var-poo, "quote-right": $fa-var-quote-right, "quote-right-alt": $fa-var-quote-right-alt, "shirt": $fa-var-shirt, "t-shirt": $fa-var-t-shirt, "tshirt": $fa-var-tshirt, "cubes": $fa-var-cubes, "divide": $fa-var-divide, "tenge-sign": $fa-var-tenge-sign, "tenge": $fa-var-tenge, "headphones": $fa-var-headphones, "hands-holding": $fa-var-hands-holding, "hands-clapping": $fa-var-hands-clapping, "republican": $fa-var-republican, "arrow-left": $fa-var-arrow-left, "person-circle-xmark": $fa-var-person-circle-xmark, "ruler": $fa-var-ruler, "align-left": $fa-var-align-left, "dice-d6": $fa-var-dice-d6, "restroom": $fa-var-restroom, "j": $fa-var-j, "users-viewfinder": $fa-var-users-viewfinder, "file-video": $fa-var-file-video, "up-right-from-square": $fa-var-up-right-from-square, "external-link-alt": $fa-var-external-link-alt, "table-cells": $fa-var-table-cells, "th": $fa-var-th, "file-pdf": $fa-var-file-pdf, "book-bible": $fa-var-book-bible, "bible": $fa-var-bible, "o": $fa-var-o, "suitcase-medical": $fa-var-suitcase-medical, "medkit": $fa-var-medkit, "user-secret": $fa-var-user-secret, "otter": $fa-var-otter, "person-dress": $fa-var-person-dress, "female": $fa-var-female, "comment-dollar": $fa-var-comment-dollar, "business-time": $fa-var-business-time, "briefcase-clock": $fa-var-briefcase-clock, "table-cells-large": $fa-var-table-cells-large, "th-large": $fa-var-th-large, "book-tanakh": $fa-var-book-tanakh, "tanakh": $fa-var-tanakh, "phone-volume": $fa-var-phone-volume, "volume-control-phone": $fa-var-volume-control-phone, "hat-cowboy-side": $fa-var-hat-cowboy-side, "clipboard-user": $fa-var-clipboard-user, "child": $fa-var-child, "lira-sign": $fa-var-lira-sign, "satellite": $fa-var-satellite, "plane-lock": $fa-var-plane-lock, "tag": $fa-var-tag, "comment": $fa-var-comment, "cake-candles": $fa-var-cake-candles, "birthday-cake": $fa-var-birthday-cake, "cake": $fa-var-cake, "envelope": $fa-var-envelope, "angles-up": $fa-var-angles-up, "angle-double-up": $fa-var-angle-double-up, "paperclip": $fa-var-paperclip, "arrow-right-to-city": $fa-var-arrow-right-to-city, "ribbon": $fa-var-ribbon, "lungs": $fa-var-lungs, "arrow-up-9-1": $fa-var-arrow-up-9-1, "sort-numeric-up-alt": $fa-var-sort-numeric-up-alt, "litecoin-sign": $fa-var-litecoin-sign, "border-none": $fa-var-border-none, "circle-nodes": $fa-var-circle-nodes, "parachute-box": $fa-var-parachute-box, "indent": $fa-var-indent, "truck-field-un": $fa-var-truck-field-un, "hourglass": $fa-var-hourglass, "hourglass-empty": $fa-var-hourglass-empty, "mountain": $fa-var-mountain, "user-doctor": $fa-var-user-doctor, "user-md": $fa-var-user-md, "circle-info": $fa-var-circle-info, "info-circle": $fa-var-info-circle, "cloud-meatball": $fa-var-cloud-meatball, "camera": $fa-var-camera, "camera-alt": $fa-var-camera-alt, "square-virus": $fa-var-square-virus, "meteor": $fa-var-meteor, "car-on": $fa-var-car-on, "sleigh": $fa-var-sleigh, "arrow-down-1-9": $fa-var-arrow-down-1-9, "sort-numeric-asc": $fa-var-sort-numeric-asc, "sort-numeric-down": $fa-var-sort-numeric-down, "hand-holding-droplet": $fa-var-hand-holding-droplet, "hand-holding-water": $fa-var-hand-holding-water, "water": $fa-var-water, "calendar-check": $fa-var-calendar-check, "braille": $fa-var-braille, "prescription-bottle-medical": $fa-var-prescription-bottle-medical, "prescription-bottle-alt": $fa-var-prescription-bottle-alt, "landmark": $fa-var-landmark, "truck": $fa-var-truck, "crosshairs": $fa-var-crosshairs, "person-cane": $fa-var-person-cane, "tent": $fa-var-tent, "vest-patches": $fa-var-vest-patches, "check-double": $fa-var-check-double, "arrow-down-a-z": $fa-var-arrow-down-a-z, "sort-alpha-asc": $fa-var-sort-alpha-asc, "sort-alpha-down": $fa-var-sort-alpha-down, "money-bill-wheat": $fa-var-money-bill-wheat, "cookie": $fa-var-cookie, "arrow-rotate-left": $fa-var-arrow-rotate-left, "arrow-left-rotate": $fa-var-arrow-left-rotate, "arrow-rotate-back": $fa-var-arrow-rotate-back, "arrow-rotate-backward": $fa-var-arrow-rotate-backward, "undo": $fa-var-undo, "hard-drive": $fa-var-hard-drive, "hdd": $fa-var-hdd, "face-grin-squint-tears": $fa-var-face-grin-squint-tears, "grin-squint-tears": $fa-var-grin-squint-tears, "dumbbell": $fa-var-dumbbell, "rectangle-list": $fa-var-rectangle-list, "list-alt": $fa-var-list-alt, "tarp-droplet": $fa-var-tarp-droplet, "house-medical-circle-check": $fa-var-house-medical-circle-check, "person-skiing-nordic": $fa-var-person-skiing-nordic, "skiing-nordic": $fa-var-skiing-nordic, "calendar-plus": $fa-var-calendar-plus, "plane-arrival": $fa-var-plane-arrival, "circle-left": $fa-var-circle-left, "arrow-alt-circle-left": $fa-var-arrow-alt-circle-left, "train-subway": $fa-var-train-subway, "subway": $fa-var-subway, "chart-gantt": $fa-var-chart-gantt, "indian-rupee-sign": $fa-var-indian-rupee-sign, "indian-rupee": $fa-var-indian-rupee, "inr": $fa-var-inr, "crop-simple": $fa-var-crop-simple, "crop-alt": $fa-var-crop-alt, "money-bill-1": $fa-var-money-bill-1, "money-bill-alt": $fa-var-money-bill-alt, "left-long": $fa-var-left-long, "long-arrow-alt-left": $fa-var-long-arrow-alt-left, "dna": $fa-var-dna, "virus-slash": $fa-var-virus-slash, "minus": $fa-var-minus, "subtract": $fa-var-subtract, "chess": $fa-var-chess, "arrow-left-long": $fa-var-arrow-left-long, "long-arrow-left": $fa-var-long-arrow-left, "plug-circle-check": $fa-var-plug-circle-check, "street-view": $fa-var-street-view, "franc-sign": $fa-var-franc-sign, "volume-off": $fa-var-volume-off, "hands-asl-interpreting": $fa-var-hands-asl-interpreting, "american-sign-language-interpreting": $fa-var-american-sign-language-interpreting, "asl-interpreting": $fa-var-asl-interpreting, "hands-american-sign-language-interpreting": $fa-var-hands-american-sign-language-interpreting, "gear": $fa-var-gear, "cog": $fa-var-cog, "droplet-slash": $fa-var-droplet-slash, "tint-slash": $fa-var-tint-slash, "mosque": $fa-var-mosque, "mosquito": $fa-var-mosquito, "star-of-david": $fa-var-star-of-david, "person-military-rifle": $fa-var-person-military-rifle, "cart-shopping": $fa-var-cart-shopping, "shopping-cart": $fa-var-shopping-cart, "vials": $fa-var-vials, "plug-circle-plus": $fa-var-plug-circle-plus, "place-of-worship": $fa-var-place-of-worship, "grip-vertical": $fa-var-grip-vertical, "arrow-turn-up": $fa-var-arrow-turn-up, "level-up": $fa-var-level-up, "u": $fa-var-u, "square-root-variable": $fa-var-square-root-variable, "square-root-alt": $fa-var-square-root-alt, "clock": $fa-var-clock, "clock-four": $fa-var-clock-four, "backward-step": $fa-var-backward-step, "step-backward": $fa-var-step-backward, "pallet": $fa-var-pallet, "faucet": $fa-var-faucet, "baseball-bat-ball": $fa-var-baseball-bat-ball, "s": $fa-var-s, "timeline": $fa-var-timeline, "keyboard": $fa-var-keyboard, "caret-down": $fa-var-caret-down, "house-chimney-medical": $fa-var-house-chimney-medical, "clinic-medical": $fa-var-clinic-medical, "temperature-three-quarters": $fa-var-temperature-three-quarters, "temperature-3": $fa-var-temperature-3, "thermometer-3": $fa-var-thermometer-3, "thermometer-three-quarters": $fa-var-thermometer-three-quarters, "mobile-screen": $fa-var-mobile-screen, "mobile-android-alt": $fa-var-mobile-android-alt, "plane-up": $fa-var-plane-up, "piggy-bank": $fa-var-piggy-bank, "battery-half": $fa-var-battery-half, "battery-3": $fa-var-battery-3, "mountain-city": $fa-var-mountain-city, "coins": $fa-var-coins, "khanda": $fa-var-khanda, "sliders": $fa-var-sliders, "sliders-h": $fa-var-sliders-h, "folder-tree": $fa-var-folder-tree, "network-wired": $fa-var-network-wired, "map-pin": $fa-var-map-pin, "hamsa": $fa-var-hamsa, "cent-sign": $fa-var-cent-sign, "flask": $fa-var-flask, "person-pregnant": $fa-var-person-pregnant, "wand-sparkles": $fa-var-wand-sparkles, "ellipsis-vertical": $fa-var-ellipsis-vertical, "ellipsis-v": $fa-var-ellipsis-v, "ticket": $fa-var-ticket, "power-off": $fa-var-power-off, "right-long": $fa-var-right-long, "long-arrow-alt-right": $fa-var-long-arrow-alt-right, "flag-usa": $fa-var-flag-usa, "laptop-file": $fa-var-laptop-file, "tty": $fa-var-tty, "teletype": $fa-var-teletype, "diagram-next": $fa-var-diagram-next, "person-rifle": $fa-var-person-rifle, "house-medical-circle-exclamation": $fa-var-house-medical-circle-exclamation, "closed-captioning": $fa-var-closed-captioning, "person-hiking": $fa-var-person-hiking, "hiking": $fa-var-hiking, "venus-double": $fa-var-venus-double, "images": $fa-var-images, "calculator": $fa-var-calculator, "people-pulling": $fa-var-people-pulling, "n": $fa-var-n, "cable-car": $fa-var-cable-car, "tram": $fa-var-tram, "cloud-rain": $fa-var-cloud-rain, "building-circle-xmark": $fa-var-building-circle-xmark, "ship": $fa-var-ship, "arrows-down-to-line": $fa-var-arrows-down-to-line, "download": $fa-var-download, "face-grin": $fa-var-face-grin, "grin": $fa-var-grin, "delete-left": $fa-var-delete-left, "backspace": $fa-var-backspace, "eye-dropper": $fa-var-eye-dropper, "eye-dropper-empty": $fa-var-eye-dropper-empty, "eyedropper": $fa-var-eyedropper, "file-circle-check": $fa-var-file-circle-check, "forward": $fa-var-forward, "mobile": $fa-var-mobile, "mobile-android": $fa-var-mobile-android, "mobile-phone": $fa-var-mobile-phone, "face-meh": $fa-var-face-meh, "meh": $fa-var-meh, "align-center": $fa-var-align-center, "book-skull": $fa-var-book-skull, "book-dead": $fa-var-book-dead, "id-card": $fa-var-id-card, "drivers-license": $fa-var-drivers-license, "outdent": $fa-var-outdent, "dedent": $fa-var-dedent, "heart-circle-exclamation": $fa-var-heart-circle-exclamation, "house": $fa-var-house, "home": $fa-var-home, "home-alt": $fa-var-home-alt, "home-lg-alt": $fa-var-home-lg-alt, "calendar-week": $fa-var-calendar-week, "laptop-medical": $fa-var-laptop-medical, "b": $fa-var-b, "file-medical": $fa-var-file-medical, "dice-one": $fa-var-dice-one, "kiwi-bird": $fa-var-kiwi-bird, "arrow-right-arrow-left": $fa-var-arrow-right-arrow-left, "exchange": $fa-var-exchange, "rotate-right": $fa-var-rotate-right, "redo-alt": $fa-var-redo-alt, "rotate-forward": $fa-var-rotate-forward, "utensils": $fa-var-utensils, "cutlery": $fa-var-cutlery, "arrow-up-wide-short": $fa-var-arrow-up-wide-short, "sort-amount-up": $fa-var-sort-amount-up, "mill-sign": $fa-var-mill-sign, "bowl-rice": $fa-var-bowl-rice, "skull": $fa-var-skull, "tower-broadcast": $fa-var-tower-broadcast, "broadcast-tower": $fa-var-broadcast-tower, "truck-pickup": $fa-var-truck-pickup, "up-long": $fa-var-up-long, "long-arrow-alt-up": $fa-var-long-arrow-alt-up, "stop": $fa-var-stop, "code-merge": $fa-var-code-merge, "upload": $fa-var-upload, "hurricane": $fa-var-hurricane, "mound": $fa-var-mound, "toilet-portable": $fa-var-toilet-portable, "compact-disc": $fa-var-compact-disc, "file-arrow-down": $fa-var-file-arrow-down, "file-download": $fa-var-file-download, "caravan": $fa-var-caravan, "shield-cat": $fa-var-shield-cat, "bolt": $fa-var-bolt, "zap": $fa-var-zap, "glass-water": $fa-var-glass-water, "oil-well": $fa-var-oil-well, "vault": $fa-var-vault, "mars": $fa-var-mars, "toilet": $fa-var-toilet, "plane-circle-xmark": $fa-var-plane-circle-xmark, "yen-sign": $fa-var-yen-sign, "cny": $fa-var-cny, "jpy": $fa-var-jpy, "rmb": $fa-var-rmb, "yen": $fa-var-yen, "ruble-sign": $fa-var-ruble-sign, "rouble": $fa-var-rouble, "rub": $fa-var-rub, "ruble": $fa-var-ruble, "sun": $fa-var-sun, "guitar": $fa-var-guitar, "face-laugh-wink": $fa-var-face-laugh-wink, "laugh-wink": $fa-var-laugh-wink, "horse-head": $fa-var-horse-head, "bore-hole": $fa-var-bore-hole, "industry": $fa-var-industry, "circle-down": $fa-var-circle-down, "arrow-alt-circle-down": $fa-var-arrow-alt-circle-down, "arrows-turn-to-dots": $fa-var-arrows-turn-to-dots, "florin-sign": $fa-var-florin-sign, "arrow-down-short-wide": $fa-var-arrow-down-short-wide, "sort-amount-desc": $fa-var-sort-amount-desc, "sort-amount-down-alt": $fa-var-sort-amount-down-alt, "less-than": $fa-var-less-than, "angle-down": $fa-var-angle-down, "car-tunnel": $fa-var-car-tunnel, "head-side-cough": $fa-var-head-side-cough, "grip-lines": $fa-var-grip-lines, "thumbs-down": $fa-var-thumbs-down, "user-lock": $fa-var-user-lock, "arrow-right-long": $fa-var-arrow-right-long, "long-arrow-right": $fa-var-long-arrow-right, "anchor-circle-xmark": $fa-var-anchor-circle-xmark, "ellipsis": $fa-var-ellipsis, "ellipsis-h": $fa-var-ellipsis-h, "chess-pawn": $fa-var-chess-pawn, "kit-medical": $fa-var-kit-medical, "first-aid": $fa-var-first-aid, "person-through-window": $fa-var-person-through-window, "toolbox": $fa-var-toolbox, "hands-holding-circle": $fa-var-hands-holding-circle, "bug": $fa-var-bug, "credit-card": $fa-var-credit-card, "credit-card-alt": $fa-var-credit-card-alt, "car": $fa-var-car, "automobile": $fa-var-automobile, "hand-holding-hand": $fa-var-hand-holding-hand, "book-open-reader": $fa-var-book-open-reader, "book-reader": $fa-var-book-reader, "mountain-sun": $fa-var-mountain-sun, "arrows-left-right-to-line": $fa-var-arrows-left-right-to-line, "dice-d20": $fa-var-dice-d20, "truck-droplet": $fa-var-truck-droplet, "file-circle-xmark": $fa-var-file-circle-xmark, "temperature-arrow-up": $fa-var-temperature-arrow-up, "temperature-up": $fa-var-temperature-up, "medal": $fa-var-medal, "bed": $fa-var-bed, "square-h": $fa-var-square-h, "h-square": $fa-var-h-square, "podcast": $fa-var-podcast, "temperature-full": $fa-var-temperature-full, "temperature-4": $fa-var-temperature-4, "thermometer-4": $fa-var-thermometer-4, "thermometer-full": $fa-var-thermometer-full, "bell": $fa-var-bell, "superscript": $fa-var-superscript, "plug-circle-xmark": $fa-var-plug-circle-xmark, "star-of-life": $fa-var-star-of-life, "phone-slash": $fa-var-phone-slash, "paint-roller": $fa-var-paint-roller, "handshake-angle": $fa-var-handshake-angle, "hands-helping": $fa-var-hands-helping, "location-dot": $fa-var-location-dot, "map-marker-alt": $fa-var-map-marker-alt, "file": $fa-var-file, "greater-than": $fa-var-greater-than, "person-swimming": $fa-var-person-swimming, "swimmer": $fa-var-swimmer, "arrow-down": $fa-var-arrow-down, "droplet": $fa-var-droplet, "tint": $fa-var-tint, "eraser": $fa-var-eraser, "earth-americas": $fa-var-earth-americas, "earth": $fa-var-earth, "earth-america": $fa-var-earth-america, "globe-americas": $fa-var-globe-americas, "person-burst": $fa-var-person-burst, "dove": $fa-var-dove, "battery-empty": $fa-var-battery-empty, "battery-0": $fa-var-battery-0, "socks": $fa-var-socks, "inbox": $fa-var-inbox, "section": $fa-var-section, "gauge-high": $fa-var-gauge-high, "tachometer-alt": $fa-var-tachometer-alt, "tachometer-alt-fast": $fa-var-tachometer-alt-fast, "envelope-open-text": $fa-var-envelope-open-text, "hospital": $fa-var-hospital, "hospital-alt": $fa-var-hospital-alt, "hospital-wide": $fa-var-hospital-wide, "wine-bottle": $fa-var-wine-bottle, "chess-rook": $fa-var-chess-rook, "bars-staggered": $fa-var-bars-staggered, "reorder": $fa-var-reorder, "stream": $fa-var-stream, "dharmachakra": $fa-var-dharmachakra, "hotdog": $fa-var-hotdog, "person-walking-with-cane": $fa-var-person-walking-with-cane, "blind": $fa-var-blind, "drum": $fa-var-drum, "ice-cream": $fa-var-ice-cream, "heart-circle-bolt": $fa-var-heart-circle-bolt, "fax": $fa-var-fax, "paragraph": $fa-var-paragraph, "check-to-slot": $fa-var-check-to-slot, "vote-yea": $fa-var-vote-yea, "star-half": $fa-var-star-half, "boxes-stacked": $fa-var-boxes-stacked, "boxes": $fa-var-boxes, "boxes-alt": $fa-var-boxes-alt, "link": $fa-var-link, "chain": $fa-var-chain, "ear-listen": $fa-var-ear-listen, "assistive-listening-systems": $fa-var-assistive-listening-systems, "tree-city": $fa-var-tree-city, "play": $fa-var-play, "font": $fa-var-font, "table-cells-row-lock": $fa-var-table-cells-row-lock, "rupiah-sign": $fa-var-rupiah-sign, "magnifying-glass": $fa-var-magnifying-glass, "search": $fa-var-search, "table-tennis-paddle-ball": $fa-var-table-tennis-paddle-ball, "ping-pong-paddle-ball": $fa-var-ping-pong-paddle-ball, "table-tennis": $fa-var-table-tennis, "person-dots-from-line": $fa-var-person-dots-from-line, "diagnoses": $fa-var-diagnoses, "trash-can-arrow-up": $fa-var-trash-can-arrow-up, "trash-restore-alt": $fa-var-trash-restore-alt, "naira-sign": $fa-var-naira-sign, "cart-arrow-down": $fa-var-cart-arrow-down, "walkie-talkie": $fa-var-walkie-talkie, "file-pen": $fa-var-file-pen, "file-edit": $fa-var-file-edit, "receipt": $fa-var-receipt, "square-pen": $fa-var-square-pen, "pen-square": $fa-var-pen-square, "pencil-square": $fa-var-pencil-square, "suitcase-rolling": $fa-var-suitcase-rolling, "person-circle-exclamation": $fa-var-person-circle-exclamation, "chevron-down": $fa-var-chevron-down, "battery-full": $fa-var-battery-full, "battery": $fa-var-battery, "battery-5": $fa-var-battery-5, "skull-crossbones": $fa-var-skull-crossbones, "code-compare": $fa-var-code-compare, "list-ul": $fa-var-list-ul, "list-dots": $fa-var-list-dots, "school-lock": $fa-var-school-lock, "tower-cell": $fa-var-tower-cell, "down-long": $fa-var-down-long, "long-arrow-alt-down": $fa-var-long-arrow-alt-down, "ranking-star": $fa-var-ranking-star, "chess-king": $fa-var-chess-king, "person-harassing": $fa-var-person-harassing, "brazilian-real-sign": $fa-var-brazilian-real-sign, "landmark-dome": $fa-var-landmark-dome, "landmark-alt": $fa-var-landmark-alt, "arrow-up": $fa-var-arrow-up, "tv": $fa-var-tv, "television": $fa-var-television, "tv-alt": $fa-var-tv-alt, "shrimp": $fa-var-shrimp, "list-check": $fa-var-list-check, "tasks": $fa-var-tasks, "jug-detergent": $fa-var-jug-detergent, "circle-user": $fa-var-circle-user, "user-circle": $fa-var-user-circle, "user-shield": $fa-var-user-shield, "wind": $fa-var-wind, "car-burst": $fa-var-car-burst, "car-crash": $fa-var-car-crash, "y": $fa-var-y, "person-snowboarding": $fa-var-person-snowboarding, "snowboarding": $fa-var-snowboarding, "truck-fast": $fa-var-truck-fast, "shipping-fast": $fa-var-shipping-fast, "fish": $fa-var-fish, "user-graduate": $fa-var-user-graduate, "circle-half-stroke": $fa-var-circle-half-stroke, "adjust": $fa-var-adjust, "clapperboard": $fa-var-clapperboard, "circle-radiation": $fa-var-circle-radiation, "radiation-alt": $fa-var-radiation-alt, "baseball": $fa-var-baseball, "baseball-ball": $fa-var-baseball-ball, "jet-fighter-up": $fa-var-jet-fighter-up, "diagram-project": $fa-var-diagram-project, "project-diagram": $fa-var-project-diagram, "copy": $fa-var-copy, "volume-xmark": $fa-var-volume-xmark, "volume-mute": $fa-var-volume-mute, "volume-times": $fa-var-volume-times, "hand-sparkles": $fa-var-hand-sparkles, "grip": $fa-var-grip, "grip-horizontal": $fa-var-grip-horizontal, "share-from-square": $fa-var-share-from-square, "share-square": $fa-var-share-square, "child-combatant": $fa-var-child-combatant, "child-rifle": $fa-var-child-rifle, "gun": $fa-var-gun, "square-phone": $fa-var-square-phone, "phone-square": $fa-var-phone-square, "plus": $fa-var-plus, "add": $fa-var-add, "expand": $fa-var-expand, "computer": $fa-var-computer, "xmark": $fa-var-xmark, "close": $fa-var-close, "multiply": $fa-var-multiply, "remove": $fa-var-remove, "times": $fa-var-times, "arrows-up-down-left-right": $fa-var-arrows-up-down-left-right, "arrows": $fa-var-arrows, "chalkboard-user": $fa-var-chalkboard-user, "chalkboard-teacher": $fa-var-chalkboard-teacher, "peso-sign": $fa-var-peso-sign, "building-shield": $fa-var-building-shield, "baby": $fa-var-baby, "users-line": $fa-var-users-line, "quote-left": $fa-var-quote-left, "quote-left-alt": $fa-var-quote-left-alt, "tractor": $fa-var-tractor, "trash-arrow-up": $fa-var-trash-arrow-up, "trash-restore": $fa-var-trash-restore, "arrow-down-up-lock": $fa-var-arrow-down-up-lock, "lines-leaning": $fa-var-lines-leaning, "ruler-combined": $fa-var-ruler-combined, "copyright": $fa-var-copyright, "equals": $fa-var-equals, "blender": $fa-var-blender, "teeth": $fa-var-teeth, "shekel-sign": $fa-var-shekel-sign, "ils": $fa-var-ils, "shekel": $fa-var-shekel, "sheqel": $fa-var-sheqel, "sheqel-sign": $fa-var-sheqel-sign, "map": $fa-var-map, "rocket": $fa-var-rocket, "photo-film": $fa-var-photo-film, "photo-video": $fa-var-photo-video, "folder-minus": $fa-var-folder-minus, "store": $fa-var-store, "arrow-trend-up": $fa-var-arrow-trend-up, "plug-circle-minus": $fa-var-plug-circle-minus, "sign-hanging": $fa-var-sign-hanging, "sign": $fa-var-sign, "bezier-curve": $fa-var-bezier-curve, "bell-slash": $fa-var-bell-slash, "tablet": $fa-var-tablet, "tablet-android": $fa-var-tablet-android, "school-flag": $fa-var-school-flag, "fill": $fa-var-fill, "angle-up": $fa-var-angle-up, "drumstick-bite": $fa-var-drumstick-bite, "holly-berry": $fa-var-holly-berry, "chevron-left": $fa-var-chevron-left, "bacteria": $fa-var-bacteria, "hand-lizard": $fa-var-hand-lizard, "notdef": $fa-var-notdef, "disease": $fa-var-disease, "briefcase-medical": $fa-var-briefcase-medical, "genderless": $fa-var-genderless, "chevron-right": $fa-var-chevron-right, "retweet": $fa-var-retweet, "car-rear": $fa-var-car-rear, "car-alt": $fa-var-car-alt, "pump-soap": $fa-var-pump-soap, "video-slash": $fa-var-video-slash, "battery-quarter": $fa-var-battery-quarter, "battery-2": $fa-var-battery-2, "radio": $fa-var-radio, "baby-carriage": $fa-var-baby-carriage, "carriage-baby": $fa-var-carriage-baby, "traffic-light": $fa-var-traffic-light, "thermometer": $fa-var-thermometer, "vr-cardboard": $fa-var-vr-cardboard, "hand-middle-finger": $fa-var-hand-middle-finger, "percent": $fa-var-percent, "percentage": $fa-var-percentage, "truck-moving": $fa-var-truck-moving, "glass-water-droplet": $fa-var-glass-water-droplet, "display": $fa-var-display, "face-smile": $fa-var-face-smile, "smile": $fa-var-smile, "thumbtack": $fa-var-thumbtack, "thumb-tack": $fa-var-thumb-tack, "trophy": $fa-var-trophy, "person-praying": $fa-var-person-praying, "pray": $fa-var-pray, "hammer": $fa-var-hammer, "hand-peace": $fa-var-hand-peace, "rotate": $fa-var-rotate, "sync-alt": $fa-var-sync-alt, "spinner": $fa-var-spinner, "robot": $fa-var-robot, "peace": $fa-var-peace, "gears": $fa-var-gears, "cogs": $fa-var-cogs, "warehouse": $fa-var-warehouse, "arrow-up-right-dots": $fa-var-arrow-up-right-dots, "splotch": $fa-var-splotch, "face-grin-hearts": $fa-var-face-grin-hearts, "grin-hearts": $fa-var-grin-hearts, "dice-four": $fa-var-dice-four, "sim-card": $fa-var-sim-card, "transgender": $fa-var-transgender, "transgender-alt": $fa-var-transgender-alt, "mercury": $fa-var-mercury, "arrow-turn-down": $fa-var-arrow-turn-down, "level-down": $fa-var-level-down, "person-falling-burst": $fa-var-person-falling-burst, "award": $fa-var-award, "ticket-simple": $fa-var-ticket-simple, "ticket-alt": $fa-var-ticket-alt, "building": $fa-var-building, "angles-left": $fa-var-angles-left, "angle-double-left": $fa-var-angle-double-left, "qrcode": $fa-var-qrcode, "clock-rotate-left": $fa-var-clock-rotate-left, "history": $fa-var-history, "face-grin-beam-sweat": $fa-var-face-grin-beam-sweat, "grin-beam-sweat": $fa-var-grin-beam-sweat, "file-export": $fa-var-file-export, "arrow-right-from-file": $fa-var-arrow-right-from-file, "shield": $fa-var-shield, "shield-blank": $fa-var-shield-blank, "arrow-up-short-wide": $fa-var-arrow-up-short-wide, "sort-amount-up-alt": $fa-var-sort-amount-up-alt, "house-medical": $fa-var-house-medical, "golf-ball-tee": $fa-var-golf-ball-tee, "golf-ball": $fa-var-golf-ball, "circle-chevron-left": $fa-var-circle-chevron-left, "chevron-circle-left": $fa-var-chevron-circle-left, "house-chimney-window": $fa-var-house-chimney-window, "pen-nib": $fa-var-pen-nib, "tent-arrow-turn-left": $fa-var-tent-arrow-turn-left, "tents": $fa-var-tents, "wand-magic": $fa-var-wand-magic, "magic": $fa-var-magic, "dog": $fa-var-dog, "carrot": $fa-var-carrot, "moon": $fa-var-moon, "wine-glass-empty": $fa-var-wine-glass-empty, "wine-glass-alt": $fa-var-wine-glass-alt, "cheese": $fa-var-cheese, "yin-yang": $fa-var-yin-yang, "music": $fa-var-music, "code-commit": $fa-var-code-commit, "temperature-low": $fa-var-temperature-low, "person-biking": $fa-var-person-biking, "biking": $fa-var-biking, "broom": $fa-var-broom, "shield-heart": $fa-var-shield-heart, "gopuram": $fa-var-gopuram, "earth-oceania": $fa-var-earth-oceania, "globe-oceania": $fa-var-globe-oceania, "square-xmark": $fa-var-square-xmark, "times-square": $fa-var-times-square, "xmark-square": $fa-var-xmark-square, "hashtag": $fa-var-hashtag, "up-right-and-down-left-from-center": $fa-var-up-right-and-down-left-from-center, "expand-alt": $fa-var-expand-alt, "oil-can": $fa-var-oil-can, "t": $fa-var-t, "hippo": $fa-var-hippo, "chart-column": $fa-var-chart-column, "infinity": $fa-var-infinity, "vial-circle-check": $fa-var-vial-circle-check, "person-arrow-down-to-line": $fa-var-person-arrow-down-to-line, "voicemail": $fa-var-voicemail, "fan": $fa-var-fan, "person-walking-luggage": $fa-var-person-walking-luggage, "up-down": $fa-var-up-down, "arrows-alt-v": $fa-var-arrows-alt-v, "cloud-moon-rain": $fa-var-cloud-moon-rain, "calendar": $fa-var-calendar, "trailer": $fa-var-trailer, "bahai": $fa-var-bahai, "haykal": $fa-var-haykal, "sd-card": $fa-var-sd-card, "dragon": $fa-var-dragon, "shoe-prints": $fa-var-shoe-prints, "circle-plus": $fa-var-circle-plus, "plus-circle": $fa-var-plus-circle, "face-grin-tongue-wink": $fa-var-face-grin-tongue-wink, "grin-tongue-wink": $fa-var-grin-tongue-wink, "hand-holding": $fa-var-hand-holding, "plug-circle-exclamation": $fa-var-plug-circle-exclamation, "link-slash": $fa-var-link-slash, "chain-broken": $fa-var-chain-broken, "chain-slash": $fa-var-chain-slash, "unlink": $fa-var-unlink, "clone": $fa-var-clone, "person-walking-arrow-loop-left": $fa-var-person-walking-arrow-loop-left, "arrow-up-z-a": $fa-var-arrow-up-z-a, "sort-alpha-up-alt": $fa-var-sort-alpha-up-alt, "fire-flame-curved": $fa-var-fire-flame-curved, "fire-alt": $fa-var-fire-alt, "tornado": $fa-var-tornado, "file-circle-plus": $fa-var-file-circle-plus, "book-quran": $fa-var-book-quran, "quran": $fa-var-quran, "anchor": $fa-var-anchor, "border-all": $fa-var-border-all, "face-angry": $fa-var-face-angry, "angry": $fa-var-angry, "cookie-bite": $fa-var-cookie-bite, "arrow-trend-down": $fa-var-arrow-trend-down, "rss": $fa-var-rss, "feed": $fa-var-feed, "draw-polygon": $fa-var-draw-polygon, "scale-balanced": $fa-var-scale-balanced, "balance-scale": $fa-var-balance-scale, "gauge-simple-high": $fa-var-gauge-simple-high, "tachometer": $fa-var-tachometer, "tachometer-fast": $fa-var-tachometer-fast, "shower": $fa-var-shower, "desktop": $fa-var-desktop, "desktop-alt": $fa-var-desktop-alt, "m": $fa-var-m, "table-list": $fa-var-table-list, "th-list": $fa-var-th-list, "comment-sms": $fa-var-comment-sms, "sms": $fa-var-sms, "book": $fa-var-book, "user-plus": $fa-var-user-plus, "check": $fa-var-check, "battery-three-quarters": $fa-var-battery-three-quarters, "battery-4": $fa-var-battery-4, "house-circle-check": $fa-var-house-circle-check, "angle-left": $fa-var-angle-left, "diagram-successor": $fa-var-diagram-successor, "truck-arrow-right": $fa-var-truck-arrow-right, "arrows-split-up-and-left": $fa-var-arrows-split-up-and-left, "hand-fist": $fa-var-hand-fist, "fist-raised": $fa-var-fist-raised, "cloud-moon": $fa-var-cloud-moon, "briefcase": $fa-var-briefcase, "person-falling": $fa-var-person-falling, "image-portrait": $fa-var-image-portrait, "portrait": $fa-var-portrait, "user-tag": $fa-var-user-tag, "rug": $fa-var-rug, "earth-europe": $fa-var-earth-europe, "globe-europe": $fa-var-globe-europe, "cart-flatbed-suitcase": $fa-var-cart-flatbed-suitcase, "luggage-cart": $fa-var-luggage-cart, "rectangle-xmark": $fa-var-rectangle-xmark, "rectangle-times": $fa-var-rectangle-times, "times-rectangle": $fa-var-times-rectangle, "window-close": $fa-var-window-close, "baht-sign": $fa-var-baht-sign, "book-open": $fa-var-book-open, "book-journal-whills": $fa-var-book-journal-whills, "journal-whills": $fa-var-journal-whills, "handcuffs": $fa-var-handcuffs, "triangle-exclamation": $fa-var-triangle-exclamation, "exclamation-triangle": $fa-var-exclamation-triangle, "warning": $fa-var-warning, "database": $fa-var-database, "share": $fa-var-share, "mail-forward": $fa-var-mail-forward, "bottle-droplet": $fa-var-bottle-droplet, "mask-face": $fa-var-mask-face, "hill-rockslide": $fa-var-hill-rockslide, "right-left": $fa-var-right-left, "exchange-alt": $fa-var-exchange-alt, "paper-plane": $fa-var-paper-plane, "road-circle-exclamation": $fa-var-road-circle-exclamation, "dungeon": $fa-var-dungeon, "align-right": $fa-var-align-right, "money-bill-1-wave": $fa-var-money-bill-1-wave, "money-bill-wave-alt": $fa-var-money-bill-wave-alt, "life-ring": $fa-var-life-ring, "hands": $fa-var-hands, "sign-language": $fa-var-sign-language, "signing": $fa-var-signing, "calendar-day": $fa-var-calendar-day, "water-ladder": $fa-var-water-ladder, "ladder-water": $fa-var-ladder-water, "swimming-pool": $fa-var-swimming-pool, "arrows-up-down": $fa-var-arrows-up-down, "arrows-v": $fa-var-arrows-v, "face-grimace": $fa-var-face-grimace, "grimace": $fa-var-grimace, "wheelchair-move": $fa-var-wheelchair-move, "wheelchair-alt": $fa-var-wheelchair-alt, "turn-down": $fa-var-turn-down, "level-down-alt": $fa-var-level-down-alt, "person-walking-arrow-right": $fa-var-person-walking-arrow-right, "square-envelope": $fa-var-square-envelope, "envelope-square": $fa-var-envelope-square, "dice": $fa-var-dice, "bowling-ball": $fa-var-bowling-ball, "brain": $fa-var-brain, "bandage": $fa-var-bandage, "band-aid": $fa-var-band-aid, "calendar-minus": $fa-var-calendar-minus, "circle-xmark": $fa-var-circle-xmark, "times-circle": $fa-var-times-circle, "xmark-circle": $fa-var-xmark-circle, "gifts": $fa-var-gifts, "hotel": $fa-var-hotel, "earth-asia": $fa-var-earth-asia, "globe-asia": $fa-var-globe-asia, "id-card-clip": $fa-var-id-card-clip, "id-card-alt": $fa-var-id-card-alt, "magnifying-glass-plus": $fa-var-magnifying-glass-plus, "search-plus": $fa-var-search-plus, "thumbs-up": $fa-var-thumbs-up, "user-clock": $fa-var-user-clock, "hand-dots": $fa-var-hand-dots, "allergies": $fa-var-allergies, "file-invoice": $fa-var-file-invoice, "window-minimize": $fa-var-window-minimize, "mug-saucer": $fa-var-mug-saucer, "coffee": $fa-var-coffee, "brush": $fa-var-brush, "mask": $fa-var-mask, "magnifying-glass-minus": $fa-var-magnifying-glass-minus, "search-minus": $fa-var-search-minus, "ruler-vertical": $fa-var-ruler-vertical, "user-large": $fa-var-user-large, "user-alt": $fa-var-user-alt, "train-tram": $fa-var-train-tram, "user-nurse": $fa-var-user-nurse, "syringe": $fa-var-syringe, "cloud-sun": $fa-var-cloud-sun, "stopwatch-20": $fa-var-stopwatch-20, "square-full": $fa-var-square-full, "magnet": $fa-var-magnet, "jar": $fa-var-jar, "note-sticky": $fa-var-note-sticky, "sticky-note": $fa-var-sticky-note, "bug-slash": $fa-var-bug-slash, "arrow-up-from-water-pump": $fa-var-arrow-up-from-water-pump, "bone": $fa-var-bone, "user-injured": $fa-var-user-injured, "face-sad-tear": $fa-var-face-sad-tear, "sad-tear": $fa-var-sad-tear, "plane": $fa-var-plane, "tent-arrows-down": $fa-var-tent-arrows-down, "exclamation": $fa-var-exclamation, "arrows-spin": $fa-var-arrows-spin, "print": $fa-var-print, "turkish-lira-sign": $fa-var-turkish-lira-sign, "try": $fa-var-try, "turkish-lira": $fa-var-turkish-lira, "dollar-sign": $fa-var-dollar-sign, "dollar": $fa-var-dollar, "usd": $fa-var-usd, "x": $fa-var-x, "magnifying-glass-dollar": $fa-var-magnifying-glass-dollar, "search-dollar": $fa-var-search-dollar, "users-gear": $fa-var-users-gear, "users-cog": $fa-var-users-cog, "person-military-pointing": $fa-var-person-military-pointing, "building-columns": $fa-var-building-columns, "bank": $fa-var-bank, "institution": $fa-var-institution, "museum": $fa-var-museum, "university": $fa-var-university, "umbrella": $fa-var-umbrella, "trowel": $fa-var-trowel, "d": $fa-var-d, "stapler": $fa-var-stapler, "masks-theater": $fa-var-masks-theater, "theater-masks": $fa-var-theater-masks, "kip-sign": $fa-var-kip-sign, "hand-point-left": $fa-var-hand-point-left, "handshake-simple": $fa-var-handshake-simple, "handshake-alt": $fa-var-handshake-alt, "jet-fighter": $fa-var-jet-fighter, "fighter-jet": $fa-var-fighter-jet, "square-share-nodes": $fa-var-square-share-nodes, "share-alt-square": $fa-var-share-alt-square, "barcode": $fa-var-barcode, "plus-minus": $fa-var-plus-minus, "video": $fa-var-video, "video-camera": $fa-var-video-camera, "graduation-cap": $fa-var-graduation-cap, "mortar-board": $fa-var-mortar-board, "hand-holding-medical": $fa-var-hand-holding-medical, "person-circle-check": $fa-var-person-circle-check, "turn-up": $fa-var-turn-up, "level-up-alt": $fa-var-level-up-alt, ); $fa-brand-icons: ( "monero": $fa-var-monero, "hooli": $fa-var-hooli, "yelp": $fa-var-yelp, "cc-visa": $fa-var-cc-visa, "lastfm": $fa-var-lastfm, "shopware": $fa-var-shopware, "creative-commons-nc": $fa-var-creative-commons-nc, "aws": $fa-var-aws, "redhat": $fa-var-redhat, "yoast": $fa-var-yoast, "cloudflare": $fa-var-cloudflare, "ups": $fa-var-ups, "pixiv": $fa-var-pixiv, "wpexplorer": $fa-var-wpexplorer, "dyalog": $fa-var-dyalog, "bity": $fa-var-bity, "stackpath": $fa-var-stackpath, "buysellads": $fa-var-buysellads, "first-order": $fa-var-first-order, "modx": $fa-var-modx, "guilded": $fa-var-guilded, "vnv": $fa-var-vnv, "square-js": $fa-var-square-js, "js-square": $fa-var-js-square, "microsoft": $fa-var-microsoft, "qq": $fa-var-qq, "orcid": $fa-var-orcid, "java": $fa-var-java, "invision": $fa-var-invision, "creative-commons-pd-alt": $fa-var-creative-commons-pd-alt, "centercode": $fa-var-centercode, "glide-g": $fa-var-glide-g, "drupal": $fa-var-drupal, "jxl": $fa-var-jxl, "hire-a-helper": $fa-var-hire-a-helper, "creative-commons-by": $fa-var-creative-commons-by, "unity": $fa-var-unity, "whmcs": $fa-var-whmcs, "rocketchat": $fa-var-rocketchat, "vk": $fa-var-vk, "untappd": $fa-var-untappd, "mailchimp": $fa-var-mailchimp, "css3-alt": $fa-var-css3-alt, "square-reddit": $fa-var-square-reddit, "reddit-square": $fa-var-reddit-square, "vimeo-v": $fa-var-vimeo-v, "contao": $fa-var-contao, "square-font-awesome": $fa-var-square-font-awesome, "deskpro": $fa-var-deskpro, "brave": $fa-var-brave, "sistrix": $fa-var-sistrix, "square-instagram": $fa-var-square-instagram, "instagram-square": $fa-var-instagram-square, "battle-net": $fa-var-battle-net, "the-red-yeti": $fa-var-the-red-yeti, "square-hacker-news": $fa-var-square-hacker-news, "hacker-news-square": $fa-var-hacker-news-square, "edge": $fa-var-edge, "threads": $fa-var-threads, "napster": $fa-var-napster, "square-snapchat": $fa-var-square-snapchat, "snapchat-square": $fa-var-snapchat-square, "google-plus-g": $fa-var-google-plus-g, "artstation": $fa-var-artstation, "markdown": $fa-var-markdown, "sourcetree": $fa-var-sourcetree, "google-plus": $fa-var-google-plus, "diaspora": $fa-var-diaspora, "foursquare": $fa-var-foursquare, "stack-overflow": $fa-var-stack-overflow, "github-alt": $fa-var-github-alt, "phoenix-squadron": $fa-var-phoenix-squadron, "pagelines": $fa-var-pagelines, "algolia": $fa-var-algolia, "red-river": $fa-var-red-river, "creative-commons-sa": $fa-var-creative-commons-sa, "safari": $fa-var-safari, "google": $fa-var-google, "square-font-awesome-stroke": $fa-var-square-font-awesome-stroke, "font-awesome-alt": $fa-var-font-awesome-alt, "atlassian": $fa-var-atlassian, "linkedin-in": $fa-var-linkedin-in, "digital-ocean": $fa-var-digital-ocean, "nimblr": $fa-var-nimblr, "chromecast": $fa-var-chromecast, "evernote": $fa-var-evernote, "hacker-news": $fa-var-hacker-news, "creative-commons-sampling": $fa-var-creative-commons-sampling, "adversal": $fa-var-adversal, "creative-commons": $fa-var-creative-commons, "watchman-monitoring": $fa-var-watchman-monitoring, "fonticons": $fa-var-fonticons, "weixin": $fa-var-weixin, "shirtsinbulk": $fa-var-shirtsinbulk, "codepen": $fa-var-codepen, "git-alt": $fa-var-git-alt, "lyft": $fa-var-lyft, "rev": $fa-var-rev, "windows": $fa-var-windows, "wizards-of-the-coast": $fa-var-wizards-of-the-coast, "square-viadeo": $fa-var-square-viadeo, "viadeo-square": $fa-var-viadeo-square, "meetup": $fa-var-meetup, "centos": $fa-var-centos, "adn": $fa-var-adn, "cloudsmith": $fa-var-cloudsmith, "opensuse": $fa-var-opensuse, "pied-piper-alt": $fa-var-pied-piper-alt, "square-dribbble": $fa-var-square-dribbble, "dribbble-square": $fa-var-dribbble-square, "codiepie": $fa-var-codiepie, "node": $fa-var-node, "mix": $fa-var-mix, "steam": $fa-var-steam, "cc-apple-pay": $fa-var-cc-apple-pay, "scribd": $fa-var-scribd, "debian": $fa-var-debian, "openid": $fa-var-openid, "instalod": $fa-var-instalod, "expeditedssl": $fa-var-expeditedssl, "sellcast": $fa-var-sellcast, "square-twitter": $fa-var-square-twitter, "twitter-square": $fa-var-twitter-square, "r-project": $fa-var-r-project, "delicious": $fa-var-delicious, "freebsd": $fa-var-freebsd, "vuejs": $fa-var-vuejs, "accusoft": $fa-var-accusoft, "ioxhost": $fa-var-ioxhost, "fonticons-fi": $fa-var-fonticons-fi, "app-store": $fa-var-app-store, "cc-mastercard": $fa-var-cc-mastercard, "itunes-note": $fa-var-itunes-note, "golang": $fa-var-golang, "kickstarter": $fa-var-kickstarter, "square-kickstarter": $fa-var-square-kickstarter, "grav": $fa-var-grav, "weibo": $fa-var-weibo, "uncharted": $fa-var-uncharted, "firstdraft": $fa-var-firstdraft, "square-youtube": $fa-var-square-youtube, "youtube-square": $fa-var-youtube-square, "wikipedia-w": $fa-var-wikipedia-w, "wpressr": $fa-var-wpressr, "rendact": $fa-var-rendact, "angellist": $fa-var-angellist, "galactic-republic": $fa-var-galactic-republic, "nfc-directional": $fa-var-nfc-directional, "skype": $fa-var-skype, "joget": $fa-var-joget, "fedora": $fa-var-fedora, "stripe-s": $fa-var-stripe-s, "meta": $fa-var-meta, "laravel": $fa-var-laravel, "hotjar": $fa-var-hotjar, "bluetooth-b": $fa-var-bluetooth-b, "square-letterboxd": $fa-var-square-letterboxd, "sticker-mule": $fa-var-sticker-mule, "creative-commons-zero": $fa-var-creative-commons-zero, "hips": $fa-var-hips, "behance": $fa-var-behance, "reddit": $fa-var-reddit, "discord": $fa-var-discord, "chrome": $fa-var-chrome, "app-store-ios": $fa-var-app-store-ios, "cc-discover": $fa-var-cc-discover, "wpbeginner": $fa-var-wpbeginner, "confluence": $fa-var-confluence, "shoelace": $fa-var-shoelace, "mdb": $fa-var-mdb, "dochub": $fa-var-dochub, "accessible-icon": $fa-var-accessible-icon, "ebay": $fa-var-ebay, "amazon": $fa-var-amazon, "unsplash": $fa-var-unsplash, "yarn": $fa-var-yarn, "square-steam": $fa-var-square-steam, "steam-square": $fa-var-steam-square, "500px": $fa-var-500px, "square-vimeo": $fa-var-square-vimeo, "vimeo-square": $fa-var-vimeo-square, "asymmetrik": $fa-var-asymmetrik, "font-awesome": $fa-var-font-awesome, "font-awesome-flag": $fa-var-font-awesome-flag, "font-awesome-logo-full": $fa-var-font-awesome-logo-full, "gratipay": $fa-var-gratipay, "apple": $fa-var-apple, "hive": $fa-var-hive, "gitkraken": $fa-var-gitkraken, "keybase": $fa-var-keybase, "apple-pay": $fa-var-apple-pay, "padlet": $fa-var-padlet, "amazon-pay": $fa-var-amazon-pay, "square-github": $fa-var-square-github, "github-square": $fa-var-github-square, "stumbleupon": $fa-var-stumbleupon, "fedex": $fa-var-fedex, "phoenix-framework": $fa-var-phoenix-framework, "shopify": $fa-var-shopify, "neos": $fa-var-neos, "square-threads": $fa-var-square-threads, "hackerrank": $fa-var-hackerrank, "researchgate": $fa-var-researchgate, "swift": $fa-var-swift, "angular": $fa-var-angular, "speakap": $fa-var-speakap, "angrycreative": $fa-var-angrycreative, "y-combinator": $fa-var-y-combinator, "empire": $fa-var-empire, "envira": $fa-var-envira, "google-scholar": $fa-var-google-scholar, "square-gitlab": $fa-var-square-gitlab, "gitlab-square": $fa-var-gitlab-square, "studiovinari": $fa-var-studiovinari, "pied-piper": $fa-var-pied-piper, "wordpress": $fa-var-wordpress, "product-hunt": $fa-var-product-hunt, "firefox": $fa-var-firefox, "linode": $fa-var-linode, "goodreads": $fa-var-goodreads, "square-odnoklassniki": $fa-var-square-odnoklassniki, "odnoklassniki-square": $fa-var-odnoklassniki-square, "jsfiddle": $fa-var-jsfiddle, "sith": $fa-var-sith, "themeisle": $fa-var-themeisle, "page4": $fa-var-page4, "hashnode": $fa-var-hashnode, "react": $fa-var-react, "cc-paypal": $fa-var-cc-paypal, "squarespace": $fa-var-squarespace, "cc-stripe": $fa-var-cc-stripe, "creative-commons-share": $fa-var-creative-commons-share, "bitcoin": $fa-var-bitcoin, "keycdn": $fa-var-keycdn, "opera": $fa-var-opera, "itch-io": $fa-var-itch-io, "umbraco": $fa-var-umbraco, "galactic-senate": $fa-var-galactic-senate, "ubuntu": $fa-var-ubuntu, "draft2digital": $fa-var-draft2digital, "stripe": $fa-var-stripe, "houzz": $fa-var-houzz, "gg": $fa-var-gg, "dhl": $fa-var-dhl, "square-pinterest": $fa-var-square-pinterest, "pinterest-square": $fa-var-pinterest-square, "xing": $fa-var-xing, "blackberry": $fa-var-blackberry, "creative-commons-pd": $fa-var-creative-commons-pd, "playstation": $fa-var-playstation, "quinscape": $fa-var-quinscape, "less": $fa-var-less, "blogger-b": $fa-var-blogger-b, "opencart": $fa-var-opencart, "vine": $fa-var-vine, "signal-messenger": $fa-var-signal-messenger, "paypal": $fa-var-paypal, "gitlab": $fa-var-gitlab, "typo3": $fa-var-typo3, "reddit-alien": $fa-var-reddit-alien, "yahoo": $fa-var-yahoo, "dailymotion": $fa-var-dailymotion, "affiliatetheme": $fa-var-affiliatetheme, "pied-piper-pp": $fa-var-pied-piper-pp, "bootstrap": $fa-var-bootstrap, "odnoklassniki": $fa-var-odnoklassniki, "nfc-symbol": $fa-var-nfc-symbol, "mintbit": $fa-var-mintbit, "ethereum": $fa-var-ethereum, "speaker-deck": $fa-var-speaker-deck, "creative-commons-nc-eu": $fa-var-creative-commons-nc-eu, "patreon": $fa-var-patreon, "avianex": $fa-var-avianex, "ello": $fa-var-ello, "gofore": $fa-var-gofore, "bimobject": $fa-var-bimobject, "brave-reverse": $fa-var-brave-reverse, "facebook-f": $fa-var-facebook-f, "square-google-plus": $fa-var-square-google-plus, "google-plus-square": $fa-var-google-plus-square, "web-awesome": $fa-var-web-awesome, "mandalorian": $fa-var-mandalorian, "first-order-alt": $fa-var-first-order-alt, "osi": $fa-var-osi, "google-wallet": $fa-var-google-wallet, "d-and-d-beyond": $fa-var-d-and-d-beyond, "periscope": $fa-var-periscope, "fulcrum": $fa-var-fulcrum, "cloudscale": $fa-var-cloudscale, "forumbee": $fa-var-forumbee, "mizuni": $fa-var-mizuni, "schlix": $fa-var-schlix, "square-xing": $fa-var-square-xing, "xing-square": $fa-var-xing-square, "bandcamp": $fa-var-bandcamp, "wpforms": $fa-var-wpforms, "cloudversify": $fa-var-cloudversify, "usps": $fa-var-usps, "megaport": $fa-var-megaport, "magento": $fa-var-magento, "spotify": $fa-var-spotify, "optin-monster": $fa-var-optin-monster, "fly": $fa-var-fly, "aviato": $fa-var-aviato, "itunes": $fa-var-itunes, "cuttlefish": $fa-var-cuttlefish, "blogger": $fa-var-blogger, "flickr": $fa-var-flickr, "viber": $fa-var-viber, "soundcloud": $fa-var-soundcloud, "digg": $fa-var-digg, "tencent-weibo": $fa-var-tencent-weibo, "letterboxd": $fa-var-letterboxd, "symfony": $fa-var-symfony, "maxcdn": $fa-var-maxcdn, "etsy": $fa-var-etsy, "facebook-messenger": $fa-var-facebook-messenger, "audible": $fa-var-audible, "think-peaks": $fa-var-think-peaks, "bilibili": $fa-var-bilibili, "erlang": $fa-var-erlang, "x-twitter": $fa-var-x-twitter, "cotton-bureau": $fa-var-cotton-bureau, "dashcube": $fa-var-dashcube, "42-group": $fa-var-42-group, "innosoft": $fa-var-innosoft, "stack-exchange": $fa-var-stack-exchange, "elementor": $fa-var-elementor, "square-pied-piper": $fa-var-square-pied-piper, "pied-piper-square": $fa-var-pied-piper-square, "creative-commons-nd": $fa-var-creative-commons-nd, "palfed": $fa-var-palfed, "superpowers": $fa-var-superpowers, "resolving": $fa-var-resolving, "xbox": $fa-var-xbox, "square-web-awesome-stroke": $fa-var-square-web-awesome-stroke, "searchengin": $fa-var-searchengin, "tiktok": $fa-var-tiktok, "square-facebook": $fa-var-square-facebook, "facebook-square": $fa-var-facebook-square, "renren": $fa-var-renren, "linux": $fa-var-linux, "glide": $fa-var-glide, "linkedin": $fa-var-linkedin, "hubspot": $fa-var-hubspot, "deploydog": $fa-var-deploydog, "twitch": $fa-var-twitch, "ravelry": $fa-var-ravelry, "mixer": $fa-var-mixer, "square-lastfm": $fa-var-square-lastfm, "lastfm-square": $fa-var-lastfm-square, "vimeo": $fa-var-vimeo, "mendeley": $fa-var-mendeley, "uniregistry": $fa-var-uniregistry, "figma": $fa-var-figma, "creative-commons-remix": $fa-var-creative-commons-remix, "cc-amazon-pay": $fa-var-cc-amazon-pay, "dropbox": $fa-var-dropbox, "instagram": $fa-var-instagram, "cmplid": $fa-var-cmplid, "upwork": $fa-var-upwork, "facebook": $fa-var-facebook, "gripfire": $fa-var-gripfire, "jedi-order": $fa-var-jedi-order, "uikit": $fa-var-uikit, "fort-awesome-alt": $fa-var-fort-awesome-alt, "phabricator": $fa-var-phabricator, "ussunnah": $fa-var-ussunnah, "earlybirds": $fa-var-earlybirds, "trade-federation": $fa-var-trade-federation, "autoprefixer": $fa-var-autoprefixer, "whatsapp": $fa-var-whatsapp, "square-upwork": $fa-var-square-upwork, "slideshare": $fa-var-slideshare, "google-play": $fa-var-google-play, "viadeo": $fa-var-viadeo, "line": $fa-var-line, "google-drive": $fa-var-google-drive, "servicestack": $fa-var-servicestack, "simplybuilt": $fa-var-simplybuilt, "bitbucket": $fa-var-bitbucket, "imdb": $fa-var-imdb, "deezer": $fa-var-deezer, "raspberry-pi": $fa-var-raspberry-pi, "jira": $fa-var-jira, "docker": $fa-var-docker, "screenpal": $fa-var-screenpal, "bluetooth": $fa-var-bluetooth, "gitter": $fa-var-gitter, "d-and-d": $fa-var-d-and-d, "microblog": $fa-var-microblog, "cc-diners-club": $fa-var-cc-diners-club, "gg-circle": $fa-var-gg-circle, "pied-piper-hat": $fa-var-pied-piper-hat, "kickstarter-k": $fa-var-kickstarter-k, "yandex": $fa-var-yandex, "readme": $fa-var-readme, "html5": $fa-var-html5, "sellsy": $fa-var-sellsy, "square-web-awesome": $fa-var-square-web-awesome, "sass": $fa-var-sass, "wirsindhandwerk": $fa-var-wirsindhandwerk, "wsh": $fa-var-wsh, "buromobelexperte": $fa-var-buromobelexperte, "salesforce": $fa-var-salesforce, "octopus-deploy": $fa-var-octopus-deploy, "medapps": $fa-var-medapps, "ns8": $fa-var-ns8, "pinterest-p": $fa-var-pinterest-p, "apper": $fa-var-apper, "fort-awesome": $fa-var-fort-awesome, "waze": $fa-var-waze, "bluesky": $fa-var-bluesky, "cc-jcb": $fa-var-cc-jcb, "snapchat": $fa-var-snapchat, "snapchat-ghost": $fa-var-snapchat-ghost, "fantasy-flight-games": $fa-var-fantasy-flight-games, "rust": $fa-var-rust, "wix": $fa-var-wix, "square-behance": $fa-var-square-behance, "behance-square": $fa-var-behance-square, "supple": $fa-var-supple, "webflow": $fa-var-webflow, "rebel": $fa-var-rebel, "css3": $fa-var-css3, "staylinked": $fa-var-staylinked, "kaggle": $fa-var-kaggle, "space-awesome": $fa-var-space-awesome, "deviantart": $fa-var-deviantart, "cpanel": $fa-var-cpanel, "goodreads-g": $fa-var-goodreads-g, "square-git": $fa-var-square-git, "git-square": $fa-var-git-square, "square-tumblr": $fa-var-square-tumblr, "tumblr-square": $fa-var-tumblr-square, "trello": $fa-var-trello, "creative-commons-nc-jp": $fa-var-creative-commons-nc-jp, "get-pocket": $fa-var-get-pocket, "perbyte": $fa-var-perbyte, "grunt": $fa-var-grunt, "weebly": $fa-var-weebly, "connectdevelop": $fa-var-connectdevelop, "leanpub": $fa-var-leanpub, "black-tie": $fa-var-black-tie, "themeco": $fa-var-themeco, "python": $fa-var-python, "android": $fa-var-android, "bots": $fa-var-bots, "free-code-camp": $fa-var-free-code-camp, "hornbill": $fa-var-hornbill, "js": $fa-var-js, "ideal": $fa-var-ideal, "git": $fa-var-git, "dev": $fa-var-dev, "sketch": $fa-var-sketch, "yandex-international": $fa-var-yandex-international, "cc-amex": $fa-var-cc-amex, "uber": $fa-var-uber, "github": $fa-var-github, "php": $fa-var-php, "alipay": $fa-var-alipay, "youtube": $fa-var-youtube, "skyatlas": $fa-var-skyatlas, "firefox-browser": $fa-var-firefox-browser, "replyd": $fa-var-replyd, "suse": $fa-var-suse, "jenkins": $fa-var-jenkins, "twitter": $fa-var-twitter, "rockrms": $fa-var-rockrms, "pinterest": $fa-var-pinterest, "buffer": $fa-var-buffer, "npm": $fa-var-npm, "yammer": $fa-var-yammer, "btc": $fa-var-btc, "dribbble": $fa-var-dribbble, "stumbleupon-circle": $fa-var-stumbleupon-circle, "internet-explorer": $fa-var-internet-explorer, "stubber": $fa-var-stubber, "telegram": $fa-var-telegram, "telegram-plane": $fa-var-telegram-plane, "old-republic": $fa-var-old-republic, "odysee": $fa-var-odysee, "square-whatsapp": $fa-var-square-whatsapp, "whatsapp-square": $fa-var-whatsapp-square, "node-js": $fa-var-node-js, "edge-legacy": $fa-var-edge-legacy, "slack": $fa-var-slack, "slack-hash": $fa-var-slack-hash, "medrt": $fa-var-medrt, "usb": $fa-var-usb, "tumblr": $fa-var-tumblr, "vaadin": $fa-var-vaadin, "quora": $fa-var-quora, "square-x-twitter": $fa-var-square-x-twitter, "reacteurope": $fa-var-reacteurope, "medium": $fa-var-medium, "medium-m": $fa-var-medium-m, "amilia": $fa-var-amilia, "mixcloud": $fa-var-mixcloud, "flipboard": $fa-var-flipboard, "viacoin": $fa-var-viacoin, "critical-role": $fa-var-critical-role, "sitrox": $fa-var-sitrox, "discourse": $fa-var-discourse, "joomla": $fa-var-joomla, "mastodon": $fa-var-mastodon, "airbnb": $fa-var-airbnb, "wolf-pack-battalion": $fa-var-wolf-pack-battalion, "buy-n-large": $fa-var-buy-n-large, "gulp": $fa-var-gulp, "creative-commons-sampling-plus": $fa-var-creative-commons-sampling-plus, "strava": $fa-var-strava, "ember": $fa-var-ember, "canadian-maple-leaf": $fa-var-canadian-maple-leaf, "teamspeak": $fa-var-teamspeak, "pushed": $fa-var-pushed, "wordpress-simple": $fa-var-wordpress-simple, "nutritionix": $fa-var-nutritionix, "wodu": $fa-var-wodu, "google-pay": $fa-var-google-pay, "intercom": $fa-var-intercom, "zhihu": $fa-var-zhihu, "korvue": $fa-var-korvue, "pix": $fa-var-pix, "steam-symbol": $fa-var-steam-symbol, ); ================================================ FILE: _sass/vendor/font-awesome/brands.scss ================================================ /*! * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2024 Fonticons, Inc. */ @import 'functions'; @import 'variables'; :root, :host { --#{$fa-css-prefix}-style-family-brands: 'Font Awesome 6 Brands'; --#{$fa-css-prefix}-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } @font-face { font-family: 'Font Awesome 6 Brands'; font-style: normal; font-weight: 400; font-display: $fa-font-display; src: url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'), url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'); } .fab, .#{$fa-css-prefix}-brands { font-weight: 400; } @each $name, $icon in $fa-brand-icons { .#{$fa-css-prefix}-#{$name}:before { content: unquote("\"#{ $icon }\""); } } ================================================ FILE: _sass/vendor/font-awesome/fontawesome.scss ================================================ /*! * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2024 Fonticons, Inc. */ // Font Awesome core compile (Web Fonts-based) // ------------------------- @import 'functions'; @import 'variables'; @import 'mixins'; @import 'core'; @import 'sizing'; @import 'fixed-width'; @import 'list'; @import 'bordered-pulled'; @import 'animated'; @import 'rotated-flipped'; @import 'stacked'; @import 'icons'; @import 'screen-reader'; ================================================ FILE: _sass/vendor/font-awesome/regular.scss ================================================ /*! * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2024 Fonticons, Inc. */ @import 'functions'; @import 'variables'; :root, :host { --#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }'; --#{$fa-css-prefix}-font-regular: normal 400 1em/1 '#{ $fa-style-family }'; } @font-face { font-family: 'Font Awesome 6 Free'; font-style: normal; font-weight: 400; font-display: $fa-font-display; src: url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'), url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'); } .far, .#{$fa-css-prefix}-regular { font-weight: 400; } ================================================ FILE: _sass/vendor/font-awesome/solid.scss ================================================ /*! * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2024 Fonticons, Inc. */ @import 'functions'; @import 'variables'; :root, :host { --#{$fa-css-prefix}-style-family-classic: '#{ $fa-style-family }'; --#{$fa-css-prefix}-font-solid: normal 900 1em/1 '#{ $fa-style-family }'; } @font-face { font-family: 'Font Awesome 6 Free'; font-style: normal; font-weight: 900; font-display: $fa-font-display; src: url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'), url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'); } .fas, .#{$fa-css-prefix}-solid { font-weight: 900; } ================================================ FILE: _sass/vendor/font-awesome/v4-shims.scss ================================================ /*! * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2024 Fonticons, Inc. */ // V4 shims compile (Web Fonts-based) // ------------------------- @import 'functions'; @import 'variables'; @import 'shims'; ================================================ FILE: _sass/vendor/susy/_su.scss ================================================ // Su // == @import 'susy/su'; ================================================ FILE: _sass/vendor/susy/_susy.scss ================================================ // Susy // ==== @import 'susy/language/susy'; ================================================ FILE: _sass/vendor/susy/_susyone.scss ================================================ // Susy // ==== @import 'susy/language/susyone'; ================================================ FILE: _sass/vendor/susy/susy/_su.scss ================================================ // Su // == @import "su/utilities"; @import "su/settings"; @import "su/validation"; @import "su/grid"; ================================================ FILE: _sass/vendor/susy/susy/language/_susy.scss ================================================ // Susy Next Syntax // ================ $susy-version: 2.1; @import "../su"; @import "../output/float"; @import "susy/settings"; @import "susy/validation"; @import "susy/grids"; @import "susy/box-sizing"; @import "susy/context"; @import "susy/background"; @import "susy/container"; @import "susy/span"; @import "susy/gutters"; @import "susy/isolate"; @import "susy/gallery"; @import "susy/rows"; @import "susy/margins"; @import "susy/padding"; @import "susy/bleed"; @import "susy/breakpoint-plugin"; ================================================ FILE: _sass/vendor/susy/susy/language/_susyone.scss ================================================ // --------------------------------------------------------------------------- // Partials $susy-version: 1.5; @import "susyone/settings"; @import "susyone/functions"; @import "susyone/grid"; @import "susyone/isolation"; @import "susyone/padding"; @import "susyone/margin"; @import "susyone/media"; @import "susyone/background"; ================================================ FILE: _sass/vendor/susy/susy/language/susy/_background.scss ================================================ // Background Grid Syntax // ====================== $susy-overlay-grid-head-exists: false; // Show Grid/s // ----------- // Show grid on any element using either background or overlay. // - [$grid] : @mixin show-grid( $grid: $susy ) { $inspect: $grid; $_output: debug-get(output, $grid); @include susy-inspect(show-grid, $inspect); @if $_output == overlay and susy-get(debug image, $grid) != hide { @include overlay-grid($grid); } @else { @include background-grid($grid); } } @mixin show-grids( $grid: $susy ) { @include show-grid($grid); } // Background Grid // --------------- // Show a grid background on any element. // - [$grid] : @mixin background-grid( $grid: $susy ) { $inspect : $grid; $_output : get-background($grid); @if length($_output) > 0 { $_flow: susy-get(flow, $grid); $_image: (); @each $name, $layer in map-get($_output, image) { $_direction: if($name == baseline, to bottom, to to($_flow)); $_image: append($_image, linear-gradient($_direction, $layer), comma); } $_output: map-merge($_output, (image: $_image)); @include background-grid-output($_output...); @include susy-inspect(background-grid, $inspect); } } // Overlay Grid // ------------ // Generate an icon to trigger grid-overlays on any given elements. // $grids... : [] [, ]* @mixin overlay-grid ( $grid: $susy ) { @if not($susy-overlay-grid-head-exists) { @at-root head { @include overlay-head($grid); } @at-root head:before { @include overlay-trigger; } @at-root head:hover { @include overlay-trigger-hover; } $susy-overlay-grid-head-exists: true !global; } head:hover ~ &, head:hover ~ body & { position: relative; &:before { @include grid-overlay-base; @include background-grid($grid); } } } // [Private] Overlay Trigger // ------------------------- @mixin overlay-trigger { content: "|||"; display: block; padding: 5px 10px; font: { family: sans-serif; size: 16px; weight: bold; } } // [Private] Overlay Trigger Hover // ------------------------------- @mixin overlay-trigger-hover { background: rgba(white, .5); color: red; } // [Private] Overlay Head // ---------------------- // styles to create grid overlay toggle @mixin overlay-head ( $grid: $susy ) { $_toggle: debug-get(toggle, $grid); $_horz: null; $_vert: null; @each $side in $_toggle { $_horz: if($side == left or $side == right, $side, $_horz); $_vert: if($side == top or $side == bottom, $side, $_vert); } display: block; position: fixed; #{$_horz}: 10px; #{$_vert}: 10px; z-index: 999; color: #333; background: rgba(white, .25); } // [Private] Grid Overlay Base // --------------------------- // Base styles for generating a grid overlay @mixin grid-overlay-base() { position: absolute; top: 0; left: 0; bottom: 0; right: 0; content: " "; z-index: 998; } // Get Symmetrical Background // -------------------------- // - $grid: @function get-background-sym( $grid ) { $grid : parse-grid($grid); $_gutters : susy-get(gutters, $grid); $_column-width : susy-get(column-width, $grid); $_math : susy-get(math, $grid); $_color : debug-get(color); $_trans : transparent; $_light : lighten($_color, 15%); $_end : 1 + $_gutters; $_after : percentage(1/$_end); $_stops : (); $_size : span(1 $grid wide); @if is-inside($grid) { $_stops: $_color, $_light; } @else if is-split($grid) { $_split: $_gutters/2; $_before: percentage($_split/$_end); $_after: percentage((1 + $_split)/$_end); $_stops: $_trans $_before, $_color $_before, $_light $_after, $_trans $_after; } @else { $_stops: $_color, $_light $_after, $_trans $_after; } @if $_math == static { $_size: valid-column-math($_math, $_column-width) * $_end; } $_output: ( image: (columns: $_stops), size: $_size, ); @return $_output; } // Get Asymmetrical Inside // ----------------------- // - $grid: @function get-asym-inside( $grid ) { $grid : parse-grid($grid); $_columns : susy-get(columns, $grid); $_color : debug-get(color); $_light : lighten($_color, 15%); $_stops : (); @for $location from 1 through susy-count($_columns) { $this-stop: (); @if $location == 1 { $this-stop: append($this-stop, $_color, comma); } @else { $start: parse-span(1 at $location $grid); $start: get-isolation($start); $this-stop: append($this-stop, $_color $start, comma); } @if $location == susy-count($_columns) { $this-stop: append($this-stop, $_light, comma); } @else { $_end: parse-span(1 at ($location + 1) $grid); $_end: get-isolation($_end); $this-stop: append($this-stop, $_light $_end, comma); } $_stops: join($_stops, $this-stop, comma); } @return $_stops; } // Get Asymmetrical Split // ---------------------- // - $grid: @function get-asym-split( $grid ) { $grid : parse-grid($grid); $_columns : susy-get(columns, $grid); $_color : debug-get(color); $_light : lighten($_color, 15%); $_stops : (); @for $location from 1 through susy-count($_columns) { $this-stop: (); $start: parse-span(1 at $location $grid); $start: get-isolation($start); $this-stop: append($this-stop, transparent $start, comma); $this-stop: append($this-stop, $_color $start, comma); $_end: $start + span(1 at $location $grid); $this-stop: append($this-stop, $_light $_end, comma); $this-stop: append($this-stop, transparent $_end, comma); $_stops: join($_stops, $this-stop, comma); } @return $_stops; } // Get Asymmetrical Outside // ------------------------ // - $grid: @function get-asym-outside( $grid ) { $grid : parse-grid($grid); $_columns : susy-get(columns, $grid); $_color : debug-get(color); $_light : lighten($_color, 15%); $_trans : transparent; $_stops : (); @for $location from 1 through susy-count($_columns) { $this-stop: (); @if $location == 1 { $this-stop: append($this-stop, $_color, comma); } @else { $start: parse-span(1 at $location $grid); $start: get-isolation($start); $this-stop: append($this-stop, $_color $start, comma); } @if $location == susy-count($_columns) { $this-stop: append($this-stop, $_light, comma); } @else { $gutter: get-span-width(first $location $grid); $_end: parse-span(1 at ($location + 1) $grid); $_end: get-isolation($_end); $gutter: $_light $gutter, $_trans $gutter, $_trans $_end; $this-stop: join($this-stop, $gutter, comma); } $_stops: join($_stops, $this-stop, comma); } @return $_stops; } // Get Asymmetrical Background // --------------------------- // - $grid: @function get-background-asym( $grid ) { $_stops: (); @if is-inside($grid) { $_stops: get-asym-inside($grid); } @else if is-split($grid) { $_stops: get-asym-split($grid); } @else { $_stops: get-asym-outside($grid); } @return (image: (columns: $_stops)); } // Get Background // -------------- // - $grid: @function get-background( $grid ) { $grid : parse-grid($grid); $_show : susy-get(debug image, $grid); $_return : (); @if $_show and $_show != 'hide' { $_columns: susy-get(columns, $grid); @if $_show != 'show-baseline' { $_sym: is-symmetrical($_columns); $_return: if($_sym, get-background-sym($grid), get-background-asym($grid)); $_return: map-merge($_return, (clip: content-box)); } @if $_show != 'show-columns' and global-variable-exists(base-line-height) and type-of($base-line-height) == 'number' and not unitless($base-line-height) { $_color: variable-exists('grid-background-baseline-color'); $_color: if($_color, $grid-background-baseline-color, #000); $_image: map-get($_return, image); $_size: map-get($_return, size); $_baseline: (baseline: ($_color 1px, transparent 1px)); $_baseline-size: 100% $base-line-height; $_return: map-merge($_return, ( image: if($_image, map-merge($_image, $_baseline), $_baseline), size: if($_size, ($_size, $_baseline-size), $_baseline-size), )); @if $_show == 'show' { $_clip: map-get($_return, clip); $_return: map-merge($_return, (clip: join($_clip, border-box, comma))); } } @else if $_show == 'show-baseline' { @warn 'Please provide a $base-line-height with the desired height and units'; } } @if map-get($_return, image) { $_return: map-merge($_return, (flow: susy-get(flow, $grid))); } @return $_return; } // Get Debug // --------- // Return the value of a debug setting // - $key: @function debug-get( $key, $grid: $susy ) { $key: join(debug, $key, space); @return susy-get($key, $grid); } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_bleed.scss ================================================ // Bleed Syntax // ============ // Bleed // ----- // Add negative margins, and equal positive padding to create bleed. // - $bleed : @mixin bleed( $bleed: 0 gutter() ) { $inspect : $bleed; $output : get-bleed($bleed); @if susy-get(global-box-sizing) != content-box { $output: map-merge((box-sizing: content-box), $output); } @include susy-inspect(bleed, $inspect); @include output($output); } // Bleed-x // ------- // Shortcut for horizontal bleed. // - $bleed : @mixin bleed-x( $bleed: gutter() ) { $bleed : parse-span($bleed); $trbl : susy-get(span, $bleed); @if length($trbl) == 1 { $bleed: map-merge($bleed, (span: 0 nth($trbl, 1))); } @else if length($trbl) == 2 { $bleed: map-merge($bleed, (span: 0 nth($trbl, 2) 0 nth($trbl, 1))); } @else { @warn 'bleed-x only takes 2 lengths, but #{length($trbl)} were passed.'; } @include bleed($bleed); } // Bleed-y // ------- // Shortcut for vertical bleed. // - $bleed : @mixin bleed-y( $bleed: if(function-exists(rhythm), rhythm(1), 1em) ) { $bleed : parse-span($bleed); $trbl : susy-get(span, $bleed); @if length($trbl) == 1 { $bleed: map-merge($bleed, (span: nth($trbl, 1) 0)); } @else if length($trbl) == 2 { $bleed: map-merge($bleed, (span: nth($trbl, 1) 0 nth($trbl, 2) 0)); } @else { @warn 'bleed-y only takes 2 lengths, but #{length($trbl)} were passed.'; } @include bleed($bleed); } // Get Bleed // --------- // Return bleed output values // - $bleed: @function get-bleed( $bleed ) { $bleed : map-merge((spread: wide), parse-span($bleed)); $trbl : susy-get(span, $bleed); $short : null; $output : (); @for $i from 1 through length($trbl) { $this: nth($trbl, $i); $new: (); $margin: null; $padding: null; $padding-x: null; @if $this > 0 { $this: map-merge($bleed, (span: $this)); $margin: span($this); $padding: $margin; $padding-x: $padding; } @if $margin and $margin > 0 { $margin: - $margin; @if is-inside($this) { $gutter: gutter($this); $join: if($gutter and comparable($padding, $gutter), true, false); $padding-x: if($join and $padding > 0, $padding + $gutter, $padding); } } @if $i == 1 { $new: ( margin-top: $margin, padding-top: $padding, margin-right: $margin, padding-right: $padding-x, margin-bottom: $margin, padding-bottom: $padding, margin-left: $margin, padding-left: $padding-x, ); } @else if $i == 2 { $new: ( margin-right: $margin, padding-right: $padding-x, margin-left: $margin, padding-left: $padding-x, ); } @else if $i == 3 { $new: ( margin-bottom: $margin, padding-bottom: $padding, ); } @else if $i == 4 { $new: ( margin-left: $margin, padding-left: $padding-x, ); } $output: map-merge($output, $new); } @each $prop, $value in $output { $output: if($value == 0, map-merge($output, ($prop: null)), $output); } @return bleed-shorthand($output); } // Bleed Shorthand // --------------- // Convert bleed output into shorthand when possible. // - $bleed: @function bleed-shorthand( $bleed ) { $margin: (); $padding: (); $return: (); @each $key, $value in $bleed { @if str-index($key, margin) { $margin: map-merge($margin, ($key: $value)); } @else if str-index($key, padding) > 0 { $padding: map-merge($padding, ($key: $value)); } } $props: ( margin: $margin, padding: $padding, ); @each $name, $map in $props { $four: if(length(map-keys($map)) == 4, true, false); $null: if(index(map-values($map), null), true, false); @if $four and not($null) { $top: map-get($map, '#{$name}-top'); $right: map-get($map, '#{$name}-right'); $bottom: map-get($map, '#{$name}-bottom'); $left: map-get($map, '#{$name}-left'); $tb: if($top == $bottom, $top, null); $rl: if($right == $left, $right, null); $all: if($tb == $rl, $tb, null); $new: if($all, $all, null); @if not($new) { @if $tb and $rl { $new: $tb $rl; } @else if $rl { $new: $top $rl $bottom; } @else { $new: $top $right $bottom $left; } } $return: map-merge($return, ($name: $new)); } @else { $return: map-merge($return, $map); } } @return $return; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_box-sizing.scss ================================================ // Susy Box Sizing // ================= // Global Box Sizing // ----------------- // Set a box model globally on all elements. // - [$box]: border-box | content-box // - [$inherit]: true | false @mixin global-box-sizing( $box: susy-get(global-box-sizing), $inherit: false ) { $inspect: $box; @if $inherit { @at-root { html { @include output((box-sizing: $box)); } *, *:before, *:after { box-sizing: inherit; } } } @else { *, *:before, *:after { @include output((box-sizing: $box)); } } @include susy-inspect(global-box-sizing, $inspect); @include update-box-model($box); } // Border Box Sizing // ----------------- // A legacy shortcut... // - [$inherit]: true | false @mixin border-box-sizing( $inherit: false ) { @include global-box-sizing(border-box, $inherit); } // Update Box Model // ---------------- // PRIVATE: Updates global box model setting @mixin update-box-model( $box ) { @if $box != susy-get(global-box-sizing) { @include susy-set(global-box-sizing, $box); } } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_breakpoint-plugin.scss ================================================ // Breakpoint Integration // ====================== $susy-media: () !default; $susy-media-fallback: false !default; $_susy-media-context: (); // Susy Breakpoint // --------------- // Change grids at different media query breakpoints. // - $query : [] | | // - $layout : // - $no-query : | @mixin susy-breakpoint( $query, $layout: false, $no-query: $susy-media-fallback ) { @include susy-media-router($query, $no-query) { @if $layout { @include with-layout($layout) { @content; } } @else { @content; } } } // Susy Media // ---------- // - $query: [] | // - $no-query: | @mixin susy-media( $query, $no-query: $susy-media-fallback ) { $old-context: $_susy-media-context; $name: if(map-has-key($susy-media, $query), $query, null); $query: susy-get-media($query); $query: susy-parse-media($query); @include susy-media-context($query, $name); @if $no-query and type-of($no-query) != string { @content; } @else { @media #{susy-render-media($query)} { @content; } @if type-of($no-query) == string { #{$no-query} & { @content; } } } @include susy-media-context($old-context, $clean: true); } // Media Router // ------------ // Rout media arguments to the correct mixin. @mixin susy-media-router( $query, $no-query: $susy-media-fallback ) { @if susy-support(breakpoint, (mixin: breakpoint), $warn: false) { @include breakpoint($query, $no-query) { @content; } } @else { @include susy-media($query, $no-query) { @content; } } } // Update Context // ------------- // Set the new media context @mixin susy-media-context( $query, $name: null, $clean: false ) { $query: map-merge((name: $name), $query); @if $clean { $_susy-media-context: $query !global; } @else { $_susy-media-context: map-merge($_susy-media-context, $query) !global; } } // Media Context // ------------- // Return the full media context, or a single media property (e.g. min-width) @function susy-media-context( $property: false ) { @if $property { @return map-get($_susy-media-context, $property); } @else { @return $_susy-media-context; } } // Get Media // --------- // Return a named media-query from $susy-media. // - $name: @function susy-get-media( $name ) { @if map-has-key($susy-media, $name) { $map-value: map-get($susy-media, $name); @if ($name == $map-value) { $name: $map-value; } @else { $name: susy-get-media($map-value); } } @return $name; } // Render Media // ------------ // Build a media-query string from various media settings @function susy-render-media( $query ) { $output: null; @each $property, $value in $query { $string: null; @if $property == media { $string: $value; } @else { $string: '(#{$property}: #{$value})'; } $output: if($output, '#{$output} and #{$string}', $string); } @return $output; } // Parse Media // ----------- // Return parsed media-query settings based on shorthand @function susy-parse-media( $query ) { $mq: null; @if type-of($query) == map { $mq: $query; } @else if type-of($query) == number { $mq: (min-width: $query); } @else if type-of($query) == list and length($query) == 2 { @if type-of(nth($query, 1)) == number { $mq: ( min-width: min($query...), max-width: max($query...), ); } @else { $mq: (nth($query, 1): nth($query, 2)); } } @else { $mq: (media: '#{$query}'); } @return $mq; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_container.scss ================================================ // Container Syntax // ================ // Container [mixin] // ----------------- // Set a container element // - [$layout] : @mixin container( $layout: $susy ) { $inspect : $layout; $layout : parse-grid($layout); $_width : get-container-width($layout); $_justify : parse-container-position(susy-get(container-position, $layout)); $_property : if(susy-get(math, $layout) == static, width, max-width); $_box : susy-get(box-sizing, $layout); @if $_box { @include output((box-sizing: $_box)); } @include susy-inspect(container, $inspect); @include float-container($_width, $_justify, $_property); @include show-grid($layout); } // Container [function] // -------------------- // Return container width // - [$layout] : @function container( $layout: $susy ) { $layout: parse-grid($layout); @return get-container-width($layout); } // Get Container Width // ------------------- // Calculate the container width // - [$layout]: @function get-container-width( $layout: $susy ) { $layout : parse-grid($layout); $_width : susy-get(container, $layout); $_column-width : susy-get(column-width, $layout); $_math : susy-get(math, $layout); @if not($_width) or $_width == auto { @if valid-column-math($_math, $_column-width) { $_columns : susy-get(columns, $layout); $_gutters : susy-get(gutters, $layout); $_spread : if(is-split($layout), wide, narrow); $_width : susy-sum($_columns, $_gutters, $_spread) * $_column-width; } @else { $_width: 100%; } } @return $_width; } // Parse Container Position // ------------------------ // Parse the $container-position into margin values. // - [$justify] : left | center | right | [] @function parse-container-position( $justify: map-get($susy-defaults, container-position) ) { $_return: if($justify == left, 0, auto) if($justify == right, 0, auto); @if not(index(left right center, $justify)) { $_return: nth($justify, 1); $_return: $_return if(length($justify) > 1, nth($justify, 2), $_return); } @return $_return; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_context.scss ================================================ // Context Syntax // ============== // Nested [function] // ----------------- // Return a subset grid for nested context. // - $context : @function nested( $context ) { $context : parse-span($context); $span : susy-get(span, $context); $location : get-location($context); $columns : susy-get(columns, $context); @return susy-slice($span, $location, $columns); } // Nested [mixin] // -------------- // Use a subset grid for a nested context // - $context : // - @content : @mixin nested( $context ) { $inspect : $context; $context : parse-span($context); $old : susy-get(columns); $susy : map-merge($susy, (columns: nested($context))) !global; @include susy-inspect(nested, $inspect); @content; $susy : map-merge($susy, (columns: $old)) !global; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_gallery.scss ================================================ // Gallery Syntax // ============== // Gallery // ------- // Create an isolated gallery // - $span : // - [$selector] : child | of-type @mixin gallery( $span, $selector: child ) { $inspect : $span; $span : parse-span($span); $span : map-merge($span, (location: 1)); $n : susy-get(span, $span); $columns : susy-get(columns, $span); $context : susy-count($columns); $flow : susy-get(flow, $span); $inside : is-inside($span); $from : from($flow); $line : floor($context / $n); $symmetrical : is-symmetrical($columns); $output: ( width : null, float : from, margin-before : null, margin-after : null, padding-before : null, padding-after : null, flow : $flow, ); @if $inside { $gutters: get-gutters($span); $output: map-merge($output, ( padding-before: map-get($gutters, before), padding-after: map-get($gutters, after), )); } @if $symmetrical { $output: map-merge($output, (width: get-span-width($span))); } $box : susy-get(box-sizing, $span); $global-box : if(susy-get(global-box-sizing) == 'border-box', true, false); @include susy-inspect(gallery, $inspect); // Collective Output @if $box == border-box or ($inside and not($box) and not($global-box)) { @include output((box-sizing: border-box)); } @else if $box == content-box { @include output((box-sizing: content-box)); } @include float-span-output($output...); // Individual Loop @for $item from 1 through $line { $nth: '#{$line}n + #{$item}'; &:nth-#{$selector}(#{$nth}) { // Individual Prep $output: ( width : if($symmetrical, null, get-span-width($span)), float : null, margin-before : get-isolation($span), margin-after : -100%, padding-before : null, padding-after : null, flow : $flow, ); // Individual Output @include float-span-output($output...); @if get-edge($span) == first { @include break; @include first($span); } @else { @include nobreak; } // Individual Location Increment $location: get-location($span) + $n; $location: if($location > $context, 1, $location); $span: map-merge($span, (location: $location)); } } } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_grids.scss ================================================ // Grid Syntax // =========== // Layout // ------ // Set a new layout using a shorthand // - $layout: // - $clean: boolean @mixin layout( $layout, $clean: false ) { $inspect : $layout; $susy : _get-layout($layout, $clean) !global; @include susy-inspect(layout, $inspect); } // Use Grid // -------- // Use an arbitrary layout for a section of code // - $layout: // - $clean: boolean @mixin with-layout( $layout, $clean: false ) { $inspect : $layout; $old : $susy; $susy : _get-layout($layout, $clean) !global; @include susy-inspect(with-layout, $inspect); @content; $susy: $old !global; } // Layout // ------ // Return a parsed layout map based on shorthand syntax // - $layout: @function layout( $layout: $susy ) { @return parse-grid($layout); } // Get Layout // ---------- // Return a new layout based on current and given settings // - $layout: // - $clean: boolean @function _get-layout( $layout, $clean: false ) { $layout: layout($layout); @return if($clean, $layout, _susy-deep-merge($susy, $layout)); } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_gutters.scss ================================================ // Gutter Syntax // ============= // Gutters // ------- // Set gutters on an element. // - [$span] : @mixin gutters( $span: $susy ) { $inspect : $span; $span : parse-gutters($span); $_gutters : get-gutters($span); $_output: ( before: map-get($_gutters, before), after: map-get($_gutters, after), flow: susy-get(flow, $span), ); @include susy-inspect(gutters, $inspect); @if is-inside($span) { @include padding-output($_output...); } @else { @include margin-output($_output...); } } @mixin gutter( $span: $susy ) { @include gutters($span); } // Gutter // ------ // Return the width of a gutter. // - [$span] : @function gutter( $span: $susy ) { $span: parse-gutters($span); $_gutters: get-gutters($span); $_gutters: map-get($_gutters, before) or map-get($_gutters, after); @return $_gutters; } @function gutters( $span: $susy ) { @return gutter($span); } // Get Gutter Width // ---------------- // Return gutter width. // - [$context]: @function get-gutter-width( $context: $susy ) { $context : parse-gutters($context); $_gutters : susy-get(gutters, $context); $_gutter : susy-get(gutter-override, $context); @if $_gutters and ($_gutters > 0) and not($_gutter) { $_column-width: susy-get(column-width, $context); $_math: gutter-math($context); @if $_math == static { $_gutter: $_gutters * valid-column-math($_math, $_column-width); } @else { $_columns : susy-get(columns, $context); $_spread : if(is-split($context), wide, susy-get(spread, $context)); $_gutter : percentage($_gutters / susy-sum($_columns, $_gutters, $_spread)); } } $_gutter: if($_gutter == 'no-gutters' or $_gutter == 'no-gutter', null, $_gutter); @return $_gutter; } // Get Gutters // ----------- // Return before and after gutter values. // - [$context]: @function get-gutters( $context: $susy ) { $context : parse-gutters($context); $_gutter-position : susy-get(gutter-position, $context); $_gutter : get-gutter-width($context); $_return : (before: null, after: null); @if is-split($context) and $_gutter { $_gutter: $_gutter / 2; $_return: map-merge($_return, (before: $_gutter, after: $_gutter)); } @else { $_return: map-merge($_return, ($_gutter-position: $_gutter)); } @return $_return; } // Is Inside // --------- // Returns true if gutters are inside. // $context: @function is-inside( $context ) { $_inside: inside inside-static; $_gutter-position: susy-get(gutter-position, $context); @return if(index($_inside, $_gutter-position), true, false); } // Is Split // -------- // Returns true if gutters are split. // $context: @function is-split( $context ) { $_split: split inside inside-static; $_gutter-position: susy-get(gutter-position, $context); @return if(index($_split, $_gutter-position), true, false); } // Gutter Math // ----------- // Return the math to use for gutter calculations // $context: @function gutter-math( $context: $susy ) { $_return : susy-get(math, $context); $_return : if(susy-get(gutter-position, $context) == inside-static, static, $_return); @return $_return; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_isolate.scss ================================================ // Isolation Syntax // ================ // Isolate [Mixin] // --------------- // Set isolation as an override. // - $location: @mixin isolate( $isolate: 1 ) { $inspect: $isolate; $output: ( push: isolate($isolate), flow: susy-get(flow, $isolate), ); @include susy-inspect(isolate, $inspect); @include isolate-output($output...); } // Isolate [function] // ------------------ // Return an isolation offset width. // - $location: @function isolate( $isolate: 1 ) { $isolate: parse-span($isolate); $isolation: susy-get(span, $isolate); @if $isolation and not(get-location($isolate)) { $new: ( span: null, location: $isolation, ); $isolate: map-merge($isolate, $new); } @return get-isolation($isolate); } // Get Isolation // ------------- // Return the isolation offset width // - $input: @function get-isolation( $input ) { $location : get-location($input); $columns : susy-get(columns, $input); $width : null; @if type-of($location) == number and not(unitless($location)) { $width: $location; } @else if $location { $push: $location - 1; @if $push > 0 { $push: map-merge($input, ( span: $push, location: 1, spread: wide, )); $width: get-span-width($push); } } @if susy-get(gutter-position, $input) == split and susy-get(gutters, $input) > 0 { $width: if($width == null, gutters($input), $width + gutters($input)); } @return $width or 0; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_margins.scss ================================================ // Margin Syntax // ============= // Pre // --- // Add spanning-margins before an element. // - $span : @mixin pre( $span ) { $inspect: $span; $span : map-merge((spread: wide), parse-span($span)); $flow : susy-get(flow, $span); $split : if(susy-get(gutter-position, $span) == split, true, false); $gutter : gutter($span); $span : span($span); $width : if($split and $gutter, $span + $gutter, $span); @include susy-inspect(pre, $inspect); @include margin-output($width, null, $flow); } // Post // ---- // Add spanning-margins after an element. // - $span : @mixin post( $span ) { $inspect : $span; $span : map-merge((spread: wide), parse-span($span)); $flow : susy-get(flow, $span); $split : if(susy-get(gutter-position, $span) == split, true, false); $width : if($split, span($span) + gutter($span), span($span)); @include susy-inspect(post, $inspect); @include margin-output(null, $width, $flow); } // Push // ---- // Simple synonymn for pre. // - $span : @mixin push( $span ) { @include pre($span); } // Pull // ---- // Add negative spanning-margins before an element. // - $span : @mixin pull( $span ) { $inspect : $span; $span : map-merge((spread: wide), parse-span($span)); $flow : susy-get(flow, $span); $split : if(susy-get(gutter-position, $span) == split, true, false); $width : if($split, 0 - span($span) + gutter($span), 0 - span($span)); @include susy-inspect(pull, $inspect); @include margin-output($width, null, $flow); } // Squish // ------ // Add spanning-margins before and after an element. // - $pre : // - [$post] : @mixin squish( $pre, $post: false ) { $inspect : ($pre, $post); $pre : map-merge((spread: wide), parse-span($pre)); @if $post { $post: map-merge((spread: wide), parse-span($post)); } @else { $span: susy-get(span, $pre); @if length($span) > 1 { $pre: map-merge($pre, (span: nth($span, 1))); $post: map-merge($pre, (span: nth($span, 2))); } @else { $post: $pre; } } @include susy-inspect(squish, $inspect); @include pre($pre); @include post($post); } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_padding.scss ================================================ // Padding Syntax // ============== // Prefix // ------ // Add spanning-padding before an element. // - $span : @mixin prefix( $span ) { $inspect : $span; $span : map-merge((spread: wide), parse-span($span)); $flow : susy-get(flow, $span); $width : span($span); @if is-inside($span) { $gutter: gutter($span); $width: if($gutter and comparable($width, $gutter), $width + $gutter, $width); } @include susy-inspect(prefix, $inspect); @include padding-output($width, null, $flow); } // Suffix // ------ // Add spanning-padding after an element. // - $span : @mixin suffix( $span ) { $inspect : $span; $span : map-merge((spread: wide), parse-span($span)); $flow : susy-get(flow, $span); $width : span($span); @if is-inside($span) { $gutter: gutter($span); $width: if($gutter and comparable($width, $gutter), $width + $gutter, $width); } @include susy-inspect(suffix, $inspect); @include padding-output(null, $width, $flow); } // Pad // --- // Add spanning-padding before and after an element. // - $pre : // - [$post] : @mixin pad( $pre, $post: false ) { $inspect : ($pre, $post); $pre : map-merge((spread: wide), parse-span($pre)); @if $post { $post: map-merge((spread: wide), parse-span($post)); } @else { $span: susy-get(span, $pre); @if length($span) > 1 { $pre: map-merge($pre, (span: nth($span, 1))); $post: map-merge($pre, (span: nth($span, 2))); } @else { $post: $pre; } } @include susy-inspect(pad, $inspect); @include prefix($pre); @include suffix($post); } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_rows.scss ================================================ // Row Start & End // =============== // Break // ----- // Apply to any element that should force a line break. @mixin break { @include output((clear: both)); } // NoBreak // ------- // Cancel the break() effect, e.g. when using media queries. @mixin nobreak { @include output((clear: none)); } // Full // ---- // - [$context]: @mixin full( $context: $susy ) { $inspect : $context; @include susy-inspect(full, $inspect); @include span(full of parse-grid($context) break); } // First // ----- // - [$context]: @mixin first( $context: $susy ) { $inspect : $context; $context : parse-grid($context); $flow : susy-get(flow, $context); @include susy-inspect(first, $inspect); @if not(is-split($context)) { @include float-first($flow); } } @mixin alpha( $context: $susy ) { @include first($context); } // Last // ---- // - [$context]: @mixin last( $context: $susy ) { $inspect : $context; $context : parse-grid($context); @include susy-inspect(last, $inspect); $output: ( flow: susy-get(flow, $context), last-flow: susy-get(last-flow, $context), margin: if(is-split($context), null, 0), ); @include float-last($output...); } @mixin omega( $context: $susy ) { @include last($context); } // Get Edge // -------- // Calculate edge value based on location, if possible @function get-edge( $span ) { $span : parse-span($span); $edge : susy-get(edge, $span); @if not($edge) { $count: susy-count(susy-get(columns, $span)); $location: susy-get(location, $span); $n: susy-get(span, $span); $number: if(type-of($location) == number, true, false); $index: if($number and unitless($location), true, false); @if $n == $count { $edge: full; } @else if $location and $n and $index { @if $location == 1 { $edge: if($n == $count, full, first); } @else if $location + $n - 1 == $count { $edge: last; } } } @if $edge == alpha or $edge == omega { $edge: if($edge == alpha, first, last); } @return $edge; } // Get Location // ------------ // Calculate location value based on edge, if possible @function get-location( $span ) { $span : parse-span($span); $location : susy-get(location, $span); $edge : get-edge($span); $n : susy-get(span, $span); @if $edge and not($location) and type-of($n) == number and unitless($n) { @if $edge == first { $location: 1; } @else if $edge == last { $location: susy-count(susy-get(columns, $span)) - $n + 1; } } @return $location } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_settings.scss ================================================ // Susy Settings // ============= // Susy Language Defaults // ---------------------- // - PRIVATE @include susy-defaults(( container: auto, math: fluid, output: float, container-position: center, gutter-position: after, global-box-sizing: content-box, debug: ( image: hide, color: rgba(#66f, .25), output: background, toggle: top right, ), )); // Valid Keyword Values // -------------------- // - PRIVATE: DONT'T TOUCH $susy-keywords: ( container: auto, math: static fluid, output: isolate float, container-position: left center right, flow: ltr rtl, gutter-position: before after split inside inside-static, box-sizing: border-box content-box, span: full, edge: first alpha last omega full, spread: narrow wide wider, gutter-override: no-gutters no-gutter, role: nest, clear: break nobreak, debug image: show hide show-columns show-baseline, debug output: background overlay, ); // Parse Susy Keywords and Maps // ---------------------------- @function parse-settings( $short: $susy ) { $_return: (); @if type-of($short) == map { $_return: $short; } @else { @each $item in $short { // strings @if type-of($item) == string { @each $key, $value in $susy-keywords { @if index($value, $item) { $_key-value: append($key, $item); $_return: _susy-deep-set($_return, $_key-value...); } } // maps } @else if type-of($item) == map { $_return: map-merge($_return, $item); } } } @return $_return; } // Parse Columns & Gutters // ----------------------- @function parse-layout( $short ) { $_return: (); $_columns: (); $_gutters: null; @if not(unitless(nth(nth($short, 1), 1))) { $_gutters: nth($short, 1); } @else { $_columns: (columns: nth($short, 1)); $_gutters: if(length($short) > 1, nth($short, 2), $_gutters); } @if type-of($_gutters) == list and length($_gutters) > 0 { $_gutters: ( gutters: nth($_gutters, 2) / nth($_gutters, 1), column-width: nth($_gutters, 1), ); } @else { $_gutters: if($_gutters, (gutters: $_gutters), ()); } $_return: map-merge($_return, $_columns); $_return: map-merge($_return, $_gutters); @return $_return; } // Parse Grid/Context // ------------------ @function parse-grid( $short: $susy ) { $_return: parse-settings($short); $_layout: (); @if type-of($short) == map { $_return: $short; } @else { @each $item in $short { // number or list @if type-of($item) == number or type-of($item) == list { @if type-of($item) == list or unitless($item) { $_layout: append($_layout, $item); } @else { $_return: map-merge($_return, (container: $item)); } } } $_layout: if(length($_layout) > 0, parse-layout($_layout), $_layout); } @return map-merge($_return, $_layout); } // Parse Span // ---------- @function parse-span( $short, $key: span ) { $_return: (); @if type-of($short) == map { $_return: $short; } @else { $_at: index($short, at); @if $_at { $_loci: $_at + 1; $_location: nth($short, $_loci); $_return: map-merge($_return, (location: $_location)); $short: set-nth($short, $_at, null); $short: set-nth($short, $_loci, null); } $_i: 1; $_span: (); @while $_i <= length($short) { $_this: nth($short, $_i); @if type-of($_this) == number { $_span: append($_span, $_this); $short: set-nth($short, $_i, null); } @else if $_this == of { $short: set-nth($short, $_i, null); $_i: length($short) + 1; } $_i: $_i + 1; } @if length($_span) > 0 { $_span: if(length($_span) == 1, nth($_span, 1), $_span); $_return: map-merge($_return, ($key: $_span)); } $_return: map-merge($_return, parse-grid($short)); } @return $_return; } // Parse Gutters // ------------- @function parse-gutters( $short: $susy ) { $_gutters: parse-span($short, gutter-override); $_span: susy-get(gutter-override, $_gutters); @if $_span and not(map-get($_gutters, columns)) { $_context: (); $_new: (); @each $item in $_span { @if type-of($item) == number and unitless($item) { $_context: append($_context, $item); } @else { $_new: append($_new, $item); } } $_context: parse-grid($_context); $_new: if(length($_new) == 0, null, $_new); $_new: if(length($_new) == 1, nth($_new, 1), $_new); $_new: (gutter-override: if($_new != $_span, $_new, $_span)); $_gutters: map-merge($_gutters, $_new); $_gutters: map-merge($_gutters, $_context); } @return $_gutters; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_span.scss ================================================ // Span Syntax // =========== // Span [mixin] // ------------ // Set a spanning element using shorthand syntax. // - $span : @mixin span( $span ) { $inspect: $span; $span: parse-span($span); $output: span-math($span); $nesting: susy-get(span, $span); $clear: susy-get(clear, $span); $box: susy-get(box-sizing, $span); $content-box: if(susy-get(global-box-sizing) != 'border-box', true, false); $box: $box or if(is-inside($span) and $content-box, border-box, null); @if $clear == break { @include break; } @else if $clear == nobreak { @include nobreak; } @include susy-inspect(span, $inspect); @include output((box-sizing: $box)); @include float-span-output($output...); @if valid-columns($nesting, silent) { @include nested($span) { @content; } } @else { @content; } } // Span [function] // --------------- // Return the width of a span. // - $span : @function span( $span ) { @return get-span-width($span); } // Span Math // --------- // Get all the span results. // - $span: @function span-math( $span ) { $nest : if(susy-get(role, $span) == nest, true, false); $split-nest : if(is-split($span) and $nest, true, false); $edge : get-edge($span); $location : get-location($span); $float : from; $padding-before : null; $padding-after : null; $margin-before : null; $margin-after : null; // calculate widths $spread: index(map-values($span), spread); $span: if($split-nest and not($spread), map-merge($span, (spread: wide)), $span); $width: get-span-width($span); $gutters: get-gutters($span); // apply gutters @if is-inside($span) { @if not(susy-get(role, $span)) { $padding-before: map-get($gutters, before); $padding-after: map-get($gutters, after); } } @else { @if not($split-nest) { $margin-before: map-get($gutters, before); $margin-after: map-get($gutters, after); } } // special margin handling @if susy-get(output, $span) == isolate and $location { $margin-before: get-isolation($span); $margin-after: -100%; } @else if $edge { $is-split: is-split($span); $pos: susy-get(gutter-position, $span); @if $edge == last { $float: susy-get(last-flow, $span); } @if not($is-split) { @if $edge == full or ($edge == first and $pos == before) { $margin-before: 0; } @if $edge == full or ($edge == last and $pos == after) { $margin-after: 0; } } } @return ( width : $width, float : $float, margin-before : $margin-before, margin-after : $margin-after, padding-before : $padding-before, padding-after : $padding-after, flow : susy-get(flow, $span), ); } // Get Span Width // -------------- // Return span width. // - $span: @function get-span-width( $span ) { $span : parse-span($span); $n : susy-get(span, $span); $location : get-location($span); $columns : susy-get(columns, $span); $gutters : susy-get(gutters, $span); $spread : susy-get(spread, $span); $context : null; $span-sum : null; $width : null; @if $n == 'full' { $pos: susy-get(gutter-position, $span); $role: susy-get(role, $span); $n: if($pos == split and $role != nest, susy-count($columns), 100%); } @if type-of($n) != number { @warn "(#{type-of($n)}) #{$n} is not a valid span."; } @else if unitless($n) { $context: susy-sum($columns, $gutters, if(is-split($span), wide, narrow)); $spread: if(is-inside($span), $spread or wide, $spread); $span-sum: susy($n, $location, $columns, $gutters, $spread); $_math: susy-get(math, $span); $_column-width: susy-get(column-width, $span); @if $_math == static { $width: $span-sum * valid-column-math($_math, $_column-width); } @else { $width: percentage($span-sum / $context); } } @else { $width: $n; } @return $width; } ================================================ FILE: _sass/vendor/susy/susy/language/susy/_validation.scss ================================================ // Validation // ========== // Validate Column Math // -------------------- @function valid-column-math( $math, $column-width ) { @if $math == static and not($column-width) { @error 'Static math requires a valid column-width setting.'; } @return $column-width; } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_background.scss ================================================ // --------------------------------------------------------------------------- // Imports @import "compass/layout/grid-background"; @import "compass/css3/background-origin"; @import "compass/css3/background-clip"; // --------------------------------------------------------------------------- // Susy Grid Background // // A wrapper for the compass "column-grid-background" mixin // Uses all your settings to create a grid background for a container element. // Note: Sub-pixel rounding can lead to several pixels of variation between browsers. @mixin susy-grid-background(){ @include column-grid-background($total-columns, column(), gutter(), 0); @include background-origin(content-box); @include background-clip(content-box); } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_functions.scss ================================================ // --------------------------------------------------------------------------- // Imports // We need access to some basic font settings for handling media-queries. @import "compass/typography/vertical_rhythm"; // For now, we also need this... $browser-default-font-size-px : 16px; $browser-default-font-size-percent : 100%; $browser-default-font-size-pt : 12pt; $rem-with-px-fallback : true !default; // --------------------------------------------------------------------------- // Sass list Functions // Return a list with specific items removed // // filter($list, $target) // - $list : The list to filter. // - $target : An item to be removed from the list. @function filter($list, $target) { $clean: compact(); @if index($list, $target) { @each $item in $list { $clean: if($item == $target, $clean, append($clean, $item)); } } @else { $clean: $list; } @return $clean; } // --------------------------------------------------------------------------- // Don't use static output when it will break things // Switch element-level output to fluid, when container-width is wrong for static // // fix-static-misalignment([$style, $width]) // - $style: $container-style. // - $width: $container-width. @function fix-static-misalignment( $style: $container-style, $width: $container-width ) { @if $container-width and $container-width != container-outer-width($width: false) { $style: fluid; } @return $style; } // --------------------------------------------------------------------------- // Grid Functions // Returns the full width of a grid based on your grid settings. // // $columns : The number of columns to get width for. @function columns-width( $columns : $total-columns ) { @if round($columns) != $columns { @warn "Susy works best with integer column-spans." + "For partial-columns, you may need to finesse the math by hand using functions directly."; } @return ($columns * $column-width) + (if($columns >= 1, ceil($columns - 1), 0) * $gutter-width); } // Return the grid width after adding or subtracting grid padding // // $width : the width of the grid without padding; // $operation : ( add | subtract ) if padding should be added or subtracted; @function handle-grid-padding( $width, $operation : subtract ) { $pad: $grid-padding*2; @if comparable($width, $grid-padding) { $width: if($operation == subtract, $width - $pad, $width + $pad); } @else { @warn "$grid-padding must be set in units comparable to the container width."; } @return $width; } // Return the full outer width of a Container element. // // $columns : The number of columns in the Grid Layout. @function container-outer-width( $columns : $total-columns, $width : $container-width ) { $outerwidth: if($width, $width, columns-width($columns)); @if $width { @if not($border-box-sizing) { $outerwidth: handle-grid-padding($outerwidth, subtract); } } @else { @if $border-box-sizing { $outerwidth: handle-grid-padding($outerwidth, add); } } @return $outerwidth; } // Return the percentage width of a single column in a given 'context'. // // $context : The grid context in columns, if nested. // $style : The container style to use. @function column( $context : $total-columns, $style : fix-static-misalignment() ) { @return if($style == static, $column-width, relative-width($column-width, $context)); } // Return the percentage width of multiple 'columns' in a given 'context'. // // $columns : The number of columns to get relative width for. // $context : The grid context in columns, if nested. // $style : The container style to use. @function columns( $columns, $context : $total-columns, $style : fix-static-misalignment() ) { @return if($style == static, columns-width($columns), relative-width(columns-width($columns), $context)); } // Return the percentage width of a single gutter in a given 'context'. // // $context : The grid context in columns, if nested. // $style : The container style to use. @function gutter( $context : $total-columns, $style : fix-static-misalignment() ) { @return if($style == static, $gutter-width, relative-width($gutter-width, $context)); } // Return the percentage width of a given value in a given 'context'. // // $width : Any given width value. // $context : The grid context in columns, if nested. @function relative-width( $width, $context : $total-columns ) { @return percentage($width / columns-width($context)); } // Return the total space occupied by multiple columns and associated gutters. // Useful for adding padding or margins (prefix, suffix, push, pull, etc.) // // $columns : The number of columns to get relative space for. // $context : The grid context in columns, if nested. // $style : The container style to use. @function space( $columns, $context : $total-columns, $style : fix-static-misalignment() ) { @return columns($columns, $context, $style) + if($columns >= 1, gutter($context, $style), 0); } // Accept a list including column-count and (optional) position. // Return either the column count or the position alone. // // $columns : the list to split and interprate. // $request : The value to return, either 'columns' or 'position'. @function split-columns-value( $columns, $request : columns ) { $pos : false; $cols : false; @each $var in $columns { @if (type-of($var) == 'string') { $pos: $var; } @else { @if (type-of($var) == 'number') and (unitless($var)) { $cols: $var; } @else { @warn '"#{$var}" is not a valid part of "$columns: #{$columns}" in the columns() mixin.'; } } } @if $request == 'columns' { @return $cols; } @else { @if $request == 'position' { @return $pos; } @else { @warn '"#{$request}" is not a valid value for $request'; } } } // Accept nth-selector variables, and format them as a valid CSS3 selector. // // $n : [first | only | last | ] // $selector : [child | last-child | of-type | last-of-type ] @function format-nth( $n : last, $selector : child ) { @if ($n == 'last') or ($n =='first') or ($n =='only') { $selector: '#{$n}-#{$selector}'; } @else { $selector: 'nth-#{$selector}(#{$n})'; } @return $selector; } // --------------------------------------------------------------------------- // Media Functions // Return an em value adjusted to match the browser default font size. // Note: This only works if actual sizes are set relative to browser defaults. // // $ems : The initial value to be converted. // $font-size : The current font-size in. @function base-ems( $ems, $font-size: $base-font-size ){ $font-size : if(unit($ems) == 'rem', $base-font-size, $font-size); $unit : unit($font-size); $mult : $ems / ($ems * 0 + 1); @if $unit == 'px' { @return $font-size / $browser-default-font-size-px * $mult * 1em; } @else if $unit == '%' { @return $font-size / $browser-default-font-size-percent * $mult * 1em; } @else if $unit == 'em' { @return $font-size / 1em * $mult * 1em; } @else if $unit == 'pt' { @return $font-size / $browser-default-font-size-pt * $mult * 1em; } @else { @warn 'Variable $base-font-size does not have a valid font unit. Valid units for fonts in CSS are px, pt, em, and %.'; } } // This name will be deprecated... @function absolute-ems( $ems, $font-size: $base-font-size ){ @return base-ems( $ems, $font-size); } // Return a length, after any em-values have been sent through absolute-ems(). // // $length : The length value to be checked and adjusted if necessary. // $font-size : The current font-size in px. @function fix-ems( $length, $font-size: $base-font-size ){ @if $length { @if (unit($length) == 'em') or (unit($length) == 'rem') { $length: absolute-ems($length,$font-size); } } @return $length; } // Sort a list of arguments into "$min $layout $max $ie" order, and return the list. // // $media-layout : a list of values [$min $layout $max $ie] including... // : - one unitless number (columns in a layout) // : - two optional lengths (min and max-width media-query breakpoints). // : - one optional boolean or string to trigger fallback support for IE. // $font-size : [optional] The base font-size of your layout, if you are using ems. // : - defaults to $base-font-size @function medialayout( $media-layout, $font-size: $base-font-size ) { $media : false; $min : false; $layout : false; $max : false; $ie : false; $has-layout : false; @each $val in $media-layout { @if (type-of($val) == "number") { @if unitless($val) { $layout : $val; $has-layout : true; } @else { @if ($has-layout) and not($media) { $max: $val; } @else { @if $media { $media: join($media,$val); } @else { $media: $val; } } } } @else { $ie: $val; } } @if (length($media) > 0) { @if (length($media) == 1) { $min: nth($media,1); } @else { $min: nth($media,1); $max: nth($media,2); @if comparable($min, $max) { @if ($min > $max) { $max: nth($media,1); $min: nth($media,2); } } @else { @warn "Can't compare incompatible units." + "Using #{$min} for min-width, and #{$max} for max-width"; } @if (length($media) > 2) { @warn "You can only send two lengths: a min-width and an (optional) max-width." + "You sent #{length($media)}: #{$media}"; } } } // media-queries must be set in ems relative to the browser default // rather than the font-size set in CSS. $min: fix-ems($min,$font-size); $max: fix-ems($max,$font-size); @return $min $layout $max $ie; } // Return the nearest layout (column-count) above a given breakpoint. // // $min : The min-width media-query breakpoint above which to establish a new layout. @function get-layout( $min ) { $min : fix-ems($min); $return : false; @if comparable($min, $column-width) { $return : ceil(($min + $gutter-width) / ($column-width + $gutter-width)); } @else { @warn "Can't determine a layout, becuse #{$min} and #{$column-width} are not comparable."; } @return $return; } // Check to see if a given $media-layout list is simply the default. // // $media-layout : a list of values including - // : One unitless number (columns in a layout) // : Two optional lengths (min and max-width media-query breakpoints). // : One optional boolean or string to trigger fallback support for IE. @function is-default-layout( $media-layout ) { $media-layout : medialayout($media-layout); $min : nth($media-layout,1); $layout-cols : nth($media-layout,2); $max : nth($media-layout,3); @if $min or $max { @return false; } @else { @return if($layout-cols == $total-columns,true,false); } } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_grid.scss ================================================ // --------------------------------------------------------------------------- // Imports @import "compass/utilities/general/clearfix"; @import "compass/css3/box-sizing"; // --------------------------------------------------------------------------- // Border-Box Sizing // Apply the border-box sizing model to all elements // and adjust the grid math appropriately. @mixin border-box-sizing { $border-box-sizing: true !global; * { @include box-sizing(border-box); } } // --------------------------------------------------------------------------- // Container // Set the width of a container // // $columns : The number of columns in the Grid Layout. @mixin set-container-width( $columns : $total-columns, $style : $container-style, $px-vals : $pixel-values-only ){ $width: container-outer-width($columns); @if $style == 'static' { @if $px-vals == true { width: round(convert-length($width, px)); } @else { @include rem(width, $width); } } @else { @if $style == 'fluid' { @if unit($width) == '%' { @if $px-vals == true { width: round(convert-length($width, px)); } @else { @include rem(width, $width); } } } @else { @if $px-vals == true { max-width: round(convert-length($width, px)); } @else { @include rem(max-width, $width); } @include for-legacy-browser(ie,"6") { @if unit($width) == 'rem' { _width: round(convert-length($width, px)); } @else { _width: $width; } } } } } // Set the outer grid-containing element(s). // // $columns : The number of columns in the container. @mixin apply-container( $columns : $total-columns, $px-vals : $pixel-values-only ){ @include pie-clearfix; @include set-container-width($columns); @if $px-vals == true { padding-left: round(convert-length($grid-padding, px)); padding-right: round(convert-length($grid-padding, px)); } @else { @include rem(padding-left, $grid-padding); @include rem(padding-right, $grid-padding); } margin: { left: auto; right: auto; } } // Set one or more layouts on a grid-containing element at any number of media-query breakpoints. // // $media-layout-1 : [default:$total-columns] A list of values including - // : One unitless number (representing columns in a layout) // : Two optional lengths (representing min and max-width media-query breakpoints). // $media-layout-2 ...-10 : [optional] Same as $media-layout-1 @mixin container( $media-layouts... ){ $media-layouts: if(length($media-layouts) > 0, $media-layouts, $total-columns); @each $ml in $media-layouts { @if is-default-layout($ml) { @include apply-container; } @else { @include at-breakpoint($ml) { @include apply-container; } } } } // --------------------------------------------------------------------------- // Columns // Create a grid element spanning any number of 'columns' in a grid 'context'. // $columns : The number of columns to span. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $padding : [optional] Padding applied to the inside of individual grid columns. // : Padding is only output if one or two values are specified (e.g. 1em or 10px 20px) // : Padding values are applied only on the horizontal axis in from-to order // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin span-columns( $columns, $context : $total-columns, $padding : false, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); $to : opposite-position($from); $pos : split-columns-value($columns,position); $cols : split-columns-value($columns,columns); $pad-from : if($style == static, 0 * $gutter-width, relative-width(0 * $gutter-width, $context)); $pad-to : if($style == static, 0 * $gutter-width, relative-width(0 * $gutter-width, $context)); @if $padding != false { $pad-from : nth($padding, 1); @if length($padding) > 1 { $pad-to: nth($padding, 2); } @else { $pad-to: $pad-from; } $pad-from : if($style == static, $pad-from, relative-width($pad-from, $context)); $pad-to : if($style == static, $pad-to, relative-width($pad-to, $context)); padding-#{$from}: $pad-from; padding-#{$to}: $pad-to; } width: columns($cols, $context, $style) - if($border-box-sizing, 0, $pad-to + $pad-from); @if ($pos == 'omega') { @include omega($from); } @else { float: $from; margin-#{$to}: gutter($context, $style); @include for-legacy-browser(ie, "6") { display: inline; } } } // Apply to elements spanning the last column, to account for the page edge. // Only needed as an override. Normally 'omega' can just be called by `columns`. // // $from : The start-direction for your document. @mixin omega( $from : $from-direction ) { $from : unquote($from); $to : opposite-position($from); $hack : opposite-position($omega-float); float: $omega-float; margin-#{$to}: 0; @include for-legacy-browser(ie, "6", "7") { *margin-#{$hack}: - $gutter-width; @include for-legacy-browser(ie, "6") { display: inline; } } } // Shortcut to apply omega to a specific subset of elements. // // $n : [first | only | last | ] // $selector : [child | last-child | of-type | last-of-type ] // $from : The start-direction for your document. @mixin nth-omega( $n : last, $selector : child, $from : $from-direction ) { $from : unquote($from); &:#{format-nth($n,$selector)} { @if $n == "first" { @include omega($from); } @else { @include with-browser-ranges(css-sel3) { @include omega($from); } } } } // --------------------------------------------------------------------------- // Resets // Reset a '+columns' grid element to default block behavior // // $from : The start direction of your layout (e.g. 'left' for ltr languages) @mixin reset-columns( $from: $from-direction ) { $from : unquote($from); $to : opposite-position($from); $hack : opposite-position($omega-float); float: none; width: auto; margin-#{$to}: auto; @include for-legacy-browser(ie, "6", "7") { *margin-#{$hack}: auto; @include for-legacy-browser(ie, "6") { display: block; } } } // Apply to elements previously set as omega. // This will return floats and margins back to non-omega settigns. // // $context : [optional] The context (columns spanned by parent). // $from : The start-direction for your document. // $style : The container style to use. @mixin remove-omega( $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); $to : opposite-position($from); $hack : opposite-position($omega-float); float: $from; margin-#{$to}: gutter($context, $style); @include for-legacy-browser(ie, "6", "7") { *margin-#{$hack}: auto; } } // Shortcut to apply remove-omega to a specific subset of elements. // // $n : [first | only | last | ] // $selector : [child | last-child | of-type | last-of-type ] // $context : [optional] The context (columns spanned by parent). // $from : The start-direction for your document. // $style : The container style to use. @mixin remove-nth-omega( $n : last, $selector : child, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); &:#{format-nth($n,$selector)} { @if $n == "first" { @include remove-omega($context, $from, $style); } @else { @include with-browser-ranges(css-sel3) { @include remove-omega($context, $from, $style); } } } } // --------------------------------------------------------------------------- // Change Settings @mixin with-grid-settings( $columns: $total-columns, $width: $column-width, $gutter: $gutter-width, $padding: $grid-padding ) { // keep the defaults around $default-columns: $total-columns; $default-width: $column-width; $default-gutter: $gutter-width; $default-padding: $grid-padding; // use the new settings $total-columns: $columns !global; $column-width: $width !global; $gutter-width: $gutter !global; $grid-padding: $padding !global; // apply to contents @content; // re-instate the defaults $total-columns: $default-columns !global; $column-width: $default-width !global; $gutter-width: $default-gutter !global; $grid-padding: $default-padding !global; } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_isolation.scss ================================================ // --------------------------------------------------------------------------- // Isolation // Isolate the position of a grid element (use in addition to span-columns) // // $location : The grid column to isolate in, relative to the container; // $context : [optional] The context (columns spanned by parent). // $from : The start direction of your layout (e.g. 'left' for ltr languages) @mixin isolate( $location, $context: $total-columns, $from: $from-direction, $style: fix-static-misalignment() ) { $to: opposite-position($from); margin-#{$to}: -100%; margin-#{$from}: space($location - 1, $context, $style); } // Isolate a group of elements in a grid, using nth-child selectors // // $columns : The column-width of each item on the grid; // $context : [optional] The context (columns spanned by parent). // $selector : [child | of-type | last-of-type ] (default is 'child') // $from : The start direction of your layout (e.g. 'left' for ltr languages) @mixin isolate-grid( $columns, $context: $total-columns, $selector: 'child', $from: $from-direction, $style: fix-static-misalignment() ) { $to: opposite-position($from); $location: 1; $line: floor($context / $columns); @include span-columns($columns, $context, $from: $from, $style: $style); margin-#{$to}: -100%; @for $item from 1 through $line { $nth: '#{$line}n + #{$item}'; &:#{format-nth($nth,$selector)} { margin-#{$from}: space($location - 1, $context, $style); @if $location == 1 { clear: $from; } @else { clear: none; } $location: $location + $columns; @if $location > $context { $location: 1; } } } } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_margin.scss ================================================ // --------------------------------------------------------------------------- // Margin Mixins // Apply 'columns' margin before an element to push it along the grid. // // $columns : The number of columns to span. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin pre( $columns, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); margin-#{$from}: space($columns, $context, $style); } // 'push' is a synonymn for 'pre' @mixin push( $columns, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); @include pre($columns, $context, $from, $style); } // Apply negative 'columns' margin before an element to pull it along the grid. // // $columns : The number of columns to span. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin pull( $columns, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); margin-#{$from}: 0 - space($columns, $context, $style); } // Apply 'columns' margin after an element to contain it in a grid. // // $columns : The number of columns to span. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin post( $columns, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); $to : opposite-position($from); margin-#{$to}: space($columns, $context, $style); } // Apply 'columns' before and/or after an element to contain it on a grid. // // $pre : The number of columns to add as margin before. // $post : The number of columns to add as margin after. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin squish( $pre : false, $post : false, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); @if $pre { @include pre($pre, $context, $from, $style) } @if $post { @include post($post, $context, $from, $style) } } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_media.scss ================================================ // --------------------------------------------------------------------------- // Media Mixins // Create a new layout context for (@content) descendants. // // $layout-cols : a (unitless) number of columns to use for this layout. @mixin layout( $layout-cols ) { // store default $total-columns setting for later, then change it. $default-layout : $total-columns; $total-columns : $layout-cols !global; // apply children in this new layout context. @content; // return to default $total-columns setting. $total-columns : $default-layout !global; } // Nest a block of code inside a new media-query and layout context. // // $media-layout : a list of values [$min $layout $max $ie] including... // : - one unitless number (columns in a layout) // : - two optional lengths (min and max-width media-query breakpoints). // : - one optional boolean or string to trigger fallback support for IE. // $font-size : [optional] The base font-size of your layout, if you are using ems. // : - defaults to $base-font-size @mixin at-breakpoint( $media-layout, $font-size: $base-font-size ) { $media-layout : medialayout($media-layout,$font-size); $min : nth($media-layout,1); $layout : nth($media-layout,2); $max : nth($media-layout,3); $ie : nth($media-layout,4); @if not($breakpoint-media-output) and not($breakpoint-ie-output) and not($breakpoint-raw-output) { @warn "Either $breakpoint-media-output, $breakpoint-ie-output, or $breakpoint-raw-output must be true for at-breakpoint to work."; } // We need to have either a min-width breakpoint or a layout in order to proceed. @if $min or $layout or $max { // If we don't have a layout, we create one based on the min-width. @if not($layout) { $layout: get-layout($min); } // If we still don't have a layout, we have a problem. @if $layout { // Set our new layout context. @include layout($layout) { @if $breakpoint-media-output { @include with-browser-ranges(css-mediaqueries) { @if $min and $max { // Both $min and $max @media (min-width: $min) and (max-width: $max) { @content; } } @else { @if not($min) and not($max) { // Neither $min nor $max: // We can create a breakpoint based on the number of columns in the layout. $min: fix-ems(container-outer-width($width: false)); } @if $min { // Min only: @media (min-width: $min) { @content; } } @else { // Max only: @media (max-width: $max) { @content; } } } } } // Set an IE fallback @if $ie and $breakpoint-ie-output { @if (type-of($ie) == 'bool') { $ie: 'lt-ie9'; } .#{$ie} & { @content; } } @if $breakpoint-raw-output { @content; } } } @else { @warn "We were unable to determine a layout for your breakpoint."; } } @else { @warn "You need to provide either a valid layout (number of columns)" + "or a valid media-query min-width breakpoint (length)."; } } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_padding.scss ================================================ // --------------------------------------------------------------------------- // Padding Mixins // add empty colums as padding before an element. // $columns : The number of columns to prefix. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin prefix( $columns, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); padding-#{$from}: space($columns, $context, $style); } // add empty colums as padding after an element. // $columns : The number of columns to suffix. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin suffix( $columns, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); $to : opposite-position($from); padding-#{$to}: space($columns, $context, $style); } // add empty colums as padding before and after an element. // $columns : The number of columns to pad. // $context : [optional] The context (columns spanned by parent). // : Context is required on any nested elements. // : Context MUST NOT be declared on a root element. // $from : The start direction of your layout (e.g. 'left' for ltr languages) // $style : The container style to use. @mixin pad( $prefix : false, $suffix : false, $context : $total-columns, $from : $from-direction, $style : fix-static-misalignment() ) { $from : unquote($from); @if $prefix { @include prefix($prefix, $context, $from, $style); } @if $suffix { @include suffix($suffix, $context, $from, $style); } } // Bleed into colums with margin/padding on any side of an element. // $width : The side of the bleed. // : Any unit-length will be used directly. // : Any unitless number will be used as a column-count. // : Use "2 of 6" format to represent 2 cals in a 6-col nested context. // $sides : One or more sides to bleed [ top | right | bottom | left | all ]. // $style : The container style to use. @mixin bleed( $width: $grid-padding, $sides: left right, $style: fix-static-misalignment() ) { @if $border-box-sizing { @include box-sizing(content-box) } @if type-of($width) == 'list' { $width: filter($width, of); $width: space(nth($width,1), nth($width,2), $style); } @else if unitless($width) { $width: space($width, $style: $style); } @if $sides == 'all' { margin: - $width; padding: $width; } @else { @each $side in $sides { margin-#{$side}: - $width; padding-#{$side}: $width; } } } ================================================ FILE: _sass/vendor/susy/susy/language/susyone/_settings.scss ================================================ // --------------------------------------------------------------------------- // Susy Settings // The total number of columns in the grid $total-columns : 12 !default; // The width of columns and gutters. // These must all be set with the comparable units. $column-width : 4em !default; $gutter-width : 1em !default; // Padding on the left and right of a Grid Container. $grid-padding : $gutter-width !default; // --------------------------------------------------------------------------- // Advanced Settings // From Direction: // Controls for right-to-left or bi-directional sites. $from-direction : left !default; // Omega Float Direction: // The direction that +omega elements are floated by deafult. $omega-float : opposite-position($from-direction) !default; // Container Width: // Override the total width of your grid, using any length (50em, 75%, etc.) $container-width : false !default; // Container Style: // 'magic' - Static (fixed or elastic) when there's enough space, // fluid when there isn't. This is the SUSY MAGIC SAUCE(TM). // 'static' - Forces the grid container to remain static at all times. // 'fluid' - Forces the grid to remain fluid at all times. // (this will overrule any static $container-width settings) $container-style : magic !default; // Border-Box Sizing // Adjust the grid math appropriately for box-sizing: border-box; // Warning: This does not actually apply the new box model! // In most cases you can ignore this setting, // and simply apply the border-box-sizing mixin. $border-box-sizing : false !default; // Pixel Values only: // Make sure only pixel values are set for the container width. $pixel-values-only : false !default; // --------------------------------------------------------------------------- // IE Settings // When you are using a seperate IE stylesheet, // you can use these settings to control the output of at-breakpoint. // By default, at-breakpoint will output media-queries as well as // any defined ie-fallback classes. $breakpoint-media-output : true !default; $breakpoint-ie-output : true !default; // Danger Zone! Only set as 'true' in IE-specific style sheets. $breakpoint-raw-output : false !default; ================================================ FILE: _sass/vendor/susy/susy/output/_float.scss ================================================ // Float API // ========= @import "shared"; @import "float/container"; @import "float/span"; @import "float/end"; @import "float/isolate"; ================================================ FILE: _sass/vendor/susy/susy/output/_shared.scss ================================================ // Shared API // ========== @import "support"; @import "shared/inspect"; @import "shared/output"; @import "shared/direction"; @import "shared/background"; @import "shared/container"; @import "shared/margins"; @import "shared/padding"; ================================================ FILE: _sass/vendor/susy/susy/output/_support.scss ================================================ // Susy Browser Support // ==================== @import "support/support"; @import "support/prefix"; @import "support/background"; @import "support/box-sizing"; @import "support/rem"; @import "support/clearfix"; ================================================ FILE: _sass/vendor/susy/susy/output/float/_container.scss ================================================ // Float Container API // =================== // Float Container // --------------- // - [$width] : // - [$justify] : left | center | right // - [$math] : fluid | static @mixin float-container( $width, $justify: auto auto, $property: max-width ) { @include susy-clearfix; @include container-output($width, $justify, $property); } ================================================ FILE: _sass/vendor/susy/susy/output/float/_end.scss ================================================ // Float Ends API // ============== // Susy End Defaults // ----------------- // - PRIVATE @include susy-defaults(( last-flow: to, )); // Float Last // ---------- // - [$flow] : ltr | rtl @mixin float-last( $flow: map-get($susy-defaults, flow), $last-flow: map-get($susy-defaults, last-flow), $margin: 0 ) { $to: to($flow); $output: ( float: if($last-flow == to, $to, null), margin-#{$to}: $margin, ); @include output($output); } // Float First // ----------- // - [$flow] : ltr | rtl @mixin float-first( $flow: map-get($susy-defaults, flow) ) { $output: ( margin-#{from($flow)}: 0, ); @include output($output); } ================================================ FILE: _sass/vendor/susy/susy/output/float/_isolate.scss ================================================ // Float Isolation API // =================== // Isolate Output // -------------- // - $push : // - [$flow] : ltr | rtl @mixin isolate-output( $push, $flow: map-get($susy-defaults, flow) ) { $to: to($flow); $from: from($flow); $output: ( float: $from, margin-#{$from}: $push, margin-#{$to}: -100%, ); @include output($output); } ================================================ FILE: _sass/vendor/susy/susy/output/float/_span.scss ================================================ // Float Span API // ============== // Float Span Output // ----------------- // - $width : // - [$float] : from | to // - [$margin-before] : // - [$margin-after] : // - [$padding-before] : // - [$padding-after] : // - [$flow] : ltr | rtl @mixin float-span-output( $width, $float : from, $margin-before : null, $margin-after : null, $padding-before : null, $padding-after : null, $flow : map-get($susy-defaults, flow) ) { $to : to($flow); $from : from($flow); $output: ( width: $width, float: if($float == to, $to, null) or if($float == from, $from, null), margin-#{$from}: $margin-before, margin-#{$to}: $margin-after, padding-#{$from}: $padding-before, padding-#{$to}: $padding-after, ); @include output($output); } ================================================ FILE: _sass/vendor/susy/susy/output/shared/_background.scss ================================================ // Grid Background API // =================== // - Sub-pixel rounding can lead to several pixels variation between browsers. // Grid Background Output // ---------------------- // - $image: background-image // - $size: background-size // - $clip: background-clip // - [$flow]: ltr | rtl @mixin background-grid-output ( $image, $size: null, $clip: null, $flow: map-get($susy-defaults, flow) ) { $output: ( background-image: $image, background-size: $size, background-origin: $clip, background-clip: $clip, background-position: from($flow) top, ); @include output($output); } ================================================ FILE: _sass/vendor/susy/susy/output/shared/_container.scss ================================================ // Shared Container API // ==================== // Container Output // ---------------- // - [$width] : // - [$justify] : left | center | right // - [$math] : fluid | static @mixin container-output( $width, $justify: auto auto, $property: max-width ) { $output: ( #{$property}: $width or 100%, margin-left: nth($justify, 1), margin-right: nth($justify, 2), ); @include output($output); } ================================================ FILE: _sass/vendor/susy/susy/output/shared/_direction.scss ================================================ // Direction Helpers // ================= // Susy Flow Defaults // ------------------ // - PRIVATE @include susy-defaults(( flow: ltr, )); // Get Direction // ------------- // Return the 'from' or 'to' direction of a ltr or rtl flow. // - [$flow] : ltr | rtl // - [$key] : from | to @function get-direction( $flow: map-get($susy-defaults, flow), $key: from ) { $return: if($flow == rtl, (from: right, to: left), (from: left, to: right)); @return map-get($return, $key); } // To // -- // Return the 'to' direction of a flow // - [$flow] : ltr | rtl @function to( $flow: map-get($susy-defaults, flow) ) { @return get-direction($flow, to); } // From // ---- // Return the 'from' direction of a flow // - [$flow] : ltr | rtl @function from( $flow: map-get($susy-defaults, flow) ) { @return get-direction($flow, from); } ================================================ FILE: _sass/vendor/susy/susy/output/shared/_inspect.scss ================================================ // Debugging // ========= // Susy Inspect // ------------ // Output arguments passed to a inspect. // - $mixin : // - $inspec : @mixin susy-inspect( $mixin, $inspect ) { $show: false; @each $item in $inspect { @if index($item, inspect) { $show: true; } } @if $show or susy-get(debug inspect) { -susy-#{$mixin}: inspect($inspect); } } ================================================ FILE: _sass/vendor/susy/susy/output/shared/_margins.scss ================================================ // Margins API // =========== // Margin Output // ------------- // - $before : // - $after : // - [$flow] : ltr | rtl @mixin margin-output( $before, $after, $flow: map-get($susy-defaults, flow) ) { $to: to($flow); $from: from($flow); $output: ( margin-#{$from}: $before, margin-#{$to}: $after, ); @include output($output); } ================================================ FILE: _sass/vendor/susy/susy/output/shared/_output.scss ================================================ // Output // ====== // Output // ------ // Output CSS with proper browser support. // - $styles : @mixin output( $styles ) { @each $prop, $val in $styles { @include susy-support($prop, $val); } } ================================================ FILE: _sass/vendor/susy/susy/output/shared/_padding.scss ================================================ // Padding API // =========== // Padding Output // -------------- // - $before : // - $after : // - [$flow] : ltr | rtl @mixin padding-output( $before, $after, $flow: map-get($susy-defaults, flow) ) { $to: to($flow); $from: from($flow); $output: ( padding-#{$from}: $before, padding-#{$to}: $after, ); @include output($output); } ================================================ FILE: _sass/vendor/susy/susy/output/support/_background.scss ================================================ // Background Properties // ===================== // Susy Background Image // --------------------- // Check for an existing support mixin, or provide a simple fallback. // - $image: @mixin susy-background-image( $image ) { @if susy-support(background-image, (mixin: background-image), $warn: false) { @include background-image($image...); } @else { background-image: $image; } } // Susy Background Size // --------------------- // Check for an existing support mixin, or provide a simple fallback. // - $image: @mixin susy-background-size( $size ) { @if susy-support(background-options, (mixin: background-size)) { @include background-size($size); } @else { background-size: $size; } } // Susy Background Origin // ---------------------- // Check for an existing support mixin, or provide a simple fallback. // - $image: @mixin susy-background-origin( $origin ) { @if susy-support(background-options, (mixin: background-origin)) { @include background-origin($origin); } @else { background-origin: $origin; } } // Susy Background Clip // -------------------- // Check for an existing support mixin, or provide a simple fallback. // - $image: @mixin susy-background-clip( $clip ) { @if susy-support(background-options, (mixin: background-clip)) { @include background-clip($clip); } @else { background-clip: $clip; } } ================================================ FILE: _sass/vendor/susy/susy/output/support/_box-sizing.scss ================================================ // Box Sizing // ========== // Box Sizing // ---------- // Check for an existing support mixin, or provide a simple fallback. // - $model: @mixin susy-box-sizing( $model: content-box ) { @if $model { @if susy-support(box-sizing, (mixin: box-sizing), $warn: false) { @include box-sizing($model); } @else { $prefix: (moz, webkit, official); @include susy-prefix(box-sizing, $model, $prefix); } } } ================================================ FILE: _sass/vendor/susy/susy/output/support/_clearfix.scss ================================================ // Susy Fallback Clearfix // ====================== // Clearfix // -------- // Check for an existing support mixin, or provide a simple fallback. @mixin susy-clearfix { @if susy-support(clearfix, (mixin: clearfix)) { @include clearfix; } @else { &:after { content: " "; display: block; clear: both; } } } ================================================ FILE: _sass/vendor/susy/susy/output/support/_prefix.scss ================================================ // Susy Prefix // =========== // Prefix // ------ // Output simple prefixed properties. // - $prop : // - $val : // - [$prefix] : @mixin susy-prefix( $prop, $val, $prefix: official ) { @each $fix in $prefix { $fix: if($fix == official or not($fix), $prop, '-#{$fix}-#{$prop}'); @include susy-rem($fix, $val); } } ================================================ FILE: _sass/vendor/susy/susy/output/support/_rem.scss ================================================ // rem Support // =========== // rem // --- // Check for an existing support mixin, or output directly. // - $prop : // - $val : @mixin susy-rem( $prop, $val ) { $_reqs: ( variable: rhythm-unit rem-with-px-fallback, mixin: rem, ); @if susy-support(rem, $_reqs, $warn: false) and $rhythm-unit == rem { @include rem($prop, $val); } @else { #{$prop}: $val; } } ================================================ FILE: _sass/vendor/susy/susy/output/support/_support.scss ================================================ // Browser Support // =============== // Susy Support Defaults // --------------------- @include susy-defaults(( use-custom: ( clearfix: false, background-image: true, background-options: false, breakpoint: true, box-sizing: true, rem: true, ), )); // Susy Support [mixin] // -------------------- // Send property-value pairs to the proper support modules. // - $prop : // - $val : @mixin susy-support( $prop, $val ) { // Background Support @if $prop == background-image { @include susy-background-image($val); } @else if $prop == background-size { @include susy-background-size($val); } @else if $prop == background-origin { @include susy-background-origin($val); } @else if $prop == background-clip { @include susy-background-clip($val); } // Box-Sizing Support @else if $prop == box-sizing { @include susy-box-sizing($val); } // Rem Support @else { @include susy-rem($prop, $val); } } // Susy Support [function] // ----------------------- // Check for support of a feature. // - $feature : // - e.g "rem" or "box-sizing" // - $requirements : // - e.g (variable: rem-with-px-fallback, mixin: rem) // - $warn : @function susy-support( $feature, $requirements: (), $warn: true ) { $_support: susy-get(use-custom $feature); @if $_support { $_fail: false; @each $_type, $_req in $requirements { @each $_i in $_req { $_pass: call(get-function(unquote("#{$_type}-exists")), $_i); @if not($_pass) { $_fail: true; @if $warn { @warn "You requested custom support of #{$feature}, but the #{$_i} #{$_type} is not available."; } } } } $_support: if($_fail, false, $_support); } @return $_support; } ================================================ FILE: _sass/vendor/susy/susy/su/_grid.scss ================================================ // Column math // =========== // Is Symmetrical // -------------- // Returns true if a grid is symmetrical. // - [$columns] : | @function is-symmetrical( $columns: susy-get(columns) ) { $columns: valid-columns($columns); @return if(type-of($columns) == number, $columns, null); } // Susy Count // ---------- // Find the number of columns in a given layout // - [$columns] : | @function susy-count( $columns: susy-get(columns) ) { $columns: valid-columns($columns); @return is-symmetrical($columns) or length($columns); } // Susy Sum // -------- // Find the total sum of column-units in a layout // - [$columns] : | // - [$gutters] : // - [$spread] : false/narrow | wide | wider @function susy-sum( $columns : susy-get(columns), $gutters : susy-get(gutters), $spread : false ) { $columns: valid-columns($columns); $gutters: valid-gutters($gutters); $spread: if($spread == wide, 0, if($spread == wider, 1, -1)); $gutter-sum: (susy-count($columns) + $spread) * $gutters; $column-sum: is-symmetrical($columns); @if not($column-sum) { @each $column in $columns { $column-sum: ($column-sum or 0) + $column; } } @return $column-sum + $gutter-sum; } // Susy Slice // ---------- // Return a subset of columns at a given location. // - $span : // - $location : // - [$columns] : | @function susy-slice( $span, $location, $columns: susy-get(columns) ) { $columns: valid-columns($columns); $sub-columns: $span; @if not(is-symmetrical($columns)) { $location: $location or 1; $sub-columns: (); @for $i from $location to ($location + $span) { $sub-columns: append($sub-columns, nth($columns, $i)); } } @return $sub-columns; } // Susy // ---- // Find the sum of a column-span. // - $span : // - $location : // - [$columns] : | // - [$gutters] : // - [$spread] : false/narrow | wide | wider @function susy( $span, $location : false, $columns : susy-get(columns), $gutters : susy-get(gutters), $spread : false ) { $columns: valid-columns($columns); $gutters: valid-gutters($gutters); $span: susy-slice($span, $location, $columns); @return susy-sum($span, $gutters, $spread); } ================================================ FILE: _sass/vendor/susy/susy/su/_settings.scss ================================================ // Settings // ======== // Version // ------- $su-version: 1.1; // Default Settings // ---------------- // PRIVATE: The basic settings $susy-defaults: ( columns: 4, gutters: .25, ); // User Settings // ------------- // - Define the $susy variable with a map of your own settings. // - Set EITHER $column-width OR $container // - Use $column-width for static layouts $susy: () !default; // Susy Defaults // ------------- // PRIVATE: Add defaults to Susy @mixin susy-defaults( $defaults ) { $susy-defaults: map-merge($susy-defaults, $defaults) !global; } // Susy Set // -------- // Change one setting // - $key : setting name // - $value : setting value @mixin susy-set( $key-value... ) { $susy: _susy-deep-set($susy, $key-value...) !global; } // Susy Get // -------- // Return one setting from a grid // - $key : // - $layout : @function susy-get( $key, $layout: map-merge($susy-defaults, $susy) ) { $layout: parse-grid($layout); $_options: $layout $susy $susy-defaults; $_break: false; $_return: null; @each $opt in $_options { @if type-of($opt) == map and not($_break) { $_keyset: _susy-deep-has-key($opt, $key...); @if $_keyset { $_return: _susy-deep-get($opt, $key...); $_break: true; } } } @return $_return; } ================================================ FILE: _sass/vendor/susy/susy/su/_utilities.scss ================================================ // Map Functions // ============= // Truncate List // ------------- // - Return a list, truncated to a given length @function _susy-truncate-list( $list, $length ) { $_return: (); @for $i from 1 through length($list) { $_return: if($i <= $length, append($_return, nth($list, $i)), $_return); } @return $_return; } // Deep Get // -------- // - Return a value deep in nested maps @function _susy-deep-get( $map, $keys... ) { $_return: $map; @each $key in $keys { @if type-of($_return) == map { $_return: map-get($_return, $key); } } @return $_return; } // Deep Set // -------- // - Set a value deep in nested maps @function _susy-deep-set( $map, $keys-value... ) { $_value: nth($keys-value, -1); $_keys: _susy-truncate-list($keys-value, length($keys-value) - 1); $_length: length($_keys); $_return: (); @for $i from 1 through $_length { $_n: 0 - $i; $_level: _susy-truncate-list($_keys, $_length + $_n); $_level: _susy-deep-get($map, $_level...); $_merge: nth($_keys, $_n); $_merge: ($_merge: $_value); $_return: if($_level, map-merge($_level, $_merge), $_merge); $_value: $_return; } @return $_return; } // Deep Merge // ---------- // Return 2 objects of any depth, merged @function _susy-deep-merge( $map1, $map2 ) { @if type-of($map1) != map or type-of($map2) != map { $map1: $map2; } @else { @each $key, $value in $map2 { $_new: ($key: _susy_deep-merge(map-get($map1, $key), $value)); $map1: map-merge($map1, $_new); } } @return $map1; } // Deep Has-Key // ------------ // - Return true if a deep key exists @function _susy-deep-has-key( $map, $keys... ) { $_return: null; $_stop: false; @each $key in $keys { @if not($_stop) { $_return: map-has-key($map, $key); } @if $_return { $map: map-get($map, $key); } @else { $_stop: true; } } @return $_return; } ================================================ FILE: _sass/vendor/susy/susy/su/_validation.scss ================================================ // Math Validation // =============== // Valid Columns // ------------- // Check that a column setting is valid. @function valid-columns( $columns, $silent: false ) { $type: type-of($columns); $return: null; @if $type == number and unitless($columns) { $return: $columns; } @else if $type == list { $fail: null; @each $col in $columns { @if type-of($col) == number { $fail: $fail or if(unitless($col), null, true); } @else { $fail: true; } } $return: if($fail, $return, $columns); } @if $return != $columns and not($silent) { $return: null; $warn: '$columns must be a unitless number or list of unitless numbers.'; @warn $warn + ' Current value [#{$type}]: #{$columns}'; } @return $return; } // Valid Gutters // ------------- // Check that a gutter setting is valid. @function valid-gutters( $gutters, $silent: false ) { $type: type-of($gutters); $return: null; @if $type == number and unitless($gutters) { $return: $gutters; } @else if not($silent) { $warn: '$gutters must be a unitless number.'; @warn $warn + ' Current value [#{$type}]: #{$gutters}'; } @return $return; } ================================================ FILE: _talks/2012-03-01-talk-1.md ================================================ --- title: "Talk 1 on Relevant Topic in Your Field" collection: talks type: "Talk" permalink: /talks/2012-03-01-talk-1 venue: "UC San Francisco, Department of Testing" date: 2012-03-01 location: "San Francisco, CA, USA" --- This is a description of your talk, which is a markdown file that can be all markdown-ified like any other post. Yay markdown! ================================================ FILE: _talks/2013-03-01-tutorial-1.md ================================================ --- title: "Tutorial 1 on Relevant Topic in Your Field" collection: talks type: "Tutorial" permalink: /talks/2013-03-01-tutorial-1 venue: "UC-Berkeley Institute for Testing Science" date: 2013-03-01 location: "Berkeley, CA, USA" --- [More information here](http://exampleurl.com) This is a description of your tutorial, note the different field in type. This is a markdown files that can be all markdown-ified like any other post. Yay markdown! ================================================ FILE: _talks/2014-02-01-talk-2.md ================================================ --- title: "Talk 2 on Relevant Topic in Your Field" collection: talks type: "Talk" permalink: /talks/2014-02-01-talk-2 venue: "London School of Testing" date: 2014-02-01 location: "London, UK" --- [More information here](http://example2.com) This is a description of your talk, which is a markdown files that can be all markdown-ified like any other post. Yay markdown! ================================================ FILE: _talks/2014-03-01-talk-3.md ================================================ --- title: "Conference Proceeding talk 3 on Relevant Topic in Your Field" collection: talks type: "Conference proceedings talk" permalink: /talks/2014-03-01-talk-3 venue: "Testing Institute of America 2014 Annual Conference" date: 2014-03-01 location: "Los Angeles, CA, USA" --- This is a description of your conference proceedings talk, note the different field in type. You can put anything in this field. ================================================ FILE: _teaching/2014-spring-teaching-1.md ================================================ --- title: "Teaching experience 1" collection: teaching type: "Undergraduate course" permalink: /teaching/2014-spring-teaching-1 venue: "University 1, Department" date: 2014-01-01 location: "City, Country" --- This is a description of a teaching experience. You can use markdown like any other post. Heading 1 ====== Heading 2 ====== Heading 3 ====== ================================================ FILE: _teaching/2015-spring-teaching-2.md ================================================ --- title: "Teaching experience 2" collection: teaching type: "Workshop" permalink: /teaching/2015-spring-teaching-1 venue: "University 1, Department" date: 2015-01-01 location: "City, Country" --- This is a description of a teaching experience. You can use markdown like any other post. Heading 1 ====== Heading 2 ====== Heading 3 ====== ================================================ FILE: assets/css/academicons.css ================================================ /* * Academicons 1.9.4 by James Walsh (https://github.com/jpswalsh) and Katja Bercic (https://github.com/katjabercic) * Fonts generated using FontForge - https://fontforge.org * Square icons designed to be used alongside Font Awesome square icons - https://fortawesome.github.io/Font-Awesome/ * Licenses - Font: SIL OFL 1.1, CSS: MIT License */ @font-face { font-family: 'Academicons'; font-style: normal; font-weight: 400; font-display: block; src:url('../fonts/academicons.eot'); src:url('../fonts/academicons.eot') format('embedded-opentype'), url('../fonts/academicons.ttf') format('truetype'), url('../fonts/academicons.woff') format('woff'), url('../fonts/academicons.svg') format('svg'); } .ai { font-family: 'Academicons'; font-weight: 400; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; display: inline-block; font-style: normal; font-variant: normal; text-rendering: auto; line-height: 1; } .ai-academia:before { content: "\e9af"; } .ai-academia-square:before { content: "\e93d"; } .ai-acclaim:before { content: "\e92e"; } .ai-acclaim-square:before { content: "\e93a"; } .ai-acm:before { content: "\e93c"; } .ai-acm-square:before { content: "\e95d"; } .ai-acmdl:before { content: "\e96a"; } .ai-acmdl-square:before { content: "\e9d3"; } .ai-ads:before { content: "\e9cb"; } .ai-ads-square:before { content: "\e94a"; } .ai-africarxiv:before { content: "\e91b"; } .ai-africarxiv-square:before { content: "\e90b"; } .ai-archive:before { content: "\e955"; } .ai-archive-square:before { content: "\e956"; } .ai-arxiv:before { content: "\e974"; } .ai-arxiv-square:before { content: "\e9a6"; } .ai-biorxiv:before { content: "\e9a2"; } .ai-biorxiv-square:before { content: "\e98b"; } .ai-ceur:before { content: "\e96d"; } .ai-ceur-square:before { content: "\e92f"; } .ai-ciencia-vitae:before { content: "\e912"; } .ai-ciencia-vitae-square:before { content: "\e913"; } .ai-clarivate:before { content: "\e924"; } .ai-clarivate-square:before { content: "\e925"; } .ai-closed-access:before { content: "\e942"; } .ai-closed-access-square:before { content: "\e943"; } .ai-conversation:before { content: "\e94c"; } .ai-conversation-square:before { content: "\e915"; } .ai-coursera:before { content: "\e95f"; } .ai-coursera-square:before { content: "\e97f"; } .ai-crossref:before { content: "\e918"; } .ai-crossref-square:before { content: "\e919"; } .ai-cv:before { content: "\e9a5"; } .ai-cv-square:before { content: "\e90a"; } .ai-datacite:before { content: "\e91c"; } .ai-datacite-square:before { content: "\e91d"; } .ai-dataverse:before { content: "\e9f7"; } .ai-dataverse-square:before { content: "\e9e4"; } .ai-dblp:before { content: "\e94f"; } .ai-dblp-square:before { content: "\e93f"; } .ai-depsy:before { content: "\e97a"; } .ai-depsy-square:before { content: "\e94b"; } .ai-doi:before { content: "\e97e"; } .ai-doi-square:before { content: "\e98f"; } .ai-dryad:before { content: "\e97c"; } .ai-dryad-square:before { content: "\e98c"; } .ai-elsevier:before { content: "\e961"; } .ai-elsevier-square:before { content: "\e910"; } .ai-figshare:before { content: "\e981"; } .ai-figshare-square:before { content: "\e9e7"; } .ai-google-scholar:before { content: "\e9d4"; } .ai-google-scholar-square:before { content: "\e9f9"; } .ai-hal:before { content: "\e92c"; } .ai-hal-square:before { content: "\e92d"; } .ai-hypothesis:before { content: "\e95a"; } .ai-hypothesis-square:before { content: "\e95b"; } .ai-ideas-repec:before { content: "\e9ed"; } .ai-ideas-repec-square:before { content: "\e9f8"; } .ai-ieee:before { content: "\e929"; } .ai-ieee-square:before { content: "\e9b9"; } .ai-impactstory:before { content: "\e9cf"; } .ai-impactstory-square:before { content: "\e9aa"; } .ai-inaturalist:before { content: "\e900"; } .ai-inaturalist-square:before { content: "\e901"; } .ai-inpn:before { content: "\e902"; } .ai-inpn-square:before { content: "\e903"; } .ai-inspire:before { content: "\e9e9"; } .ai-inspire-square:before { content: "\e9fe"; } .ai-isidore:before { content: "\e936"; } .ai-isidore-square:before { content: "\e954"; } .ai-isni:before { content: "\e957"; } .ai-isni-square:before { content: "\e958"; } .ai-jstor:before { content: "\e938"; } .ai-jstor-square:before { content: "\e944"; } .ai-lattes:before { content: "\e9b3"; } .ai-lattes-square:before { content: "\e99c"; } .ai-mathoverflow:before { content: "\e9f6"; } .ai-mathoverflow-square:before { content: "\e97b"; } .ai-mendeley:before { content: "\e9f0"; } .ai-mendeley-square:before { content: "\e9f3"; } .ai-moodle:before { content: "\e907"; } .ai-moodle-square:before { content: "\e908"; } .ai-mtmt:before { content: "\e950"; } .ai-mtmt-square:before { content: "\e951"; } .ai-nakala:before { content: "\e940"; } .ai-nakala-square:before { content: "\e941"; } .ai-obp:before { content: "\e92a"; } .ai-obp-square:before { content: "\e92b"; } .ai-open-access:before { content: "\e939"; } .ai-open-access-square:before { content: "\e9f4"; } .ai-open-data:before { content: "\e966"; } .ai-open-data-square:before { content: "\e967"; } .ai-open-materials:before { content: "\e968"; } .ai-open-materials-square:before { content: "\e969"; } .ai-openedition:before { content: "\e946"; } .ai-openedition-square:before { content: "\e947"; } .ai-orcid:before { content: "\e9d9"; } .ai-orcid-square:before { content: "\e9c3"; } .ai-osf:before { content: "\e9ef"; } .ai-osf-square:before { content: "\e931"; } .ai-overleaf:before { content: "\e914"; } .ai-overleaf-square:before { content: "\e98d"; } .ai-philpapers:before { content: "\e98a"; } .ai-philpapers-square:before { content: "\e96f"; } .ai-piazza:before { content: "\e99a"; } .ai-piazza-square:before { content: "\e90c"; } .ai-preregistered:before { content: "\e906"; } .ai-preregistered-square:before { content: "\e96b"; } .ai-protocols:before { content: "\e952"; } .ai-protocols-square:before { content: "\e953"; } .ai-psyarxiv:before { content: "\e90e"; } .ai-psyarxiv-square:before { content: "\e90f"; } .ai-publons:before { content: "\e937"; } .ai-publons-square:before { content: "\e94e"; } .ai-pubmed:before { content: "\e99f"; } .ai-pubmed-square:before { content: "\e97d"; } .ai-pubpeer:before { content: "\e922"; } .ai-pubpeer-square:before { content: "\e923"; } .ai-researcherid:before { content: "\e91a"; } .ai-researcherid-square:before { content: "\e95c"; } .ai-researchgate:before { content: "\e95e"; } .ai-researchgate-square:before { content: "\e99e"; } .ai-ror:before { content: "\e948"; } .ai-ror-square:before { content: "\e949"; } .ai-sci-hub:before { content: "\e959"; } .ai-sci-hub-square:before { content: "\e905"; } .ai-scirate:before { content: "\e98e"; } .ai-scirate-square:before { content: "\e99d"; } .ai-scopus:before { content: "\e91e"; } .ai-scopus-square:before { content: "\e91f"; } .ai-semantic-scholar:before { content: "\e96e"; } .ai-semantic-scholar-square:before { content: "\e96c"; } .ai-springer:before { content: "\e928"; } .ai-springer-square:before { content: "\e99b"; } .ai-ssrn:before { content: "\e916"; } .ai-ssrn-square:before { content: "\e917"; } .ai-stackoverflow:before { content: "\e920"; } .ai-stackoverflow-square:before { content: "\e921"; } .ai-viaf:before { content: "\e933"; } .ai-viaf-square:before { content: "\e934"; } .ai-wiley:before { content: "\e926"; } .ai-wiley-square:before { content: "\e927"; } .ai-zenodo:before { content: "\e911"; } .ai-zotero:before { content: "\e962"; } .ai-zotero-square:before { content: "\e932"; } /* Duplication of the FontAwesome style classes using 'ai' in place of 'fa'. */ .ai-lg { font-size: 1.33333em; line-height: 0.75em; vertical-align: -.0667em; } .ai-xs { font-size: .75em; } .ai-sm { font-size: .875em; } .ai-1x { font-size: 1em; } .ai-2x { font-size: 2em; } .ai-3x { font-size: 3em; } .ai-4x { font-size: 4em; } .ai-5x { font-size: 5em; } .ai-6x { font-size: 6em; } .ai-7x { font-size: 7em; } .ai-8x { font-size: 8em; } .ai-9x { font-size: 9em; } .ai-10x { font-size: 10em; } .ai-fw { text-align: center; width: 1.25em; } .ai-ul { list-style-type: none; margin-left: 2.5em; padding-left: 0; } .ai-ul > li { position: relative; } .ai-li { left: -2em; position: absolute; text-align: center; width: 2em; line-height: inherit; } .ai-border { border: solid 0.08em #eee; border-radius: .1em; padding: .2em .25em .15em; } .ai-pull-left { float: left; } .ai-pull-right { float: right; } .ai.ai-pull-left { margin-right: .3em; } .ai.ai-pull-right { margin-right: .3em; } .ai-stack { display: inline-block; height: 2em; line-height: 2em; position: relative; vertical-align: middle; width: 2.5em; } .ai-stack-1x, .ai-stack-2x { left: 0; position: absolute; text-align: center; width: 100%; } .ai-stack-1x { line-height: inherit; } .ai-stack-2x { font-size: 2em; } .ai-inverse { color: #fff; } ================================================ FILE: assets/css/collapse.css ================================================ .container { width:100%; border:1px solid #d3d3d3; } .container div { width:100%; } .container .header { background-color:#d3d3d3; padding: 2px; cursor: pointer; font-weight: bold; } .container .content { display: none; padding : 5px; } ================================================ FILE: assets/css/main.scss ================================================ --- --- /* * This file controls what is imported from /_sass * * Note that the files are processed in the order they are imported, so they are partly sorted by the dependencies. Also, the first two lines of the file are required by Jekyll. */ @import "vendor/breakpoint/breakpoint", "themes", "theme/{{ site.site_theme | default: 'default' | append: '_light' }}", "theme/{{ site.site_theme | default: 'default' | append: '_dark' }}", "include/mixins", "vendor/susy/susy", "layout/reset", "layout/base", "include/utilities", "layout/tables", "layout/buttons", "layout/notices", "layout/masthead", "layout/navigation", "layout/footer", "syntax", "layout/forms", "layout/page", "layout/archive", "layout/sidebar", "layout/json_cv", "vendor/font-awesome/fontawesome", "vendor/font-awesome/solid", "vendor/font-awesome/brands" ; ================================================ FILE: assets/js/_main.js ================================================ /* ========================================================================== Various functions that we want to use within the template ========================================================================== */ // Determine the expected state of the theme toggle, which can be "dark", "light", or // "system". Default is "system". let determineThemeSetting = () => { let themeSetting = localStorage.getItem("theme"); return (themeSetting != "dark" && themeSetting != "light" && themeSetting != "system") ? "system" : themeSetting; }; // Determine the computed theme, which can be "dark" or "light". If the theme setting is // "system", the computed theme is determined based on the user's system preference. let determineComputedTheme = () => { let themeSetting = determineThemeSetting(); if (themeSetting != "system") { return themeSetting; } return (userPref && userPref("(prefers-color-scheme: dark)").matches) ? "dark" : "light"; }; // detect OS/browser preference const browserPref = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; // Set the theme on page load or when explicitly called let setTheme = (theme) => { const use_theme = theme || localStorage.getItem("theme") || $("html").attr("data-theme") || browserPref; if (use_theme === "dark") { $("html").attr("data-theme", "dark"); $("#theme-icon").removeClass("fa-sun").addClass("fa-moon"); } else if (use_theme === "light") { $("html").removeAttr("data-theme"); $("#theme-icon").removeClass("fa-moon").addClass("fa-sun"); } }; // Toggle the theme manually var toggleTheme = () => { const current_theme = $("html").attr("data-theme"); const new_theme = current_theme === "dark" ? "light" : "dark"; localStorage.setItem("theme", new_theme); setTheme(new_theme); }; /* ========================================================================== Plotly integration script so that Markdown codeblocks will be rendered ========================================================================== */ // Read the Plotly data from the code block, hide it, and render the chart as new node. This allows for the // JSON data to be retrieve when the theme is switched. The listener should only be added if the data is // actually present on the page. import { plotlyDarkLayout, plotlyLightLayout } from './theme.js'; let plotlyElements = document.querySelectorAll("pre>code.language-plotly"); if (plotlyElements.length > 0) { document.addEventListener("readystatechange", () => { if (document.readyState === "complete") { plotlyElements.forEach((elem) => { // Parse the Plotly JSON data and hide it var jsonData = JSON.parse(elem.textContent); elem.parentElement.classList.add("hidden"); // Add the Plotly node let chartElement = document.createElement("div"); elem.parentElement.after(chartElement); // Set the theme for the plot and render it const theme = (determineComputedTheme() === "dark") ? plotlyDarkLayout : plotlyLightLayout; if (jsonData.layout) { jsonData.layout.template = (jsonData.layout.template) ? { ...theme, ...jsonData.layout.template } : theme; } else { jsonData.layout = { template: theme }; } Plotly.react(chartElement, jsonData.data, jsonData.layout); }); } }); } /* ========================================================================== Actions that should occur when the page has been fully loaded ========================================================================== */ $(document).ready(function () { // SCSS SETTINGS - These should be the same as the settings in the relevant files const scssLarge = 925; // pixels, from /_sass/_themes.scss const scssMastheadHeight = 70; // pixels, from the current theme (e.g., /_sass/theme/_default.scss) // If the user hasn't chosen a theme, follow the OS preference setTheme(); window.matchMedia('(prefers-color-scheme: dark)') .addEventListener("change", (e) => { if (!localStorage.getItem("theme")) { setTheme(e.matches ? "dark" : "light"); } }); // Enable the theme toggle $('#theme-toggle').on('click', toggleTheme); // Enable the sticky footer var bumpIt = function () { $("body").css("padding-bottom", "0"); $("body").css("margin-bottom", $(".page__footer").outerHeight(true)); } $(window).resize(function () { didResize = true; }); setInterval(function () { if (didResize) { didResize = false; bumpIt(); }}, 250); var didResize = false; bumpIt(); // FitVids init fitvids(); // Follow menu drop down $(".author__urls-wrapper button").on("click", function () { $(".author__urls").fadeToggle("fast", function () { }); $(".author__urls-wrapper button").toggleClass("open"); }); // Restore the follow menu if toggled on a window resize jQuery(window).on('resize', function () { if ($('.author__urls.social-icons').css('display') == 'none' && $(window).width() >= scssLarge) { $(".author__urls").css('display', 'block') } }); // Init smooth scroll, this needs to be slightly more than then fixed masthead height $("a").smoothScroll({ offset: -scssMastheadHeight, preventDefault: false, }); }); ================================================ FILE: assets/js/collapse.js ================================================ $(".header").click(function () { $header = $(this); //getting the next element $content = $header.next(); //open up the content needed - toggle the slide- if visible, slide up, if not slidedown. $content.slideToggle(500, function () { //execute this after slideToggle is done //change text of header based on visibility of content div $header.text(function () { //change text based on condition return $content.is(":visible") ? "Collapse" : "Expand"; }); }); }); ================================================ FILE: assets/js/plugins/jquery.greedy-navigation.js ================================================ /* * Greedy Navigation * * http://codepen.io/lukejacksonn/pen/PwmwWV * */ var $nav = $('#site-nav'); var $btn = $('#site-nav button'); var $vlinks = $('#site-nav .visible-links'); var $vlinks_persist_tail = $vlinks.children("*.persist.tail"); var $hlinks = $('#site-nav .hidden-links'); var breaks = []; function updateNav() { var availableSpace = $btn.hasClass('hidden') ? $nav.width() : $nav.width() - $btn.width() - 30; // The visible list is overflowing the nav if ($vlinks.width() > availableSpace) { while ($vlinks.width() > availableSpace && $vlinks.children("*:not(.persist)").length > 0) { // Record the width of the list breaks.push($vlinks.width()); // Move item to the hidden list $vlinks.children("*:not(.persist)").last().prependTo($hlinks); availableSpace = $btn.hasClass("hidden") ? $nav.width() : $nav.width() - $btn.width() - 30; // Show the dropdown btn $btn.removeClass("hidden"); } // The visible list is not overflowing } else { // There is space for another item in the nav while (breaks.length > 0 && availableSpace > breaks[breaks.length - 1]) { // Move the item to the visible list if ($vlinks_persist_tail.children().length > 0) { $hlinks.children().first().insertBefore($vlinks_persist_tail); } else { $hlinks.children().first().appendTo($vlinks); } breaks.pop(); } // Hide the dropdown btn if hidden list is empty if (breaks.length < 1) { $btn.addClass('hidden'); $btn.removeClass('close'); $hlinks.addClass('hidden'); } } // Keep counter updated $btn.attr("count", breaks.length); // update masthead height and the body/sidebar top padding var mastheadHeight = $('.masthead').height(); $('body').css('padding-top', mastheadHeight + 'px'); if ($(".author__urls-wrapper button").is(":visible")) { $(".sidebar").css("padding-top", ""); } else { $(".sidebar").css("padding-top", mastheadHeight + "px"); } } // Window listeners $(window).on('resize', function () { updateNav(); }); screen.orientation.addEventListener("change", function () { updateNav(); }); $btn.on('click', function () { $hlinks.toggleClass('hidden'); $(this).toggleClass('close'); }); updateNav(); ================================================ FILE: assets/js/theme.js ================================================ // dark theme extracted from https://github.com/plotly/plotly.py/blob/main/plotly/package_data/templates/plotly_dark.json?raw=true export const plotlyDarkLayout = {"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#f2f5fa"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"rgb(17,17,17)","plot_bgcolor":"rgb(17,17,17)","polar":{"bgcolor":"rgb(17,17,17)","angularaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"radialaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"ternary":{"bgcolor":"rgb(17,17,17)","aaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"baxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"caxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3","gridwidth":2},"yaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3","gridwidth":2},"zaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3","gridwidth":2}},"shapedefaults":{"line":{"color":"#f2f5fa"}},"annotationdefaults":{"arrowcolor":"#f2f5fa","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"rgb(17,17,17)","landcolor":"rgb(17,17,17)","subunitcolor":"#506784","showland":true,"showlakes":true,"lakecolor":"rgb(17,17,17)"},"title":{"x":0.05},"updatemenudefaults":{"bgcolor":"#506784","borderwidth":0},"sliderdefaults":{"bgcolor":"#C8D4E3","borderwidth":1,"bordercolor":"rgb(17,17,17)","tickwidth":0},"mapbox":{"style":"dark"}},"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"marker":{"line":{"color":"#283442"}},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#f2f5fa"},"error_y":{"color":"#f2f5fa"},"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"marker":{"line":{"color":"#283442"}},"type":"scattergl"}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermap":[{"type":"scattermap","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"baxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#506784"},"line":{"color":"rgb(17,17,17)"}},"header":{"fill":{"color":"#2a3f5f"},"line":{"color":"rgb(17,17,17)"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]}}; // light theme extracted from https://github.com/plotly/plotly.py/blob/main/plotly/package_data/templates/plotly_white.json?raw=true export const plotlyLightLayout = {"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"bgcolor":"white","angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"ternary":{"bgcolor":"white","aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8","gridwidth":2},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8","gridwidth":2},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"white","subunitcolor":"#C8D4E3","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}},"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermap":[{"type":"scattermap","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]}}; ================================================ FILE: docker-compose.yaml ================================================ services: jekyll-site: image: jekyll-site build: . volumes: [ .:/usr/src/app ] ports: [ 4000:4000 ] user: 1000:1000 environment: [ JEKYLL_ENV=docker ] command: jekyll serve -H 0.0.0.0 -w --config _config.yml,_config_docker.yml ================================================ FILE: files/bibtex1.bib ================================================ @article{Alice2023example, title={An Example Article}, author={Alice, Bob and Charlie}, journal={Journal of Examples}, volume={12}, number={3}, pages={123--456}, year={2023}, publisher={Example Publisher} } ================================================ FILE: images/manifest.json ================================================ { "name": "OOjs UI icon academic-progressive", "icons": [ { "src": "/images/favicon-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/images/favicon-512x512.png", "sizes": "512x512", "type": "image/png" } ] } ================================================ FILE: markdown_generator/OrcidToBib.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": null, "id": "01f0c5c2-619a-48e0-bb7c-e5e0be009f0e", "metadata": {}, "outputs": [], "source": [ "orcid = '0000-0000-0000-0000' # Fill your orcid here" ] }, { "cell_type": "code", "execution_count": null, "id": "2fe4bc4e-4574-4322-8b18-0c4d33a749fa", "metadata": {}, "outputs": [], "source": [ "import requests" ] }, { "cell_type": "markdown", "id": "44a8b6cd-4034-4fc4-85a8-e3431dc564f1", "metadata": {}, "source": [ "We use the `/works` api to list all works related to the orcid. This gives a summary of all works, so citation information is not included. We collect the `put-code` of all works to retrieve the citation information later." ] }, { "cell_type": "code", "execution_count": null, "id": "3b04331e-4149-4ca3-a0aa-89e3ba892723", "metadata": {}, "outputs": [], "source": [ "response = requests.get('https://pub.orcid.org/v3.0/{}/works'.format(orcid),\n", " headers={\"Accept\": \"application/orcid+json\" })\n", "record = response.json()" ] }, { "cell_type": "code", "execution_count": null, "id": "16f7c42d-623b-421a-8d87-bbb389313e3b", "metadata": { "scrolled": true }, "outputs": [], "source": [ "put_codes = []\n", "for work in record['group']:\n", " put_code = work['work-summary'][0]['put-code']\n", " put_codes.append(put_code)\n", "put_code = put_codes[0]" ] }, { "cell_type": "markdown", "id": "25e5d2aa-5233-486e-abce-a0d07a36c5ce", "metadata": {}, "source": [ "We use the `//work/` endpoint to retrieve the citation information for each record." ] }, { "cell_type": "code", "execution_count": null, "id": "dd797a16-0d91-4271-8e1e-b82579a07e45", "metadata": {}, "outputs": [], "source": [ "citations = []\n", "for put_code in put_codes:\n", " response = requests.get('https://pub.orcid.org/v3.0/{}/work/{}'.format(orcid, put_code),\n", " headers={\"Accept\": \"application/orcid+json\" })\n", " work = response.json()\n", " if work['citation'] is not None:\n", " citations.append(work['citation']['citation-value'])" ] }, { "cell_type": "code", "execution_count": null, "id": "ad763df9-261f-41f3-bc32-00921d0a4e11", "metadata": {}, "outputs": [], "source": [ "with open('output.bib', 'w') as bibfile:\n", " for citation in citations:\n", " bibfile.write(citation)\n", " bibfile.write('\\n')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.6" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: markdown_generator/PubsFromBib.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Publications markdown generator for academicpages\n", "\n", "Takes a set of bibtex of publications and converts them for use with [academicpages.github.io](academicpages.github.io). This is an interactive Jupyter notebook ([see more info here](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html)). \n", "\n", "The core python code is also in `pubsFromBibs.py`. \n", "Run either from the `markdown_generator` folder after replacing updating the publist dictionary with:\n", "* bib file names\n", "* specific venue keys based on your bib file preferences\n", "* any specific pre-text for specific files\n", "* Collection Name (future feature)\n", "\n", "TODO: Make this work with other databases of citations, \n", "TODO: Merge this with the existing TSV parsing solution" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from pybtex.database.input import bibtex\n", "import pybtex.database.input.bibtex \n", "from time import strptime\n", "import string\n", "import html\n", "import os\n", "import re" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#todo: incorporate different collection types rather than a catch all publications, requires other changes to template\n", "publist = {\n", " \"proceeding\": {\n", " \"file\" : \"proceedings.bib\",\n", " \"venuekey\": \"booktitle\",\n", " \"venue-pretext\": \"In the proceedings of \",\n", " \"collection\" : {\"name\":\"publications\",\n", " \"permalink\":\"/publication/\"}\n", " \n", " },\n", " \"journal\":{\n", " \"file\": \"pubs.bib\",\n", " \"venuekey\" : \"journal\",\n", " \"venue-pretext\" : \"\",\n", " \"collection\" : {\"name\":\"publications\",\n", " \"permalink\":\"/publication/\"}\n", " } \n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "html_escape_table = {\n", " \"&\": \"&\",\n", " '\"': \""\",\n", " \"'\": \"'\"\n", " }\n", "\n", "def html_escape(text):\n", " \"\"\"Produce entities within text.\"\"\"\n", " return \"\".join(html_escape_table.get(c,c) for c in text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "for pubsource in publist:\n", " parser = bibtex.Parser()\n", " bibdata = parser.parse_file(publist[pubsource][\"file\"])\n", "\n", " #loop through the individual references in a given bibtex file\n", " for bib_id in bibdata.entries:\n", " #reset default date\n", " pub_year = \"1900\"\n", " pub_month = \"01\"\n", " pub_day = \"01\"\n", " \n", " b = bibdata.entries[bib_id].fields\n", " \n", " try:\n", " pub_year = f'{b[\"year\"]}'\n", "\n", " #todo: this hack for month and day needs some cleanup\n", " if \"month\" in b.keys(): \n", " if(len(b[\"month\"])<3):\n", " pub_month = \"0\"+b[\"month\"]\n", " pub_month = pub_month[-2:]\n", " elif(b[\"month\"] not in range(12)):\n", " tmnth = strptime(b[\"month\"][:3],'%b').tm_mon \n", " pub_month = \"{:02d}\".format(tmnth) \n", " else:\n", " pub_month = str(b[\"month\"])\n", " if \"day\" in b.keys(): \n", " pub_day = str(b[\"day\"])\n", "\n", " \n", " pub_date = pub_year+\"-\"+pub_month+\"-\"+pub_day\n", " \n", " #strip out {} as needed (some bibtex entries that maintain formatting)\n", " clean_title = b[\"title\"].replace(\"{\", \"\").replace(\"}\",\"\").replace(\"\\\\\",\"\").replace(\" \",\"-\") \n", "\n", " url_slug = re.sub(\"\\\\[.*\\\\]|[^a-zA-Z0-9_-]\", \"\", clean_title)\n", " url_slug = url_slug.replace(\"--\",\"-\")\n", "\n", " md_filename = (str(pub_date) + \"-\" + url_slug + \".md\").replace(\"--\",\"-\")\n", " html_filename = (str(pub_date) + \"-\" + url_slug).replace(\"--\",\"-\")\n", "\n", " #Build Citation from text\n", " citation = \"\"\n", "\n", " #citation authors - todo - add highlighting for primary author?\n", " for author in bibdata.entries[bib_id].persons[\"author\"]:\n", " citation = citation+\" \"+author.first_names[0]+\" \"+author.last_names[0]+\", \"\n", "\n", " #citation title\n", " citation = citation + \"\\\"\" + html_escape(b[\"title\"].replace(\"{\", \"\").replace(\"}\",\"\").replace(\"\\\\\",\"\")) + \".\\\"\"\n", "\n", " #add venue logic depending on citation type\n", " venue = publist[pubsource][\"venue-pretext\"]+b[publist[pubsource][\"venuekey\"]].replace(\"{\", \"\").replace(\"}\",\"\").replace(\"\\\\\",\"\")\n", "\n", " citation = citation + \" \" + html_escape(venue)\n", " citation = citation + \", \" + pub_year + \".\"\n", "\n", " \n", " ## YAML variables\n", " md = \"---\\ntitle: \\\"\" + html_escape(b[\"title\"].replace(\"{\", \"\").replace(\"}\",\"\").replace(\"\\\\\",\"\")) + '\"\\n'\n", " \n", " md += \"\"\"collection: \"\"\" + publist[pubsource][\"collection\"][\"name\"]\n", "\n", " md += \"\"\"\\npermalink: \"\"\" + publist[pubsource][\"collection\"][\"permalink\"] + html_filename\n", " \n", " note = False\n", " if \"note\" in b.keys():\n", " if len(str(b[\"note\"])) > 5:\n", " md += \"\\nexcerpt: '\" + html_escape(b[\"note\"]) + \"'\"\n", " note = True\n", "\n", " md += \"\\ndate: \" + str(pub_date) \n", "\n", " md += \"\\nvenue: '\" + html_escape(venue) + \"'\"\n", " \n", " url = False\n", " if \"url\" in b.keys():\n", " if len(str(b[\"url\"])) > 5:\n", " md += \"\\npaperurl: '\" + b[\"url\"] + \"'\"\n", " url = True\n", "\n", " md += \"\\ncitation: '\" + html_escape(citation) + \"'\"\n", "\n", " md += \"\\n---\"\n", "\n", " \n", " ## Markdown description for individual page\n", " if note:\n", " md += \"\\n\" + html_escape(b[\"note\"]) + \"\\n\"\n", "\n", " if url:\n", " md += \"\\n[Access paper here](\" + b[\"url\"] + \"){:target=\\\"_blank\\\"}\\n\" \n", " else:\n", " md += \"\\nUse [Google Scholar](https://scholar.google.com/scholar?q=\"+html.escape(clean_title.replace(\"-\",\"+\"))+\"){:target=\\\"_blank\\\"} for full citation\"\n", "\n", " md_filename = os.path.basename(md_filename)\n", "\n", " with open(\"../_publications/\" + md_filename, 'w', encoding=\"utf-8\") as f:\n", " f.write(md)\n", " print(f'SUCESSFULLY PARSED {bib_id}: \\\"', b[\"title\"][:60],\"...\"*(len(b['title'])>60),\"\\\"\")\n", " # field may not exist for a reference\n", " except KeyError as e:\n", " print(f'WARNING Missing Expected Field {e} from entry {bib_id}: \\\"', b[\"title\"][:30],\"...\"*(len(b['title'])>30),\"\\\"\")\n", " continue\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: markdown_generator/README.md ================================================ # Markdown Generator This directory contains various ways of creating Markdown for your site. In general, filenames that end with `.ipynb` or `.py` are similar, but may contain different documentation or are intended to be run from with GitHub when deploying your site. ## Python Scripts The .py files are Python scripts that that can be run from the command line (ex., `python3 publications.py publications.csv`) with the objective of also ensuring that they have reduced requirements for packages, which may allow them to run when deploying your site from within GitHub. ## Jupyter Notebooks These .ipynb files are Jupyter notebook files that convert a TSV containing structured data about talks (`talks.tsv`) or presentations (`presentations.tsv`) into individual markdown files that will be properly formatted for the academicpages template. The notebooks contain a lot of documentation about the process. ================================================ FILE: markdown_generator/publications.csv ================================================ pub_date,title,venue,excerpt,citation,url_slug,paper_url,slides_url,category 2009-10-01,Paper Title Number 1,Journal 1,This paper is about the number 1. The number 2 is left for future work.,"Your Name, You. (2009). ""Paper Title Number 1."" Journal 1. 1(1).",paper-title-number-1,https://academicpages.github.io/files/paper1.pdf,http://academicpages.github.io/files/slides1.pdf,manuscripts 2010-10-01,Paper Title Number 2,Journal 1,This paper is about the number 2. The number 3 is left for future work.,"Your Name, You. (2010). ""Paper Title Number 2."" Journal 1. 1(2).",paper-title-number-2,https://academicpages.github.io/files/paper2.pdf,http://academicpages.github.io/files/slides2.pdf,manuscripts 2015-10-01,Paper Title Number 3,Journal 1,This paper is about the number 3. The number 4 is left for future work.,"Your Name, You. (2015). ""Paper Title Number 3."" Journal 1. 1(3).",paper-title-number-3,https://academicpages.github.io/files/paper3.pdf,http://academicpages.github.io/files/slides3.pdf,manuscripts ================================================ FILE: markdown_generator/publications.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Publications markdown generator for academicpages\n", "\n", "Takes a TSV of publications with metadata and converts them for use with [academicpages.github.io](academicpages.github.io). This is an interactive Jupyter notebook ([see more info here](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html)). The core python code is also in `publications.py`. Run either from the `markdown_generator` folder after replacing `publications.tsv` with one containing your data.\n", "\n", "TODO: Make this work with BibTex and other databases of citations, rather than Stuart's non-standard TSV format and citation style.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data format\n", "\n", "The TSV needs to have the following columns: pub_date, title, venue, excerpt, citation, site_url, and paper_url, with a header at the top. \n", "\n", "- `excerpt` and `paper_url` can be blank, but the others must have values. \n", "- `pub_date` must be formatted as YYYY-MM-DD.\n", "- `url_slug` will be the descriptive part of the .md file and the permalink URL for the page about the paper. The .md file will be `YYYY-MM-DD-[url_slug].md` and the permalink will be `https://[yourdomain]/publications/YYYY-MM-DD-[url_slug]`\n", "\n", "This is how the raw file looks (it doesn't look pretty, use a spreadsheet or other program to edit and create)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pub_date\ttitle\tvenue\texcerpt\tcitation\turl_slug\tpaper_url\tslides_url\n", "2009-10-01\tPaper Title Number 1\tJournal 1\tThis paper is about the number 1. The number 2 is left for future work.\tYour Name, You. (2009). \"Paper Title Number 1.\" Journal 1. 1(1).\tpaper-title-number-1\thttp://academicpages.github.io/files/paper1.pdf\thttp://academicpages.github.io/files/slides1.pdf\n", "2010-10-01\tPaper Title Number 2\tJournal 1\tThis paper is about the number 2. The number 3 is left for future work.\tYour Name, You. (2010). \"Paper Title Number 2.\" Journal 1. 1(2).\tpaper-title-number-2\thttp://academicpages.github.io/files/paper2.pdf\thttp://academicpages.github.io/files/slides2.pdf\n", "2015-10-01\tPaper Title Number 3\tJournal 1\tThis paper is about the number 3. The number 4 is left for future work.\tYour Name, You. (2015). \"Paper Title Number 3.\" Journal 1. 1(3).\tpaper-title-number-3\thttp://academicpages.github.io/files/paper3.pdf\thttp://academicpages.github.io/files/slides3.pdf" ] } ], "source": [ "!cat publications.tsv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import pandas\n", "\n", "We are using the very handy pandas library for dataframes." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import TSV\n", "\n", "Pandas makes this easy with the read_csv function. We are using a TSV, so we specify the separator as a tab, or `\\t`.\n", "\n", "I found it important to put this data in a tab-separated values format, because there are a lot of commas in this kind of data and comma-separated values can get messed up. However, you can modify the import statement, as pandas also has read_excel(), read_json(), and others." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
    \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
    pub_datetitlevenueexcerptcitationurl_slugpaper_urlslides_url
    02009-10-01Paper Title Number 1Journal 1This paper is about the number 1. The number 2...Your Name, You. (2009). \"Paper Title Number 1....paper-title-number-1http://academicpages.github.io/files/paper1.pdfhttp://academicpages.github.io/files/slides1.pdf
    12010-10-01Paper Title Number 2Journal 1This paper is about the number 2. The number 3...Your Name, You. (2010). \"Paper Title Number 2....paper-title-number-2http://academicpages.github.io/files/paper2.pdfhttp://academicpages.github.io/files/slides2.pdf
    22015-10-01Paper Title Number 3Journal 1This paper is about the number 3. The number 4...Your Name, You. (2015). \"Paper Title Number 3....paper-title-number-3http://academicpages.github.io/files/paper3.pdfhttp://academicpages.github.io/files/slides3.pdf
    \n", "
    " ], "text/plain": [ " pub_date title venue \\\n", "0 2009-10-01 Paper Title Number 1 Journal 1 \n", "1 2010-10-01 Paper Title Number 2 Journal 1 \n", "2 2015-10-01 Paper Title Number 3 Journal 1 \n", "\n", " excerpt \\\n", "0 This paper is about the number 1. The number 2... \n", "1 This paper is about the number 2. The number 3... \n", "2 This paper is about the number 3. The number 4... \n", "\n", " citation url_slug \\\n", "0 Your Name, You. (2009). \"Paper Title Number 1.... paper-title-number-1 \n", "1 Your Name, You. (2010). \"Paper Title Number 2.... paper-title-number-2 \n", "2 Your Name, You. (2015). \"Paper Title Number 3.... paper-title-number-3 \n", "\n", " paper_url \\\n", "0 http://academicpages.github.io/files/paper1.pdf \n", "1 http://academicpages.github.io/files/paper2.pdf \n", "2 http://academicpages.github.io/files/paper3.pdf \n", "\n", " slides_url \n", "0 http://academicpages.github.io/files/slides1.pdf \n", "1 http://academicpages.github.io/files/slides2.pdf \n", "2 http://academicpages.github.io/files/slides3.pdf " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "publications = pd.read_csv(\"publications.tsv\", sep=\"\\t\", header=0)\n", "publications\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Escape special characters\n", "\n", "YAML is very picky about how it takes a valid string, so we are replacing single and double quotes (and ampersands) with their HTML encoded equivilents. This makes them look not so readable in raw format, but they are parsed and rendered nicely." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "html_escape_table = {\n", " \"&\": \"&\",\n", " '\"': \""\",\n", " \"'\": \"'\"\n", " }\n", "\n", "def html_escape(text):\n", " \"\"\"Produce entities within text.\"\"\"\n", " return \"\".join(html_escape_table.get(c,c) for c in text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating the markdown files\n", "\n", "This is where the heavy lifting is done. This loops through all the rows in the TSV dataframe, then starts to concatentate a big string (```md```) that contains the markdown for each type. It does the YAML metadata first, then does the description for the individual page." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "import os\n", "for row, item in publications.iterrows():\n", " \n", " md_filename = str(item.pub_date) + \"-\" + item.url_slug + \".md\"\n", " html_filename = str(item.pub_date) + \"-\" + item.url_slug\n", " year = item.pub_date[:4]\n", " \n", " ## YAML variables\n", " \n", " md = \"---\\ntitle: \\\"\" + item.title + '\"\\n'\n", " \n", " md += \"\"\"collection: publications\"\"\"\n", " \n", " md += \"\"\"\\npermalink: /publication/\"\"\" + html_filename\n", " \n", " if len(str(item.excerpt)) > 5:\n", " md += \"\\nexcerpt: '\" + html_escape(item.excerpt) + \"'\"\n", " \n", " md += \"\\ndate: \" + str(item.pub_date) \n", " \n", " md += \"\\nvenue: '\" + html_escape(item.venue) + \"'\"\n", " \n", " if len(str(item.slides_url)) > 5:\n", " md += \"\\nslidesurl: '\" + item.slides_url + \"'\"\n", "\n", " if len(str(item.paper_url)) > 5:\n", " md += \"\\npaperurl: '\" + item.paper_url + \"'\"\n", " \n", " md += \"\\ncitation: '\" + html_escape(item.citation) + \"'\"\n", " \n", " md += \"\\n---\"\n", " \n", " ## Markdown description for individual page\n", " \n", " if len(str(item.excerpt)) > 5:\n", " md += \"\\n\" + html_escape(item.excerpt) + \"\\n\"\n", "\n", " if len(str(item.slides_url)) > 5:\n", " md += \"\\n[Download slides here](\" + item.slides_url + \")\\n\" \n", "\n", " if len(str(item.paper_url)) > 5:\n", " md += \"\\n[Download paper here](\" + item.paper_url + \")\\n\" \n", " \n", " md += \"\\nRecommended citation: \" + item.citation\n", " \n", " md_filename = os.path.basename(md_filename)\n", " \n", " with open(\"../_publications/\" + md_filename, 'w') as f:\n", " f.write(md)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These files are in the publications directory, one directory below where we're working from." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2009-10-01-paper-title-number-1.md 2015-10-01-paper-title-number-3.md\n", "2010-10-01-paper-title-number-2.md 2024-02-17-paper-title-number-4.md\n" ] } ], "source": [ "!ls ../_publications/" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---\n", "title: \"Paper Title Number 1\"\n", "collection: publications\n", "permalink: /publication/2009-10-01-paper-title-number-1\n", "excerpt: 'This paper is about the number 1. The number 2 is left for future work.'\n", "date: 2009-10-01\n", "venue: 'Journal 1'\n", "slidesurl: 'http://academicpages.github.io/files/slides1.pdf'\n", "paperurl: 'http://academicpages.github.io/files/paper1.pdf'\n", "citation: 'Your Name, You. (2009). "Paper Title Number 1." Journal 1. 1(1).'\n", "---\n", "This paper is about the number 1. The number 2 is left for future work.\n", "\n", "[Download slides here](http://academicpages.github.io/files/slides1.pdf)\n", "\n", "[Download paper here](http://academicpages.github.io/files/paper1.pdf)\n", "\n", "Recommended citation: Your Name, You. (2009). \"Paper Title Number 1.\" Journal 1. 1(1)." ] } ], "source": [ "!cat ../_publications/2009-10-01-paper-title-number-1.md" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: markdown_generator/publications.py ================================================ # Publications markdown generator for AcademicPages # # Takes a TSV / CSV of publications with metadata and converts them for use with [academicpages.github.io](academicpages.github.io). # Can be called via the command prompt by using `python3 publications.py [filename]`. # Data format # # The file needs to have the following columns as a header at the top: # pub_date, title, venue, excerpt, citation, url_slug, paper_url, slides_url # - `excerpt`, `paper_url`, and slides_url can be blank, but the others must have values. # - `pub_date` must be formatted as YYYY-MM-DD. # - `url_slug` will be the descriptive part of the .md file and the permalink URL for the page about the paper. # The .md file will be `YYYY-MM-DD-[url_slug].md` and the permalink will be `https://[yourdomain]/publications/YYYY-MM-DD-[url_slug]` import csv import os import sys # Flag to indicate an error occurred EXIT_ERROR = 0 # The expected layout of the CSV / TSV file HEADER_LEGACY = ['pub_date', 'title', 'venue', 'excerpt', 'citation', 'url_slug', 'paper_url', 'slides_url'] HEADER_UPDATED = ['pub_date', 'title', 'venue', 'excerpt', 'citation', 'url_slug', 'paper_url', 'slides_url', 'category'] # YAML is very picky about how it takes a valid string, so we are replacing single and double quotes (and ampersands) # with their HTML encoded equivalents. This makes them look not so readable in raw format, but they are parsed and # rendered nicely. HTML_ESCAPE_TABLE = { "&": "&", '"': """, "'": "'" } # This is where the heavy lifting is done. This loops through all the rows in the TSV dataframe, then starts to # concatenate a big string (```md```) that contains the markdown for each type. It does the YAML metadata first, then # does the description for the individual page. def create_md(lines: list, layout: list): for item in lines: # Parse the filename information md_filename = f"{item[layout.index('pub_date')]}-{item[layout.index('url_slug')]}.md" html_filename = str(item[layout.index('pub_date')]) + "-" + item[layout.index('url_slug')] # Parse the YAML variables md = f"---\ntitle: \"{item[layout.index('title')]}\"\n" md += "collection: publications" if len(layout) == len(HEADER_UPDATED): md += f"\ncategory: {item[layout.index('category')]}" else: md += "\ncategory: manuscripts" md += f"\npermalink: /publication/{html_filename}" if len(str(item[layout.index('excerpt')])) > 5: md += f"\nexcerpt: '{html_escape(item[layout.index('excerpt')])}'" md += f"\ndate: {item[layout.index('pub_date')]}" md += f"\nvenue: '{html_escape(item[layout.index('venue')])}'" if len(str(item[layout.index('paper_url')])) > 5: md += f"\npaperurl: '{item[layout.index('paper_url')]}'" md += f"\ncitation: '{html_escape(item[layout.index('citation')])}'" md += "\n---" # Markdown description for individual page if len(str(item[layout.index('paper_url')])) > 5: md += f"\nDownload paper here\n" if len(str(item[layout.index('excerpt')])) > 5: md += f"\n{html_escape(item[layout.index('excerpt')])}\n" md += f"\nRecommended citation: {item[layout.index('citation')]}" # Write the file md_filename = os.path.join("../_publications/", os.path.basename(md_filename)) with open(md_filename, 'w') as f: f.write(md) def html_escape(text): """Produce entities within text.""" return "".join(HTML_ESCAPE_TABLE.get(c,c) for c in text) def read(filename: str) -> tuple[list, list]: '''Read the contents of the file, check the header and return the parsed line along with the file type.''' # Read the contents of the file lines = [] with open(filename, 'r') as file: delimiter = ',' if filename.endswith('.csv') else '\t' reader = csv.reader(file, delimiter=delimiter) for row in reader: lines.append(row) # Verify the file format makes sense if len(lines) <= 1: print(f'Not enough lines in the file to process, found {len(lines)}', file=sys.stderr) sys.exit(EXIT_ERROR) # Verify the header, remove it once checked layout = HEADER_UPDATED if HEADER_LEGACY == lines[0]: layout = HEADER_LEGACY elif HEADER_UPDATED != lines[0]: print(lines[0]) print('The header of the file does not match the expected format', file=sys.stderr) sys.exit(EXIT_ERROR) lines = lines[1:] # Return the lines and format return lines, layout if __name__ == '__main__': # Make sure a filename was given if len(sys.argv) != 2: print('Usage: python3 publications.py [filename]', file=sys.stderr) sys.exit(EXIT_ERROR) # Make sure the filename is TSV or CSV filename = sys.argv[1] if not (filename.endswith('.csv') or filename.endswith('.tsv')): print(f'Expected a TSV or CSV file, got {filename}', file=sys.stderr) sys.exit(EXIT_ERROR) # Read and process the lines lines, layout = read(filename) create_md(lines, layout) ================================================ FILE: markdown_generator/publications.tsv ================================================ pub_date title venue excerpt citation url_slug paper_url slides_url 2009-10-01 Paper Title Number 1 Journal 1 This paper is about the number 1. The number 2 is left for future work. Your Name, You. (2009). "Paper Title Number 1." Journal 1. 1(1). paper-title-number-1 https://academicpages.github.io/files/paper1.pdf https://academicpages.github.io/files/slides1.pdf 2010-10-01 Paper Title Number 2 Journal 1 This paper is about the number 2. The number 3 is left for future work. Your Name, You. (2010). "Paper Title Number 2." Journal 1. 1(2). paper-title-number-2 https://academicpages.github.io/files/paper2.pdf https://academicpages.github.io/files/slides2.pdf 2015-10-01 Paper Title Number 3 Journal 1 This paper is about the number 3. The number 4 is left for future work. Your Name, You. (2015). "Paper Title Number 3." Journal 1. 1(3). paper-title-number-3 https://academicpages.github.io/files/paper3.pdf https://academicpages.github.io/files/slides3.pdf ================================================ FILE: markdown_generator/pubsFromBib.py ================================================ #!/usr/bin/env python # coding: utf-8 # # Publications markdown generator for academicpages # # Takes a set of bibtex of publications and converts them for use with [academicpages.github.io](academicpages.github.io). This is an interactive Jupyter notebook ([see more info here](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html)). # # The core python code is also in `pubsFromBibs.py`. # Run either from the `markdown_generator` folder after replacing updating the publist dictionary with: # * bib file names # * specific venue keys based on your bib file preferences # * any specific pre-text for specific files # * Collection Name (future feature) # # TODO: Make this work with other databases of citations, # TODO: Merge this with the existing TSV parsing solution from pybtex.database.input import bibtex import pybtex.database.input.bibtex from time import strptime import string import html import os import re #todo: incorporate different collection types rather than a catch all publications, requires other changes to template publist = { "proceeding": { "file" : "proceedings.bib", "venuekey": "booktitle", "venue-pretext": "In the proceedings of ", "collection" : {"name":"publications", "permalink":"/publication/"} }, "journal":{ "file": "pubs.bib", "venuekey" : "journal", "venue-pretext" : "", "collection" : {"name":"publications", "permalink":"/publication/"} } } html_escape_table = { "&": "&", '"': """, "'": "'" } def html_escape(text): """Produce entities within text.""" return "".join(html_escape_table.get(c,c) for c in text) for pubsource in publist: parser = bibtex.Parser() bibdata = parser.parse_file(publist[pubsource]["file"]) #loop through the individual references in a given bibtex file for bib_id in bibdata.entries: #reset default date pub_year = "1900" pub_month = "01" pub_day = "01" b = bibdata.entries[bib_id].fields try: pub_year = f'{b["year"]}' #todo: this hack for month and day needs some cleanup if "month" in b.keys(): if(len(b["month"])<3): pub_month = "0"+b["month"] pub_month = pub_month[-2:] elif(b["month"] not in range(12)): tmnth = strptime(b["month"][:3],'%b').tm_mon pub_month = "{:02d}".format(tmnth) else: pub_month = str(b["month"]) if "day" in b.keys(): pub_day = str(b["day"]) pub_date = pub_year+"-"+pub_month+"-"+pub_day #strip out {} as needed (some bibtex entries that maintain formatting) clean_title = b["title"].replace("{", "").replace("}","").replace("\\","").replace(" ","-") url_slug = re.sub("\\[.*\\]|[^a-zA-Z0-9_-]", "", clean_title) url_slug = url_slug.replace("--","-") md_filename = (str(pub_date) + "-" + url_slug + ".md").replace("--","-") html_filename = (str(pub_date) + "-" + url_slug).replace("--","-") #Build Citation from text citation = "" #citation authors - todo - add highlighting for primary author? for author in bibdata.entries[bib_id].persons["author"]: citation = citation+" "+author.first_names[0]+" "+author.last_names[0]+", " #citation title citation = citation + "\"" + html_escape(b["title"].replace("{", "").replace("}","").replace("\\","")) + ".\"" #add venue logic depending on citation type venue = publist[pubsource]["venue-pretext"]+b[publist[pubsource]["venuekey"]].replace("{", "").replace("}","").replace("\\","") citation = citation + " " + html_escape(venue) citation = citation + ", " + pub_year + "." ## YAML variables md = "---\ntitle: \"" + html_escape(b["title"].replace("{", "").replace("}","").replace("\\","")) + '"\n' md += """collection: """ + publist[pubsource]["collection"]["name"] md += """\npermalink: """ + publist[pubsource]["collection"]["permalink"] + html_filename note = False if "note" in b.keys(): if len(str(b["note"])) > 5: md += "\nexcerpt: '" + html_escape(b["note"]) + "'" note = True md += "\ndate: " + str(pub_date) md += "\nvenue: '" + html_escape(venue) + "'" url = False if "url" in b.keys(): if len(str(b["url"])) > 5: md += "\npaperurl: '" + b["url"] + "'" url = True md += "\ncitation: '" + html_escape(citation) + "'" md += "\n---" ## Markdown description for individual page if note: md += "\n" + html_escape(b["note"]) + "\n" if url: md += "\n[Access paper here](" + b["url"] + "){:target=\"_blank\"}\n" else: md += "\nUse [Google Scholar](https://scholar.google.com/scholar?q="+html.escape(clean_title.replace("-","+"))+"){:target=\"_blank\"} for full citation" md_filename = os.path.basename(md_filename) with open("../_publications/" + md_filename, 'w', encoding="utf-8") as f: f.write(md) print(f'SUCCESSFULLY PARSED {bib_id}: \"', b["title"][:60],"..."*(len(b['title'])>60),"\"") # field may not exist for a reference except KeyError as e: print(f'WARNING Missing Expected Field {e} from entry {bib_id}: \"', b["title"][:30],"..."*(len(b['title'])>30),"\"") continue ================================================ FILE: markdown_generator/talks.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Talks markdown generator for academicpages\n", "\n", "Takes a TSV of talks with metadata and converts them for use with [academicpages.github.io](academicpages.github.io). This is an interactive Jupyter notebook ([see more info here](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html)). The core python code is also in `talks.py`. Run either from the `markdown_generator` folder after replacing `talks.tsv` with one containing your data.\n", "\n", "TODO: Make this work with BibTex and other databases, rather than Stuart's non-standard TSV format and citation style." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "import pandas as pd\n", "import os" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data format\n", "\n", "The TSV needs to have the following columns: title, type, url_slug, venue, date, location, talk_url, description, with a header at the top. Many of these fields can be blank, but the columns must be in the TSV.\n", "\n", "- Fields that cannot be blank: `title`, `url_slug`, `date`. All else can be blank. `type` defaults to \"Talk\" \n", "- `date` must be formatted as YYYY-MM-DD.\n", "- `url_slug` will be the descriptive part of the .md file and the permalink URL for the page about the paper. \n", " - The .md file will be `YYYY-MM-DD-[url_slug].md` and the permalink will be `https://[yourdomain]/talks/YYYY-MM-DD-[url_slug]`\n", " - The combination of `url_slug` and `date` must be unique, as it will be the basis for your filenames\n", "\n", "This is how the raw file looks (it doesn't look pretty, use a spreadsheet or other program to edit and create)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "title\ttype\turl_slug\tvenue\tdate\tlocation\ttalk_url\tdescription\r\n", "Talk 1 on Relevant Topic in Your Field\tTalk\ttalk-1\tUC San Francisco, Department of Testing\t2012-03-01\tSan Francisco, California\t\tThis is a description of your talk, which is a markdown files that can be all markdown-ified like any other post. Yay markdown!\r\n", "Tutorial 1 on Relevant Topic in Your Field\tTutorial\ttutorial-1\tUC-Berkeley Institute for Testing Science\t2013-03-01\tBerkeley CA, USA\thttp://exampleurl.com\tThis is a description of your tutorial, note the different field in type. This is a markdown files that can be all markdown-ified like any other post. Yay markdown!\r\n", "Talk 2 on Relevant Topic in Your Field\tTalk\ttalk-2\tLondon School of Testing\t2014-02-01\tLondon, UK\thttp://example2.com\tThis is a description of your talk, which is a markdown files that can be all markdown-ified like any other post. Yay markdown!\r\n", "Conference Proceeding talk 3 on Relevant Topic in Your Field\tConference proceedings talk\ttalk-3\tTesting Institute of America 2014 Annual Conference\t2014-03-01\tLos Angeles, CA\t\tThis is a description of your conference proceedings talk, note the different field in type. You can put anything in this field." ] } ], "source": [ "!cat talks.tsv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import TSV\n", "\n", "Pandas makes this easy with the read_csv function. We are using a TSV, so we specify the separator as a tab, or `\\t`.\n", "\n", "I found it important to put this data in a tab-separated values format, because there are a lot of commas in this kind of data and comma-separated values can get messed up. However, you can modify the import statement, as pandas also has read_excel(), read_json(), and others." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "data": { "text/html": [ "
    \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
    titletypeurl_slugvenuedatelocationtalk_urldescription
    0Talk 1 on Relevant Topic in Your FieldTalktalk-1UC San Francisco, Department of Testing2012-03-01San Francisco, CaliforniaNaNThis is a description of your talk, which is a...
    1Tutorial 1 on Relevant Topic in Your FieldTutorialtutorial-1UC-Berkeley Institute for Testing Science2013-03-01Berkeley CA, USAhttp://exampleurl.comThis is a description of your tutorial, note t...
    2Talk 2 on Relevant Topic in Your FieldTalktalk-2London School of Testing2014-02-01London, UKhttp://example2.comThis is a description of your talk, which is a...
    3Conference Proceeding talk 3 on Relevant Topic...Conference proceedings talktalk-3Testing Institute of America 2014 Annual Confe...2014-03-01Los Angeles, CANaNThis is a description of your conference proce...
    \n", "
    " ], "text/plain": [ " title \\\n", "0 Talk 1 on Relevant Topic in Your Field \n", "1 Tutorial 1 on Relevant Topic in Your Field \n", "2 Talk 2 on Relevant Topic in Your Field \n", "3 Conference Proceeding talk 3 on Relevant Topic... \n", "\n", " type url_slug \\\n", "0 Talk talk-1 \n", "1 Tutorial tutorial-1 \n", "2 Talk talk-2 \n", "3 Conference proceedings talk talk-3 \n", "\n", " venue date \\\n", "0 UC San Francisco, Department of Testing 2012-03-01 \n", "1 UC-Berkeley Institute for Testing Science 2013-03-01 \n", "2 London School of Testing 2014-02-01 \n", "3 Testing Institute of America 2014 Annual Confe... 2014-03-01 \n", "\n", " location talk_url \\\n", "0 San Francisco, California NaN \n", "1 Berkeley CA, USA http://exampleurl.com \n", "2 London, UK http://example2.com \n", "3 Los Angeles, CA NaN \n", "\n", " description \n", "0 This is a description of your talk, which is a... \n", "1 This is a description of your tutorial, note t... \n", "2 This is a description of your talk, which is a... \n", "3 This is a description of your conference proce... " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "talks = pd.read_csv(\"talks.tsv\", sep=\"\\t\", header=0)\n", "talks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Escape special characters\n", "\n", "YAML is very picky about how it takes a valid string, so we are replacing single and double quotes (and ampersands) with their HTML encoded equivilents. This makes them look not so readable in raw format, but they are parsed and rendered nicely." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "html_escape_table = {\n", " \"&\": \"&\",\n", " '\"': \""\",\n", " \"'\": \"'\"\n", " }\n", "\n", "def html_escape(text):\n", " if type(text) is str:\n", " return \"\".join(html_escape_table.get(c,c) for c in text)\n", " else:\n", " return \"False\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating the markdown files\n", "\n", "This is where the heavy lifting is done. This loops through all the rows in the TSV dataframe, then starts to concatentate a big string (```md```) that contains the markdown for each type. It does the YAML metadata first, then does the description for the individual page." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "loc_dict = {}\n", "\n", "for row, item in talks.iterrows():\n", " \n", " md_filename = str(item.date) + \"-\" + item.url_slug + \".md\"\n", " html_filename = str(item.date) + \"-\" + item.url_slug \n", " year = item.date[:4]\n", " \n", " md = \"---\\ntitle: \\\"\" + item.title + '\"\\n'\n", " md += \"collection: talks\" + \"\\n\"\n", " \n", " if len(str(item.type)) > 3:\n", " md += 'type: \"' + item.type + '\"\\n'\n", " else:\n", " md += 'type: \"Talk\"\\n'\n", " \n", " md += \"permalink: /talks/\" + html_filename + \"\\n\"\n", " \n", " if len(str(item.venue)) > 3:\n", " md += 'venue: \"' + item.venue + '\"\\n'\n", " \n", " if len(str(item.location)) > 3:\n", " md += \"date: \" + str(item.date) + \"\\n\"\n", " \n", " if len(str(item.location)) > 3:\n", " md += 'location: \"' + str(item.location) + '\"\\n'\n", " \n", " md += \"---\\n\"\n", " \n", " \n", " if len(str(item.talk_url)) > 3:\n", " md += \"\\n[More information here](\" + item.talk_url + \")\\n\" \n", " \n", " \n", " if len(str(item.description)) > 3:\n", " md += \"\\n\" + html_escape(item.description) + \"\\n\"\n", " \n", " \n", " md_filename = os.path.basename(md_filename)\n", " #print(md)\n", " \n", " with open(\"../_talks/\" + md_filename, 'w') as f:\n", " f.write(md)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These files are in the talks directory, one directory below where we're working from." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2012-03-01-talk-1.md\t 2014-02-01-talk-2.md\r\n", "2013-03-01-tutorial-1.md 2014-03-01-talk-3.md\r\n" ] } ], "source": [ "!ls ../_talks" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---\r\n", "title: \"Tutorial 1 on Relevant Topic in Your Field\"\r\n", "collection: talks\r\n", "type: \"Tutorial\"\r\n", "permalink: /talks/2013-03-01-tutorial-1\r\n", "venue: \"UC-Berkeley Institute for Testing Science\"\r\n", "date: 2013-03-01\r\n", "location: \"Berkeley CA, USA\"\r\n", "---\r\n", "\r\n", "[More information here](http://exampleurl.com)\r\n", "\r\n", "This is a description of your tutorial, note the different field in type. This is a markdown files that can be all markdown-ified like any other post. Yay markdown!\r\n" ] } ], "source": [ "!cat ../_talks/2013-03-01-tutorial-1.md" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: markdown_generator/talks.py ================================================ # coding: utf-8 # # Talks markdown generator for academicpages # # Takes a TSV of talks with metadata and converts them for use with [academicpages.github.io](academicpages.github.io). This is an interactive Jupyter notebook ([see more info here](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html)). The core python code is also in `talks.py`. Run either from the `markdown_generator` folder after replacing `talks.tsv` with one containing your data. # # TODO: Make this work with BibTex and other databases, rather than Stuart's non-standard TSV format and citation style. # In[1]: import pandas as pd import os # ## Data format # # The TSV needs to have the following columns: title, type, url_slug, venue, date, location, talk_url, description, with a header at the top. Many of these fields can be blank, but the columns must be in the TSV. # # - Fields that cannot be blank: `title`, `url_slug`, `date`. All else can be blank. `type` defaults to "Talk" # - `date` must be formatted as YYYY-MM-DD. # - `url_slug` will be the descriptive part of the .md file and the permalink URL for the page about the paper. # - The .md file will be `YYYY-MM-DD-[url_slug].md` and the permalink will be `https://[yourdomain]/talks/YYYY-MM-DD-[url_slug]` # - The combination of `url_slug` and `date` must be unique, as it will be the basis for your filenames # # ## Import TSV # # Pandas makes this easy with the read_csv function. We are using a TSV, so we specify the separator as a tab, or `\t`. # # I found it important to put this data in a tab-separated values format, because there are a lot of commas in this kind of data and comma-separated values can get messed up. However, you can modify the import statement, as pandas also has read_excel(), read_json(), and others. # In[3]: talks = pd.read_csv("talks.tsv", sep="\t", header=0) talks # ## Escape special characters # # YAML is very picky about how it takes a valid string, so we are replacing single and double quotes (and ampersands) with their HTML encoded equivilents. This makes them look not so readable in raw format, but they are parsed and rendered nicely. # In[4]: html_escape_table = { "&": "&", '"': """, "'": "'" } def html_escape(text): if type(text) is str: return "".join(html_escape_table.get(c,c) for c in text) else: return "False" # ## Creating the markdown files # # This is where the heavy lifting is done. This loops through all the rows in the TSV dataframe, then starts to concatentate a big string (```md```) that contains the markdown for each type. It does the YAML metadata first, then does the description for the individual page. # In[5]: loc_dict = {} for row, item in talks.iterrows(): md_filename = str(item.date) + "-" + item.url_slug + ".md" html_filename = str(item.date) + "-" + item.url_slug year = item.date[:4] md = "---\ntitle: \"" + item.title + '"\n' md += "collection: talks" + "\n" if len(str(item.type)) > 3: md += 'type: "' + item.type + '"\n' else: md += 'type: "Talk"\n' md += "permalink: /talks/" + html_filename + "\n" if len(str(item.venue)) > 3: md += 'venue: "' + item.venue + '"\n' if len(str(item.date)) > 3: md += "date: " + str(item.date) + "\n" if len(str(item.location)) > 3: md += 'location: "' + str(item.location) + '"\n' md += "---\n" if len(str(item.talk_url)) > 3: md += "\n[More information here](" + item.talk_url + ")\n" if len(str(item.description)) > 3: md += "\n" + html_escape(item.description) + "\n" md_filename = os.path.basename(md_filename) #print(md) with open("../_talks/" + md_filename, 'w') as f: f.write(md) # These files are in the talks directory, one directory below where we're working from. ================================================ FILE: markdown_generator/talks.tsv ================================================ title type url_slug venue date location talk_url description Talk 1 on Relevant Topic in Your Field Talk talk-1 UC San Francisco, Department of Testing 2012-03-01 San Francisco, California This is a description of your talk, which is a markdown files that can be all markdown-ified like any other post. Yay markdown! Tutorial 1 on Relevant Topic in Your Field Tutorial tutorial-1 UC-Berkeley Institute for Testing Science 2013-03-01 Berkeley CA, USA http://exampleurl.com This is a description of your tutorial, note the different field in type. This is a markdown files that can be all markdown-ified like any other post. Yay markdown! Talk 2 on Relevant Topic in Your Field Talk talk-2 London School of Testing 2014-02-01 London, UK http://example2.com This is a description of your talk, which is a markdown files that can be all markdown-ified like any other post. Yay markdown! Conference Proceeding talk 3 on Relevant Topic in Your Field Conference proceedings talk talk-3 Testing Institute of America 2014 Annual Conference 2014-03-01 Los Angeles, CA This is a description of your conference proceedings talk, note the different field in type. You can put anything in this field. ================================================ FILE: package.json ================================================ { "name": "academic-pages", "version": "0.8.1.1", "description": "Academic Pages Mistakes Jekyll theme npm build scripts", "repository": { "type": "git", "url": "https://github.com/academicpages/academicpages.github.io" }, "keywords": [ "jekyll", "theme", "minimal" ], "contributors": [ "Michael Rose", "Robert Zupko" ], "license": "MIT", "bugs": { "url": "https://github.com/academicpages/academicpages.github.io/issues" }, "homepage": "https://github.com/academicpages/academicpages.github.io", "engines": { "node": ">= 0.10.0" }, "dependencies": { "fitvids": "^2.1.1", "jquery": "^3.7.1", "jquery-smooth-scroll": "^2.2.0", "plotly.js-dist-min": "^3.3.0" }, "devDependencies": { "onchange": "^7.1.0", "uglify-js": "^3.17.4" }, "scripts": { "uglify": "uglifyjs node_modules/jquery/dist/jquery.min.js node_modules/fitvids/dist/fitvids.min.js node_modules/jquery-smooth-scroll/jquery.smooth-scroll.min.js node_modules/plotly.js-dist-min/plotly.min.js assets/js/plugins/jquery.greedy-navigation.js assets/js/_main.js -c -m -o assets/js/main.min.js", "watch:js": "onchange \"assets/js/**/*.js\" -e \"assets/js/main.min.js\" -- npm run build:js", "build:js": "npm run uglify" } } ================================================ FILE: scripts/cv_markdown_to_json.py ================================================ #!/usr/bin/env python3 """ Script to convert markdown CV to JSON format Author: Yuan Chen """ import os import re import json import yaml import argparse from datetime import datetime, date from pathlib import Path import glob # Custom JSON encoder to handle date objects class DateTimeEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, (datetime, date)): return obj.isoformat() return super().default(obj) def parse_markdown_cv(md_file): """Parse the markdown CV file and extract sections.""" with open(md_file, 'r', encoding='utf-8') as file: content = file.read() # Remove YAML front matter content = re.sub(r'^---.*?---\s*', '', content, flags=re.DOTALL) # Extract sections sections = {} current_section = None section_content = [] for line in content.split('\n'): if re.match(r'^=+$', line): continue section_match = re.match(r'^([A-Za-z\s]+)$', line.strip()) if section_match and len(line.strip()) > 0: if current_section: sections[current_section] = '\n'.join(section_content).strip() section_content = [] current_section = section_match.group(1).strip() elif current_section: section_content.append(line) # Add the last section if current_section and section_content: sections[current_section] = '\n'.join(section_content).strip() return sections def parse_config(config_file): """Parse the Jekyll _config.yml file for additional information.""" if not os.path.exists(config_file): return {} with open(config_file, 'r', encoding='utf-8') as file: config = yaml.safe_load(file) return config def extract_author_info(config): """Extract author information from the config file.""" author_info = { "name": config.get('name', ''), "email": "", "phone": "", "website": config.get('url', ''), "summary": "", "location": { "address": "", "postalCode": "", "city": "", "countryCode": "US", "region": "" }, "profiles": [] } # Extract author details if available if 'author' in config: author = config.get('author', {}) # Override name if author name is available if author.get('name'): author_info['name'] = author.get('name') # Add email if author.get('email'): author_info['email'] = author.get('email') # Add location if author.get('location'): author_info['location']['city'] = author.get('location', '') # Add employer as part of summary if author.get('employer'): author_info['summary'] = f"Currently employed at {author.get('employer')}" # Add bio to summary if available if author.get('bio'): if author_info['summary']: author_info['summary'] += f". {author.get('bio')}" else: author_info['summary'] = author.get('bio') # Add social profiles profiles = [] # Academic profiles if author.get('googlescholar'): profiles.append({ "network": "Google Scholar", "username": "", "url": author.get('googlescholar') }) if author.get('orcid'): profiles.append({ "network": "ORCID", "username": "", "url": author.get('orcid') }) if author.get('researchgate'): profiles.append({ "network": "ResearchGate", "username": "", "url": author.get('researchgate') }) # Social media profiles if author.get('github'): profiles.append({ "network": "GitHub", "username": author.get('github'), "url": f"https://github.com/{author.get('github')}" }) if author.get('linkedin'): profiles.append({ "network": "LinkedIn", "username": author.get('linkedin'), "url": f"https://www.linkedin.com/in/{author.get('linkedin')}" }) if author.get('twitter'): profiles.append({ "network": "Twitter", "username": author.get('twitter'), "url": f"https://twitter.com/{author.get('twitter')}" }) author_info['profiles'] = profiles return author_info def parse_education(education_text): """Parse education section from markdown.""" education_entries = [] # Extract education entries entries = re.findall(r'\* (.*?)(?=\n\*|\Z)', education_text, re.DOTALL) for entry in entries: # Parse degree, institution, and year match = re.match(r'([^,]+), ([^,]+), (\d{4})(.*)', entry.strip()) if match: degree, institution, year, additional = match.groups() # Extract GPA if available gpa_match = re.search(r'GPA: ([\d\.]+)', additional) gpa = gpa_match.group(1) if gpa_match else None education_entries.append({ "institution": institution.strip(), "area": degree.strip(), "studyType": "", "startDate": "", "endDate": year.strip(), "gpa": gpa, "courses": [] }) return education_entries def parse_work_experience(work_text): """Parse work experience section from markdown.""" work_entries = [] # Extract work entries entries = re.findall(r'\* (.*?)(?=\n\*|\Z)', work_text, re.DOTALL) for entry in entries: lines = entry.strip().split('\n') if not lines: continue # Parse position and company first_line = lines[0].strip() position_match = re.match(r'(.*?), (.*?)(?:, |$)', first_line) if position_match: position, company = position_match.groups() # Extract dates if available date_match = re.search(r'(\d{4})\s*-\s*(\d{4}|present)', entry, re.IGNORECASE) start_date = date_match.group(1) if date_match else "" end_date = date_match.group(2) if date_match else "" # Extract highlights highlights = [] for line in lines[1:]: if line.strip().startswith('*') or line.strip().startswith('-'): highlights.append(line.strip()[1:].strip()) work_entries.append({ "company": company.strip(), "position": position.strip(), "website": "", "startDate": start_date, "endDate": end_date, "summary": "", "highlights": highlights }) return work_entries def parse_skills(skills_text): """Parse skills section from markdown.""" skills_entries = [] # Extract skill categories categories = re.findall(r'(?:^|\n)(\w+.*?):\s*(.*?)(?=\n\w+.*?:|\Z)', skills_text, re.DOTALL) for category, skills in categories: # Extract individual skills skill_list = [s.strip() for s in re.split(r',|\n', skills) if s.strip()] skills_entries.append({ "name": category.strip(), "level": "", "keywords": skill_list }) return skills_entries def parse_publications(pub_dir): """Parse publications from the _publications directory.""" publications = [] if not os.path.exists(pub_dir): return publications for pub_file in sorted(glob.glob(os.path.join(pub_dir, "*.md"))): with open(pub_file, 'r', encoding='utf-8') as file: content = file.read() # Extract front matter front_matter_match = re.match(r'^---\s*(.*?)\s*---', content, re.DOTALL) if front_matter_match: front_matter = yaml.safe_load(front_matter_match.group(1)) # Extract publication details pub_entry = { "name": front_matter.get('title', ''), "publisher": front_matter.get('venue', ''), "releaseDate": front_matter.get('date', ''), "website": front_matter.get('paperurl', ''), "summary": front_matter.get('excerpt', '') } publications.append(pub_entry) return publications def parse_talks(talks_dir): """Parse talks from the _talks directory.""" talks = [] if not os.path.exists(talks_dir): return talks for talk_file in sorted(glob.glob(os.path.join(talks_dir, "*.md"))): with open(talk_file, 'r', encoding='utf-8') as file: content = file.read() # Extract front matter front_matter_match = re.match(r'^---\s*(.*?)\s*---', content, re.DOTALL) if front_matter_match: front_matter = yaml.safe_load(front_matter_match.group(1)) # Extract talk details talk_entry = { "name": front_matter.get('title', ''), "event": front_matter.get('venue', ''), "date": front_matter.get('date', ''), "location": front_matter.get('location', ''), "description": front_matter.get('excerpt', '') } talks.append(talk_entry) return talks def parse_teaching(teaching_dir): """Parse teaching from the _teaching directory.""" teaching = [] if not os.path.exists(teaching_dir): return teaching for teaching_file in sorted(glob.glob(os.path.join(teaching_dir, "*.md"))): with open(teaching_file, 'r', encoding='utf-8') as file: content = file.read() # Extract front matter front_matter_match = re.match(r'^---\s*(.*?)\s*---', content, re.DOTALL) if front_matter_match: front_matter = yaml.safe_load(front_matter_match.group(1)) # Extract teaching details teaching_entry = { "course": front_matter.get('title', ''), "institution": front_matter.get('venue', ''), "date": front_matter.get('date', ''), "role": front_matter.get('type', ''), "description": front_matter.get('excerpt', '') } teaching.append(teaching_entry) return teaching def parse_portfolio(portfolio_dir): """Parse portfolio items from the _portfolio directory.""" portfolio = [] if not os.path.exists(portfolio_dir): return portfolio for portfolio_file in sorted(glob.glob(os.path.join(portfolio_dir, "*.md"))): with open(portfolio_file, 'r', encoding='utf-8') as file: content = file.read() # Extract front matter front_matter_match = re.match(r'^---\s*(.*?)\s*---', content, re.DOTALL) if front_matter_match: front_matter = yaml.safe_load(front_matter_match.group(1)) # Extract portfolio details portfolio_entry = { "name": front_matter.get('title', ''), "category": front_matter.get('collection', 'portfolio'), "date": front_matter.get('date', ''), "url": front_matter.get('permalink', ''), "description": front_matter.get('excerpt', '') } portfolio.append(portfolio_entry) return portfolio def create_cv_json(md_file, config_file, repo_root, output_file): """Create a JSON CV from markdown and other repository data.""" # Parse the markdown CV sections = parse_markdown_cv(md_file) # Parse config file config = parse_config(config_file) # Extract author information author_info = extract_author_info(config) # Create the JSON structure cv_json = { "basics": author_info, "work": parse_work_experience(sections.get('Work experience', '')), "education": parse_education(sections.get('Education', '')), "skills": parse_skills(sections.get('Skills', '')), "languages": [], "interests": [], "references": [] } # Add publications cv_json["publications"] = parse_publications(os.path.join(repo_root, "_publications")) # Add talks cv_json["presentations"] = parse_talks(os.path.join(repo_root, "_talks")) # Add teaching cv_json["teaching"] = parse_teaching(os.path.join(repo_root, "_teaching")) # Add portfolio cv_json["portfolio"] = parse_portfolio(os.path.join(repo_root, "_portfolio")) # Extract languages and interests from config if available if 'languages' in config: cv_json["languages"] = config.get('languages', []) if 'interests' in config: cv_json["interests"] = config.get('interests', []) # Write the JSON to a file with open(output_file, 'w', encoding='utf-8') as file: json.dump(cv_json, file, indent=2, cls=DateTimeEncoder) print(f"Successfully converted {md_file} to {output_file}") def main(): """Main function to parse arguments and run the conversion.""" parser = argparse.ArgumentParser(description='Convert markdown CV to JSON format') parser.add_argument('--input', '-i', required=True, help='Input markdown CV file') parser.add_argument('--output', '-o', required=True, help='Output JSON file') parser.add_argument('--config', '-c', help='Jekyll _config.yml file') args = parser.parse_args() # Get repository root (parent directory of the input file's directory) repo_root = str(Path(args.input).parent.parent) create_cv_json(args.input, args.config, repo_root, args.output) if __name__ == '__main__': main() ================================================ FILE: scripts/update_cv_json.sh ================================================ #!/bin/bash # Script to update the CV JSON file from the markdown CV # Author: Yuan Chen # Set the base directory to the repository root BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # Define file paths CV_MARKDOWN="$BASE_DIR/_pages/cv.md" CV_JSON="$BASE_DIR/_data/cv.json" CONFIG_FILE="$BASE_DIR/_config.yml" # Check if the Python script exists PYTHON_SCRIPT="$BASE_DIR/scripts/cv_markdown_to_json.py" if [ ! -f "$PYTHON_SCRIPT" ]; then echo "Error: Python script not found at $PYTHON_SCRIPT" exit 1 fi # Check if the markdown CV exists if [ ! -f "$CV_MARKDOWN" ]; then echo "Error: Markdown CV not found at $CV_MARKDOWN" exit 1 fi # Run the Python script to convert markdown to JSON echo "Converting markdown CV to JSON..." python3 "$PYTHON_SCRIPT" --input "$CV_MARKDOWN" --output "$CV_JSON" --config "$CONFIG_FILE" # Check if the conversion was successful if [ $? -eq 0 ]; then echo "Successfully updated CV JSON file at $CV_JSON" # Optional: Build the Jekyll site to see the changes echo "Would you like to build the Jekyll site to see the changes? (y/n)" read -r answer if [[ "$answer" =~ ^[Yy]$ ]]; then echo "Building Jekyll site..." cd "$BASE_DIR" && bundle exec jekyll serve fi else echo "Error: Failed to update CV JSON file" exit 1 fi exit 0 ================================================ FILE: talkmap/leaflet_dist/MarkerCluster.Default.css ================================================ .marker-cluster-small { background-color: rgba(181, 226, 140, 0.6); } .marker-cluster-small div { background-color: rgba(110, 204, 57, 0.6); } .marker-cluster-medium { background-color: rgba(241, 211, 87, 0.6); } .marker-cluster-medium div { background-color: rgba(240, 194, 12, 0.6); } .marker-cluster-large { background-color: rgba(253, 156, 115, 0.6); } .marker-cluster-large div { background-color: rgba(241, 128, 23, 0.6); } /* IE 6-8 fallback colors */ .leaflet-oldie .marker-cluster-small { background-color: rgb(181, 226, 140); } .leaflet-oldie .marker-cluster-small div { background-color: rgb(110, 204, 57); } .leaflet-oldie .marker-cluster-medium { background-color: rgb(241, 211, 87); } .leaflet-oldie .marker-cluster-medium div { background-color: rgb(240, 194, 12); } .leaflet-oldie .marker-cluster-large { background-color: rgb(253, 156, 115); } .leaflet-oldie .marker-cluster-large div { background-color: rgb(241, 128, 23); } .marker-cluster { background-clip: padding-box; border-radius: 20px; } .marker-cluster div { width: 30px; height: 30px; margin-left: 5px; margin-top: 5px; text-align: center; border-radius: 15px; font: 12px "Helvetica Neue", Arial, Helvetica, sans-serif; } .marker-cluster span { line-height: 30px; } ================================================ FILE: talkmap/leaflet_dist/MarkerCluster.css ================================================ .leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow { -webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in; -moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in; -o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in; transition: transform 0.3s ease-out, opacity 0.3s ease-in; } .leaflet-cluster-spider-leg { /* stroke-dashoffset (duration and function) should match with leaflet-marker-icon transform in order to track it exactly */ -webkit-transition: -webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in; -moz-transition: -moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in; -o-transition: -o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in; transition: stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in; } ================================================ FILE: talkmap/leaflet_dist/leaflet.markercluster-src.js ================================================ /* Leaflet.markercluster, Provides Beautiful Animated Marker Clustering functionality for Leaflet, a JS library for interactive maps. https://github.com/Leaflet/Leaflet.markercluster (c) 2012-2013, Dave Leaver, smartrak */ (function (window, document, undefined) {/* * L.MarkerClusterGroup extends L.FeatureGroup by clustering the markers contained within */ L.MarkerClusterGroup = L.FeatureGroup.extend({ options: { maxClusterRadius: 80, //A cluster will cover at most this many pixels from its center iconCreateFunction: null, spiderfyOnMaxZoom: true, showCoverageOnHover: true, zoomToBoundsOnClick: true, singleMarkerMode: false, disableClusteringAtZoom: null, // Setting this to false prevents the removal of any clusters outside of the viewpoint, which // is the default behaviour for performance reasons. removeOutsideVisibleBounds: true, // Set to false to disable all animations (zoom and spiderfy). // If false, option animateAddingMarkers below has no effect. // If L.DomUtil.TRANSITION is falsy, this option has no effect. animate: true, //Whether to animate adding markers after adding the MarkerClusterGroup to the map // If you are adding individual markers set to true, if adding bulk markers leave false for massive performance gains. animateAddingMarkers: false, //Increase to increase the distance away that spiderfied markers appear from the center spiderfyDistanceMultiplier: 1, // Make it possible to specify a polyline options on a spider leg spiderLegPolylineOptions: { weight: 1.5, color: '#222', opacity: 0.5 }, // When bulk adding layers, adds markers in chunks. Means addLayers may not add all the layers in the call, others will be loaded during setTimeouts chunkedLoading: false, chunkInterval: 200, // process markers for a maximum of ~ n milliseconds (then trigger the chunkProgress callback) chunkDelay: 50, // at the end of each interval, give n milliseconds back to system/browser chunkProgress: null, // progress callback: function(processed, total, elapsed) (e.g. for a progress indicator) //Options to pass to the L.Polygon constructor polygonOptions: {} }, initialize: function (options) { L.Util.setOptions(this, options); if (!this.options.iconCreateFunction) { this.options.iconCreateFunction = this._defaultIconCreateFunction; } this._featureGroup = L.featureGroup(); this._featureGroup.addEventParent(this); this._nonPointGroup = L.featureGroup(); this._nonPointGroup.addEventParent(this); this._inZoomAnimation = 0; this._needsClustering = []; this._needsRemoving = []; //Markers removed while we aren't on the map need to be kept track of //The bounds of the currently shown area (from _getExpandedVisibleBounds) Updated on zoom/move this._currentShownBounds = null; this._queue = []; // Hook the appropriate animation methods. var animate = L.DomUtil.TRANSITION && this.options.animate; L.extend(this, animate ? this._withAnimation : this._noAnimation); // Remember which MarkerCluster class to instantiate (animated or not). this._markerCluster = animate ? L.MarkerCluster : L.MarkerClusterNonAnimated; }, addLayer: function (layer) { if (layer instanceof L.LayerGroup) { return this.addLayers([layer]); } //Don't cluster non point data if (!layer.getLatLng) { this._nonPointGroup.addLayer(layer); return this; } if (!this._map) { this._needsClustering.push(layer); return this; } if (this.hasLayer(layer)) { return this; } //If we have already clustered we'll need to add this one to a cluster if (this._unspiderfy) { this._unspiderfy(); } this._addLayer(layer, this._maxZoom); // Refresh bounds and weighted positions. this._topClusterLevel._recalculateBounds(); this._refreshClustersIcons(); //Work out what is visible var visibleLayer = layer, currentZoom = this._map.getZoom(); if (layer.__parent) { while (visibleLayer.__parent._zoom >= currentZoom) { visibleLayer = visibleLayer.__parent; } } if (this._currentShownBounds.contains(visibleLayer.getLatLng())) { if (this.options.animateAddingMarkers) { this._animationAddLayer(layer, visibleLayer); } else { this._animationAddLayerNonAnimated(layer, visibleLayer); } } return this; }, removeLayer: function (layer) { if (layer instanceof L.LayerGroup) { return this.removeLayers([layer]); } //Non point layers if (!layer.getLatLng) { this._nonPointGroup.removeLayer(layer); return this; } if (!this._map) { if (!this._arraySplice(this._needsClustering, layer) && this.hasLayer(layer)) { this._needsRemoving.push(layer); } return this; } if (!layer.__parent) { return this; } if (this._unspiderfy) { this._unspiderfy(); this._unspiderfyLayer(layer); } //Remove the marker from clusters this._removeLayer(layer, true); // Refresh bounds and weighted positions. this._topClusterLevel._recalculateBounds(); this._refreshClustersIcons(); layer.off('move', this._childMarkerMoved, this); if (this._featureGroup.hasLayer(layer)) { this._featureGroup.removeLayer(layer); if (layer.clusterShow) { layer.clusterShow(); } } return this; }, //Takes an array of markers and adds them in bulk addLayers: function (layersArray) { if (!L.Util.isArray(layersArray)) { return this.addLayer(layersArray); } var fg = this._featureGroup, npg = this._nonPointGroup, chunked = this.options.chunkedLoading, chunkInterval = this.options.chunkInterval, chunkProgress = this.options.chunkProgress, l = layersArray.length, offset = 0, originalArray = true, m; if (this._map) { var started = (new Date()).getTime(); var process = L.bind(function () { var start = (new Date()).getTime(); for (; offset < l; offset++) { if (chunked && offset % 200 === 0) { // every couple hundred markers, instrument the time elapsed since processing started: var elapsed = (new Date()).getTime() - start; if (elapsed > chunkInterval) { break; // been working too hard, time to take a break :-) } } m = layersArray[offset]; // Group of layers, append children to layersArray and skip. // Side effects: // - Total increases, so chunkProgress ratio jumps backward. // - Groups are not included in this group, only their non-group child layers (hasLayer). // Changing array length while looping does not affect performance in current browsers: // http://jsperf.com/for-loop-changing-length/6 if (m instanceof L.LayerGroup) { if (originalArray) { layersArray = layersArray.slice(); originalArray = false; } this._extractNonGroupLayers(m, layersArray); l = layersArray.length; continue; } //Not point data, can't be clustered if (!m.getLatLng) { npg.addLayer(m); continue; } if (this.hasLayer(m)) { continue; } this._addLayer(m, this._maxZoom); //If we just made a cluster of size 2 then we need to remove the other marker from the map (if it is) or we never will if (m.__parent) { if (m.__parent.getChildCount() === 2) { var markers = m.__parent.getAllChildMarkers(), otherMarker = markers[0] === m ? markers[1] : markers[0]; fg.removeLayer(otherMarker); } } } if (chunkProgress) { // report progress and time elapsed: chunkProgress(offset, l, (new Date()).getTime() - started); } // Completed processing all markers. if (offset === l) { // Refresh bounds and weighted positions. this._topClusterLevel._recalculateBounds(); this._refreshClustersIcons(); this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds); } else { setTimeout(process, this.options.chunkDelay); } }, this); process(); } else { var needsClustering = this._needsClustering; for (; offset < l; offset++) { m = layersArray[offset]; // Group of layers, append children to layersArray and skip. if (m instanceof L.LayerGroup) { if (originalArray) { layersArray = layersArray.slice(); originalArray = false; } this._extractNonGroupLayers(m, layersArray); l = layersArray.length; continue; } //Not point data, can't be clustered if (!m.getLatLng) { npg.addLayer(m); continue; } if (this.hasLayer(m)) { continue; } needsClustering.push(m); } } return this; }, //Takes an array of markers and removes them in bulk removeLayers: function (layersArray) { var i, m, l = layersArray.length, fg = this._featureGroup, npg = this._nonPointGroup, originalArray = true; if (!this._map) { for (i = 0; i < l; i++) { m = layersArray[i]; // Group of layers, append children to layersArray and skip. if (m instanceof L.LayerGroup) { if (originalArray) { layersArray = layersArray.slice(); originalArray = false; } this._extractNonGroupLayers(m, layersArray); l = layersArray.length; continue; } this._arraySplice(this._needsClustering, m); npg.removeLayer(m); if (this.hasLayer(m)) { this._needsRemoving.push(m); } } return this; } if (this._unspiderfy) { this._unspiderfy(); // Work on a copy of the array, so that next loop is not affected. var layersArray2 = layersArray.slice(), l2 = l; for (i = 0; i < l2; i++) { m = layersArray2[i]; // Group of layers, append children to layersArray and skip. if (m instanceof L.LayerGroup) { this._extractNonGroupLayers(m, layersArray2); l2 = layersArray2.length; continue; } this._unspiderfyLayer(m); } } for (i = 0; i < l; i++) { m = layersArray[i]; // Group of layers, append children to layersArray and skip. if (m instanceof L.LayerGroup) { if (originalArray) { layersArray = layersArray.slice(); originalArray = false; } this._extractNonGroupLayers(m, layersArray); l = layersArray.length; continue; } if (!m.__parent) { npg.removeLayer(m); continue; } this._removeLayer(m, true, true); if (fg.hasLayer(m)) { fg.removeLayer(m); if (m.clusterShow) { m.clusterShow(); } } } // Refresh bounds and weighted positions. this._topClusterLevel._recalculateBounds(); this._refreshClustersIcons(); //Fix up the clusters and markers on the map this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds); return this; }, //Removes all layers from the MarkerClusterGroup clearLayers: function () { //Need our own special implementation as the LayerGroup one doesn't work for us //If we aren't on the map (yet), blow away the markers we know of if (!this._map) { this._needsClustering = []; delete this._gridClusters; delete this._gridUnclustered; } if (this._noanimationUnspiderfy) { this._noanimationUnspiderfy(); } //Remove all the visible layers this._featureGroup.clearLayers(); this._nonPointGroup.clearLayers(); this.eachLayer(function (marker) { marker.off('move', this._childMarkerMoved, this); delete marker.__parent; }); if (this._map) { //Reset _topClusterLevel and the DistanceGrids this._generateInitialClusters(); } return this; }, //Override FeatureGroup.getBounds as it doesn't work getBounds: function () { var bounds = new L.LatLngBounds(); if (this._topClusterLevel) { bounds.extend(this._topClusterLevel._bounds); } for (var i = this._needsClustering.length - 1; i >= 0; i--) { bounds.extend(this._needsClustering[i].getLatLng()); } bounds.extend(this._nonPointGroup.getBounds()); return bounds; }, //Overrides LayerGroup.eachLayer eachLayer: function (method, context) { var markers = this._needsClustering.slice(), needsRemoving = this._needsRemoving, i; if (this._topClusterLevel) { this._topClusterLevel.getAllChildMarkers(markers); } for (i = markers.length - 1; i >= 0; i--) { if (needsRemoving.indexOf(markers[i]) === -1) { method.call(context, markers[i]); } } this._nonPointGroup.eachLayer(method, context); }, //Overrides LayerGroup.getLayers getLayers: function () { var layers = []; this.eachLayer(function (l) { layers.push(l); }); return layers; }, //Overrides LayerGroup.getLayer, WARNING: Really bad performance getLayer: function (id) { var result = null; id = parseInt(id, 10); this.eachLayer(function (l) { if (L.stamp(l) === id) { result = l; } }); return result; }, //Returns true if the given layer is in this MarkerClusterGroup hasLayer: function (layer) { if (!layer) { return false; } var i, anArray = this._needsClustering; for (i = anArray.length - 1; i >= 0; i--) { if (anArray[i] === layer) { return true; } } anArray = this._needsRemoving; for (i = anArray.length - 1; i >= 0; i--) { if (anArray[i] === layer) { return false; } } return !!(layer.__parent && layer.__parent._group === this) || this._nonPointGroup.hasLayer(layer); }, //Zoom down to show the given layer (spiderfying if necessary) then calls the callback zoomToShowLayer: function (layer, callback) { if (typeof callback !== 'function') { callback = function () {}; } var showMarker = function () { if ((layer._icon || layer.__parent._icon) && !this._inZoomAnimation) { this._map.off('moveend', showMarker, this); this.off('animationend', showMarker, this); if (layer._icon) { callback(); } else if (layer.__parent._icon) { this.once('spiderfied', callback, this); layer.__parent.spiderfy(); } } }; if (layer._icon && this._map.getBounds().contains(layer.getLatLng())) { //Layer is visible ond on screen, immediate return callback(); } else if (layer.__parent._zoom < this._map.getZoom()) { //Layer should be visible at this zoom level. It must not be on screen so just pan over to it this._map.on('moveend', showMarker, this); this._map.panTo(layer.getLatLng()); } else { var moveStart = function () { this._map.off('movestart', moveStart, this); moveStart = null; }; this._map.on('movestart', moveStart, this); this._map.on('moveend', showMarker, this); this.on('animationend', showMarker, this); layer.__parent.zoomToBounds(); if (moveStart) { //Never started moving, must already be there, probably need clustering however showMarker.call(this); } } }, //Overrides FeatureGroup.onAdd onAdd: function (map) { this._map = map; var i, l, layer; if (!isFinite(this._map.getMaxZoom())) { throw "Map has no maxZoom specified"; } this._featureGroup.addTo(map); this._nonPointGroup.addTo(map); if (!this._gridClusters) { this._generateInitialClusters(); } this._maxLat = map.options.crs.projection.MAX_LATITUDE; for (i = 0, l = this._needsRemoving.length; i < l; i++) { layer = this._needsRemoving[i]; this._removeLayer(layer, true); } this._needsRemoving = []; //Remember the current zoom level and bounds this._zoom = this._map.getZoom(); this._currentShownBounds = this._getExpandedVisibleBounds(); this._map.on('zoomend', this._zoomEnd, this); this._map.on('moveend', this._moveEnd, this); if (this._spiderfierOnAdd) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely this._spiderfierOnAdd(); } this._bindEvents(); //Actually add our markers to the map: l = this._needsClustering; this._needsClustering = []; this.addLayers(l); }, //Overrides FeatureGroup.onRemove onRemove: function (map) { map.off('zoomend', this._zoomEnd, this); map.off('moveend', this._moveEnd, this); this._unbindEvents(); //In case we are in a cluster animation this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', ''); if (this._spiderfierOnRemove) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely this._spiderfierOnRemove(); } delete this._maxLat; //Clean up all the layers we added to the map this._hideCoverage(); this._featureGroup.remove(); this._nonPointGroup.remove(); this._featureGroup.clearLayers(); this._map = null; }, getVisibleParent: function (marker) { var vMarker = marker; while (vMarker && !vMarker._icon) { vMarker = vMarker.__parent; } return vMarker || null; }, //Remove the given object from the given array _arraySplice: function (anArray, obj) { for (var i = anArray.length - 1; i >= 0; i--) { if (anArray[i] === obj) { anArray.splice(i, 1); return true; } } }, /** * Removes a marker from all _gridUnclustered zoom levels, starting at the supplied zoom. * @param marker to be removed from _gridUnclustered. * @param z integer bottom start zoom level (included) * @private */ _removeFromGridUnclustered: function (marker, z) { var map = this._map, gridUnclustered = this._gridUnclustered; for (; z >= 0; z--) { if (!gridUnclustered[z].removeObject(marker, map.project(marker.getLatLng(), z))) { break; } } }, _childMarkerMoved: function (e) { if (!this._ignoreMove) { e.target._latlng = e.oldLatLng; this.removeLayer(e.target); e.target._latlng = e.latlng; this.addLayer(e.target); } }, //Internal function for removing a marker from everything. //dontUpdateMap: set to true if you will handle updating the map manually (for bulk functions) _removeLayer: function (marker, removeFromDistanceGrid, dontUpdateMap) { var gridClusters = this._gridClusters, gridUnclustered = this._gridUnclustered, fg = this._featureGroup, map = this._map; //Remove the marker from distance clusters it might be in if (removeFromDistanceGrid) { this._removeFromGridUnclustered(marker, this._maxZoom); } //Work our way up the clusters removing them as we go if required var cluster = marker.__parent, markers = cluster._markers, otherMarker; //Remove the marker from the immediate parents marker list this._arraySplice(markers, marker); while (cluster) { cluster._childCount--; cluster._boundsNeedUpdate = true; if (cluster._zoom < 0) { //Top level, do nothing break; } else if (removeFromDistanceGrid && cluster._childCount <= 1) { //Cluster no longer required //We need to push the other marker up to the parent otherMarker = cluster._markers[0] === marker ? cluster._markers[1] : cluster._markers[0]; //Update distance grid gridClusters[cluster._zoom].removeObject(cluster, map.project(cluster._cLatLng, cluster._zoom)); gridUnclustered[cluster._zoom].addObject(otherMarker, map.project(otherMarker.getLatLng(), cluster._zoom)); //Move otherMarker up to parent this._arraySplice(cluster.__parent._childClusters, cluster); cluster.__parent._markers.push(otherMarker); otherMarker.__parent = cluster.__parent; if (cluster._icon) { //Cluster is currently on the map, need to put the marker on the map instead fg.removeLayer(cluster); if (!dontUpdateMap) { fg.addLayer(otherMarker); } } } else { cluster._iconNeedsUpdate = true; } cluster = cluster.__parent; } delete marker.__parent; }, _isOrIsParent: function (el, oel) { while (oel) { if (el === oel) { return true; } oel = oel.parentNode; } return false; }, //Override L.Evented.fire fire: function (type, data, propagate) { if (data && data.layer instanceof L.MarkerCluster) { //Prevent multiple clustermouseover/off events if the icon is made up of stacked divs (Doesn't work in ie <= 8, no relatedTarget) if (data.originalEvent && this._isOrIsParent(data.layer._icon, data.originalEvent.relatedTarget)) { return; } type = 'cluster' + type; } L.FeatureGroup.prototype.fire.call(this, type, data, propagate); }, //Override L.Evented.listens listens: function (type, propagate) { return L.FeatureGroup.prototype.listens.call(this, type, propagate) || L.FeatureGroup.prototype.listens.call(this, 'cluster' + type, propagate); }, //Default functionality _defaultIconCreateFunction: function (cluster) { var childCount = cluster.getChildCount(); var c = ' marker-cluster-'; if (childCount < 10) { c += 'small'; } else if (childCount < 100) { c += 'medium'; } else { c += 'large'; } return new L.DivIcon({ html: '
    ' + childCount + '
    ', className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) }); }, _bindEvents: function () { var map = this._map, spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom, showCoverageOnHover = this.options.showCoverageOnHover, zoomToBoundsOnClick = this.options.zoomToBoundsOnClick; //Zoom on cluster click or spiderfy if we are at the lowest level if (spiderfyOnMaxZoom || zoomToBoundsOnClick) { this.on('clusterclick', this._zoomOrSpiderfy, this); } //Show convex hull (boundary) polygon on mouse over if (showCoverageOnHover) { this.on('clustermouseover', this._showCoverage, this); this.on('clustermouseout', this._hideCoverage, this); map.on('zoomend', this._hideCoverage, this); } }, _zoomOrSpiderfy: function (e) { var cluster = e.layer, bottomCluster = cluster; while (bottomCluster._childClusters.length === 1) { bottomCluster = bottomCluster._childClusters[0]; } if (bottomCluster._zoom === this._maxZoom && bottomCluster._childCount === cluster._childCount && this.options.spiderfyOnMaxZoom) { // All child markers are contained in a single cluster from this._maxZoom to this cluster. cluster.spiderfy(); } else if (this.options.zoomToBoundsOnClick) { cluster.zoomToBounds(); } // Focus the map again for keyboard users. if (e.originalEvent && e.originalEvent.keyCode === 13) { this._map._container.focus(); } }, _showCoverage: function (e) { var map = this._map; if (this._inZoomAnimation) { return; } if (this._shownPolygon) { map.removeLayer(this._shownPolygon); } if (e.layer.getChildCount() > 2 && e.layer !== this._spiderfied) { this._shownPolygon = new L.Polygon(e.layer.getConvexHull(), this.options.polygonOptions); map.addLayer(this._shownPolygon); } }, _hideCoverage: function () { if (this._shownPolygon) { this._map.removeLayer(this._shownPolygon); this._shownPolygon = null; } }, _unbindEvents: function () { var spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom, showCoverageOnHover = this.options.showCoverageOnHover, zoomToBoundsOnClick = this.options.zoomToBoundsOnClick, map = this._map; if (spiderfyOnMaxZoom || zoomToBoundsOnClick) { this.off('clusterclick', this._zoomOrSpiderfy, this); } if (showCoverageOnHover) { this.off('clustermouseover', this._showCoverage, this); this.off('clustermouseout', this._hideCoverage, this); map.off('zoomend', this._hideCoverage, this); } }, _zoomEnd: function () { if (!this._map) { //May have been removed from the map by a zoomEnd handler return; } this._mergeSplitClusters(); this._zoom = Math.round(this._map._zoom); this._currentShownBounds = this._getExpandedVisibleBounds(); }, _moveEnd: function () { if (this._inZoomAnimation) { return; } var newBounds = this._getExpandedVisibleBounds(); this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, newBounds); this._topClusterLevel._recursivelyAddChildrenToMap(null, Math.round(this._map._zoom), newBounds); this._currentShownBounds = newBounds; return; }, _generateInitialClusters: function () { var maxZoom = this._map.getMaxZoom(), radius = this.options.maxClusterRadius, radiusFn = radius; //If we just set maxClusterRadius to a single number, we need to create //a simple function to return that number. Otherwise, we just have to //use the function we've passed in. if (typeof radius !== "function") { radiusFn = function () { return radius; }; } if (this.options.disableClusteringAtZoom) { maxZoom = this.options.disableClusteringAtZoom - 1; } this._maxZoom = maxZoom; this._gridClusters = {}; this._gridUnclustered = {}; //Set up DistanceGrids for each zoom for (var zoom = maxZoom; zoom >= 0; zoom--) { this._gridClusters[zoom] = new L.DistanceGrid(radiusFn(zoom)); this._gridUnclustered[zoom] = new L.DistanceGrid(radiusFn(zoom)); } // Instantiate the appropriate L.MarkerCluster class (animated or not). this._topClusterLevel = new this._markerCluster(this, -1); }, //Zoom: Zoom to start adding at (Pass this._maxZoom to start at the bottom) _addLayer: function (layer, zoom) { var gridClusters = this._gridClusters, gridUnclustered = this._gridUnclustered, markerPoint, z; if (this.options.singleMarkerMode) { this._overrideMarkerIcon(layer); } layer.on('move', this._childMarkerMoved, this); //Find the lowest zoom level to slot this one in for (; zoom >= 0; zoom--) { markerPoint = this._map.project(layer.getLatLng(), zoom); // calculate pixel position //Try find a cluster close by var closest = gridClusters[zoom].getNearObject(markerPoint); if (closest) { closest._addChild(layer); layer.__parent = closest; return; } //Try find a marker close by to form a new cluster with closest = gridUnclustered[zoom].getNearObject(markerPoint); if (closest) { var parent = closest.__parent; if (parent) { this._removeLayer(closest, false); } //Create new cluster with these 2 in it var newCluster = new this._markerCluster(this, zoom, closest, layer); gridClusters[zoom].addObject(newCluster, this._map.project(newCluster._cLatLng, zoom)); closest.__parent = newCluster; layer.__parent = newCluster; //First create any new intermediate parent clusters that don't exist var lastParent = newCluster; for (z = zoom - 1; z > parent._zoom; z--) { lastParent = new this._markerCluster(this, z, lastParent); gridClusters[z].addObject(lastParent, this._map.project(closest.getLatLng(), z)); } parent._addChild(lastParent); //Remove closest from this zoom level and any above that it is in, replace with newCluster this._removeFromGridUnclustered(closest, zoom); return; } //Didn't manage to cluster in at this zoom, record us as a marker here and continue upwards gridUnclustered[zoom].addObject(layer, markerPoint); } //Didn't get in anything, add us to the top this._topClusterLevel._addChild(layer); layer.__parent = this._topClusterLevel; return; }, /** * Refreshes the icon of all "dirty" visible clusters. * Non-visible "dirty" clusters will be updated when they are added to the map. * @private */ _refreshClustersIcons: function () { this._featureGroup.eachLayer(function (c) { if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) { c._updateIcon(); } }); }, //Enqueue code to fire after the marker expand/contract has happened _enqueue: function (fn) { this._queue.push(fn); if (!this._queueTimeout) { this._queueTimeout = setTimeout(L.bind(this._processQueue, this), 300); } }, _processQueue: function () { for (var i = 0; i < this._queue.length; i++) { this._queue[i].call(this); } this._queue.length = 0; clearTimeout(this._queueTimeout); this._queueTimeout = null; }, //Merge and split any existing clusters that are too big or small _mergeSplitClusters: function () { var mapZoom = Math.round(this._map._zoom); //In case we are starting to split before the animation finished this._processQueue(); if (this._zoom < mapZoom && this._currentShownBounds.intersects(this._getExpandedVisibleBounds())) { //Zoom in, split this._animationStart(); //Remove clusters now off screen this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, this._getExpandedVisibleBounds()); this._animationZoomIn(this._zoom, mapZoom); } else if (this._zoom > mapZoom) { //Zoom out, merge this._animationStart(); this._animationZoomOut(this._zoom, mapZoom); } else { this._moveEnd(); } }, //Gets the maps visible bounds expanded in each direction by the size of the screen (so the user cannot see an area we do not cover in one pan) _getExpandedVisibleBounds: function () { if (!this.options.removeOutsideVisibleBounds) { return this._mapBoundsInfinite; } else if (L.Browser.mobile) { return this._checkBoundsMaxLat(this._map.getBounds()); } return this._checkBoundsMaxLat(this._map.getBounds().pad(1)); // Padding expands the bounds by its own dimensions but scaled with the given factor. }, /** * Expands the latitude to Infinity (or -Infinity) if the input bounds reach the map projection maximum defined latitude * (in the case of Web/Spherical Mercator, it is 85.0511287798 / see https://en.wikipedia.org/wiki/Web_Mercator#Formulas). * Otherwise, the removeOutsideVisibleBounds option will remove markers beyond that limit, whereas the same markers without * this option (or outside MCG) will have their position floored (ceiled) by the projection and rendered at that limit, * making the user think that MCG "eats" them and never displays them again. * @param bounds L.LatLngBounds * @returns {L.LatLngBounds} * @private */ _checkBoundsMaxLat: function (bounds) { var maxLat = this._maxLat; if (maxLat !== undefined) { if (bounds.getNorth() >= maxLat) { bounds._northEast.lat = Infinity; } if (bounds.getSouth() <= -maxLat) { bounds._southWest.lat = -Infinity; } } return bounds; }, //Shared animation code _animationAddLayerNonAnimated: function (layer, newCluster) { if (newCluster === layer) { this._featureGroup.addLayer(layer); } else if (newCluster._childCount === 2) { newCluster._addToMap(); var markers = newCluster.getAllChildMarkers(); this._featureGroup.removeLayer(markers[0]); this._featureGroup.removeLayer(markers[1]); } else { newCluster._updateIcon(); } }, /** * Extracts individual (i.e. non-group) layers from a Layer Group. * @param group to extract layers from. * @param output {Array} in which to store the extracted layers. * @returns {*|Array} * @private */ _extractNonGroupLayers: function (group, output) { var layers = group.getLayers(), i = 0, layer; output = output || []; for (; i < layers.length; i++) { layer = layers[i]; if (layer instanceof L.LayerGroup) { this._extractNonGroupLayers(layer, output); continue; } output.push(layer); } return output; }, /** * Implements the singleMarkerMode option. * @param layer Marker to re-style using the Clusters iconCreateFunction. * @returns {L.Icon} The newly created icon. * @private */ _overrideMarkerIcon: function (layer) { var icon = layer.options.icon = this.options.iconCreateFunction({ getChildCount: function () { return 1; }, getAllChildMarkers: function () { return [layer]; } }); return icon; } }); // Constant bounds used in case option "removeOutsideVisibleBounds" is set to false. L.MarkerClusterGroup.include({ _mapBoundsInfinite: new L.LatLngBounds(new L.LatLng(-Infinity, -Infinity), new L.LatLng(Infinity, Infinity)) }); L.MarkerClusterGroup.include({ _noAnimation: { //Non Animated versions of everything _animationStart: function () { //Do nothing... }, _animationZoomIn: function (previousZoomLevel, newZoomLevel) { this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel); this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds()); //We didn't actually animate, but we use this event to mean "clustering animations have finished" this.fire('animationend'); }, _animationZoomOut: function (previousZoomLevel, newZoomLevel) { this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel); this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds()); //We didn't actually animate, but we use this event to mean "clustering animations have finished" this.fire('animationend'); }, _animationAddLayer: function (layer, newCluster) { this._animationAddLayerNonAnimated(layer, newCluster); } }, _withAnimation: { //Animated versions here _animationStart: function () { this._map._mapPane.className += ' leaflet-cluster-anim'; this._inZoomAnimation++; }, _animationZoomIn: function (previousZoomLevel, newZoomLevel) { var bounds = this._getExpandedVisibleBounds(), fg = this._featureGroup, i; this._ignoreMove = true; //Add all children of current clusters to map and remove those clusters from map this._topClusterLevel._recursively(bounds, previousZoomLevel, 0, function (c) { var startPos = c._latlng, markers = c._markers, m; if (!bounds.contains(startPos)) { startPos = null; } if (c._isSingleParent() && previousZoomLevel + 1 === newZoomLevel) { //Immediately add the new child and remove us fg.removeLayer(c); c._recursivelyAddChildrenToMap(null, newZoomLevel, bounds); } else { //Fade out old cluster c.clusterHide(); c._recursivelyAddChildrenToMap(startPos, newZoomLevel, bounds); } //Remove all markers that aren't visible any more //TODO: Do we actually need to do this on the higher levels too? for (i = markers.length - 1; i >= 0; i--) { m = markers[i]; if (!bounds.contains(m._latlng)) { fg.removeLayer(m); } } }); this._forceLayout(); //Update opacities this._topClusterLevel._recursivelyBecomeVisible(bounds, newZoomLevel); //TODO Maybe? Update markers in _recursivelyBecomeVisible fg.eachLayer(function (n) { if (!(n instanceof L.MarkerCluster) && n._icon) { n.clusterShow(); } }); //update the positions of the just added clusters/markers this._topClusterLevel._recursively(bounds, previousZoomLevel, newZoomLevel, function (c) { c._recursivelyRestoreChildPositions(newZoomLevel); }); this._ignoreMove = false; //Remove the old clusters and close the zoom animation this._enqueue(function () { //update the positions of the just added clusters/markers this._topClusterLevel._recursively(bounds, previousZoomLevel, 0, function (c) { fg.removeLayer(c); c.clusterShow(); }); this._animationEnd(); }); }, _animationZoomOut: function (previousZoomLevel, newZoomLevel) { this._animationZoomOutSingle(this._topClusterLevel, previousZoomLevel - 1, newZoomLevel); //Need to add markers for those that weren't on the map before but are now this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds()); //Remove markers that were on the map before but won't be now this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel, this._getExpandedVisibleBounds()); }, _animationAddLayer: function (layer, newCluster) { var me = this, fg = this._featureGroup; fg.addLayer(layer); if (newCluster !== layer) { if (newCluster._childCount > 2) { //Was already a cluster newCluster._updateIcon(); this._forceLayout(); this._animationStart(); layer._setPos(this._map.latLngToLayerPoint(newCluster.getLatLng())); layer.clusterHide(); this._enqueue(function () { fg.removeLayer(layer); layer.clusterShow(); me._animationEnd(); }); } else { //Just became a cluster this._forceLayout(); me._animationStart(); me._animationZoomOutSingle(newCluster, this._map.getMaxZoom(), this._map.getZoom()); } } } }, // Private methods for animated versions. _animationZoomOutSingle: function (cluster, previousZoomLevel, newZoomLevel) { var bounds = this._getExpandedVisibleBounds(); //Animate all of the markers in the clusters to move to their cluster center point cluster._recursivelyAnimateChildrenInAndAddSelfToMap(bounds, previousZoomLevel + 1, newZoomLevel); var me = this; //Update the opacity (If we immediately set it they won't animate) this._forceLayout(); cluster._recursivelyBecomeVisible(bounds, newZoomLevel); //TODO: Maybe use the transition timing stuff to make this more reliable //When the animations are done, tidy up this._enqueue(function () { //This cluster stopped being a cluster before the timeout fired if (cluster._childCount === 1) { var m = cluster._markers[0]; //If we were in a cluster animation at the time then the opacity and position of our child could be wrong now, so fix it this._ignoreMove = true; m.setLatLng(m.getLatLng()); this._ignoreMove = false; if (m.clusterShow) { m.clusterShow(); } } else { cluster._recursively(bounds, newZoomLevel, 0, function (c) { c._recursivelyRemoveChildrenFromMap(bounds, previousZoomLevel + 1); }); } me._animationEnd(); }); }, _animationEnd: function () { if (this._map) { this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', ''); } this._inZoomAnimation--; this.fire('animationend'); }, //Force a browser layout of stuff in the map // Should apply the current opacity and location to all elements so we can update them again for an animation _forceLayout: function () { //In my testing this works, infact offsetWidth of any element seems to work. //Could loop all this._layers and do this for each _icon if it stops working L.Util.falseFn(document.body.offsetWidth); } }); L.markerClusterGroup = function (options) { return new L.MarkerClusterGroup(options); }; L.MarkerCluster = L.Marker.extend({ initialize: function (group, zoom, a, b) { L.Marker.prototype.initialize.call(this, a ? (a._cLatLng || a.getLatLng()) : new L.LatLng(0, 0), { icon: this }); this._group = group; this._zoom = zoom; this._markers = []; this._childClusters = []; this._childCount = 0; this._iconNeedsUpdate = true; this._boundsNeedUpdate = true; this._bounds = new L.LatLngBounds(); if (a) { this._addChild(a); } if (b) { this._addChild(b); } }, //Recursively retrieve all child markers of this cluster getAllChildMarkers: function (storageArray) { storageArray = storageArray || []; for (var i = this._childClusters.length - 1; i >= 0; i--) { this._childClusters[i].getAllChildMarkers(storageArray); } for (var j = this._markers.length - 1; j >= 0; j--) { storageArray.push(this._markers[j]); } return storageArray; }, //Returns the count of how many child markers we have getChildCount: function () { return this._childCount; }, //Zoom to the minimum of showing all of the child markers, or the extents of this cluster zoomToBounds: function () { var childClusters = this._childClusters.slice(), map = this._group._map, boundsZoom = map.getBoundsZoom(this._bounds), zoom = this._zoom + 1, mapZoom = map.getZoom(), i; //calculate how far we need to zoom down to see all of the markers while (childClusters.length > 0 && boundsZoom > zoom) { zoom++; var newClusters = []; for (i = 0; i < childClusters.length; i++) { newClusters = newClusters.concat(childClusters[i]._childClusters); } childClusters = newClusters; } if (boundsZoom > zoom) { this._group._map.setView(this._latlng, zoom); } else if (boundsZoom <= mapZoom) { //If fitBounds wouldn't zoom us down, zoom us down instead this._group._map.setView(this._latlng, mapZoom + 1); } else { this._group._map.fitBounds(this._bounds); } }, getBounds: function () { var bounds = new L.LatLngBounds(); bounds.extend(this._bounds); return bounds; }, _updateIcon: function () { this._iconNeedsUpdate = true; if (this._icon) { this.setIcon(this); } }, //Cludge for Icon, we pretend to be an icon for performance createIcon: function () { if (this._iconNeedsUpdate) { this._iconObj = this._group.options.iconCreateFunction(this); this._iconNeedsUpdate = false; } return this._iconObj.createIcon(); }, createShadow: function () { return this._iconObj.createShadow(); }, _addChild: function (new1, isNotificationFromChild) { this._iconNeedsUpdate = true; this._boundsNeedUpdate = true; this._setClusterCenter(new1); if (new1 instanceof L.MarkerCluster) { if (!isNotificationFromChild) { this._childClusters.push(new1); new1.__parent = this; } this._childCount += new1._childCount; } else { if (!isNotificationFromChild) { this._markers.push(new1); } this._childCount++; } if (this.__parent) { this.__parent._addChild(new1, true); } }, /** * Makes sure the cluster center is set. If not, uses the child center if it is a cluster, or the marker position. * @param child L.MarkerCluster|L.Marker that will be used as cluster center if not defined yet. * @private */ _setClusterCenter: function (child) { if (!this._cLatLng) { // when clustering, take position of the first point as the cluster center this._cLatLng = child._cLatLng || child._latlng; } }, /** * Assigns impossible bounding values so that the next extend entirely determines the new bounds. * This method avoids having to trash the previous L.LatLngBounds object and to create a new one, which is much slower for this class. * As long as the bounds are not extended, most other methods would probably fail, as they would with bounds initialized but not extended. * @private */ _resetBounds: function () { var bounds = this._bounds; if (bounds._southWest) { bounds._southWest.lat = Infinity; bounds._southWest.lng = Infinity; } if (bounds._northEast) { bounds._northEast.lat = -Infinity; bounds._northEast.lng = -Infinity; } }, _recalculateBounds: function () { var markers = this._markers, childClusters = this._childClusters, latSum = 0, lngSum = 0, totalCount = this._childCount, i, child, childLatLng, childCount; // Case where all markers are removed from the map and we are left with just an empty _topClusterLevel. if (totalCount === 0) { return; } // Reset rather than creating a new object, for performance. this._resetBounds(); // Child markers. for (i = 0; i < markers.length; i++) { childLatLng = markers[i]._latlng; this._bounds.extend(childLatLng); latSum += childLatLng.lat; lngSum += childLatLng.lng; } // Child clusters. for (i = 0; i < childClusters.length; i++) { child = childClusters[i]; // Re-compute child bounds and weighted position first if necessary. if (child._boundsNeedUpdate) { child._recalculateBounds(); } this._bounds.extend(child._bounds); childLatLng = child._wLatLng; childCount = child._childCount; latSum += childLatLng.lat * childCount; lngSum += childLatLng.lng * childCount; } this._latlng = this._wLatLng = new L.LatLng(latSum / totalCount, lngSum / totalCount); // Reset dirty flag. this._boundsNeedUpdate = false; }, //Set our markers position as given and add it to the map _addToMap: function (startPos) { if (startPos) { this._backupLatlng = this._latlng; this.setLatLng(startPos); } this._group._featureGroup.addLayer(this); }, _recursivelyAnimateChildrenIn: function (bounds, center, maxZoom) { this._recursively(bounds, 0, maxZoom - 1, function (c) { var markers = c._markers, i, m; for (i = markers.length - 1; i >= 0; i--) { m = markers[i]; //Only do it if the icon is still on the map if (m._icon) { m._setPos(center); m.clusterHide(); } } }, function (c) { var childClusters = c._childClusters, j, cm; for (j = childClusters.length - 1; j >= 0; j--) { cm = childClusters[j]; if (cm._icon) { cm._setPos(center); cm.clusterHide(); } } } ); }, _recursivelyAnimateChildrenInAndAddSelfToMap: function (bounds, previousZoomLevel, newZoomLevel) { this._recursively(bounds, newZoomLevel, 0, function (c) { c._recursivelyAnimateChildrenIn(bounds, c._group._map.latLngToLayerPoint(c.getLatLng()).round(), previousZoomLevel); //TODO: depthToAnimateIn affects _isSingleParent, if there is a multizoom we may/may not be. //As a hack we only do a animation free zoom on a single level zoom, if someone does multiple levels then we always animate if (c._isSingleParent() && previousZoomLevel - 1 === newZoomLevel) { c.clusterShow(); c._recursivelyRemoveChildrenFromMap(bounds, previousZoomLevel); //Immediately remove our children as we are replacing them. TODO previousBounds not bounds } else { c.clusterHide(); } c._addToMap(); } ); }, _recursivelyBecomeVisible: function (bounds, zoomLevel) { this._recursively(bounds, 0, zoomLevel, null, function (c) { c.clusterShow(); }); }, _recursivelyAddChildrenToMap: function (startPos, zoomLevel, bounds) { this._recursively(bounds, -1, zoomLevel, function (c) { if (zoomLevel === c._zoom) { return; } //Add our child markers at startPos (so they can be animated out) for (var i = c._markers.length - 1; i >= 0; i--) { var nm = c._markers[i]; if (!bounds.contains(nm._latlng)) { continue; } if (startPos) { nm._backupLatlng = nm.getLatLng(); nm.setLatLng(startPos); if (nm.clusterHide) { nm.clusterHide(); } } c._group._featureGroup.addLayer(nm); } }, function (c) { c._addToMap(startPos); } ); }, _recursivelyRestoreChildPositions: function (zoomLevel) { //Fix positions of child markers for (var i = this._markers.length - 1; i >= 0; i--) { var nm = this._markers[i]; if (nm._backupLatlng) { nm.setLatLng(nm._backupLatlng); delete nm._backupLatlng; } } if (zoomLevel - 1 === this._zoom) { //Reposition child clusters for (var j = this._childClusters.length - 1; j >= 0; j--) { this._childClusters[j]._restorePosition(); } } else { for (var k = this._childClusters.length - 1; k >= 0; k--) { this._childClusters[k]._recursivelyRestoreChildPositions(zoomLevel); } } }, _restorePosition: function () { if (this._backupLatlng) { this.setLatLng(this._backupLatlng); delete this._backupLatlng; } }, //exceptBounds: If set, don't remove any markers/clusters in it _recursivelyRemoveChildrenFromMap: function (previousBounds, zoomLevel, exceptBounds) { var m, i; this._recursively(previousBounds, -1, zoomLevel - 1, function (c) { //Remove markers at every level for (i = c._markers.length - 1; i >= 0; i--) { m = c._markers[i]; if (!exceptBounds || !exceptBounds.contains(m._latlng)) { c._group._featureGroup.removeLayer(m); if (m.clusterShow) { m.clusterShow(); } } } }, function (c) { //Remove child clusters at just the bottom level for (i = c._childClusters.length - 1; i >= 0; i--) { m = c._childClusters[i]; if (!exceptBounds || !exceptBounds.contains(m._latlng)) { c._group._featureGroup.removeLayer(m); if (m.clusterShow) { m.clusterShow(); } } } } ); }, //Run the given functions recursively to this and child clusters // boundsToApplyTo: a L.LatLngBounds representing the bounds of what clusters to recurse in to // zoomLevelToStart: zoom level to start running functions (inclusive) // zoomLevelToStop: zoom level to stop running functions (inclusive) // runAtEveryLevel: function that takes an L.MarkerCluster as an argument that should be applied on every level // runAtBottomLevel: function that takes an L.MarkerCluster as an argument that should be applied at only the bottom level _recursively: function (boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel) { var childClusters = this._childClusters, zoom = this._zoom, i, c; if (zoomLevelToStart > zoom) { //Still going down to required depth, just recurse to child clusters for (i = childClusters.length - 1; i >= 0; i--) { c = childClusters[i]; if (boundsToApplyTo.intersects(c._bounds)) { c._recursively(boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel); } } } else { //In required depth if (runAtEveryLevel) { runAtEveryLevel(this); } if (runAtBottomLevel && this._zoom === zoomLevelToStop) { runAtBottomLevel(this); } //TODO: This loop is almost the same as above if (zoomLevelToStop > zoom) { for (i = childClusters.length - 1; i >= 0; i--) { c = childClusters[i]; if (boundsToApplyTo.intersects(c._bounds)) { c._recursively(boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel); } } } } }, //Returns true if we are the parent of only one cluster and that cluster is the same as us _isSingleParent: function () { //Don't need to check this._markers as the rest won't work if there are any return this._childClusters.length > 0 && this._childClusters[0]._childCount === this._childCount; } }); /* * Extends L.Marker to include two extra methods: clusterHide and clusterShow. * * They work as setOpacity(0) and setOpacity(1) respectively, but * they will remember the marker's opacity when hiding and showing it again. * */ L.Marker.include({ clusterHide: function () { this.options.opacityWhenUnclustered = this.options.opacity || 1; return this.setOpacity(0); }, clusterShow: function () { var ret = this.setOpacity(this.options.opacity || this.options.opacityWhenUnclustered); delete this.options.opacityWhenUnclustered; return ret; } }); L.DistanceGrid = function (cellSize) { this._cellSize = cellSize; this._sqCellSize = cellSize * cellSize; this._grid = {}; this._objectPoint = { }; }; L.DistanceGrid.prototype = { addObject: function (obj, point) { var x = this._getCoord(point.x), y = this._getCoord(point.y), grid = this._grid, row = grid[y] = grid[y] || {}, cell = row[x] = row[x] || [], stamp = L.Util.stamp(obj); this._objectPoint[stamp] = point; cell.push(obj); }, updateObject: function (obj, point) { this.removeObject(obj); this.addObject(obj, point); }, //Returns true if the object was found removeObject: function (obj, point) { var x = this._getCoord(point.x), y = this._getCoord(point.y), grid = this._grid, row = grid[y] = grid[y] || {}, cell = row[x] = row[x] || [], i, len; delete this._objectPoint[L.Util.stamp(obj)]; for (i = 0, len = cell.length; i < len; i++) { if (cell[i] === obj) { cell.splice(i, 1); if (len === 1) { delete row[x]; } return true; } } }, eachObject: function (fn, context) { var i, j, k, len, row, cell, removed, grid = this._grid; for (i in grid) { row = grid[i]; for (j in row) { cell = row[j]; for (k = 0, len = cell.length; k < len; k++) { removed = fn.call(context, cell[k]); if (removed) { k--; len--; } } } } }, getNearObject: function (point) { var x = this._getCoord(point.x), y = this._getCoord(point.y), i, j, k, row, cell, len, obj, dist, objectPoint = this._objectPoint, closestDistSq = this._sqCellSize, closest = null; for (i = y - 1; i <= y + 1; i++) { row = this._grid[i]; if (row) { for (j = x - 1; j <= x + 1; j++) { cell = row[j]; if (cell) { for (k = 0, len = cell.length; k < len; k++) { obj = cell[k]; dist = this._sqDist(objectPoint[L.Util.stamp(obj)], point); if (dist < closestDistSq) { closestDistSq = dist; closest = obj; } } } } } } return closest; }, _getCoord: function (x) { return Math.floor(x / this._cellSize); }, _sqDist: function (p, p2) { var dx = p2.x - p.x, dy = p2.y - p.y; return dx * dx + dy * dy; } }; /* Copyright (c) 2012 the authors listed at the following URL, and/or the authors of referenced articles or incorporated external code: http://en.literateprograms.org/Quickhull_(Javascript)?action=history&offset=20120410175256 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Retrieved from: http://en.literateprograms.org/Quickhull_(Javascript)?oldid=18434 */ (function () { L.QuickHull = { /* * @param {Object} cpt a point to be measured from the baseline * @param {Array} bl the baseline, as represented by a two-element * array of latlng objects. * @returns {Number} an approximate distance measure */ getDistant: function (cpt, bl) { var vY = bl[1].lat - bl[0].lat, vX = bl[0].lng - bl[1].lng; return (vX * (cpt.lat - bl[0].lat) + vY * (cpt.lng - bl[0].lng)); }, /* * @param {Array} baseLine a two-element array of latlng objects * representing the baseline to project from * @param {Array} latLngs an array of latlng objects * @returns {Object} the maximum point and all new points to stay * in consideration for the hull. */ findMostDistantPointFromBaseLine: function (baseLine, latLngs) { var maxD = 0, maxPt = null, newPoints = [], i, pt, d; for (i = latLngs.length - 1; i >= 0; i--) { pt = latLngs[i]; d = this.getDistant(pt, baseLine); if (d > 0) { newPoints.push(pt); } else { continue; } if (d > maxD) { maxD = d; maxPt = pt; } } return { maxPoint: maxPt, newPoints: newPoints }; }, /* * Given a baseline, compute the convex hull of latLngs as an array * of latLngs. * * @param {Array} latLngs * @returns {Array} */ buildConvexHull: function (baseLine, latLngs) { var convexHullBaseLines = [], t = this.findMostDistantPointFromBaseLine(baseLine, latLngs); if (t.maxPoint) { // if there is still a point "outside" the base line convexHullBaseLines = convexHullBaseLines.concat( this.buildConvexHull([baseLine[0], t.maxPoint], t.newPoints) ); convexHullBaseLines = convexHullBaseLines.concat( this.buildConvexHull([t.maxPoint, baseLine[1]], t.newPoints) ); return convexHullBaseLines; } else { // if there is no more point "outside" the base line, the current base line is part of the convex hull return [baseLine[0]]; } }, /* * Given an array of latlngs, compute a convex hull as an array * of latlngs * * @param {Array} latLngs * @returns {Array} */ getConvexHull: function (latLngs) { // find first baseline var maxLat = false, minLat = false, maxLng = false, minLng = false, maxLatPt = null, minLatPt = null, maxLngPt = null, minLngPt = null, maxPt = null, minPt = null, i; for (i = latLngs.length - 1; i >= 0; i--) { var pt = latLngs[i]; if (maxLat === false || pt.lat > maxLat) { maxLatPt = pt; maxLat = pt.lat; } if (minLat === false || pt.lat < minLat) { minLatPt = pt; minLat = pt.lat; } if (maxLng === false || pt.lng > maxLng) { maxLngPt = pt; maxLng = pt.lng; } if (minLng === false || pt.lng < minLng) { minLngPt = pt; minLng = pt.lng; } } if (minLat !== maxLat) { minPt = minLatPt; maxPt = maxLatPt; } else { minPt = minLngPt; maxPt = maxLngPt; } var ch = [].concat(this.buildConvexHull([minPt, maxPt], latLngs), this.buildConvexHull([maxPt, minPt], latLngs)); return ch; } }; }()); L.MarkerCluster.include({ getConvexHull: function () { var childMarkers = this.getAllChildMarkers(), points = [], p, i; for (i = childMarkers.length - 1; i >= 0; i--) { p = childMarkers[i].getLatLng(); points.push(p); } return L.QuickHull.getConvexHull(points); } }); //This code is 100% based on https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet //Huge thanks to jawj for implementing it first to make my job easy :-) L.MarkerCluster.include({ _2PI: Math.PI * 2, _circleFootSeparation: 25, //related to circumference of circle _circleStartAngle: Math.PI / 6, _spiralFootSeparation: 28, //related to size of spiral (experiment!) _spiralLengthStart: 11, _spiralLengthFactor: 5, _circleSpiralSwitchover: 9, //show spiral instead of circle from this marker count upwards. // 0 -> always spiral; Infinity -> always circle spiderfy: function () { if (this._group._spiderfied === this || this._group._inZoomAnimation) { return; } var childMarkers = this.getAllChildMarkers(), group = this._group, map = group._map, center = map.latLngToLayerPoint(this._latlng), positions; this._group._unspiderfy(); this._group._spiderfied = this; //TODO Maybe: childMarkers order by distance to center if (childMarkers.length >= this._circleSpiralSwitchover) { positions = this._generatePointsSpiral(childMarkers.length, center); } else { center.y += 10; // Otherwise circles look wrong => hack for standard blue icon, renders differently for other icons. positions = this._generatePointsCircle(childMarkers.length, center); } this._animationSpiderfy(childMarkers, positions); }, unspiderfy: function (zoomDetails) { /// Argument from zoomanim if being called in a zoom animation or null otherwise if (this._group._inZoomAnimation) { return; } this._animationUnspiderfy(zoomDetails); this._group._spiderfied = null; }, _generatePointsCircle: function (count, centerPt) { var circumference = this._group.options.spiderfyDistanceMultiplier * this._circleFootSeparation * (2 + count), legLength = circumference / this._2PI, //radius from circumference angleStep = this._2PI / count, res = [], i, angle; res.length = count; for (i = count - 1; i >= 0; i--) { angle = this._circleStartAngle + i * angleStep; res[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round(); } return res; }, _generatePointsSpiral: function (count, centerPt) { var spiderfyDistanceMultiplier = this._group.options.spiderfyDistanceMultiplier, legLength = spiderfyDistanceMultiplier * this._spiralLengthStart, separation = spiderfyDistanceMultiplier * this._spiralFootSeparation, lengthFactor = spiderfyDistanceMultiplier * this._spiralLengthFactor * this._2PI, angle = 0, res = [], i; res.length = count; // Higher index, closer position to cluster center. for (i = count - 1; i >= 0; i--) { angle += separation / legLength + i * 0.0005; res[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round(); legLength += lengthFactor / angle; } return res; }, _noanimationUnspiderfy: function () { var group = this._group, map = group._map, fg = group._featureGroup, childMarkers = this.getAllChildMarkers(), m, i; group._ignoreMove = true; this.setOpacity(1); for (i = childMarkers.length - 1; i >= 0; i--) { m = childMarkers[i]; fg.removeLayer(m); if (m._preSpiderfyLatlng) { m.setLatLng(m._preSpiderfyLatlng); delete m._preSpiderfyLatlng; } if (m.setZIndexOffset) { m.setZIndexOffset(0); } if (m._spiderLeg) { map.removeLayer(m._spiderLeg); delete m._spiderLeg; } } group.fire('unspiderfied', { cluster: this, markers: childMarkers }); group._ignoreMove = false; group._spiderfied = null; } }); //Non Animated versions of everything L.MarkerClusterNonAnimated = L.MarkerCluster.extend({ _animationSpiderfy: function (childMarkers, positions) { var group = this._group, map = group._map, fg = group._featureGroup, legOptions = this._group.options.spiderLegPolylineOptions, i, m, leg, newPos; group._ignoreMove = true; // Traverse in ascending order to make sure that inner circleMarkers are on top of further legs. Normal markers are re-ordered by newPosition. // The reverse order trick no longer improves performance on modern browsers. for (i = 0; i < childMarkers.length; i++) { newPos = map.layerPointToLatLng(positions[i]); m = childMarkers[i]; // Add the leg before the marker, so that in case the latter is a circleMarker, the leg is behind it. leg = new L.Polyline([this._latlng, newPos], legOptions); map.addLayer(leg); m._spiderLeg = leg; // Now add the marker. m._preSpiderfyLatlng = m._latlng; m.setLatLng(newPos); if (m.setZIndexOffset) { m.setZIndexOffset(1000000); //Make these appear on top of EVERYTHING } fg.addLayer(m); } this.setOpacity(0.3); group._ignoreMove = false; group.fire('spiderfied', { cluster: this, markers: childMarkers }); }, _animationUnspiderfy: function () { this._noanimationUnspiderfy(); } }); //Animated versions here L.MarkerCluster.include({ _animationSpiderfy: function (childMarkers, positions) { var me = this, group = this._group, map = group._map, fg = group._featureGroup, thisLayerLatLng = this._latlng, thisLayerPos = map.latLngToLayerPoint(thisLayerLatLng), svg = L.Path.SVG, legOptions = L.extend({}, this._group.options.spiderLegPolylineOptions), // Copy the options so that we can modify them for animation. finalLegOpacity = legOptions.opacity, i, m, leg, legPath, legLength, newPos; if (finalLegOpacity === undefined) { finalLegOpacity = L.MarkerClusterGroup.prototype.options.spiderLegPolylineOptions.opacity; } if (svg) { // If the initial opacity of the spider leg is not 0 then it appears before the animation starts. legOptions.opacity = 0; // Add the class for CSS transitions. legOptions.className = (legOptions.className || '') + ' leaflet-cluster-spider-leg'; } else { // Make sure we have a defined opacity. legOptions.opacity = finalLegOpacity; } group._ignoreMove = true; // Add markers and spider legs to map, hidden at our center point. // Traverse in ascending order to make sure that inner circleMarkers are on top of further legs. Normal markers are re-ordered by newPosition. // The reverse order trick no longer improves performance on modern browsers. for (i = 0; i < childMarkers.length; i++) { m = childMarkers[i]; newPos = map.layerPointToLatLng(positions[i]); // Add the leg before the marker, so that in case the latter is a circleMarker, the leg is behind it. leg = new L.Polyline([thisLayerLatLng, newPos], legOptions); map.addLayer(leg); m._spiderLeg = leg; // Explanations: https://jakearchibald.com/2013/animated-line-drawing-svg/ // In our case the transition property is declared in the CSS file. if (svg) { legPath = leg._path; legLength = legPath.getTotalLength() + 0.1; // Need a small extra length to avoid remaining dot in Firefox. legPath.style.strokeDasharray = legLength; // Just 1 length is enough, it will be duplicated. legPath.style.strokeDashoffset = legLength; } // If it is a marker, add it now and we'll animate it out if (m.setZIndexOffset) { m.setZIndexOffset(1000000); // Make normal markers appear on top of EVERYTHING } if (m.clusterHide) { m.clusterHide(); } // Vectors just get immediately added fg.addLayer(m); if (m._setPos) { m._setPos(thisLayerPos); } } group._forceLayout(); group._animationStart(); // Reveal markers and spider legs. for (i = childMarkers.length - 1; i >= 0; i--) { newPos = map.layerPointToLatLng(positions[i]); m = childMarkers[i]; //Move marker to new position m._preSpiderfyLatlng = m._latlng; m.setLatLng(newPos); if (m.clusterShow) { m.clusterShow(); } // Animate leg (animation is actually delegated to CSS transition). if (svg) { leg = m._spiderLeg; legPath = leg._path; legPath.style.strokeDashoffset = 0; //legPath.style.strokeOpacity = finalLegOpacity; leg.setStyle({opacity: finalLegOpacity}); } } this.setOpacity(0.3); group._ignoreMove = false; setTimeout(function () { group._animationEnd(); group.fire('spiderfied', { cluster: me, markers: childMarkers }); }, 200); }, _animationUnspiderfy: function (zoomDetails) { var me = this, group = this._group, map = group._map, fg = group._featureGroup, thisLayerPos = zoomDetails ? map._latLngToNewLayerPoint(this._latlng, zoomDetails.zoom, zoomDetails.center) : map.latLngToLayerPoint(this._latlng), childMarkers = this.getAllChildMarkers(), svg = L.Path.SVG, m, i, leg, legPath, legLength, nonAnimatable; group._ignoreMove = true; group._animationStart(); //Make us visible and bring the child markers back in this.setOpacity(1); for (i = childMarkers.length - 1; i >= 0; i--) { m = childMarkers[i]; //Marker was added to us after we were spiderfied if (!m._preSpiderfyLatlng) { continue; } //Fix up the location to the real one m.setLatLng(m._preSpiderfyLatlng); delete m._preSpiderfyLatlng; //Hack override the location to be our center nonAnimatable = true; if (m._setPos) { m._setPos(thisLayerPos); nonAnimatable = false; } if (m.clusterHide) { m.clusterHide(); nonAnimatable = false; } if (nonAnimatable) { fg.removeLayer(m); } // Animate the spider leg back in (animation is actually delegated to CSS transition). if (svg) { leg = m._spiderLeg; legPath = leg._path; legLength = legPath.getTotalLength() + 0.1; legPath.style.strokeDashoffset = legLength; leg.setStyle({opacity: 0}); } } group._ignoreMove = false; setTimeout(function () { //If we have only <= one child left then that marker will be shown on the map so don't remove it! var stillThereChildCount = 0; for (i = childMarkers.length - 1; i >= 0; i--) { m = childMarkers[i]; if (m._spiderLeg) { stillThereChildCount++; } } for (i = childMarkers.length - 1; i >= 0; i--) { m = childMarkers[i]; if (!m._spiderLeg) { //Has already been unspiderfied continue; } if (m.clusterShow) { m.clusterShow(); } if (m.setZIndexOffset) { m.setZIndexOffset(0); } if (stillThereChildCount > 1) { fg.removeLayer(m); } map.removeLayer(m._spiderLeg); delete m._spiderLeg; } group._animationEnd(); group.fire('unspiderfied', { cluster: me, markers: childMarkers }); }, 200); } }); L.MarkerClusterGroup.include({ //The MarkerCluster currently spiderfied (if any) _spiderfied: null, unspiderfy: function () { this._unspiderfy.apply(this, arguments); }, _spiderfierOnAdd: function () { this._map.on('click', this._unspiderfyWrapper, this); if (this._map.options.zoomAnimation) { this._map.on('zoomstart', this._unspiderfyZoomStart, this); } //Browsers without zoomAnimation or a big zoom don't fire zoomstart this._map.on('zoomend', this._noanimationUnspiderfy, this); if (!L.Browser.touch) { this._map.getRenderer(this); //Needs to happen in the pageload, not after, or animations don't work in webkit // http://stackoverflow.com/questions/8455200/svg-animate-with-dynamically-added-elements //Disable on touch browsers as the animation messes up on a touch zoom and isn't very noticable } }, _spiderfierOnRemove: function () { this._map.off('click', this._unspiderfyWrapper, this); this._map.off('zoomstart', this._unspiderfyZoomStart, this); this._map.off('zoomanim', this._unspiderfyZoomAnim, this); this._map.off('zoomend', this._noanimationUnspiderfy, this); //Ensure that markers are back where they should be // Use no animation to avoid a sticky leaflet-cluster-anim class on mapPane this._noanimationUnspiderfy(); }, //On zoom start we add a zoomanim handler so that we are guaranteed to be last (after markers are animated) //This means we can define the animation they do rather than Markers doing an animation to their actual location _unspiderfyZoomStart: function () { if (!this._map) { //May have been removed from the map by a zoomEnd handler return; } this._map.on('zoomanim', this._unspiderfyZoomAnim, this); }, _unspiderfyZoomAnim: function (zoomDetails) { //Wait until the first zoomanim after the user has finished touch-zooming before running the animation if (L.DomUtil.hasClass(this._map._mapPane, 'leaflet-touching')) { return; } this._map.off('zoomanim', this._unspiderfyZoomAnim, this); this._unspiderfy(zoomDetails); }, _unspiderfyWrapper: function () { /// _unspiderfy but passes no arguments this._unspiderfy(); }, _unspiderfy: function (zoomDetails) { if (this._spiderfied) { this._spiderfied.unspiderfy(zoomDetails); } }, _noanimationUnspiderfy: function () { if (this._spiderfied) { this._spiderfied._noanimationUnspiderfy(); } }, //If the given layer is currently being spiderfied then we unspiderfy it so it isn't on the map anymore etc _unspiderfyLayer: function (layer) { if (layer._spiderLeg) { this._featureGroup.removeLayer(layer); if (layer.clusterShow) { layer.clusterShow(); } //Position will be fixed up immediately in _animationUnspiderfy if (layer.setZIndexOffset) { layer.setZIndexOffset(0); } this._map.removeLayer(layer._spiderLeg); delete layer._spiderLeg; } } }); /** * Adds 1 public method to MCG and 1 to L.Marker to facilitate changing * markers' icon options and refreshing their icon and their parent clusters * accordingly (case where their iconCreateFunction uses data of childMarkers * to make up the cluster icon). */ L.MarkerClusterGroup.include({ /** * Updates the icon of all clusters which are parents of the given marker(s). * In singleMarkerMode, also updates the given marker(s) icon. * @param layers L.MarkerClusterGroup|L.LayerGroup|Array(L.Marker)|Map(L.Marker)| * L.MarkerCluster|L.Marker (optional) list of markers (or single marker) whose parent * clusters need to be updated. If not provided, retrieves all child markers of this. * @returns {L.MarkerClusterGroup} */ refreshClusters: function (layers) { if (!layers) { layers = this._topClusterLevel.getAllChildMarkers(); } else if (layers instanceof L.MarkerClusterGroup) { layers = layers._topClusterLevel.getAllChildMarkers(); } else if (layers instanceof L.LayerGroup) { layers = layers._layers; } else if (layers instanceof L.MarkerCluster) { layers = layers.getAllChildMarkers(); } else if (layers instanceof L.Marker) { layers = [layers]; } // else: must be an Array(L.Marker)|Map(L.Marker) this._flagParentsIconsNeedUpdate(layers); this._refreshClustersIcons(); // In case of singleMarkerMode, also re-draw the markers. if (this.options.singleMarkerMode) { this._refreshSingleMarkerModeMarkers(layers); } return this; }, /** * Simply flags all parent clusters of the given markers as having a "dirty" icon. * @param layers Array(L.Marker)|Map(L.Marker) list of markers. * @private */ _flagParentsIconsNeedUpdate: function (layers) { var id, parent; // Assumes layers is an Array or an Object whose prototype is non-enumerable. for (id in layers) { // Flag parent clusters' icon as "dirty", all the way up. // Dumb process that flags multiple times upper parents, but still // much more efficient than trying to be smart and make short lists, // at least in the case of a hierarchy following a power law: // http://jsperf.com/flag-nodes-in-power-hierarchy/2 parent = layers[id].__parent; while (parent) { parent._iconNeedsUpdate = true; parent = parent.__parent; } } }, /** * Re-draws the icon of the supplied markers. * To be used in singleMarkerMode only. * @param layers Array(L.Marker)|Map(L.Marker) list of markers. * @private */ _refreshSingleMarkerModeMarkers: function (layers) { var id, layer; for (id in layers) { layer = layers[id]; // Make sure we do not override markers that do not belong to THIS group. if (this.hasLayer(layer)) { // Need to re-create the icon first, then re-draw the marker. layer.setIcon(this._overrideMarkerIcon(layer)); } } } }); L.Marker.include({ /** * Updates the given options in the marker's icon and refreshes the marker. * @param options map object of icon options. * @param directlyRefreshClusters boolean (optional) true to trigger * MCG.refreshClustersOf() right away with this single marker. * @returns {L.Marker} */ refreshIconOptions: function (options, directlyRefreshClusters) { var icon = this.options.icon; L.setOptions(icon, options); this.setIcon(icon); // Shortcut to refresh the associated MCG clusters right away. // To be used when refreshing a single marker. // Otherwise, better use MCG.refreshClusters() once at the end with // the list of modified markers. if (directlyRefreshClusters && this.__parent) { this.__parent._group.refreshClusters(this); } return this; } }); }(window, document)); ================================================ FILE: talkmap/leaflet_dist/leaflet.markercluster.js ================================================ /* Leaflet.markercluster, Provides Beautiful Animated Marker Clustering functionality for Leaflet, a JS library for interactive maps. https://github.com/Leaflet/Leaflet.markercluster (c) 2012-2013, Dave Leaver, smartrak */ !function(e,t,i){L.MarkerClusterGroup=L.FeatureGroup.extend({options:{maxClusterRadius:80,iconCreateFunction:null,spiderfyOnMaxZoom:!0,showCoverageOnHover:!0,zoomToBoundsOnClick:!0,singleMarkerMode:!1,disableClusteringAtZoom:null,removeOutsideVisibleBounds:!0,animate:!0,animateAddingMarkers:!1,spiderfyDistanceMultiplier:1,spiderLegPolylineOptions:{weight:1.5,color:"#222",opacity:.5},chunkedLoading:!1,chunkInterval:200,chunkDelay:50,chunkProgress:null,polygonOptions:{}},initialize:function(e){L.Util.setOptions(this,e),this.options.iconCreateFunction||(this.options.iconCreateFunction=this._defaultIconCreateFunction),this._featureGroup=L.featureGroup(),this._featureGroup.addEventParent(this),this._nonPointGroup=L.featureGroup(),this._nonPointGroup.addEventParent(this),this._inZoomAnimation=0,this._needsClustering=[],this._needsRemoving=[],this._currentShownBounds=null,this._queue=[];var t=L.DomUtil.TRANSITION&&this.options.animate;L.extend(this,t?this._withAnimation:this._noAnimation),this._markerCluster=t?L.MarkerCluster:L.MarkerClusterNonAnimated},addLayer:function(e){if(e instanceof L.LayerGroup)return this.addLayers([e]);if(!e.getLatLng)return this._nonPointGroup.addLayer(e),this;if(!this._map)return this._needsClustering.push(e),this;if(this.hasLayer(e))return this;this._unspiderfy&&this._unspiderfy(),this._addLayer(e,this._maxZoom),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons();var t=e,i=this._map.getZoom();if(e.__parent)for(;t.__parent._zoom>=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),e.off("move",this._childMarkerMoved,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push(e),this):(this._nonPointGroup.removeLayer(e),this)},addLayers:function(e){if(!L.Util.isArray(e))return this.addLayer(e);var t,i=this._featureGroup,n=this._nonPointGroup,s=this.options.chunkedLoading,r=this.options.chunkInterval,o=this.options.chunkProgress,a=e.length,h=0,u=!0;if(this._map){var l=(new Date).getTime(),_=L.bind(function(){for(var d=(new Date).getTime();a>h;h++){if(s&&0===h%200){var c=(new Date).getTime()-d;if(c>r)break}if(t=e[h],t instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(t,e),a=e.length;else if(t.getLatLng){if(!this.hasLayer(t)&&(this._addLayer(t,this._maxZoom),t.__parent&&2===t.__parent.getChildCount())){var p=t.__parent.getAllChildMarkers(),f=p[0]===t?p[1]:p[0];i.removeLayer(f)}}else n.addLayer(t)}o&&o(h,a,(new Date).getTime()-l),h===a?(this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(_,this.options.chunkDelay)},this);_()}else for(var d=this._needsClustering;a>h;h++)t=e[h],t instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(t,e),a=e.length):t.getLatLng?this.hasLayer(t)||d.push(t):n.addLayer(t);return this},removeLayers:function(e){var t,i,n=e.length,s=this._featureGroup,r=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),r.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push(i));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)i=a[t],i instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),s.hasLayer(i)&&(s.removeLayer(i),i.clusterShow&&i.clusterShow())):r.removeLayer(i);return this._topClusterLevel._recalculateBounds(),this._refreshClustersIcons(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),this},clearLayers:function(){return this._map||(this._needsClustering=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(e){e.off("move",this._childMarkerMoved,this),delete e.__parent}),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n=this._needsClustering.slice(),s=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(n),i=n.length-1;i>=0;i--)-1===s.indexOf(n[i])&&e.call(t,n[i]);this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer(function(t){e.push(t)}),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer(function(i){L.stamp(i)===e&&(t=i)}),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(i=this._needsRemoving,t=i.length-1;t>=0;t--)if(i[t]===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){"function"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off("moveend",i,this),this.off("animationend",i,this),e._icon?t():e.__parent._icon&&(this.once("spiderfied",t,this),e.__parent.spiderfy()))};if(e._icon&&this._map.getBounds().contains(e.getLatLng()))t();else if(e.__parent._zoomt;t++)n=this._needsRemoving[t],this._removeLayer(n,!0);this._needsRemoving=[],this._zoom=this._map.getZoom(),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i)},onRemove:function(e){e.off("zoomend",this._zoomEnd,this),e.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered;t>=0&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerMoved:function(e){this._ignoreMove||(e.target._latlng=e.oldLatLng,this.removeLayer(e.target),e.target._latlng=e.latlng,this.addLayer(e.target))},_removeLayer:function(e,t,i){var n=this._gridClusters,s=this._gridUnclustered,r=this._featureGroup,o=this._map;t&&this._removeFromGridUnclustered(e,this._maxZoom);var a,h=e.__parent,u=h._markers;for(this._arraySplice(u,e);h&&(h._childCount--,h._boundsNeedUpdate=!0,!(h._zoom<0));)t&&h._childCount<=1?(a=h._markers[0]===e?h._markers[1]:h._markers[0],n[h._zoom].removeObject(h,o.project(h._cLatLng,h._zoom)),s[h._zoom].addObject(a,o.project(a.getLatLng(),h._zoom)),this._arraySplice(h.__parent._childClusters,h),h.__parent._markers.push(a),a.__parent=h.__parent,h._icon&&(r.removeLayer(h),i||r.addLayer(a))):h._iconNeedsUpdate=!0,h=h.__parent;delete e.__parent},_isOrIsParent:function(e,t){for(;t;){if(e===t)return!0;t=t.parentNode}return!1},fire:function(e,t,i){if(t&&t.layer instanceof L.MarkerCluster){if(t.originalEvent&&this._isOrIsParent(t.layer._icon,t.originalEvent.relatedTarget))return;e="cluster"+e}L.FeatureGroup.prototype.fire.call(this,e,t,i)},listens:function(e,t){return L.FeatureGroup.prototype.listens.call(this,e,t)||L.FeatureGroup.prototype.listens.call(this,"cluster"+e,t)},_defaultIconCreateFunction:function(e){var t=e.getChildCount(),i=" marker-cluster-";return i+=10>t?"small":100>t?"medium":"large",new L.DivIcon({html:"
    "+t+"
    ",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),e.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),t&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=this._map.getMaxZoom(),t=this.options.maxClusterRadius,i=t;"function"!=typeof t&&(i=function(){return t}),this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var n=e;n>=0;n--)this._gridClusters[n]=new L.DistanceGrid(i(n)),this._gridUnclustered[n]=new L.DistanceGrid(i(n));this._topClusterLevel=new this._markerCluster(this,-1)},_addLayer:function(e,t){var i,n,s=this._gridClusters,r=this._gridUnclustered;for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on("move",this._childMarkerMoved,this);t>=0;t--){i=this._map.project(e.getLatLng(),t);var o=s[t].getNearObject(i);if(o)return o._addChild(e),e.__parent=o,void 0;if(o=r[t].getNearObject(i)){var a=o.__parent;a&&this._removeLayer(o,!1);var h=new this._markerCluster(this,t,o,e);s[t].addObject(h,this._map.project(h._cLatLng,t)),o.__parent=h,e.__parent=h;var u=h;for(n=t-1;n>a._zoom;n--)u=new this._markerCluster(this,n,u),s[n].addObject(u,this._map.project(o.getLatLng(),n));return a._addChild(u),this._removeFromGridUnclustered(o,t),void 0}r[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_refreshClustersIcons:function(){this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()})},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;ee?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return t!==i&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()<=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),s=0;for(t=t||[];s=0;i--)o=h[i],n.contains(o._latlng)||s.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),s.eachLayer(function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()}),this._topClusterLevel._recursively(n,e,t,function(e){e._recursivelyRestoreChildPositions(t)}),this._ignoreMove=!1,this._enqueue(function(){this._topClusterLevel._recursively(n,e,0,function(e){s.removeLayer(e),e.clusterShow()}),this._animationEnd()})},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue(function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._map.getZoom())))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds();e._recursivelyAnimateChildrenInAndAddSelfToMap(n,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===e._childCount){var r=e._markers[0];this._ignoreMove=!0,r.setLatLng(r.getLatLng()),this._ignoreMove=!1,r.clusterShow&&r.clusterShow()}else e._recursively(n,i,0,function(e){e._recursivelyRemoveChildrenFromMap(n,t+1)});s._animationEnd()})},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_forceLayout:function(){L.Util.falseFn(t.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)},L.MarkerCluster=L.Marker.extend({initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e){e=e||[];for(var t=this._childClusters.length-1;t>=0;t--)this._childClusters[t].getAllChildMarkers(e);for(var i=this._markers.length-1;i>=0;i--)e.push(this._markers[i]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(){for(var e,t=this._childClusters.slice(),i=this._group._map,n=i.getBoundsZoom(this._bounds),s=this._zoom+1,r=i.getZoom();t.length>0&&n>s;){s++;var o=[];for(e=0;es?this._group._map.setView(this._latlng,s):r>=n?this._group._map.setView(this._latlng,r+1):this._group._map.fitBounds(this._bounds)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,s=this._markers,r=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e=0;i--)n=s[i],n._icon&&(n._setPos(t),n.clusterHide())},function(e){var i,n,s=e._childClusters;for(i=s.length-1;i>=0;i--)n=s[i],n._icon&&(n._setPos(t),n.clusterHide())})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i){this._recursively(e,i,0,function(n){n._recursivelyAnimateChildrenIn(e,n._group._map.latLngToLayerPoint(n.getLatLng()).round(),t),n._isSingleParent()&&t-1===i?(n.clusterShow(),n._recursivelyRemoveChildrenFromMap(e,t)):n.clusterHide(),n._addToMap()})},_recursivelyBecomeVisible:function(e,t){this._recursively(e,0,t,null,function(e){e.clusterShow()})},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,-1,t,function(n){if(t!==n._zoom)for(var s=n._markers.length-1;s>=0;s--){var r=n._markers[s];i.contains(r._latlng)&&(e&&(r._backupLatlng=r.getLatLng(),r.setLatLng(e),r.clusterHide&&r.clusterHide()),n._group._featureGroup.addLayer(r))}},function(t){t._addToMap(e)})},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var s=this._childClusters.length-1;s>=0;s--)this._childClusters[s]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i){var n,s;this._recursively(e,-1,t-1,function(e){for(s=e._markers.length-1;s>=0;s--)n=e._markers[s],i&&i.contains(n._latlng)||(e._group._featureGroup.removeLayer(n),n.clusterShow&&n.clusterShow())},function(e){for(s=e._childClusters.length-1;s>=0;s--)n=e._childClusters[s],i&&i.contains(n._latlng)||(e._group._featureGroup.removeLayer(n),n.clusterShow&&n.clusterShow())})},_recursively:function(e,t,i,n,s){var r,o,a=this._childClusters,h=this._zoom;if(t>h)for(r=a.length-1;r>=0;r--)o=a[r],e.intersects(o._bounds)&&o._recursively(e,t,i,n,s);else if(n&&n(this),s&&this._zoom===i&&s(this),i>h)for(r=a.length-1;r>=0;r--)o=a[r],e.intersects(o._bounds)&&o._recursively(e,t,i,n,s)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}}),L.Marker.include({clusterHide:function(){return this.options.opacityWhenUnclustered=this.options.opacity||1,this.setOpacity(0)},clusterShow:function(){var e=this.setOpacity(this.options.opacity||this.options.opacityWhenUnclustered);return delete this.options.opacityWhenUnclustered,e}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),s=this._grid,r=s[n]=s[n]||{},o=r[i]=r[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,s=this._getCoord(t.x),r=this._getCoord(t.y),o=this._grid,a=o[r]=o[r]||{},h=a[s]=a[s]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[s],!0},eachObject:function(e,t){var i,n,s,r,o,a,h,u=this._grid;for(i in u){o=u[i];for(n in o)for(a=o[n],s=0,r=a.length;r>s;s++)h=e.call(t,a[s]),h&&(s--,r--)}},getNearObject:function(e){var t,i,n,s,r,o,a,h,u=this._getCoord(e.x),l=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=l-1;l+1>=t;t++)if(s=this._grid[t])for(i=u-1;u+1>=i;i++)if(r=s[i])for(n=0,o=r.length;o>n;n++)a=r[n],h=this._sqDist(_[L.Util.stamp(a)],e),d>h&&(d=h,c=a);return c},_getCoord:function(e){return Math.floor(e/this._cellSize)},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat,n=t[0].lng-t[1].lng;return n*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,s,r=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],s=this.getDistant(n,e),s>0&&(a.push(n),s>r&&(r=s,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints))):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,s=!1,r=!1,o=null,a=null,h=null,u=null,l=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(i===!1||d.lat>i)&&(o=d,i=d.lat),(n===!1||d.lats)&&(h=d,s=d.lng),(r===!1||d.lng=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:Math.PI/6,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(),i=this._group,n=i._map,s=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,s):(s.y+=10,e=this._generatePointsCircle(t.length,s)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,s=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e),r=s/this._2PI,o=this._2PI/e,a=[];for(a.length=e,i=e-1;i>=0;i--)n=this._circleStartAngle+i*o,a[i]=new L.Point(t.x+r*Math.cos(n),t.y+r*Math.sin(n))._round();return a},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,s=n*this._spiralLengthStart,r=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e-1;i>=0;i--)a+=r/s+5e-4*i,h[i]=new L.Point(t.x+s*Math.cos(a),t.y+s*Math.sin(a))._round(),s+=o/a;return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,s=i._featureGroup,r=this.getAllChildMarkers();for(i._ignoreMove=!0,this.setOpacity(1),t=r.length-1;t>=0;t--)e=r[t],s.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire("unspiderfied",{cluster:this,markers:r}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,s,r,o=this._group,a=o._map,h=o._featureGroup,u=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i=0;n--)h=_.layerPointToLatLng(t[n]),s=e[n],s._preSpiderfyLatlng=s._latlng,s.setLatLng(h),s.clusterShow&&s.clusterShow(),f&&(r=s._spiderLeg,o=r._path,o.style.strokeDashoffset=0,r.setStyle({opacity:g}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout(function(){l._animationEnd(),l.fire("spiderfied",{cluster:u,markers:e})},200)},_animationUnspiderfy:function(e){var t,i,n,s,r,o,a=this,h=this._group,u=h._map,l=h._featureGroup,_=e?u._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):u.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)t=d[i],t._preSpiderfyLatlng&&(t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&l.removeLayer(t),c&&(n=t._spiderLeg,s=n._path,r=s.getTotalLength()+.1,s.style.strokeDashoffset=r,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout(function(){var e=0;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&l.removeLayer(t),u.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire("unspiderfied",{cluster:a,markers:d})},200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._map.off("zoomend",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy()},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}})}(window,document); ================================================ FILE: talkmap/leaflet_dist/screen.css ================================================ #map { width: 800px; height: 600px; border: 1px solid #ccc; } #progress { display: none; position: absolute; z-index: 1000; left: 400px; top: 300px; width: 200px; height: 20px; margin-top: -20px; margin-left: -100px; background-color: #fff; background-color: rgba(255, 255, 255, 0.7); border-radius: 4px; padding: 2px; } #progress-bar { width: 0; height: 100%; background-color: #76A6FC; border-radius: 4px; } ================================================ FILE: talkmap/map.html ================================================ Leaflet debug page
    Mouse over a cluster to see the bounds of its children and click a cluster to zoom to those bounds ================================================ FILE: talkmap/org-locations.js ================================================ var addressPoints = [ [ "Talk 2 on Relevant Topic in Your Field
    London School of Testing; London, UK", 51.4893335, -0.14405508452768728 ], [ "Tutorial 1 on Relevant Topic in Your Field
    UC-Berkeley Institute for Testing Science; Berkeley, CA, USA", 37.8708393, -122.272863 ], [ "Conference Proceeding talk 3 on Relevant Topic in Your Field
    Testing Institute of America 2014 Annual Conference; Los Angeles, CA, USA", 34.0536909, -118.242766 ], [ "Talk 1 on Relevant Topic in Your Field
    UC San Francisco, Department of Testing; San Francisco, CA, USA", 37.7792588, -122.4193286 ] ]; ================================================ FILE: talkmap.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Leaflet cluster map of talk locations\n", "\n", "Assuming you are working in a Linux or Windows Subsystem for Linux environment, you may need to install some dependencies. Assuming a clean installation, the following will be needed:\n", "\n", "```bash\n", "sudo apt install jupyter\n", "sudo apt install python3-pip\n", "pip install python-frontmatter getorg --upgrade\n", "```\n", "\n", "After which you can run this from the `_talks/` directory, via:\n", "\n", "```bash\n", " jupyter nbconvert --to notebook --execute talkmap.ipynb --output talkmap_out.ipynb\n", "```\n", " \n", "The `_talks/` directory contains `.md` files of all your talks. This scrapes the location YAML field from each `.md` file, geolocates it with `geopy/Nominatim`, and uses the `getorg` library to output data, HTML, and Javascript for a standalone cluster map." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Start by installing the dependencies\n", "!pip install python-frontmatter getorg --upgrade\n", "import frontmatter\n", "import glob\n", "import getorg\n", "from geopy import Nominatim\n", "from geopy.exc import GeocoderTimedOut" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Collect the Markdown files\n", "g = glob.glob(\"_talks/*.md\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Set the default timeout, in seconds\n", "TIMEOUT = 5\n", "\n", "# Prepare to geolocate\n", "geocoder = Nominatim(user_agent=\"academicpages.github.io\")\n", "location_dict = {}\n", "location = \"\"\n", "permalink = \"\"\n", "title = \"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the event that this times out with an error, double check to make sure that the location is can be properly geolocated." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Perform geolocation\n", "for file in g:\n", " # Read the file\n", " data = frontmatter.load(file)\n", " data = data.to_dict()\n", "\n", " # Press on if the location is not present\n", " if 'location' not in data:\n", " continue\n", "\n", " # Prepare the description\n", " title = data['title'].strip()\n", " venue = data['venue'].strip()\n", " location = data['location'].strip()\n", " description = f\"{title}
    {venue}; {location}\"\n", "\n", " # Geocode the location and report the status\n", " try:\n", " location_dict[description] = geocoder.geocode(location, timeout=TIMEOUT)\n", " print(description, location_dict[description])\n", " except ValueError as ex:\n", " print(f\"Error: geocode failed on input {location} with message {ex}\")\n", " except GeocoderTimedOut as ex:\n", " print(f\"Error: geocode timed out on input {location} with message {ex}\")\n", " except Exception as ex:\n", " print(f\"An unhandled exception occurred while processing input {location} with message {ex}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Save the map\n", "m = getorg.orgmap.create_map_obj()\n", "getorg.orgmap.output_html_cluster_map(location_dict, folder_name=\"talkmap\", hashed_usernames=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: talkmap.py ================================================ # Leaflet cluster map of talk locations # # Run this from the _talks/ directory, which contains .md files of all your # talks. This scrapes the location YAML field from each .md file, geolocates it # with geopy/Nominatim, and uses the getorg library to output data, HTML, and # Javascript for a standalone cluster map. This is functionally the same as the # #talkmap Jupyter notebook. import frontmatter import glob import getorg from geopy import Nominatim from geopy.exc import GeocoderTimedOut # Set the default timeout, in seconds TIMEOUT = 5 # Collect the Markdown files g = glob.glob("_talks/*.md") # Prepare to geolocate geocoder = Nominatim(user_agent="academicpages.github.io") location_dict = {} location = "" permalink = "" title = "" # Perform geolocation for file in g: # Read the file data = frontmatter.load(file) data = data.to_dict() # Press on if the location is not present if 'location' not in data: continue # Prepare the description title = data['title'].strip() venue = data['venue'].strip() location = data['location'].strip() description = f"{title}
    {venue}; {location}" # Geocode the location and report the status try: location_dict[description] = geocoder.geocode(location, timeout=TIMEOUT) print(description, location_dict[description]) except ValueError as ex: print(f"Error: geocode failed on input {location} with message {ex}") except GeocoderTimedOut as ex: print(f"Error: geocode timed out on input {location} with message {ex}") except Exception as ex: print(f"An unhandled exception occurred while processing input {location} with message {ex}") # Save the map m = getorg.orgmap.create_map_obj() getorg.orgmap.output_html_cluster_map(location_dict, folder_name="talkmap", hashed_usernames=False) ================================================ FILE: talkmap_out.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Leaflet cluster map of talk locations\n", "\n", "Assuming you are working in a Linux or Windows Subsystem for Linux environment, you may need to install some dependencies. Assuming a clean installation, the following will be needed:\n", "\n", "```bash\n", "sudo apt install jupyter\n", "sudo apt install python3-pip\n", "pip install python-frontmatter getorg --upgrade\n", "```\n", "\n", "After which you can run this from the `_talks/` directory, via:\n", "\n", "```bash\n", " jupyter nbconvert --to notebook --execute talkmap.ipynb --output talkmap_out.ipynb\n", "```\n", " \n", "The `_talks/` directory contains `.md` files of all your talks. This scrapes the location YAML field from each `.md` file, geolocates it with `geopy/Nominatim`, and uses the `getorg` library to output data, HTML, and Javascript for a standalone cluster map." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2025-02-26T03:36:06.769536Z", "iopub.status.busy": "2025-02-26T03:36:06.769131Z", "iopub.status.idle": "2025-02-26T03:36:07.934020Z", "shell.execute_reply": "2025-02-26T03:36:07.933257Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting python-frontmatter\r\n", " Downloading python_frontmatter-1.1.0-py3-none-any.whl.metadata (4.1 kB)\r\n", "Requirement already satisfied: getorg in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (0.3.1)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: PyYAML in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from python-frontmatter) (6.0.2)\r\n", "Requirement already satisfied: geopy in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from getorg) (2.4.1)\r\n", "Requirement already satisfied: pygithub in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from getorg) (2.6.1)\r\n", "Requirement already satisfied: retrying in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from getorg) (1.3.4)\r\n", "Requirement already satisfied: geographiclib<3,>=1.52 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from geopy->getorg) (2.0)\r\n", "Requirement already satisfied: pynacl>=1.4.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (1.5.0)\r\n", "Requirement already satisfied: requests>=2.14.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (2.32.3)\r\n", "Requirement already satisfied: pyjwt>=2.4.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pyjwt[crypto]>=2.4.0->pygithub->getorg) (2.10.1)\r\n", "Requirement already satisfied: typing-extensions>=4.0.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (4.12.2)\r\n", "Requirement already satisfied: urllib3>=1.26.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (2.3.0)\r\n", "Requirement already satisfied: Deprecated in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pygithub->getorg) (1.2.18)\r\n", "Requirement already satisfied: six>=1.7.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from retrying->getorg) (1.17.0)\r\n", "Requirement already satisfied: cryptography>=3.4.0 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pyjwt[crypto]>=2.4.0->pygithub->getorg) (44.0.1)\r\n", "Requirement already satisfied: cffi>=1.4.1 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from pynacl>=1.4.0->pygithub->getorg) (1.17.1)\r\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from requests>=2.14.0->pygithub->getorg) (3.4.1)\r\n", "Requirement already satisfied: idna<4,>=2.5 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from requests>=2.14.0->pygithub->getorg) (3.10)\r\n", "Requirement already satisfied: certifi>=2017.4.17 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from requests>=2.14.0->pygithub->getorg) (2025.1.31)\r\n", "Requirement already satisfied: wrapt<2,>=1.10 in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from Deprecated->pygithub->getorg) (1.17.2)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: pycparser in /opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/site-packages (from cffi>=1.4.1->pynacl>=1.4.0->pygithub->getorg) (2.22)\r\n", "Downloading python_frontmatter-1.1.0-py3-none-any.whl (9.8 kB)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Installing collected packages: python-frontmatter\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Successfully installed python-frontmatter-1.1.0\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iywidgets and ipyleaflet support disabled. You must be in a Jupyter notebook to use this feature.\n", "Error raised:\n", "No module named 'ipyleaflet'\n", "Check that you have enabled ipyleaflet in Jupyter with:\n", " jupyter nbextension enable --py ipyleaflet\n" ] } ], "source": [ "# Start by installing the dependencies\n", "!pip install python-frontmatter getorg --upgrade\n", "import frontmatter\n", "import glob\n", "import getorg\n", "from geopy import Nominatim\n", "from geopy.exc import GeocoderTimedOut" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2025-02-26T03:36:07.936149Z", "iopub.status.busy": "2025-02-26T03:36:07.935901Z", "iopub.status.idle": "2025-02-26T03:36:07.939314Z", "shell.execute_reply": "2025-02-26T03:36:07.938765Z" } }, "outputs": [], "source": [ "# Collect the Markdown files\n", "g = glob.glob(\"_talks/*.md\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true, "execution": { "iopub.execute_input": "2025-02-26T03:36:07.941580Z", "iopub.status.busy": "2025-02-26T03:36:07.941049Z", "iopub.status.idle": "2025-02-26T03:36:07.966143Z", "shell.execute_reply": "2025-02-26T03:36:07.965594Z" } }, "outputs": [], "source": [ "# Set the default timeout, in seconds\n", "TIMEOUT = 5\n", "\n", "# Prepare to geolocate\n", "geocoder = Nominatim(user_agent=\"academicpages.github.io\")\n", "location_dict = {}\n", "location = \"\"\n", "permalink = \"\"\n", "title = \"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the event that this times out with an error, double check to make sure that the location is can be properly geolocated." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2025-02-26T03:36:07.968167Z", "iopub.status.busy": "2025-02-26T03:36:07.967976Z", "iopub.status.idle": "2025-02-26T03:36:11.603488Z", "shell.execute_reply": "2025-02-26T03:36:11.602744Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Talk 2 on Relevant Topic in Your Field
    London School of Testing; London, UK London, Greater London, England, United Kingdom\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Tutorial 1 on Relevant Topic in Your Field
    UC-Berkeley Institute for Testing Science; Berkeley, CA, USA Berkeley, Alameda County, California, United States\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Conference Proceeding talk 3 on Relevant Topic in Your Field
    Testing Institute of America 2014 Annual Conference; Los Angeles, CA, USA Los Angeles, Los Angeles County, California, United States\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Talk 1 on Relevant Topic in Your Field
    UC San Francisco, Department of Testing; San Francisco, CA, USA San Francisco, California, United States\n" ] } ], "source": [ "# Perform geolocation\n", "for file in g:\n", " # Read the file\n", " data = frontmatter.load(file)\n", " data = data.to_dict()\n", "\n", " # Press on if the location is not present\n", " if 'location' not in data:\n", " continue\n", "\n", " # Prepare the description\n", " title = data['title'].strip()\n", " venue = data['venue'].strip()\n", " location = data['location'].strip()\n", " description = f\"{title}
    {venue}; {location}\"\n", "\n", " # Geocode the location and report the status\n", " try:\n", " location_dict[description] = geocoder.geocode(location, timeout=TIMEOUT)\n", " print(description, location_dict[description])\n", " except ValueError as ex:\n", " print(f\"Error: geocode failed on input {location} with message {ex}\")\n", " except GeocoderTimedOut as ex:\n", " print(f\"Error: geocode timed out on input {location} with message {ex}\")\n", " except Exception as ex:\n", " print(f\"An unhandled exception occurred while processing input {location} with message {ex}\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "execution": { "iopub.execute_input": "2025-02-26T03:36:11.605607Z", "iopub.status.busy": "2025-02-26T03:36:11.605411Z", "iopub.status.idle": "2025-02-26T03:36:11.613528Z", "shell.execute_reply": "2025-02-26T03:36:11.612932Z" } }, "outputs": [ { "data": { "text/plain": [ "'Written map to talkmap/'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Save the map\n", "m = getorg.orgmap.create_map_obj()\n", "getorg.orgmap.output_html_cluster_map(location_dict, folder_name=\"talkmap\", hashed_usernames=False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.21" } }, "nbformat": 4, "nbformat_minor": 0 }