commit c09f092db410891986087cf07fb297b26c107e39 Author: Adrian Amaglio Date: Fri Nov 17 10:54:41 2023 +0100 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2d82ead --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Generated files by hugo +/public/ +/resources/_gen/ +/assets/jsconfig.json +hugo_stats.json + +# Executable may be added to repository +hugo.exe +hugo.darwin +hugo.linux + +# Temporary lock file while building +/.hugo_build.lock + +content diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/assets/custom.css b/assets/custom.css new file mode 100644 index 0000000..c7cfcdd --- /dev/null +++ b/assets/custom.css @@ -0,0 +1 @@ +/* Add custom CSS */ \ No newline at end of file diff --git a/assets/custom.js b/assets/custom.js new file mode 100644 index 0000000..a61ccff --- /dev/null +++ b/assets/custom.js @@ -0,0 +1 @@ +// Add custom JS \ No newline at end of file diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml new file mode 100644 index 0000000..53a5c33 --- /dev/null +++ b/config/_default/hugo.toml @@ -0,0 +1,214 @@ +### General +baseURL = '' # Enter your full production URL +languageCode = 'fr-fr' # Default +timeZone = 'Europe/Paris' # IANA timezone https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +title = 'RimaRima' # Site title used throughout site + +### SEO, Analytics & 3rd-party +enableRobotsTXT = true # To overwrite the theme's robots.txt, add your own in the /layouts/ directory +rssLimit = -1 # -1 is unlimited RSS entries +# googleAnalytics = '' # Enter GA tracking ID to enable GA4 +# disqusShortname = '' # Enter Disqus shortname to enable comments + +### Content & Publishing +# Please see https://gohugo.io/getting-started/configuration/ for detailed explanations +buildDrafts = false # Default +buildExpired = false # Default +buildFuture = false # Default +canonifyURLs = false # Default +defaultContentLanguage = 'en' # Default +disableAliases = true # Set to true if using server (Netlify, .htaccess) for redirects instead of Hugo +disableKinds = [] # Default +enableEmoji = true # Use Emojis in content +enableGitInfo = false # Default, enable to use git for lastmod (can be overwritten in frontmatter) +enableInlineShortcodes = false # Default, false is more security-friendly +ignoreFiles = [] # Default +# newContentEditor = 'code' # Set VS Code as default editor +paginate = 10 # Default +paginatePath = 'page' # Default +pluralizeListTitles = true # Default +publishDir = 'public' # Default +relativeURLs = false # Default +summaryLength = 70 # Default +titleCaseStyle = 'AP' # Default, other options: Chicago (slightly different) or Go (all first letters capitalized) + +### Other +archetypeDir = 'archetypes' # Default +assetDir = 'assets' # Default +contentDir = 'content' # Default +dataDir = 'data' # Default +disableHugoGeneratorInject = false # Default +disableLiveReload = false # Default + +# Use this theme as git submodule +theme = 'hugo-liftoff' +# Or, use this theme as hugo module +# [module] +# [[module.imports]] +# path = 'hugo-liftoff' + +[taxonomies] + tag = 'tags' + category = 'categories' + series = 'series' # Allows you to create an organized series of posts (e.g. multi-part tutorial) + project-type = 'project types' # Categorize projects by type (e.g. client work, personal, open source, etc.) + +[permalinks] + [permalinks.page] + # e.g. /subsection/example-post instead of /posts/subsection/example-post + posts = '/:sections[last]/:slug/' # Removes 'posts' from the permalink structure for posts created under nested sub-sections + [permalinks.section] + # e.g. /subsection/ instead of /posts/subsection/ + posts = '/:slug/' + +[markup] + defaultMarkdownHandler = 'goldmark' # Default (everything under [markup] is unless otherwise specified) + [markup.goldmark] + [markup.goldmark.extensions] + definitionList = true + footnote = true + linkify = true + linkifyProtocol = 'https' + strikethrough = true + table = true + taskList = true + typographer = true + [markup.goldmark.parser] + autoHeadingID = true + autoHeadingIDType = 'github' + [markup.goldmark.parser.attribute] + block = false + title = true + [markup.goldmark.renderer] + hardWraps = false + unsafe = false + xhtml = false + [markup.highlight] + anchorLineNos = false + codeFences = true + guessSyntax = false + hl_Lines = '' + lineAnchors = '' + lineNoStart = 1 + lineNos = true # Not the default + lineNumbersInTable = false # Not the default + noClasses = true + noHl = false + style = 'monokai' + tabWidth = 4 + [markup.tableOfContents] + endLevel = 3 + ordered = false + startLevel = 2 + +[related] + # Default related posts settings + includeNewer = false + threshold = 80 + toLower = false +[[related.indices]] + name = 'keywords' + weight = 100 +[[related.indices]] + name = 'date' + weight = 10 +# Remove if not using tags taxonomy +[[related.indices]] + name = 'tags' + weight = 80 + +[sitemap] + # Default sitemap settings + changefreq = 'monthly' + filename = 'sitemap.xml' + priority = 0.5 + +[frontmatter] + # Default frontmatter date settings + date = ['date', 'publishDate', 'lastmod'] + expiryDate = ['expiryDate'] + lastmod = ['lastmod', ':git', 'date', 'publishDate'] + publishDate = ['publishDate', 'date'] + +[caches] + # Default cache settings + [caches.assets] + dir = ':resourceDir/_gen' + maxAge = -1 + [caches.getcsv] + dir = ':cacheDir/:project' + maxAge = -1 + [caches.getjson] + dir = ':cacheDir/:project' + maxAge = -1 + [caches.images] + dir = ':resourceDir/_gen' + maxAge = -1 + [caches.modules] + dir = ':cacheDir/modules' + maxAge = -1 + +[imaging] + # Default image processing settings + anchor = 'Smart' + bgColor = '#ffffff' + hint = 'photo' + quality = 75 + resampleFilter = 'Box' + +### Hugo Pipes +[minify] + disableCSS = false + disableHTML = false + disableJS = false + disableJSON = false + disableSVG = false + disableXML = false + minifyOutput = false + [minify.tdewolff] + [minify.tdewolff.css] + keepCSS2 = true + precision = 0 + [minify.tdewolff.html] + keepComments = false + keepConditionalComments = true + keepDefaultAttrVals = true + keepDocumentTags = true + keepEndTags = true + keepQuotes = false + keepWhitespace = false + [minify.tdewolff.js] + keepVarNames = false + noNullishOperator = false + precision = 0 + [minify.tdewolff.json] + keepNumbers = false + precision = 0 + [minify.tdewolff.svg] + precision = 0 + [minify.tdewolff.xml] + keepWhitespace = false + +### Netlify settings +# add redirects/headers +[outputs] + home = ["HTML", "RSS", "REDIRECTS", "HEADERS"] + +# remove .{ext} from text/netlify +[mediaTypes."text/netlify"] + suffixes = [""] + delimiter = "" + +# add output format for netlify _redirects +[outputFormats.REDIRECTS] + mediatype = "text/netlify" + baseName = "_redirects" + isPlainText = true + notAlternative = true + +# add output format for netlify _headers +[outputFormats.HEADERS] + mediatype = "text/netlify" + baseName = "_headers" + isPlainText = true + notAlternative = true diff --git a/config/_default/menus.toml b/config/_default/menus.toml new file mode 100644 index 0000000..d8bf86a --- /dev/null +++ b/config/_default/menus.toml @@ -0,0 +1,84 @@ +[[main]] + # Top-level menu entry + identifier = "work" + name = "Work" + url = "/projects/" + weight = 1 + +[[main]] + identifier = "projects" + name = "Projects" + url = "/projects/" + parent = "work" + weight = 1 + +[[main]] + identifier = "about" + name = "About" + url = "/about/" + parent = "work" + weight = 2 + +[[main]] + identifier = "contact" + name = "Contact" + url = "/contact/" + parent = "work" + weight = 3 + +[[main]] + # Top-level menu entry + identifier = "writing" + name = "Writing" + url = "/posts/" + weight = 4 + +[[main]] + identifier = "posts" + name = "All Posts" + url = "/posts/" + parent = "writing" + weight = 4 + +[[main]] + identifier = "subsection" + name = "Subsection" + url = "/subsection/" + # url = "/posts/subsection/" # Remove url param from subsection/_index.md frontmatter to use full permalink + parent = "writing" + weight = 5 + +[[main]] + # Top-level menu entry + identifier = "explore" + name = "Explore" + url = "/categories/" + weight = 6 + +[[main]] + identifier = "categories" + name = "Categories" + url = "/categories/" + parent = "explore" + weight = 6 + +[[main]] + identifier = "tags" + name = "Tags" + url = "/tags/" + parent = "explore" + weight = 7 + +[[main]] + identifier = "series" + name = "Series" + url = "/series/" + parent = "explore" + weight = 8 + +[[main]] + identifier = "project-type" + name = "Project Types" + url = "/project-types/" + parent = "explore" + weight = 9 \ No newline at end of file diff --git a/config/_default/params.toml b/config/_default/params.toml new file mode 100644 index 0000000..37fdec2 --- /dev/null +++ b/config/_default/params.toml @@ -0,0 +1,65 @@ +### SEO, Analytics & 3rd-party +netlify_forms = true # add data-netlify attribute to contact and newsletter forms, false to disable Netlify forms +# gtm_id = '' # GTM tracking (leave blank to use GA) +disallow_search_engines = false # Disallow search engine crawling in robots.txt + +### Content +favicon = true # Enable favicon, add your favicon files to /static/ directory +# avatar = 'avatar.png' # Custom avatar image in /assets/ +grayscale_avatar = true # Add a grayscale filter to the avatar image +author = 'John Doe' # Default author for meta +description = "Personal blog and portfolio site of John Doe." # Add a global meta description to +footer_text = "Built with [Hugo Liftoff](https://github.com/wjh18/hugo-liftoff) theme." # Customize footer text +fallback_text = "No content available yet. Coming soon." # Fallback text for empty content +label_drafts = true # Add a label indicator next to the title of any built drafts (dev only) + +# Customize newsletter text +newsletter_header = "This is my custom newsletter header with a captivating title." +newsletter_description = "This is my custom newsletter description that tells you why you should sign up." +newsletter_submit = "Join now" +global_newsletter = false # Enable newsletter site-wide + +# CSS / JavaScript +enable_postcss = false # Enable if you're using npm and want to utilize PostCSS processing +custom_css = 'custom.css' # Add the specified file to assets before setting this param to avoid errors +custom_js = 'custom.js' # Add the specified file to assets before setting this param to avoid errors + +### Web schemas +# Open Graph +images = ['images/default.png'] # Fallback for Open Graph and Twitter Cards images if none are present in front matter. Enter path to the image. +ogLocale = "en_US" # Open graph locale + +# Twitter Cards +twitterSite = "johndoestwitter" # Enter your twitter handle without the @ +twitterCreator = "johndoestwitter" # Enter your twitter handle without the @ + +# JSON-LD structured data schemas +schemaName = "John Doe" # Enter your name +schemaLocale = "en-US" # Structured data locale +schemaImage = "images/default.png" # Image for Person structured data schema. Enter path to the image. +schemaImageWidth = 453 # Width of the above image +schemaImageHeight = 455 # Height of the above image + +### Social +# Show social links in footer, home hero section, or about page +footer_socials = true +home_hero_socials = true +about_page_socials = true + +# Enable or disable individual social icons +[social.links] + twitter = "username" + github = "username" + stack_overflow = "userid/username" # include user id + email = "user@example.com" + # linkedin = "username" # Comment out to disable + # mastodon_server = "example.social" # include subdomains if relevant, scheme not needed (defaults to https) + # mastodon_user = "username" # don't include preceding @ + +# Enable or disable individual social share icons in posts +[social.share] + #facebook = true + #linkedin = true + #twitter = true + #reddit = true + #email = true diff --git a/config/development/server.toml b/config/development/server.toml new file mode 100644 index 0000000..0c605a1 --- /dev/null +++ b/config/development/server.toml @@ -0,0 +1,9 @@ +# Adds custom security headers for development environment only +[[headers]] +for = '/**' +[headers.values] + # Content-Security-Policy = 'script-src localhost:1313' + Referrer-Policy = 'strict-origin-when-cross-origin' + X-Content-Type-Options = 'nosniff' + X-Frame-Options = 'DENY' + X-XSS-Protection = '1; mode=block' \ No newline at end of file diff --git a/config/production/hugo.toml b/config/production/hugo.toml new file mode 100644 index 0000000..06ae498 --- /dev/null +++ b/config/production/hugo.toml @@ -0,0 +1,3 @@ +### Config for production environment +# Includes but overwrites anything in _default/config.toml +# Excludes anything in _development/config.toml if it exists \ No newline at end of file diff --git a/config/production/params.toml b/config/production/params.toml new file mode 100644 index 0000000..7ed42e5 --- /dev/null +++ b/config/production/params.toml @@ -0,0 +1,3 @@ +### Params for production environment +# Includes but overwrites anything in _default/params.toml +# Excludes anything in _development/params.toml if it exists \ No newline at end of file diff --git a/hugo.toml b/hugo.toml new file mode 100644 index 0000000..542a14b --- /dev/null +++ b/hugo.toml @@ -0,0 +1,3 @@ +baseURL = '' +languageCode = 'fr-fr' +title = 'RimaRima' diff --git a/static/.keep b/static/.keep new file mode 100644 index 0000000..e69de29 diff --git a/themes/hugo-liftoff/CONTRIBUTING.md b/themes/hugo-liftoff/CONTRIBUTING.md new file mode 100644 index 0000000..d0fbf0b --- /dev/null +++ b/themes/hugo-liftoff/CONTRIBUTING.md @@ -0,0 +1,12 @@ +# Contributing + +For any proposed changes or bug reports, please [open an issue](https://github.com/wjh18/hugo-liftoff/issues) first using one of the issue templates. Then feel free to work on it. You're also welcome to tackle any existing issues. + +## How to contribute + +* Fork the project on Github +* Clone the fork to your local machine +* Create a descriptive branch for the changes +* Make and commit your changes to the new branch +* Push your changes to the branch +* Submit a pull request on Github using the [pull request template](https://github.com/wjh18/hugo-liftoff/blob/master/.github/pull_request_template.md). diff --git a/themes/hugo-liftoff/LICENSE b/themes/hugo-liftoff/LICENSE new file mode 100644 index 0000000..8055e34 --- /dev/null +++ b/themes/hugo-liftoff/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2023 Will J. Holmes + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/themes/hugo-liftoff/README.md b/themes/hugo-liftoff/README.md new file mode 100644 index 0000000..195cd86 --- /dev/null +++ b/themes/hugo-liftoff/README.md @@ -0,0 +1,169 @@ +# Hugo Liftoff + +**Warning: I no longer have time to work on this theme for various reasons. It's unlikely I'll get to your issue and no additional features are planned, although the theme will remain available to the public. Feel free to fork it if you need to make extensive changes. I will consider merging simple bugfix pull requests. Apologies for any inconvenience this may cause. Please see [v3.4.3 release notes](https://github.com/wjh18/hugo-liftoff/releases/tag/v3.4.3) for further details.** + +## About + +Hugo Liftoff is a minimal blog/portfolio theme with a focus on content creation and SEO best practices. It's an ideal choice for technical users jump-starting a personal brand. + +## Documentation + +The full documentation is hosted on this repo's [Github Wiki](https://github.com/wjh18/hugo-liftoff/wiki). + +Please open an issue if you find any mistakes in the docs or have suggestions for improvement. + +## Demo Site + +A working [demo of the theme](https://hugo-liftoff.netlify.app/) is available to the public for evaluation. + +The `exampleSite` content included with the theme, which you're free to copy into your own project, mirrors the content used in the demo. The idea behind this is to help you get started quickly and replicate any features you saw in the demo that you think could be useful in your own project. + +## Notable Features + +* Content subsections with the ability to filter recent posts on homepage by subsection +* Series posts taxonomy with single posts that list all posts in the current series +* Next/prev links at the end of single posts for subsections or series posts (if enabled) +* Light/dark mode toggle using CSS custom properties +* Mobile-responsive, collapsible JS menu with automatic submenu support based on menu config +* Customizable newsletter with Netlify Forms support and conditional visibility control +* And much more... + +## Overview of Features + +Below are the current features of this theme. Features labeled *optional* or *frontmatter* can be enabled/disabled in config or frontmatter, respectively. + +### Netlify + +* Custom headers / redirects with Netlify (optional) +* Netlify forms support for newsletter opt-in and contact page (optional) +* Sample `netlify.toml` file for streamlined deployment + +### 3rd Party + +* Google Analytics v4 +* Google Tag Manager as an alternative to GA (optional) +* Disqus comments (optional) +* Disable comments on a per-page basis (optional) (frontmatter) + +### Newsletter + +* Newsletter opt-in with Netlify Forms support (optional) (frontmatter) +* Global display of newsletter opt-in (optional) +* Customizable newsletter header, description and CTA text (optional) +* Override global newsletter on a per-page basis (optional) (frontmatter) +* Enable or disable newsletter on a per-page basis (frontmatter) + +### Social + +* Native Twitter, Mastodon, Github, Stack Overflow, LinkedIn and email social links with SVG (optional) +* Enable or disable social links in footer, homepage hero, and about page (optional) +* Enable or disable individual social links (optional) +* Facebook, LinkedIn, Twitter, Reddit and email social share icons with SVG for posts (optional) +* Enable or disable individual social share icons (optional) + +### SEO / RSS + +* Enhanced Open Graph, Twitter Cards, and Schema.org templates +* RSS feed that excludes any pages outside of the posts section +* Customizable title and SEO title tags or use title for both (frontmatter) +* Customizable summary and meta description or use description for both (frontmatter) +* Custom author meta tag (optional) (frontmatter) +* Custom title tags and meta descriptions for every page (optional) (frontmatter) +* `robots.txt` and `sitemap.xml` +* Disable search engine crawling (optional) + +### Series / Subsections + +* Content subsections with the ability to filter recent posts on homepage by subsection (optional) +* Series posts taxonomy with single posts that list all posts in the current series (optional) +* Next/prev links at the end of single posts for subsections or series posts (if enabled) +* Subsection support for posts with custom permalinks for clean SEO URLs (optional) +* Mobile-responsive, collapsible JS menu with automatic submenu support based on menu config + +### Homepage + +* Customize hero title and subtitle on homepage (frontmatter) +* Customize posts and projects section headings on homepage (frontmatter) + +### Posts & Projects + +* Toggle-able sticky table of contents for posts (frontmatter) +* Related posts (frontmatter) +* Social share icons for posts (frontmatter) +* Reading time and word count for posts +* Last modified dates for posts (optional) +* Customizable live URL, source URL and tech stack details for projects (frontmatter) +* Tag and category taxonomies +* Project type taxonomy for categorizing projects +* Recent posts and projects on homepage + +### Code snippets + +* Syntax highlighting +* One-click copy button and language indicator for code snippets + +### CSS / JS + +* Light/dark mode toggle using CSS custom properties +* Add custom CSS / JS in `assets` +* CSS and JS minification +* Frontend build pipeline with ESBuild and ToCSS +* PostCSS processing for autoprefixing (optional) +* `npm` completely optional unless using PostCSS / Autoprefixer +* Fluid typography scale with CSS `clamp()` +* Sourcemaps for SCSS and JS in development + +### Images + +* Image processing with Hugo resources +* Feature images for posts and projects from `assets` or page bundle (frontmatter) +* Custom homepage hero avatar image (optional) +* Disable grayscale avatar filter (optional) +* Enable/disable favicons (optional) + +### Archetypes + +* Archetype templates for posts and projects +* Page bundle support for archetype templates + +### Markdown Hooks + +* Markdown render hooks for codeblocks, images, headings and links +* Language indicator for codeblocks +* Add custom CSS class to markdown images via URL fragments +* Heading anchor link SVG icon + +### Other Content + +* Create generic single pages quickly with the default single template (optional) +* Additional markdown footer text (optional) +* Add a label to drafts in development (optional) +* Responsive support for common markdown styles like tables +* About page with social links (optional) +* Contact page with Netlify Forms support (optional) +* Customize fallback text for empty content (optional) + +### Hugo Defaults + +* Example `hugo.toml` with the majority of Hugo config defaults included for easy customization +* Override config settings based on Hugo environment +* Built-in shortcodes +* And much more...Hugo has a lot to offer! + +## Planned Features + +The following features are planned for a future release. + +* Real-time site search +* Image galleries for projects +* i18n support +* Additional advanced Google structured data schemas +* Custom shortcodes for things like project lists + +## Getting Help + +To submit a bug report, feature request, or usage questions, please open an [issue](https://github.com/wjh18/hugo-liftoff/issues) on Github using one of the issue templates. + +## Contributing + +If you'd like to contribute to the project, fork it and submit a pull request with your changes using the [pull request template](https://github.com/wjh18/hugo-liftoff/blob/master/.github/pull_request_template.md). Please see the [Contribution Guidelines](https://github.com/wjh18/hugo-liftoff/blob/master/CONTRIBUTING.md) for more details. diff --git a/themes/hugo-liftoff/archetypes/default.md b/themes/hugo-liftoff/archetypes/default.md new file mode 100644 index 0000000..d57d9fc --- /dev/null +++ b/themes/hugo-liftoff/archetypes/default.md @@ -0,0 +1,13 @@ +--- +title: {{ replace .Name "-" " " | title }} +seo_title: {{ replace .Name "-" " " | title }} +description: +slug: {{ .Name }} +author: {{ .Site.Params.author }} + +draft: true +date: {{ .Date }} + +newsletter: true +--- + diff --git a/themes/hugo-liftoff/archetypes/post-bundle/index.md b/themes/hugo-liftoff/archetypes/post-bundle/index.md new file mode 100644 index 0000000..775ce6d --- /dev/null +++ b/themes/hugo-liftoff/archetypes/post-bundle/index.md @@ -0,0 +1,28 @@ +--- +title: {{ replace .Name "-" " " | title }} +seo_title: {{ replace .Name "-" " " | title }} +summary: +description: +slug: {{ .Name }} +author: {{ .Site.Params.author }} + +draft: true +date: {{ .Date }} +lastmod: +expiryDate: +publishDate: + +feature_image: +feature_image_alt: + +categories: +tags: +series: + +toc: true +related: true +social_share: true +newsletter: true +disable_comments: false +--- + diff --git a/themes/hugo-liftoff/archetypes/posts.md b/themes/hugo-liftoff/archetypes/posts.md new file mode 100644 index 0000000..775ce6d --- /dev/null +++ b/themes/hugo-liftoff/archetypes/posts.md @@ -0,0 +1,28 @@ +--- +title: {{ replace .Name "-" " " | title }} +seo_title: {{ replace .Name "-" " " | title }} +summary: +description: +slug: {{ .Name }} +author: {{ .Site.Params.author }} + +draft: true +date: {{ .Date }} +lastmod: +expiryDate: +publishDate: + +feature_image: +feature_image_alt: + +categories: +tags: +series: + +toc: true +related: true +social_share: true +newsletter: true +disable_comments: false +--- + diff --git a/themes/hugo-liftoff/archetypes/project-bundle/index.md b/themes/hugo-liftoff/archetypes/project-bundle/index.md new file mode 100644 index 0000000..952c8d3 --- /dev/null +++ b/themes/hugo-liftoff/archetypes/project-bundle/index.md @@ -0,0 +1,26 @@ +--- +title: {{ replace .Name "-" " " | title }} +seo_title: {{ replace .Name "-" " " | title }} +summary: +description: +slug: {{ .Name }} +author: {{ .Site.Params.author }} + +draft: true +date: {{ .Date }} +lastmod: +expiryDate: +publishDate: + +feature_image: +feature_image_alt: + +project types: + +techstack: +live_url: +source_url: + +newsletter: true +--- + diff --git a/themes/hugo-liftoff/archetypes/projects.md b/themes/hugo-liftoff/archetypes/projects.md new file mode 100644 index 0000000..952c8d3 --- /dev/null +++ b/themes/hugo-liftoff/archetypes/projects.md @@ -0,0 +1,26 @@ +--- +title: {{ replace .Name "-" " " | title }} +seo_title: {{ replace .Name "-" " " | title }} +summary: +description: +slug: {{ .Name }} +author: {{ .Site.Params.author }} + +draft: true +date: {{ .Date }} +lastmod: +expiryDate: +publishDate: + +feature_image: +feature_image_alt: + +project types: + +techstack: +live_url: +source_url: + +newsletter: true +--- + diff --git a/themes/hugo-liftoff/assets/images/default.png b/themes/hugo-liftoff/assets/images/default.png new file mode 100644 index 0000000..6192443 Binary files /dev/null and b/themes/hugo-liftoff/assets/images/default.png differ diff --git a/themes/hugo-liftoff/assets/js/app.js b/themes/hugo-liftoff/assets/js/app.js new file mode 100644 index 0000000..c745f26 --- /dev/null +++ b/themes/hugo-liftoff/assets/js/app.js @@ -0,0 +1,3 @@ +import { switcher, clipboard, toggleToc } from './components/components'; +import { header } from './layouts/header'; +import { home } from './pages/home'; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/js/components/clipboard.js b/themes/hugo-liftoff/assets/js/components/clipboard.js new file mode 100644 index 0000000..353777a --- /dev/null +++ b/themes/hugo-liftoff/assets/js/components/clipboard.js @@ -0,0 +1,44 @@ +// Adapted from the following tutorials: +// https://www.dannyguo.com/blog/how-to-add-copy-to-clipboard-buttons-to-code-blocks-in-hugo/ +// https://aaronluna.dev/blog/add-copy-button-to-code-blocks-hugo-chroma/ +// https://logfetch.com/hugo-add-copy-to-clipboard-button/ + +const addCopyButtons = (clipboard) => { + // 1. Look for pre > code elements in the DOM + document.querySelectorAll('.highlight > pre > code').forEach((codeBlock) => { + // 2. Create a button that will trigger a copy operation + const button = document.createElement('button'); + const svgCopy = ''; + const svgCheck = ''; + button.className = 'clipboard-button'; + button.type = 'button'; + button.innerHTML = svgCopy; + button.addEventListener('click', () => { + let textToCopy = ''; + let codeBlockChildren = Array.from(codeBlock.children) + codeBlockChildren.forEach(function(span) { + // lastChild is required to avoid copying line numbers + textToCopy += span.lastChild.innerText; + }); + clipboard.writeText(textToCopy).then( + () => { + button.blur(); + button.innerHTML = svgCheck; + setTimeout(() => (button.innerHTML = svgCopy), 2000); + }, + (error) => (button.innerHTML = 'Error') + ); + }); + // 3. Append the button directly before the pre tag + const pre = codeBlock.parentNode; + pre.parentNode.insertBefore(button, pre); + }); +}; + +const clipboard = (() => { + if (navigator && navigator.clipboard) { + addCopyButtons(navigator.clipboard); + } +})(); + +export { clipboard }; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/js/components/components.js b/themes/hugo-liftoff/assets/js/components/components.js new file mode 100644 index 0000000..00b61fe --- /dev/null +++ b/themes/hugo-liftoff/assets/js/components/components.js @@ -0,0 +1,3 @@ +export { switcher } from './switchTheme'; +export { clipboard } from './clipboard'; +export { toggleToc } from './toc'; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/js/components/switchTheme.js b/themes/hugo-liftoff/assets/js/components/switchTheme.js new file mode 100644 index 0000000..46d77f2 --- /dev/null +++ b/themes/hugo-liftoff/assets/js/components/switchTheme.js @@ -0,0 +1,46 @@ +// Adapted from https://github.com/CodyHouse/dark-light-mode-switch + +function switchTheme() { + let themeSwitch = document.getElementById('themeSwitch'); + if (themeSwitch) { + initTheme(); + + themeSwitch.addEventListener('change', () => { + resetTheme(); + }); + + function initTheme() { + let lsItem = localStorage.getItem('themeSwitch'); + let darkThemeSelected = false; + if (lsItem !== null) { + darkThemeSelected = lsItem === 'dark'; + } else { + darkThemeSelected = window.matchMedia('(prefers-color-scheme: dark)').matches; + } + + themeSwitch.checked = darkThemeSelected; + resetTheme(); + } + + function resetTheme() { + if (themeSwitch.checked) { + document.body.setAttribute('data-theme', 'dark'); + localStorage.setItem('themeSwitch', 'dark'); + } else { + document.body.removeAttribute('data-theme'); + localStorage.setItem('themeSwitch', 'light'); + } + + // Reset Disqus to match new color scheme + if (typeof DISQUS !== "undefined") { + DISQUS.reset({ reload: true }); + } + } + } +} + +const switcher = (() => { + switchTheme(); +})(); + +export { switcher }; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/js/components/toc.js b/themes/hugo-liftoff/assets/js/components/toc.js new file mode 100644 index 0000000..b23671d --- /dev/null +++ b/themes/hugo-liftoff/assets/js/components/toc.js @@ -0,0 +1,12 @@ +const toggleToc = (() => { + let tocToggle = document.getElementById('js-toc-toggle'); + let tocContents = document.getElementById('js-toc-contents'); + + if (tocToggle) { + tocToggle.addEventListener('click', () => { + tocContents.classList.toggle('toc-contents--active'); + }); + } +})(); + +export { toggleToc }; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/js/layouts/header.js b/themes/hugo-liftoff/assets/js/layouts/header.js new file mode 100644 index 0000000..c0be45f --- /dev/null +++ b/themes/hugo-liftoff/assets/js/layouts/header.js @@ -0,0 +1,44 @@ +// Show or hide nav on click of menu burger +function toggleNav() { + let mainMenu = document.getElementById('js-menu'); + let navBarToggle = document.getElementById('js-navbar-toggle'); + + navBarToggle.addEventListener('click', () => { + mainMenu.classList.toggle('menu--active'); + removeSubMenus(); + }); +} + +// Show or hide menu items on mobile +function toggleMobileMenu() { + let menuItems = document.querySelectorAll('.menu-item'); + + menuItems.forEach(function(item) { + item.addEventListener('click', () => { + let subMenu = item.querySelector('.sub-menu'); + if (subMenu.classList.contains('sub-menu--active')) { + subMenu.classList.remove('sub-menu--active'); + } else { + removeSubMenus(); + subMenu.classList.add('sub-menu--active'); + } + }); + }); +} + +// Collapse submenus +function removeSubMenus() { + let subMenus = document.querySelectorAll('.sub-menu'); + subMenus.forEach(function(sub) { + if (sub.classList.contains('sub-menu--active')) { + sub.classList.remove('sub-menu--active'); + } + }); +} + +const header = (() => { + toggleNav(); + toggleMobileMenu(); +})(); + +export { header }; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/js/pages/home.js b/themes/hugo-liftoff/assets/js/pages/home.js new file mode 100644 index 0000000..33fbf2c --- /dev/null +++ b/themes/hugo-liftoff/assets/js/pages/home.js @@ -0,0 +1,21 @@ +function filterPosts() { + let selectPosts = document.getElementById('select-posts'); + let entries = document.querySelectorAll('.post-entry-filter'); + if (selectPosts) { + selectPosts.addEventListener('change', () => { + entries.forEach(function(entry) { + if (entry.classList.contains(`entry--${selectPosts.value}`) | selectPosts.value === 'all-posts') { + entry.style.display = 'block'; + } else { + entry.style.display = 'none'; + } + }); + }); + } +} + +const home = (() => { + filterPosts(); +})(); + +export { home }; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/abstracts/_functions.scss b/themes/hugo-liftoff/assets/scss/abstracts/_functions.scss new file mode 100644 index 0000000..7bd6971 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/abstracts/_functions.scss @@ -0,0 +1,30 @@ +// ----------------------------------------------------------------------------- +// This file contains all application-wide Sass functions. +// ----------------------------------------------------------------------------- + +/// Native `url(..)` function wrapper +/// @param {String} $base - base URL for the asset +/// @param {String} $type - asset type folder (e.g. `fonts/`) +/// @param {String} $path - asset path +/// @return {Url} +@function asset($base, $type, $path) { + @return url($base + $type + $path); +} + +/// Returns URL to an image based on its path +/// @param {String} $path - image path +/// @param {String} $base [$base-url] - base URL +/// @return {Url} +/// @require $base-url +@function image($path, $base: $base-url) { + @return asset($base, 'images/', $path); +} + +/// Returns URL to a font based on its path +/// @param {String} $path - font path +/// @param {String} $base [$base-url] - base URL +/// @return {Url} +/// @require $base-url +@function font($path, $base: $base-url) { + @return asset($base, 'fonts/', $path); +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/abstracts/_mixins.scss b/themes/hugo-liftoff/assets/scss/abstracts/_mixins.scss new file mode 100644 index 0000000..c463943 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/abstracts/_mixins.scss @@ -0,0 +1,60 @@ +// ----------------------------------------------------------------------------- +// This file contains all application-wide Sass mixins. +// ----------------------------------------------------------------------------- + +/// Event wrapper +/// @author Harry Roberts +/// @param {Bool} $self [false] - Whether or not to include current selector +/// @link https://twitter.com/csswizardry/status/478938530342006784 Original tweet from Harry Roberts +@mixin on-event($self: false) { + @if $self { + &, + &:hover, + &:active, + &:focus, + &:focus-within { + @content; + } + } @else { + &:hover, + &:active, + &:focus, + &:focus-within { + @content; + } + } +} + +/// Make a context based selector a little more friendly +/// @author Kitty Giraudel +/// @param {String} $context +@mixin when-inside($context) { + #{$context} & { + @content; + } +} + +/// Mixin to manage responsive breakpoints +/// @author Kitty Giraudel +/// @param {String} $breakpoint - Breakpoint name +/// @require $breakpoints +@mixin respond-to($breakpoint) { + // If the key exists in the map + @if map-has-key($breakpoints, $breakpoint) { + // Prints a media query based on the value + @media (min-width: map-get($breakpoints, $breakpoint)) { + @content; + } + } + + // If the key doesn't exist in the map + @else { + @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + + "Available breakpoints are: #{map-keys($breakpoints)}."; + } +} + +@mixin font-size($step) { + font-size: var(--font-size-#{$step}); + line-height: calc(8px + 2ex); +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/abstracts/_variables.scss b/themes/hugo-liftoff/assets/scss/abstracts/_variables.scss new file mode 100644 index 0000000..addd410 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/abstracts/_variables.scss @@ -0,0 +1,92 @@ +// ----------------------------------------------------------------------------- +// This file contains all application-wide Sass variables. +// ----------------------------------------------------------------------------- + +:root, [data-theme="default"] { + --color-primary: rgb(18, 120, 175); + --color-inline-code: hsl(0, 81%, 35%); + + /* color contrasts */ + --color-bg: rgb(248, 248, 248); + --color-contrast-lower: hsl(0, 0%, 95%); + --color-contrast-low: hsl(240, 1%, 83%); + --color-contrast-medium-low: hsl(240, 1%, 65%); + --color-contrast-medium: hsl(240, 1%, 48%); + --color-contrast-medium-high: hsl(240, 2%, 34%); + --color-contrast-high: hsl(240, 4%, 20%); + --color-contrast-higher: black; + + --color-text: var(--color-contrast-high); + + --font-size-sm: clamp(0.8rem, 0.17vw + 0.76rem, 0.89rem); + --font-size-base: clamp(1rem, 0.34vw + 0.91rem, 1.19rem); + --font-size-md: clamp(1.25rem, 0.61vw + 1.1rem, 1.58rem); + --font-size-lg: clamp(1.56rem, 1vw + 1.31rem, 2.11rem); + --font-size-xl: clamp(1.95rem, 1.56vw + 1.56rem, 2.81rem); + --font-size-xxl: clamp(2.44rem, 2.38vw + 1.85rem, 3.75rem); + --font-size-xxxl: clamp(3.05rem, 3.54vw + 2.17rem, 5rem); +} + +[data-theme] { + background-color: var(--color-bg); + color: var(--color-contrast-high); +} + +[data-theme="dark"] { + --color-primary: rgb(86, 184, 237); + --color-inline-code: hsl(0, 81%, 70%); + + /* color contrasts */ + --color-bg: rgb(18, 18, 18); + --color-contrast-lower: hsl(240, 6%, 15%); + --color-contrast-low: hsl(252, 4%, 25%); + --color-contrast-medium-low: hsl(240, 2%, 34%); + --color-contrast-medium: hsl(240, 1%, 57%); + --color-contrast-medium-high: hsl(240, 1%, 65%); + --color-contrast-high: hsl(0, 0%, 89%); + --color-contrast-higher: white; + + --color-text: var(--color-contrast-high); +} + + +// Fonts + +/// Regular font family +/// @type List +$text-font-stack: 'Roboto', 'Helvetica Neue Light', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + +/// Code (monospace) font family +/// @type List +$code-font-stack: 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Monaco', monospace; + + +// Containers + +/// Container's maximum width +/// @type Length +$max-width: 1180px; + + +// Responsiveness + +/// Breakpoints map +/// @prop {String} keys - Keys are identifiers mapped to a given length +/// @prop {Map} values - Values are actual breakpoints expressed in pixels +$breakpoints: ( + 'x-small': 320px, + 'small': 576px, + 'medium': 768px, + 'm-large': 900px, + 'large': 1024px, + 'x-large': 1200px, +); + + +// Assets + +/// Relative or absolute URL where all assets are served from +/// @type String +/// @example scss - When using a CDN +/// $base-url: 'https://cdn.example.com/assets/'; +$base-url: '/assets/'; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/base/_base.scss b/themes/hugo-liftoff/assets/scss/base/_base.scss new file mode 100644 index 0000000..570204c --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/base/_base.scss @@ -0,0 +1,178 @@ +// ----------------------------------------------------------------------------- +// This file contains very basic styles. +// ----------------------------------------------------------------------------- + +/** + * Set up a decent box model on the root element + */ + html { + box-sizing: border-box; +} + +/** + * Make all elements from the DOM inherit from the parent box-sizing + * Since `*` has a specificity of 0, it does not override the `html` value + * making all elements inheriting from the root box-sizing value + * See: https://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ + */ +*, +*::before, +*::after { + box-sizing: inherit; +} + +html, body { + height: 100%; +} + +body { + /* Flex properties on body/main/footer are for floating footer + to bottom of page if main content doesn't fill viewport vertically */ + display: flex; + flex-direction: column; +} + +main { + flex: 1 0 auto; +} + +footer { + flex-shrink: 0; +} + +a { + color: var(--color-primary); + text-decoration: none; + + @include on-event { + color: var(--color-text); + text-decoration: underline; + } +} + +h1 { + @include font-size('xl'); +} + +h2 { + @include font-size('lg'); +} + +h3 { + @include font-size('md'); +} + +h4 { + @include font-size('base'); +} + +h5 { + @include font-size('sm'); +} + +h6 { + @include font-size('sm'); +} + +table { + border-collapse: collapse; + display: block; + overflow-x: auto; +} + +td, th { + border: 1px solid var(--color-contrast-medium-low); + padding: 10px 20px; + font-size: 0.9rem; + line-height: 1.4rem; +} + +th { + border: 1px solid var(--color-contrast-medium); + background-color: var(--color-contrast-medium-low); + color: var(--color-contrast-high); + font-size: 1rem; +} + +td { + text-align: center; +} + +tr:nth-child(even) td { + background-color: var(--color-contrast-lower); + color: var(--color-contrast-high); +} + +tr:nth-child(odd) td { + background-color: var(--color-contrast-low); + color: var(--color-contrast-high); +} + +blockquote { + background: var(--color-contrast-lower); + border-left: 10px solid var(--color-contrast-low); + margin: 1.5em 10px; + padding: 0.7em 10px; + quotes: "\201C" "\201D"; + + p { + display: inline; + } + + &::before { + color: var(--color-contrast-low); + content: open-quote; + font-size: 4em; + line-height: 0.1em; + margin-right: 0.25em; + vertical-align: -0.4em; + } +} + +pre { + font-size: 1rem; + line-height: 1.6rem; + overflow-x: auto; +} + +code { + overflow-x: scroll; +} + +pre:not([style]) { + // If no highlighting is applied already + background-color:#272822; + color:#f8f8f2; + padding: 20px; +} + +p > code, li > code { + background-color: var(--color-contrast-lower); + font-size: 1rem; + color: var(--color-inline-code); + padding: 2px 5px; + border-radius: 5px; +} + +form { + display: flex; + flex-wrap: wrap; + row-gap: 10px; + + input, textarea { + border: 1px solid var(--color-contrast-medium-low); + padding: 10px 12px; + font-size: 1rem; + background-color: var(--color-contrast-lower); + color: var(--color-contrast-high); + + @include respond-to('small') { + padding: 15px 12px; + min-width: 250px; + } + } + + button { + cursor: pointer; + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/base/_fonts.scss b/themes/hugo-liftoff/assets/scss/base/_fonts.scss new file mode 100644 index 0000000..7d2dd27 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/base/_fonts.scss @@ -0,0 +1,111 @@ +// ----------------------------------------------------------------------------- +// This file contains all @font-face declarations, if any. +// ----------------------------------------------------------------------------- + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Thin'), + url('/fonts/Roboto/Roboto-Thin.ttf') format('truetype'); + font-weight: 100; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Thin Italic'), + url('/fonts/Roboto/Roboto-ThinItalic.ttf') format('truetype'); + font-weight: 100; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Light'), + url('/fonts/Roboto/Roboto-Light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Light Italic'), + url('/fonts/Roboto/Roboto-LightItalic.ttf') format('truetype'); + font-weight: 300; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Regular'), + url('/fonts/Roboto/Roboto-Regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Italic'), + url('/fonts/Roboto/Roboto-Italic.ttf') format('truetype'); + font-weight: 400; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Medium'), + url('/fonts/Roboto/Roboto-Medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Italic'), + url('/fonts/Roboto/Roboto-MediumItalic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Bold'), + url('/fonts/Roboto/Roboto-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Bold Italic'), + url('/fonts/Roboto/Roboto-BoldItalic.ttf') format('truetype'); + font-weight: 700; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Black'), + url('/fonts/Roboto/Roboto-Black.ttf') format('truetype'); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Roboto'; + src: local('Roboto Black Italic'), + url('/fonts/Roboto/Roboto-BlackItalic.ttf') format('truetype'); + font-weight: 900; + font-style: italic; + font-display: swap; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/base/_helpers.scss b/themes/hugo-liftoff/assets/scss/base/_helpers.scss new file mode 100644 index 0000000..9b92a60 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/base/_helpers.scss @@ -0,0 +1,69 @@ +// ----------------------------------------------------------------------------- +// This file contains CSS helper classes. +// ----------------------------------------------------------------------------- + +/** + * Clear inner floats + */ + .clearfix::after { + clear: both; + content: ''; + display: table; +} + +/** + * Main content containers + * 1. Make the container full-width with a maximum width + * 2. Center it in the viewport + * 3. Leave some space on the edges, especially valuable on small screens + */ +.container { + max-width: $max-width; /* 1 */ + margin-left: auto; /* 2 */ + margin-right: auto; /* 2 */ + padding-left: 16px; /* 3 */ + padding-right: 16px; /* 3 */ + width: 100%; /* 1 */ + + @include respond-to('small') { + padding-left: 20px; /* 3 */ + padding-right: 20px; /* 3 */ + } + + &--sm { + @extend .container; + max-width: 768px; + } +} + +/** + * Hide text while making it readable for screen readers + * 1. Needed in WebKit-based browsers because of an implementation bug; + * See: https://code.google.com/p/chromium/issues/detail?id=457146 + */ +.hide-text { + overflow: hidden; + padding: 0; /* 1 */ + text-indent: 101%; + white-space: nowrap; +} + +/** + * Hide element while making it readable for screen readers + * Shamelessly borrowed from HTML5Boilerplate: + * https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css#L119-L133 + */ +.visually-hidden { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +.section { + padding: 50px 0; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/base/_typography.scss b/themes/hugo-liftoff/assets/scss/base/_typography.scss new file mode 100644 index 0000000..e5169bc --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/base/_typography.scss @@ -0,0 +1,31 @@ +// ----------------------------------------------------------------------------- +// This file contains typography styles. +// ----------------------------------------------------------------------------- + +/** + * Basic typography style for copy text + */ + body { + color: var(--color-text); + font: normal 125% / 1.4 $text-font-stack; +} + +.summary-text { + font-weight: 300; + @include font-size('base'); + color: var(--color-contrast-medium-high); +} + +.meta-text { + color: var(--color-contrast-medium); + @include font-size('sm'); + font-weight: 400; + display: flex; + flex-wrap: wrap; + gap: 6px 15px; +} + +.fallback-text { + color: var(--color-contrast-medium); + @include font-size('md'); +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_buttons.scss b/themes/hugo-liftoff/assets/scss/components/_buttons.scss new file mode 100644 index 0000000..8861b0e --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_buttons.scss @@ -0,0 +1,40 @@ +.btn-group { + display: flex; + column-gap: 15px; + margin-top: 30px; +} + +%btn { + border: 1px solid var(--color-primary); + padding: 0.4rem 0.7rem; + display: inline-block; + @include font-size('base'); + + @include respond-to('small') { + padding: 0.5rem 0.8rem; + } + + @include on-event() { + text-decoration: none; + } +} + +.btn-primary { + @extend %btn; + background-color: var(--color-primary); + color: var(--color-contrast-lower); + + &:hover { + background: transparent; + color: var(--color-primary); + } +} + +.btn-secondary { + @extend %btn; + + &:hover { + background-color: var(--color-primary); + color: var(--color-contrast-lower); + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_clipboard.scss b/themes/hugo-liftoff/assets/scss/components/_clipboard.scss new file mode 100644 index 0000000..586f2f5 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_clipboard.scss @@ -0,0 +1,44 @@ +// Adapted from the following tutorials: +// https://logfetch.com/hugo-add-copy-to-clipboard-button/ + +.clipboard-button { + position: absolute; + right: 0; + padding: 2px 7px 5px 7px; + margin: 5px; + color: #767676; + border-color: #767676; + background-color: #ededed; + border: 1px solid; + border-radius: 6px; + z-index: 1; + opacity: 0; + transition: 0.1s; +} + +.clipboard-button > svg { + fill: #767676; +} + +.clipboard-button:hover { + cursor: pointer; + border-color: #696969; + background-color: #e0e0e0; +} + +.clipboard-button:hover > svg { + fill: #696969; +} + +.clipboard-button:focus { + outline: 0; +} + +.highlight { + position: relative; +} + +.highlight:hover > .clipboard-button { + opacity: 1; + transition: 0.2s; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_code-highlight.scss b/themes/hugo-liftoff/assets/scss/components/_code-highlight.scss new file mode 100644 index 0000000..0586704 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_code-highlight.scss @@ -0,0 +1,14 @@ +.code-language { + position: relative; + padding: 6px 15px; + border-radius: 5px; + background-color: #272822; + color: #7f7f7f; + z-index: 1000; + top: 25px; + @include font-size('base'); +} + +.highlight > pre { + padding: 20px; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_draft-label.scss b/themes/hugo-liftoff/assets/scss/components/_draft-label.scss new file mode 100644 index 0000000..bc42ceb --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_draft-label.scss @@ -0,0 +1,9 @@ +.draft::after { + content: 'Draft'; + color: rgb(201, 8, 8); + border: 1px solid rgb(201, 8, 8); + border-radius: 5px; + @include font-size('sm'); + padding: 2px 5px; + font-weight: 300; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_markdown.scss b/themes/hugo-liftoff/assets/scss/components/_markdown.scss new file mode 100644 index 0000000..c3c4315 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_markdown.scss @@ -0,0 +1,19 @@ +.markdown { + @include font-size('base'); + + p > img, figure > img { + max-width: 100%; + height: auto; + } + + figure { + margin-left: 0; + margin-right: 0; + } + + figcaption { + @include font-size('sm'); + color: var(--color-contrast-medium); + font-weight: 300; + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_newsletter.scss b/themes/hugo-liftoff/assets/scss/components/_newsletter.scss new file mode 100644 index 0000000..c8095dd --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_newsletter.scss @@ -0,0 +1,16 @@ +.newsletter-header { + color: var(--color-contrast-high); + margin-bottom: 0; +} + +.newsletter-desc { + color: var(--color-contrast-medium-high); + @include font-size('base'); +} + +#newsletter-form { + + input { + border-right: none; + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_page-header.scss b/themes/hugo-liftoff/assets/scss/components/_page-header.scss new file mode 100644 index 0000000..cd112a9 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_page-header.scss @@ -0,0 +1,26 @@ +.page-header { + background-color: var(--color-contrast-lower); + padding: 30px; + margin: 0 0 50px 0; + border-radius: 20px; +} + +.page-header--c { + @extend .page-header; + text-align: center; +} + +.page-header-title { + margin: 0; + color: var(--color-contrast-high); + font-weight: 500; + @include font-size('lg'); +} + +.page-header-desc { + margin: 0; + margin-top: 15px; + color: var(--color-contrast-medium); + font-weight: 400; + @include font-size('base'); +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_pagination.scss b/themes/hugo-liftoff/assets/scss/components/_pagination.scss new file mode 100644 index 0000000..8b19ddd --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_pagination.scss @@ -0,0 +1,37 @@ +.pagination { + list-style-type: none; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + gap: 15px 10px; + margin-top: 50px; + padding: 0; + @include font-size('base'); +} + +.page-link { + color: var(--color-contrast-medium-high); + padding: 8px 15px; + background-color: var(--color-contrast-lower); + + &:hover { + color: var(--color-primary); + } + + @include on-event { + text-decoration: none; + } +} + +.page-item { + + &.disabled > a { + color: var(--color-contrast-low); + cursor:unset; + } + + &.active > a { + background-color: var(--color-primary); + color: var(--color-contrast-lower); + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_socials.scss b/themes/hugo-liftoff/assets/scss/components/_socials.scss new file mode 100644 index 0000000..4d9544c --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_socials.scss @@ -0,0 +1,29 @@ +.social-links { + width: 100%; + opacity: 0.9; +} + +.social-icons { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 15px 40px; + list-style: none; + padding: 0; + margin: 0; + + &--share { + @extend .social-icons; + justify-content: flex-start; + gap: 10px 15px; + li { + border: 1px solid var(--color-contrast-medium-low); + border-radius: 100px; + padding: 12px; + display: flex; + justify-content: center; + align-items: center; + } + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_switch-theme.scss b/themes/hugo-liftoff/assets/scss/components/_switch-theme.scss new file mode 100644 index 0000000..95b0c29 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_switch-theme.scss @@ -0,0 +1,105 @@ +:root { + /* style */ + --switch-width: 48px; + --switch-height: 24px; + --switch-padding: 3px; + /* animation */ + --switch-animation-duration: 0.2s; +} + +.switch { + display: flex; + flex-shrink: 0; + align-items: center; + width: 48px; + width: var(--switch-width); + height: 24px; + height: var(--switch-height); + border-radius: 50em; + padding: 3px 0; + padding: var(--switch-padding) 0; + + position: absolute; + top: 65px; + right: 20px; + + @include respond-to('m-large') { + position:relative; + top: unset; + right: unset; + } + +} + +.switch-input, .switch-label { + position: absolute; + left: 0; + top: 0; +} + +.switch-input { + margin: 0; + padding: 0; + opacity: 0; + height: 0; + width: 0; + pointer-events: none; +} + +.switch-input:checked + .switch-label { + background-color: hsl(228, 74%, 61%); + background-color: var(--color-primary); +} + +.switch-input:checked + .switch-label + .switch-marker { + left: calc(100% - 29px); + left: calc(100% - var(--switch-height) + var(--switch-padding)); +} + +.switch-input:focus + .switch-label, +.switch-input:active + .switch-label { + --color-shadow: hsla(228, 74%, 61%, 0.2); + box-shadow: undefined; + box-shadow: 0 0 0 3px var(--color-shadow); +} + +.switch-input:focus + .switch-label, +.switch-input:active + .switch-label { + box-shadow: 0 0 0 3px hsla(228, 74%, 61%, 0.2); + box-shadow: 0 0 0 3px var(--color-shadow); +} + +.switch-label { + width: 100%; + height: 100%; + color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: hsl(240, 1%, 83%); + background-color: var(--color-contrast-low); + border-radius: inherit; + z-index: 1; + transition: background 0.2s; + transition: background var(--switch-animation-duration); +} + +.switch-marker { + position: relative; + background-color: hsl(0, 0%, 100%); + background-color: var(--color-contrast-high); + width: 20px; + width: calc(var(--switch-height) - var(--switch-padding)*2); + height: 20px; + height: calc(var(--switch-height) - var(--switch-padding)*2); + border-radius: 50%; + z-index: 2; + pointer-events: none; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); + left: 3px; + left: var(--switch-padding); + transition: left 0.2s; + transition: left var(--switch-animation-duration); + will-change: left; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/components/_toc.scss b/themes/hugo-liftoff/assets/scss/components/_toc.scss new file mode 100644 index 0000000..786816c --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/components/_toc.scss @@ -0,0 +1,52 @@ +.toc { + + @include respond-to('x-large') { + position: sticky; + top: 2rem; + align-self: start; + order: 2; + display: flex; + flex-direction: column; + align-items: center; + height: 90vh; + overflow-y: scroll; + } +} + +.toc-header, .toc-drop-icon { + @include font-size('sm'); + font-weight: 500; + margin: 0; + text-align: center; +} + +.toc-contents { + display: none; + @include font-size('sm'); + + &--active { + display: block; + } + + @include respond-to('x-large') { + display: block; + + &--active { + display: none; + } + } +} + +#js-toc-toggle { + display: inline-flex; + align-items: center; + column-gap: 10px; + padding: 10px 20px; + background-color: var(--color-contrast-lower); + border-radius: 20px; + + &:hover { + cursor: pointer; + color: var(--color-primary); + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/layout/_footer.scss b/themes/hugo-liftoff/assets/scss/layout/_footer.scss new file mode 100644 index 0000000..b86570d --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/layout/_footer.scss @@ -0,0 +1,18 @@ +// ----------------------------------------------------------------------------- +// This file contains all styles related to the footer of the site/application. +// ----------------------------------------------------------------------------- + +.footer { + background-color: var(--color-contrast-lower); +} + +.footer-socials { + max-width: 300px; + margin: 0 auto; +} + +.footer-copyright { + text-align: center; + @include font-size('base'); + color: var(--color-contrast-medium-high); +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/layout/_header.scss b/themes/hugo-liftoff/assets/scss/layout/_header.scss new file mode 100644 index 0000000..fc68cc9 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/layout/_header.scss @@ -0,0 +1,128 @@ +// ----------------------------------------------------------------------------- +// This file contains all styles related to the header of the site. +// ----------------------------------------------------------------------------- + +.main-nav { + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 15px 0; + row-gap: 20px; + + .nav-toggle { + position: absolute; + top: 20px; + right: 20px; + cursor: pointer; + } + + @include respond-to('m-large') { + flex-direction: row; /* Horizontal nav on desktop */ + align-items: center; + padding: 0; + + .nav-toggle { + display: none; /* Hide nav toggle on desktop */ + } + } +} + +.logo { + @include font-size('md'); + font-weight: 700; + text-decoration: none; + width: fit-content; + + &:hover { + text-decoration: none; + } +} + +.menu-link { + color: var(--color-text); + + &:hover { + color: var(--color-contrast-lower); + } +} + +.menu { + display: none; + flex-direction: column; + margin: 0; + padding: 0; + border-bottom: 1px solid var(--color-contrast-low); + border-top: 1px solid var(--color-contrast-low); + + &--active { + display: flex; /* Display mobile menu on click */ + } + + .menu-item { + display: block; + list-style-type: none; + } + + .menu-item--align { + @extend .menu-item; + align-self: center; + margin-left: 20px; + } + + .menu-link { + display: flex; + font-size: 1rem; + font-weight: 500; + text-align: center; + text-decoration: none; + cursor: pointer; + padding: 1.4rem 1rem; + + &:hover { + background-color: var(--color-primary); + color: var(--color-contrast-lower); + } + } + + .drop-icon { + margin-left: 10px; + } + + @include respond-to('m-large') { + display: flex; + flex-direction: row; + border: none; + + .menu-item:hover { + .sub-menu { + background-color: var(--color-contrast-lower); + padding-left: 0; + display: block; + z-index: 1; + } + } + } +} + +.sub-menu { + display: none; + + &--active { + display: block; + z-index: 1; + } + + .menu-link { + font-weight: initial; + } + + @include respond-to('m-large') { + display: none; + position: absolute; + box-shadow: rgba(9, 30, 66, 0.25) 0px 4px 8px -2px, rgba(9, 30, 66, 0.08) 0px 0px 0px 1px; + + &--active { + display: none; + } + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/main.scss b/themes/hugo-liftoff/assets/scss/main.scss new file mode 100644 index 0000000..8d961f9 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/main.scss @@ -0,0 +1,47 @@ +@charset "UTF-8"; + +// 1. Configuration and helpers +@import + 'abstracts/variables', + 'abstracts/functions', + 'abstracts/mixins'; + +// 2. Vendors +@import + 'vendors/normalize'; + +// 3. Base stuff +@import + 'base/base', + 'base/fonts', + 'base/typography', + 'base/helpers'; + +// 4. Layout-related sections +@import + 'layout/header', + 'layout/footer'; + +// 5. Components +@import + 'components/switch-theme', + 'components/socials', + 'components/buttons', + 'components/newsletter', + 'components/pagination', + 'components/draft-label', + 'components/clipboard', + 'components/code-highlight', + 'components/markdown', + 'components/toc', + 'components/page-header'; + +// 6. Page-specific styles +@import + 'pages/home', + 'pages/contact', + 'pages/single', + 'pages/terms', + 'pages/errors', + 'pages/post-list', + 'pages/project-list'; \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/pages/_contact.scss b/themes/hugo-liftoff/assets/scss/pages/_contact.scss new file mode 100644 index 0000000..9c91e86 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/pages/_contact.scss @@ -0,0 +1,10 @@ +#contact-form { + flex-direction: column; + row-gap: 15px; + max-width: 500px; + margin-top: 30px; + + button { + align-self: flex-start; + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/pages/_errors.scss b/themes/hugo-liftoff/assets/scss/pages/_errors.scss new file mode 100644 index 0000000..c39c68b --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/pages/_errors.scss @@ -0,0 +1,11 @@ +.error-404 { + margin-top: 50px; + + h1 { + margin: 0; + } + + p { + margin-top: 10px; + } +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/pages/_home.scss b/themes/hugo-liftoff/assets/scss/pages/_home.scss new file mode 100644 index 0000000..f147a9b --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/pages/_home.scss @@ -0,0 +1,104 @@ +// ----------------------------------------------------------------------------- +// This file contains styles that are specific to the home page. +// ----------------------------------------------------------------------------- + +.hero { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 3rem 5vw; + + @include respond-to('medium') { + flex-wrap: nowrap; + } + + @include respond-to('m-large') { + padding: 80px 0; + } +} + +.hero-info { + + @include respond-to('medium') { + flex: 0 1 65%; + } + + .hero-title { + font-weight: 900; + margin-top: 0; + @include font-size('xl'); + } + + .hero-subtitle { + color: var(--color-contrast-medium-high); + @include font-size('base'); + } +} + +.hero-owner { + display: flex; + flex-direction: column; + align-items: center; + row-gap: 20px; + + @include respond-to('medium') { + flex: 0 1 35%; + } + + .hero-avatar { + max-width: 300px; + width: 100%; + height: auto; + border-radius: 20px; + + @include respond-to('medium') { + max-width: 100%; + width: unset; + } + } +} + +.home-section-title { + + &::after { + background-color: var(--color-contrast-medium); + content: ""; + display: block; + height: 2px; + position: relative; + width: 80px; + top: 8px; + } +} + +.home-section-posts-title { + @extend .home-section-title; + margin: 0; +} + +.home-title-dropdown { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 30px; + margin-bottom: 50px; +} + +#select-posts { + @include font-size('sm'); + padding: 0.4rem; + border: 1px solid var(--color-contrast-medium-low); + border-radius: 5px; + color: var(--color-contrast-high); + background-color: var(--color-contrast-lower); +} + +.see-more { + margin-top: 30px; +} + +.see-more-projects { + color: var(--color-contrast-medium); + font-weight: 300; + font-size: var(--font-size-base); +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/pages/_post-list.scss b/themes/hugo-liftoff/assets/scss/pages/_post-list.scss new file mode 100644 index 0000000..20a7401 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/pages/_post-list.scss @@ -0,0 +1,47 @@ +.post-entry { + margin: 20px 0; + max-width: 750px; +} + +.post-entry-divider { + background-color: var(--color-contrast-low); + content: ""; + display: block; + height: 1px; + position: relative; + max-width: 750px; +} + +.post-list-title { + font-weight: 400; + margin: 0; + @include font-size('md'); + + a { + text-decoration: none; + color: var(--color-contrast-high); + + &:hover { + color: var(--color-primary); + } + } +} + +.post-list-summary { + @extend .summary-text; + margin: 10px 0 0 0; +} + +.post-list-meta { + @extend .meta-text; + margin-top: 10px; +} + +.post-list-dates { + font-weight: 400; +} + +.post-list-categories { + display: inline-flex; + column-gap: 10px; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/pages/_project-list.scss b/themes/hugo-liftoff/assets/scss/pages/_project-list.scss new file mode 100644 index 0000000..705ed67 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/pages/_project-list.scss @@ -0,0 +1,81 @@ +.project-list { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + gap: 2rem 1rem; + + & > * { + flex: 1 1 350px; + } +} + +.project-entry { + border: 1px solid var(--color-contrast-low); + border-radius: 10px; + box-shadow: 0 0 20px -10px var(--color-contrast-low), 0 0 20px -10px var(--color-contrast-low); + max-width: 750px; +} + +.project-entry-img { + position: relative; + border-radius: 10px 10px 0 0; + min-height: 1rem; + + img { + width: 100%; + height: 20vh; + object-fit: cover; + border-radius: 10px 10px 0 0; + border-bottom: 1px solid var(--color-contrast-low); + // Image overlay + z-index: -1; + position: relative; + filter: grayscale(50%); + } +} + +.project-entry-type { + position: absolute; + top: 0; + right: 0; + padding: 0.2rem 0.4rem; + background-color: var(--color-bg); + border-left: 1px solid var(--color-contrast-low); + border-bottom: 1px solid var(--color-contrast-low); + border-top-right-radius: 10px; + + a { + @include font-size('sm'); + } +} + +.project-entry-info { + padding: 1.2rem; + + @include respond-to('small') { + padding: 1.5rem; + } +} + +.project-entry-title { + margin: 0; + font-weight: 400; + + a { + color: var(--color-contrast-high); + + &:hover { + text-decoration: none; + color: var(--color-primary); + } + } +} + +.project-list-summary { + @extend .summary-text; +} + +.project-list-meta { + @extend .meta-text; + margin-top: 10px; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/pages/_single.scss b/themes/hugo-liftoff/assets/scss/pages/_single.scss new file mode 100644 index 0000000..164f142 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/pages/_single.scss @@ -0,0 +1,80 @@ +.single-feature-img { + display: flex; + + img { + margin: 30px 0; + max-width: 100%; + height: auto; + filter: grayscale(50%); + } +} + +.single-terms { + display: flex; + flex-wrap: wrap; + gap: 10px; + justify-content: flex-start; + margin-top: 20px; +} + +.single-container { + @extend .container; + max-width: 900px; +} + +.single-container-post { + @extend .container; + max-width: 900px; + + @include respond-to('x-large') { + max-width: $max-width; + display: grid; + grid-template-columns: 1fr 15em; + gap: 1rem; + } +} + +.single-post-contents { + overflow: auto; +} + +.series { + @include font-size('base'); + margin: 2rem 0; +} + +.series-this-post { + color: var(--color-primary); + border: 1px solid var(--color-primary); + border-radius: 5px; + padding: 0.3rem; + @include font-size('sm'); + font-weight: 500; + margin-left: 10px; +} + +.single-next-previous { + display: flex; + flex-wrap: wrap; + gap: 20px; + justify-content: space-between; + align-items: baseline; + + & > * { + background-color: transparent; + border: 1px solid var(--color-contrast-medium-low); + border-radius: 12px; + padding: 10px; + @include font-size('base'); + max-width: 300px; + + &:hover { + text-decoration: none; + border: 1px solid var(--color-contrast-high); + } + } +} + +.related-posts { + @include font-size('base'); +} diff --git a/themes/hugo-liftoff/assets/scss/pages/_terms.scss b/themes/hugo-liftoff/assets/scss/pages/_terms.scss new file mode 100644 index 0000000..9248265 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/pages/_terms.scss @@ -0,0 +1,28 @@ +.terms { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 15px 15px; +} + +.term { + border: 1px solid var(--color-primary); + border-radius: 20px; + @include font-size('sm'); + padding: 0.4rem 0.6rem; + + &:hover { + text-decoration: none; + border: 1px solid var(--color-contrast-high); + color: var(--color-contrast-high); + } + + @include respond-to('small') { + padding: 0.5rem 0.7rem; + } +} + +.term-count { + color: var(--color-contrast-high); + margin-left: 2px; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/assets/scss/vendors/_normalize.scss b/themes/hugo-liftoff/assets/scss/vendors/_normalize.scss new file mode 100644 index 0000000..b6eb821 --- /dev/null +++ b/themes/hugo-liftoff/assets/scss/vendors/_normalize.scss @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} \ No newline at end of file diff --git a/themes/hugo-liftoff/config.toml b/themes/hugo-liftoff/config.toml new file mode 100644 index 0000000..1edbce1 --- /dev/null +++ b/themes/hugo-liftoff/config.toml @@ -0,0 +1,4 @@ +[module] + [module.hugoVersion] + extended = true + min = "0.115.2" \ No newline at end of file diff --git a/themes/hugo-liftoff/go.mod b/themes/hugo-liftoff/go.mod new file mode 100644 index 0000000..69257a1 --- /dev/null +++ b/themes/hugo-liftoff/go.mod @@ -0,0 +1,3 @@ +module github.com/wjh18/hugo-liftoff/v3 + +go 1.20 diff --git a/themes/hugo-liftoff/images/screenshot.png b/themes/hugo-liftoff/images/screenshot.png new file mode 100644 index 0000000..f5a3a65 Binary files /dev/null and b/themes/hugo-liftoff/images/screenshot.png differ diff --git a/themes/hugo-liftoff/images/tn.png b/themes/hugo-liftoff/images/tn.png new file mode 100644 index 0000000..7031723 Binary files /dev/null and b/themes/hugo-liftoff/images/tn.png differ diff --git a/themes/hugo-liftoff/layouts/404.html b/themes/hugo-liftoff/layouts/404.html new file mode 100644 index 0000000..fd32cc1 --- /dev/null +++ b/themes/hugo-liftoff/layouts/404.html @@ -0,0 +1,9 @@ +{{ define "main" }} +
+
+

Page Not Found!

+

The page you requested could not be found.

+ ‹ Return Home +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/_markup/render-codeblock.html b/themes/hugo-liftoff/layouts/_default/_markup/render-codeblock.html new file mode 100644 index 0000000..6c45709 --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/_markup/render-codeblock.html @@ -0,0 +1,6 @@ +{{ $lang := .Attributes.lang | default .Type }} +{{ if transform.CanHighlight $lang }} + {{ $lang }}{{ highlight .Inner $lang }} +{{ else }} +
{{ .Inner }}
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/_markup/render-heading.html b/themes/hugo-liftoff/layouts/_default/_markup/render-heading.html new file mode 100644 index 0000000..479035c --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/_markup/render-heading.html @@ -0,0 +1,10 @@ + + {{- .Text | safeHTML -}} + + + Link to this heading + + + + + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/_markup/render-image.html b/themes/hugo-liftoff/layouts/_default/_markup/render-image.html new file mode 100644 index 0000000..7c1238b --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/_markup/render-image.html @@ -0,0 +1,50 @@ + +{{- $src := (.Destination | safeURL) -}} + +{{- $fragments := (split $src "#") -}} +{{- $src = index ($fragments) 0 -}} + +{{- $imgwidth := .Page.Scratch.Get "imgwidth" | default 800 -}} + +{{- $src = path.Base $src -}} + +{{- with (.Page.Resources.ByType "image").GetMatch (printf "**/%s" $src) -}} + {{ $resized := . }} + {{ if (gt .Width $imgwidth) }} + {{ if hugo.IsExtended }} + {{- $resized = .Resize (print $imgwidth "x webp") -}} + {{ else }} + {{- $resized = .Resize (print $imgwidth "x") -}} + {{ end }} + {{ end }} + + {{ $placeholder := "" }} + {{- if or (eq .MediaType.SubType "jpg") (eq .MediaType.SubType "jpeg") }} + {{ $placeholder = .Resize "48x q20 jpg Gaussian" }} + {{ end -}} + + {{- if (eq .MediaType.SubType "gif") }} + {{ $resized = . }} + {{ end -}} + {{ $.Text }} + +{{- else -}} + {{ .Text }} +{{- end -}} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/_markup/render-link.html b/themes/hugo-liftoff/layouts/_default/_markup/render-link.html new file mode 100644 index 0000000..868f0e8 --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/_markup/render-link.html @@ -0,0 +1 @@ +{{ .Text | safeHTML }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/baseof.html b/themes/hugo-liftoff/layouts/_default/baseof.html new file mode 100644 index 0000000..df2584c --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/baseof.html @@ -0,0 +1,17 @@ + + + {{- partial "head/head.html" . -}} + + {{ if and (not .Site.IsServer) (.Site.Params.gtm_id) }} + + + + {{ end }} + {{- partial "header/header.html" . -}} +
+ {{- block "main" . }}{{- end }} +
+ {{- partial "footer/footer.html" . -}} + {{- partial "footer/scripts.html" . -}} + + diff --git a/themes/hugo-liftoff/layouts/_default/list.html b/themes/hugo-liftoff/layouts/_default/list.html new file mode 100644 index 0000000..55311fd --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/list.html @@ -0,0 +1,31 @@ +{{ define "main" -}} +
+ +
+ {{ range (.Paginate .RegularPagesRecursive).Pages }} + {{ partial "posts/post-entry.html" . }} +
+ {{ else }} + {{ partial "general/fallback-text.html" . }} + {{ end }} + {{ template "_internal/pagination.html" . }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/rss.xml b/themes/hugo-liftoff/layouts/_default/rss.xml new file mode 100644 index 0000000..72e2898 --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/rss.xml @@ -0,0 +1,27 @@ +{{- printf "" | safeHTML }} + + + {{ with .Site.Title }}{{ . }}{{ else }}{{ .Title }}{{ end }} + {{ .Permalink }} + Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} + Hugo -- gohugo.io{{ with .Site.LanguageCode }} + {{.}}{{end}}{{ with .Site.Author.email }} + {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} + {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Copyright }} + {{.}}{{end}}{{ if not .Date.IsZero }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" -}} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end -}} + {{ range where (where .Site.Pages ".Section" "posts") "Kind" "page" }} + + {{ .Title }} + {{ .Permalink }} + {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ with .Site.Author.email }}{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}} + {{ .Permalink }} + {{ with .Params.Summary }}{{ . | html }}{{ else }}{{ .Description | html }}{{ end }} + + {{ end }} + + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/single.html b/themes/hugo-liftoff/layouts/_default/single.html new file mode 100644 index 0000000..953e2af --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/single.html @@ -0,0 +1,12 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+
+
+
+
+ {{ .Content }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/sitemap.xml b/themes/hugo-liftoff/layouts/_default/sitemap.xml new file mode 100644 index 0000000..f5abe25 --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/sitemap.xml @@ -0,0 +1,24 @@ +{{ printf "" | safeHTML }} + + {{ range .Data.Pages }} + {{- if .Permalink -}} + + {{ .Permalink }}{{ if not .Lastmod.IsZero }} + {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} + {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} + {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} + {{ end }} + {{ end }} + + {{- end -}} + {{ end }} + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/_default/terms.html b/themes/hugo-liftoff/layouts/_default/terms.html new file mode 100644 index 0000000..6f9b092 --- /dev/null +++ b/themes/hugo-liftoff/layouts/_default/terms.html @@ -0,0 +1,16 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+
+
+ {{ with .Data.Terms.ByCount }} + {{ range . }} + {{ .Page.Title }} {{ .Count }} + {{ end }} + {{ else }} + {{ partial "general/fallback-text.html" . }} + {{ end }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/about/single.html b/themes/hugo-liftoff/layouts/about/single.html new file mode 100644 index 0000000..713c935 --- /dev/null +++ b/themes/hugo-liftoff/layouts/about/single.html @@ -0,0 +1,15 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+
+
+
+ {{ if eq .Site.Params.about_page_socials true }} +
{{ partial "general/social-links.html" . }}
+ {{ end }} +
+ {{ .Content }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/contact/single.html b/themes/hugo-liftoff/layouts/contact/single.html new file mode 100644 index 0000000..c0786c0 --- /dev/null +++ b/themes/hugo-liftoff/layouts/contact/single.html @@ -0,0 +1,16 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+
+
+
+
{{ .Content }}
+
+ + + + +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/index.headers b/themes/hugo-liftoff/layouts/index.headers new file mode 100644 index 0000000..9c5050f --- /dev/null +++ b/themes/hugo-liftoff/layouts/index.headers @@ -0,0 +1,5 @@ +/* + X-Frame-Options: DENY + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Referrer-Policy: origin-when-cross-origin \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/index.html b/themes/hugo-liftoff/layouts/index.html new file mode 100644 index 0000000..f32159a --- /dev/null +++ b/themes/hugo-liftoff/layouts/index.html @@ -0,0 +1,52 @@ +{{ define "main" }} +
+
+
+

{{ .Title }}

+ {{ with .Params.subtitle }} +

{{. | markdownify}}

+ {{ end }} +
+ {{ $p_cta := "" }} + {{ with .Params.primary_cta_page }} + {{ $p_cta = . }} + {{ end }} + {{ $s_cta := "" }} + {{ with .Params.secondary_cta_page }} + {{ $s_cta = . }} + {{ end }} + + {{ if $p_cta }}{{ with .Site.GetPage $p_cta }}{{ .LinkTitle }}{{ end }}{{ else }}About{{ end }} + + + {{ if $s_cta }}{{ with .Site.GetPage $s_cta }}{{ .LinkTitle }}{{ end }}{{ else }}Projects{{ end }} + +
+
+
+ {{ $avatar := .Site.Params.avatar }} + {{ $default_image := "images/default.png" }} + {{ $image := "" }} + {{ with $avatar }} + {{ $image = resources.Get $avatar }} + {{ else }} + {{ $image = resources.Get $default_image }} + {{ end }} + {{ if eq .Site.Params.grayscale_avatar true }} + {{ $image = $image | images.Filter (images.Grayscale) }} + {{ end }} + Headshot or avatar belonging to the website owner + {{ if eq .Site.Params.home_hero_socials true }} + {{ partial "general/social-links.html" . }} + {{ end }} +
+
+ {{/* Shortcodes from page content */}} + {{ .Content }} +
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/index.redirects b/themes/hugo-liftoff/layouts/index.redirects new file mode 100644 index 0000000..4692541 --- /dev/null +++ b/themes/hugo-liftoff/layouts/index.redirects @@ -0,0 +1,7 @@ +# redirects for Netlify - https://www.netlify.com/docs/redirects/ +{{- range $p := .Site.Pages -}} +{{- range .Aliases }} +{{ . }} {{ $p.RelPermalink -}} +{{- end }} +{{- end -}} +# Add custom redirects here \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/footer/footer.html b/themes/hugo-liftoff/layouts/partials/footer/footer.html new file mode 100644 index 0000000..9619a28 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/footer/footer.html @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/footer/newsletter.html b/themes/hugo-liftoff/layouts/partials/footer/newsletter.html new file mode 100644 index 0000000..ecbdbbb --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/footer/newsletter.html @@ -0,0 +1,29 @@ + +
+
+ + +
+ + +
+
+
\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/footer/scripts.html b/themes/hugo-liftoff/layouts/partials/footer/scripts.html new file mode 100644 index 0000000..6dfa986 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/footer/scripts.html @@ -0,0 +1,34 @@ +{{ $opts := "" }} +{{ if hugo.IsProduction }} + {{ $opts = dict "targetPath" "main.js" }} +{{ else }} + {{ $opts = dict "targetPath" "main.js" "sourceMap" "inline" }} +{{ end }} +{{ $script := resources.Get "js/app.js" | js.Build $opts }} + +{{ $custom := "" }} +{{ with .Site.Params.custom_js }} + {{ $custom = resources.Get . }} + {{/* Only concatenate in production to allow source maps */}} + {{ if hugo.IsProduction }} + {{ $bundle := slice $script $custom | resources.Concat "main.js" }} + {{ $script = $bundle }} + {{ else }} + + {{ end }} +{{ end }} + +{{ $final := "" }} +{{ if hugo.IsProduction }} + {{/* Only rebuild concatenated files in production (in dev there is no concat) */}} + {{/* Only minify in production to allow source maps */}} + {{ $final = $script | js.Build "main.js" | minify }} +{{ else }} + {{ $final = $script }} +{{ end }} + + + +{{ if and (not .Site.IsServer) (not .Site.Params.gtm_id) }} + {{ template "_internal/google_analytics.html" . }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/general/fallback-text.html b/themes/hugo-liftoff/layouts/partials/general/fallback-text.html new file mode 100644 index 0000000..ff69872 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/general/fallback-text.html @@ -0,0 +1,7 @@ +

+ {{- with .Site.Params.fallback_text -}} + {{- . -}} + {{- else -}} + No content available yet. Coming soon. + {{- end -}} +

\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/general/feature-image.html b/themes/hugo-liftoff/layouts/partials/general/feature-image.html new file mode 100644 index 0000000..aabd994 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/general/feature-image.html @@ -0,0 +1,19 @@ +{{ $images := $.Resources.ByType "image" -}} +{{ $custom_file := .Params.feature_image }} +{{ $custom_image := $images.GetMatch $custom_file }} +{{ $feature_image := $images.GetMatch "*feature*" -}} +{{ $img_src := "" }} +{{ with $custom_image }} + {{ $img_src = .RelPermalink }} +{{ else }} + {{ with $feature_image }} + {{ $img_src = .RelPermalink }} + {{ end }} +{{ end }} +{{ if $img_src }} + +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/general/label-drafts.html b/themes/hugo-liftoff/layouts/partials/general/label-drafts.html new file mode 100644 index 0000000..55c2504 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/general/label-drafts.html @@ -0,0 +1,3 @@ +{{ if and (eq .Params.draft true) (eq .Site.Params.label_drafts true) (.Site.IsServer) }} + +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/general/social-links.html b/themes/hugo-liftoff/layouts/partials/general/social-links.html new file mode 100644 index 0000000..0ca021e --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/general/social-links.html @@ -0,0 +1,58 @@ + + diff --git a/themes/hugo-liftoff/layouts/partials/head/favicons.html b/themes/hugo-liftoff/layouts/partials/head/favicons.html new file mode 100644 index 0000000..0ee8570 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/favicons.html @@ -0,0 +1,7 @@ + +{{ if eq .Site.Params.favicon true }} + + + + +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/gtm.html b/themes/hugo-liftoff/layouts/partials/head/gtm.html new file mode 100644 index 0000000..3759fba --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/gtm.html @@ -0,0 +1,11 @@ +{{ if not .Site.IsServer }} + {{ with .Site.Params.gtm_id }} + + + + {{ end }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/head.html b/themes/hugo-liftoff/layouts/partials/head/head.html new file mode 100644 index 0000000..2af13b6 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/head.html @@ -0,0 +1,10 @@ + + + + + {{ partial "head/resource-hints.html" . }} + {{ partial "head/styles.html" . }} + {{ partial "head/seo/seo.html" . }} + {{ partial "head/favicons.html" . }} + {{ partial "head/scripts.html" . }} + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/resource-hints.html b/themes/hugo-liftoff/layouts/partials/head/resource-hints.html new file mode 100644 index 0000000..84896f2 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/resource-hints.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/scripts.html b/themes/hugo-liftoff/layouts/partials/head/scripts.html new file mode 100644 index 0000000..2bda8ff --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/scripts.html @@ -0,0 +1,4 @@ + +{{ if .Site.Params.gtm_id }} + {{ partial "head/gtm.html" . }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/seo/opengraph.html b/themes/hugo-liftoff/layouts/partials/head/seo/opengraph.html new file mode 100644 index 0000000..18b5bd0 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/seo/opengraph.html @@ -0,0 +1,72 @@ + + + + +{{ if $.Scratch.Get "paginator" -}} + {{ $paginator := .Paginate (where .Site.RegularPages.ByDate.Reverse "Section" "posts" ) -}} + +{{ else -}} + +{{ end -}} +{{ with .Site.Params.title -}} + +{{ end -}} + +{{ $iso8601 := "2006-01-02T15:04:05-07:00" -}} +{{ if .IsPage -}} + {{ if not .PublishDate.IsZero -}} + + {{ else if not .Date.IsZero -}} + + {{ end -}} + {{ if not .Lastmod.IsZero -}} + + {{ end -}} +{{ else -}} + {{ if not .Date.IsZero -}} + + {{ end -}} +{{ end -}} + +{{ $images := $.Resources.ByType "image" -}} +{{ $feature := $images.GetMatch "*feature*" -}} +{{ $feature_param := $.Params.feature_image }} +{{ $feature_frontmatter := $images.GetMatch $feature_param }} +{{ if $feature_frontmatter -}} + + {{ with $.Params.feature_image_alt }} + + {{ end }} +{{ else if $feature -}} + + {{ with $.Params.feature_image_alt }} + + {{ end }} +{{ else if $.Params.images }} + +{{ else if $.Site.Params.images }} + +{{ end }} + +{{ with .Params.audio -}} + +{{ end -}} + +{{ with .Params.videos -}} + {{ range . -}} + + {{ end -}} +{{ end -}} + +{{- /* If it is part of a series, link to related articles */}} +{{- $permalink := .Permalink }} +{{- $siteSeries := .Site.Taxonomies.series }} +{{/* Only add property if taxonomy is enabled */}} +{{ if $siteSeries }} + {{ with .Params.series }}{{- range $name := . }} + {{- $series := index $siteSeries ($name | urlize) }} + {{- range $page := first 6 $series.Pages }} + {{- if ne $page.Permalink $permalink }}{{ end }} + {{- end }} + {{ end }}{{ end }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/seo/seo.html b/themes/hugo-liftoff/layouts/partials/head/seo/seo.html new file mode 100644 index 0000000..b10b065 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/seo/seo.html @@ -0,0 +1,65 @@ + +{{ if eq .Kind "404" -}} + +{{ else -}} + {{ with .Params.robots -}} + + {{ else -}} + + + + {{ end -}} +{{ end -}} + + + + + {{- $paginator := .Paginate .RegularPagesRecursive }} + {{- with .Params.seo_title -}} + {{- . -}} + {{- else -}} + {{- .Title -}} + {{- end -}} + {{- with $paginator -}} + {{ if and (gt $paginator.TotalPages 1) (gt $paginator.PageNumber 1) }} + | Page {{ $paginator.PageNumber }} + {{- end -}} + {{- end -}} + {{ if (or (and (ne .Type "posts") (ne .Type "projects") (not .IsHome)) (and (not .IsPage) (not .IsHome))) }} | {{ .Site.Title -}}{{ end -}} + + + +{{ with .Params.author -}} + +{{ else -}} + +{{ end -}} + + +{{ with .Description -}} + +{{ else -}} + +{{ end -}} + +{{ if $.Scratch.Get "paginator" }} + + {{ if .Paginator.HasPrev -}} + + {{ end -}} + {{ if .Paginator.HasNext -}} + + {{ end -}} +{{ else -}} + +{{ end -}} + +{{ partial "head/seo/opengraph.html" . }} +{{ partial "head/seo/twitter-cards.html" . }} + + +{{- with .OutputFormats.Get "rss" -}} +{{ printf `` .Rel .MediaType.Type .Permalink $.Site.Title | safeHTML }} +{{- end -}} + +{{ partial "head/seo/structured-data.html" . }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/seo/structured-data.html b/themes/hugo-liftoff/layouts/partials/head/seo/structured-data.html new file mode 100644 index 0000000..dbc2283 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/seo/structured-data.html @@ -0,0 +1,159 @@ +{{ $baseURL := "/" | absURL -}} + +{{ $dot := . -}} +{{ $dot.Scratch.Set "path" "" -}} +{{ $dot.Scratch.Set "breadcrumb" slice -}} + +{{ $url := replace .Permalink ( printf "%s" .Site.BaseURL) "" -}} +{{ $.Scratch.Add "path" .Site.BaseURL -}} + +{{ $.Scratch.Add "breadcrumb" (slice (dict "url" .Site.BaseURL "name" "home" "position" 1 )) -}} + {{ range $index, $element := split $url "/" -}} + {{ $dot.Scratch.Add "path" $element -}} + {{ $.Scratch.Add "path" "/" -}} + {{ if ne $element "" -}} + {{ $.Scratch.Add "breadcrumb" (slice (dict "url" ($.Scratch.Get "path") "name" . "position" (add $index 2))) -}} + {{ end -}} +{{ end -}} + +{{ $images := $.Resources.ByType "image" -}} +{{ $feature := $images.GetMatch "*feature*" -}} +{{ $feature_param := $.Params.feature_image }} +{{ $feature_frontmatter := $images.GetMatch $feature_param }} +{{ if $feature_frontmatter -}} + {{ $.Scratch.Set "primaryImage" $feature_frontmatter.Permalink }} + {{ with $.Params.feature_image_alt }} + {{ $.Scratch.Set "primaryImageAlt" . }} + {{ end }} +{{ else if $feature -}} + {{ $.Scratch.Set "primaryImage" $feature.Permalink }} + {{ with $.Params.feature_image_alt }} + {{ $.Scratch.Set "primaryImageAlt" . }} + {{ end }} +{{ else if $.Params.images }} + {{ $.Scratch.Set "primaryImage" ( index $.Params.images 0 | absURL ) }} +{{ else if $.Site.Params.images }} + {{ $.Scratch.Set "primaryImage" ( index $.Site.Params.images 0 | absURL ) }} +{{ end }} + + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/seo/twitter-cards.html b/themes/hugo-liftoff/layouts/partials/head/seo/twitter-cards.html new file mode 100644 index 0000000..68be60b --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/seo/twitter-cards.html @@ -0,0 +1,33 @@ +{{ with .Site.Params.twitterSite }} + +{{ end }} +{{ with .Site.Params.twitterCreator }} + +{{ end }} + + +{{ $images := $.Resources.ByType "image" -}} +{{ $feature := $images.GetMatch "*feature*" -}} +{{ $feature_param := $.Params.feature_image }} +{{ $feature_frontmatter := $images.GetMatch $feature_param }} +{{ if $feature_frontmatter -}} + + + {{ with $.Params.feature_image_alt }} + + {{ end }} +{{ else if $feature -}} + + + {{ with $.Params.feature_image_alt }} + + {{ end }} +{{ else if $.Params.images }} + + +{{ else if $.Site.Params.images }} + + +{{ else }} + +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/head/styles.html b/themes/hugo-liftoff/layouts/partials/head/styles.html new file mode 100644 index 0000000..7a505eb --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/head/styles.html @@ -0,0 +1,34 @@ +{{ $sass := resources.Get "scss/main.scss" }} +{{ $options := (dict "enableSourceMap" (not hugo.IsProduction)) }} +{{ $style := $sass | resources.ToCSS $options }} + +{{ $custom := "" }} +{{ $custom_no_bundle := false }} +{{ with .Site.Params.custom_css }} + {{ $custom = resources.Get . }} + {{/* Only concatenate in production to allow source maps */}} + {{ if hugo.IsProduction }} + {{ $bundle := slice $style $custom | resources.Concat "main.css" }} + {{ $style = $bundle }} + {{ else }} + {{ $custom_no_bundle = true }} + {{ end }} +{{ end }} + +{{ $final := "" }} +{{/* Only enable PostCSS in production to allow source maps */}} +{{ if and (eq $.Site.Params.enable_postcss true) (hugo.IsProduction) }} + {{ $final = $style | postCSS (dict "config" "postcss.config.js") }} +{{ else }} + {{ $final = $style }} +{{ end }} + +{{ if hugo.IsProduction }} + {{/* Only minify in production to allow source maps */}} + {{ $final = $final | minify }} +{{ end }} + +{{/* Custom goes last to preserve cascade in development */}} +{{ if $custom_no_bundle }} + +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/header/header.html b/themes/hugo-liftoff/layouts/partials/header/header.html new file mode 100644 index 0000000..83363cf --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/header/header.html @@ -0,0 +1,36 @@ +
+ +
\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/posts/next-previous.html b/themes/hugo-liftoff/layouts/partials/posts/next-previous.html new file mode 100644 index 0000000..2b97d99 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/posts/next-previous.html @@ -0,0 +1,13 @@ +{{ if or (.PrevInSection) (.NextInSection) }} +
+

Read Next

+
+ {{ with .PrevInSection }} + + {{ end }} + {{ with .NextInSection }} + + {{ end }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/posts/post-entry.html b/themes/hugo-liftoff/layouts/partials/posts/post-entry.html new file mode 100644 index 0000000..9ff4cb5 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/posts/post-entry.html @@ -0,0 +1,23 @@ +
+

+ {{ .Title }} +

+
+ {{ partial "posts/post-meta.html" . }} + {{ with .Params.categories }} +
+ {{ range . }} + {{ . }} + {{ end }} +
+ {{ end }} + {{ partial "general/label-drafts.html" . }} +
+

+ {{- with .Params.Summary -}} + {{- . -}} + {{- else -}} + {{- .Description -}} + {{- end -}} +

+
\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/posts/post-meta.html b/themes/hugo-liftoff/layouts/partials/posts/post-meta.html new file mode 100644 index 0000000..4b3d98d --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/posts/post-meta.html @@ -0,0 +1,15 @@ +
+ {{- if not (eq .Lastmod .Date) -}} + Posted: + {{ end -}} + {{- if not .PublishDate.IsZero -}} + {{- .PublishDate.Format "Jan 2, 2006" -}} + {{- else -}} + {{ .Date.Format "Jan 2, 2006" -}} + {{- end -}} + {{- if not (eq .Lastmod .Date) -}} +  ·  + Updated: {{ .Lastmod.Format "Jan 2, 2006" -}} + {{- end -}} +  ·  + {{- .ReadingTime }} min.
\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/posts/related.html b/themes/hugo-liftoff/layouts/partials/posts/related.html new file mode 100644 index 0000000..ce7cb49 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/posts/related.html @@ -0,0 +1,14 @@ + +{{ if .Param "related" }} + {{ $related := .Site.RegularPages.Related . | first 5 }} + {{ with $related }} + + {{ end }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/posts/social-share.html b/themes/hugo-liftoff/layouts/partials/posts/social-share.html new file mode 100644 index 0000000..ca82d3d --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/posts/social-share.html @@ -0,0 +1,44 @@ + +{{- if .Param "social_share" }} + {{ $title := .Title }} + {{ $url := printf "%s" .Permalink }} + {{ $body := print $title ", by " .Site.Title "\n" .Params.description "\n\n" $url "\n" }} + +
+

Share

+ +
+ {{ end }} +{{- end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/posts/toc.html b/themes/hugo-liftoff/layouts/partials/posts/toc.html new file mode 100644 index 0000000..d5a237f --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/posts/toc.html @@ -0,0 +1,10 @@ + +{{ if .Params.toc }} + +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/projects/project-entry.html b/themes/hugo-liftoff/layouts/partials/projects/project-entry.html new file mode 100644 index 0000000..4b9ed6a --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/projects/project-entry.html @@ -0,0 +1,42 @@ +
+
+ {{ partial "general/feature-image.html" . }} + {{ with .Param "project types" }} +
+ {{ range first 1 . }} + {{ . }} + {{ end }} +
+ {{ end }} +
+ +
\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/projects/projects.html b/themes/hugo-liftoff/layouts/partials/projects/projects.html new file mode 100644 index 0000000..b6410b6 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/projects/projects.html @@ -0,0 +1,38 @@ +
+ +
+ {{ with .RegularPagesRecursive }} +
+ {{ range . }} + {{ partial "projects/project-entry.html" . }} + {{ end }} +
+ {{ else }} + {{ partial "general/fallback-text.html" . }} + {{ end }} +
+
\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/email.svg b/themes/hugo-liftoff/layouts/partials/svg/email.svg new file mode 100644 index 0000000..532b0d9 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/facebook.svg b/themes/hugo-liftoff/layouts/partials/svg/facebook.svg new file mode 100644 index 0000000..6b48820 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/github.svg b/themes/hugo-liftoff/layouts/partials/svg/github.svg new file mode 100644 index 0000000..be65da9 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/linkedin.svg b/themes/hugo-liftoff/layouts/partials/svg/linkedin.svg new file mode 100644 index 0000000..bb5b18d --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/mastodon.svg b/themes/hugo-liftoff/layouts/partials/svg/mastodon.svg new file mode 100644 index 0000000..18fe9e6 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/mastodon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/reddit.svg b/themes/hugo-liftoff/layouts/partials/svg/reddit.svg new file mode 100644 index 0000000..cde70e4 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/reddit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/stack-overflow.svg b/themes/hugo-liftoff/layouts/partials/svg/stack-overflow.svg new file mode 100644 index 0000000..d9fca20 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/stack-overflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/partials/svg/twitter.svg b/themes/hugo-liftoff/layouts/partials/svg/twitter.svg new file mode 100644 index 0000000..17b0231 --- /dev/null +++ b/themes/hugo-liftoff/layouts/partials/svg/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/posts/single.html b/themes/hugo-liftoff/layouts/posts/single.html new file mode 100644 index 0000000..61fbe7e --- /dev/null +++ b/themes/hugo-liftoff/layouts/posts/single.html @@ -0,0 +1,103 @@ +{{ define "main" }} +
+ +
+
+ {{ partial "posts/toc.html" . }} +
+ {{- if .Params.series }} +
+ {{- $name := index .Params.series 0 }} +

Part of the {{$name}} series:

+ {{- $name := $name | urlize }} + {{- $series := index .Site.Taxonomies.series $name }} + {{ $curtitle := .Title }} +
    + {{- range $series.Pages.Reverse }} +
  1. + {{- if eq .Title $curtitle -}} + {{- .Title -}} + This post! + {{ else }} + {{ .Title }} + {{ end }} +
  2. + {{- end }} +
+
+ {{ end }} +
{{ partial "general/feature-image.html" . }}
+
+ {{ .Content }} +
+ +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/project-type/term.html b/themes/hugo-liftoff/layouts/project-type/term.html new file mode 100644 index 0000000..6ec9568 --- /dev/null +++ b/themes/hugo-liftoff/layouts/project-type/term.html @@ -0,0 +1,3 @@ +{{ define "main" -}} + {{ partial "projects/projects.html" . }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/projects/section.html b/themes/hugo-liftoff/layouts/projects/section.html new file mode 100644 index 0000000..6ec9568 --- /dev/null +++ b/themes/hugo-liftoff/layouts/projects/section.html @@ -0,0 +1,3 @@ +{{ define "main" -}} + {{ partial "projects/projects.html" . }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/projects/single.html b/themes/hugo-liftoff/layouts/projects/single.html new file mode 100644 index 0000000..20a4afe --- /dev/null +++ b/themes/hugo-liftoff/layouts/projects/single.html @@ -0,0 +1,47 @@ +{{ define "main" }} +
+ +
+
+
{{ partial "general/feature-image.html" . }}
+
+ {{ .Content }} +
+
+{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/robots.txt b/themes/hugo-liftoff/layouts/robots.txt new file mode 100644 index 0000000..33d34a6 --- /dev/null +++ b/themes/hugo-liftoff/layouts/robots.txt @@ -0,0 +1,6 @@ +User-agent: * +{{- if eq .Site.Params.disallow_search_engines true }} +Disallow: / +{{ else }} +Disallow: {{ if not hugo.IsProduction }}/{{ end }} +{{ end }} \ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/shortcodes/projects.html b/themes/hugo-liftoff/layouts/shortcodes/projects.html new file mode 100644 index 0000000..370264f --- /dev/null +++ b/themes/hugo-liftoff/layouts/shortcodes/projects.html @@ -0,0 +1,26 @@ +
+
+

+ {{- with $.Page.Params.projects_section_heading -}} + {{- . -}} + {{- else -}} + My Projects + {{- end -}} +

+ View all » +
+ {{ $num := .Get 0 }} + {{ if not $num }} + {{ $num = 6 }} + {{ end }} + {{ $projects := where site.RegularPages "Section" "projects" | first $num }} + {{ with $projects }} +
+ {{- range . }} + {{ partial "projects/project-entry.html" . }} + {{ end }} +
+ {{ else }} + {{ partial "general/fallback-text.html" . }} + {{ end }} +
\ No newline at end of file diff --git a/themes/hugo-liftoff/layouts/shortcodes/recent-posts.html b/themes/hugo-liftoff/layouts/shortcodes/recent-posts.html new file mode 100644 index 0000000..963cb99 --- /dev/null +++ b/themes/hugo-liftoff/layouts/shortcodes/recent-posts.html @@ -0,0 +1,34 @@ +
+
+

+ {{- with $.Page.Params.posts_section_heading -}} + {{- . -}} + {{- else -}} + Recent Posts + {{- end -}} +

+ +
+ {{ $num := .Get 0 }} + {{ if not $num }} + {{ $num = 10 }} + {{ end }} + {{ range (where site.RegularPages "Section" "posts" | first $num) }} +
+ {{ partial "posts/post-entry.html" . }} +
+
+ {{ else }} + {{ partial "general/fallback-text.html" . }} + {{ end }} + Plus de publications +
diff --git a/themes/hugo-liftoff/netlify.toml b/themes/hugo-liftoff/netlify.toml new file mode 100644 index 0000000..7a53dbe --- /dev/null +++ b/themes/hugo-liftoff/netlify.toml @@ -0,0 +1,10 @@ +[build] + command = "hugo" + publish = "public" + +[build.environment] + HUGO_VERSION = "0.115.2" + +[context.production.environment] + HUGO_ENV = "production" + NODE_ENV = "production" \ No newline at end of file diff --git a/themes/hugo-liftoff/package-lock.json b/themes/hugo-liftoff/package-lock.json new file mode 100644 index 0000000..101fbf7 --- /dev/null +++ b/themes/hugo-liftoff/package-lock.json @@ -0,0 +1,918 @@ +{ + "name": "hugo-liftoff", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hugo-liftoff", + "dependencies": { + "autoprefixer": "^10.4.14", + "postcss": "^8.4.25", + "postcss-cli": "^10.1.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz", + "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz", + "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^13.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^4.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/themes/hugo-liftoff/package.json b/themes/hugo-liftoff/package.json new file mode 100644 index 0000000..b5cd153 --- /dev/null +++ b/themes/hugo-liftoff/package.json @@ -0,0 +1,21 @@ +{ + "private": true, + "name": "hugo-liftoff", + "version": "", + "scripts": { + "build": "hugo", + "dev": "hugo server", + "drafts": "hugo server -D", + "future": "hugo server -F", + "expired": "hugo server -E" + }, + "dependencies": { + "autoprefixer": "^10.4.14", + "postcss": "^8.4.25", + "postcss-cli": "^10.1.0" + }, + "browserlists": [ + "ie >= 8", + "last 3 versions" + ] +} \ No newline at end of file diff --git a/themes/hugo-liftoff/postcss.config.js b/themes/hugo-liftoff/postcss.config.js new file mode 100644 index 0000000..73241e5 --- /dev/null +++ b/themes/hugo-liftoff/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: [ + require('autoprefixer')() + ] +}; \ No newline at end of file diff --git a/themes/hugo-liftoff/static/about.txt b/themes/hugo-liftoff/static/about.txt new file mode 100644 index 0000000..177de89 --- /dev/null +++ b/themes/hugo-liftoff/static/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following font: + +- Font Title: Roboto +- Font Author: Copyright 2011 Google Inc. All Rights Reserved. +- Font Source: http://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmWUlvAx05IsDqlA.ttf +- Font License: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html)) diff --git a/themes/hugo-liftoff/static/android-chrome-192x192.png b/themes/hugo-liftoff/static/android-chrome-192x192.png new file mode 100644 index 0000000..81b2a93 Binary files /dev/null and b/themes/hugo-liftoff/static/android-chrome-192x192.png differ diff --git a/themes/hugo-liftoff/static/android-chrome-512x512.png b/themes/hugo-liftoff/static/android-chrome-512x512.png new file mode 100644 index 0000000..f6e888b Binary files /dev/null and b/themes/hugo-liftoff/static/android-chrome-512x512.png differ diff --git a/themes/hugo-liftoff/static/apple-touch-icon.png b/themes/hugo-liftoff/static/apple-touch-icon.png new file mode 100644 index 0000000..52011b8 Binary files /dev/null and b/themes/hugo-liftoff/static/apple-touch-icon.png differ diff --git a/themes/hugo-liftoff/static/favicon-16x16.png b/themes/hugo-liftoff/static/favicon-16x16.png new file mode 100644 index 0000000..4ca3160 Binary files /dev/null and b/themes/hugo-liftoff/static/favicon-16x16.png differ diff --git a/themes/hugo-liftoff/static/favicon-32x32.png b/themes/hugo-liftoff/static/favicon-32x32.png new file mode 100644 index 0000000..0bfab6f Binary files /dev/null and b/themes/hugo-liftoff/static/favicon-32x32.png differ diff --git a/themes/hugo-liftoff/static/favicon.ico b/themes/hugo-liftoff/static/favicon.ico new file mode 100644 index 0000000..cdc5880 Binary files /dev/null and b/themes/hugo-liftoff/static/favicon.ico differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/LICENSE.txt b/themes/hugo-liftoff/static/fonts/Roboto/LICENSE.txt new file mode 100644 index 0000000..75b5248 --- /dev/null +++ b/themes/hugo-liftoff/static/fonts/Roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Black.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Black.ttf new file mode 100644 index 0000000..0112e7d Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Black.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-BlackItalic.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-BlackItalic.ttf new file mode 100644 index 0000000..b2c6aca Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-BlackItalic.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Bold.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Bold.ttf new file mode 100644 index 0000000..43da14d Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Bold.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-BoldItalic.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-BoldItalic.ttf new file mode 100644 index 0000000..bcfdab4 Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-BoldItalic.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Italic.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Italic.ttf new file mode 100644 index 0000000..1b5eaa3 Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Italic.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Light.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Light.ttf new file mode 100644 index 0000000..e7307e7 Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Light.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-LightItalic.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-LightItalic.ttf new file mode 100644 index 0000000..2d277af Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-LightItalic.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Medium.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Medium.ttf new file mode 100644 index 0000000..ac0f908 Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Medium.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-MediumItalic.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-MediumItalic.ttf new file mode 100644 index 0000000..fc36a47 Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-MediumItalic.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Regular.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Regular.ttf new file mode 100644 index 0000000..ddf4bfa Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Regular.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Thin.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Thin.ttf new file mode 100644 index 0000000..2e0dee6 Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-Thin.ttf differ diff --git a/themes/hugo-liftoff/static/fonts/Roboto/Roboto-ThinItalic.ttf b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-ThinItalic.ttf new file mode 100644 index 0000000..084f9c0 Binary files /dev/null and b/themes/hugo-liftoff/static/fonts/Roboto/Roboto-ThinItalic.ttf differ diff --git a/themes/hugo-liftoff/static/site.webmanifest b/themes/hugo-liftoff/static/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/themes/hugo-liftoff/static/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/themes/hugo-liftoff/theme.toml b/themes/hugo-liftoff/theme.toml new file mode 100644 index 0000000..98463dc --- /dev/null +++ b/themes/hugo-liftoff/theme.toml @@ -0,0 +1,11 @@ +name = "Hugo Liftoff" +license = "MIT" +licenselink = "https://github.com/wjh18/hugo-liftoff/blob/master/LICENSE" +description = "Minimal blog/portfolio theme with a focus on content creation and SEO best practices. An ideal choice for technical users jump-starting a personal brand." +homepage = "https://github.com/wjh18/hugo-liftoff" +demosite = "https://hugo-liftoff.netlify.app" +tags = ["blog", "responsive", "minimal", "personal", "light", "dark", "portfolio", "dark-mode", "contact"] +features = ["newsletter", "hero", "netlify", "seo", "schema", "rss", "comments", "google-tag-manager", "social-icons", "social-share", "subsections", "series", "submenu", "toc", "related-posts", "projects", "code-snippets", "custom-assets", "about-page"] +[author] + name = "Will J. Holmes" + homepage = "https://www.wjholmes.com" \ No newline at end of file