diff --git a/.prettierrc b/.prettierrc
index f5f5a075..3031bfbc 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,5 +1,9 @@
{
+ "htmlWhitespaceSensitivity": "css",
"printWidth": 100,
+ "singleQuote": false,
+ "tabWidth": 2,
+ "trailingComma": "es5",
"overrides": [
{
"files": ["*.html"],
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 00000000..22390215
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,58 @@
+# Changelog
+
+All notable changes to Congo will be documented in this file.
+
+Things that need attention when upgrading from a prior version are marked ⚠️.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+---
+
+## [1.1.0] - 2020-08-18
+
+### Added
+
+- Breadcrumbs
+- i18n support
+- Recent articles partial
+- CSS transitions
+- Hugo module support
+- JSON-LD structured metadata
+
+### Changed
+
+- ⚠️ Renamed parameter: `homepage.showList` -> `homepage.showRecent`
+- ⚠️ Renamed parameter: `homepage.listSections` -> `mainSections`
+- ⚠️ Consolidated author configuration parameters into `config.toml`
+- General style tweaks to enhance design consistency
+
+### Fixed
+
+- URLs being incorrect in some cases when the site is deployed in a subfolder
+
+## [1.0.0] - 2020-08-16
+
+### Initial release 🎉
+
+- Built with Tailwind CSS JIT for minified stylesheets without any excess code
+- Fully responsive layout
+- Dark mode (auto-switching based upon browser)
+- Highly customisable configuration
+- Multiple homepage layouts
+- Flexible with any content types, taxonomies and menus
+- Ability to link to posts on third-party websites
+- Diagrams and visualisations using Mermaid JS
+- SVG icons from FontAwesome 5
+- Heading anchors, Buttons, Badges and more
+- HTML and Emoji support in articles
+- SEO friendly with links for sharing to social media
+- RSS feeds
+- Fathom Analytics and Google Analytics support
+- Favicons support
+- Comments support
+- Advanced customisation using simple Tailwind colour definitions and styles
+- Fully documented
+
+[unreleased]: https://github.com/jpanther/Congo/compare/v1.1.0...HEAD
+[1.1.0]: https://github.com/jpanther/Congo/compare/v1.0.0...v1.1.0
+[1.0.0]: https://github.com/jpanther/Congo/releases/tag/v1.0.0
diff --git a/README.md b/README.md
index 6ceb5aa5..511be018 100644
--- a/README.md
+++ b/README.md
@@ -69,19 +69,12 @@ A few things you need to set for a new installation:
baseURL = "https://your_domain.com"
languageCode = "en-AU"
-
title = "My awesome website"
-```
-
-It's also useful to set the author configuration in the `config/_default/author.toml` file. You can also add links to your profiles here to enable them in the theme.
-
-```toml
-# config/_default/author.toml
[author]
name = "Your name"
links = [
- { twitter = "https://twitter.com/username" }
+ { twitter = "https://twitter.com/jpanther" }
]
```
diff --git a/assets/css/main.css b/assets/css/main.css
index daf510e1..9cbcfe92 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -1,6 +1,11 @@
@tailwind base;
@tailwind components;
+body a,
+body button {
+ @apply transition;
+}
+
/* Scale SVG icons to text size */
.icon svg {
height: 1em;
@@ -29,6 +34,15 @@
@apply mt-0 last:mb-0;
}
+/* Article pagination */
+.article-pagination a:hover .article-pagination-title {
+ @apply underline underline-primary-500;
+}
+
+.article-pagination a:hover .article-pagination-direction {
+ @apply text-primary-700 dark:text-primary-400;
+}
+
/* -- Chroma Highlight -- */
/* Background */
.prose .chroma {
diff --git a/config/_default/author.toml b/config/_default/author.toml
deleted file mode 100644
index 5aa0e4f9..00000000
--- a/config/_default/author.toml
+++ /dev/null
@@ -1,34 +0,0 @@
-# -- Site Author Details --
-# To display the author box below each article, configure the settings below.
-# The author image should be placed inside the `/static` folder.
-# Uncomment any links to enable them. The icons will be displayed in the order listed.
-
-[author]
- # name = "Your name here"
- # image = "/img/author.jpg"
- # links = [
- # { email = "mailto:hello@your_domain.com" },
- # { link = "https://link-to-some-website.com/" },
- # { codepen = "https://codepen.io/username" },
- # { dev = "https://dev.to/username" },
- # { discord = "https://discord.gg/invitecode" },
- # { dribbble = "https://dribbble.com/username" },
- # { facebook = "https://facebook.com/username" },
- # { github = "https://github.com/username" },
- # { gitlab = "https://gitlab.com/username" },
- # { instagram = "https://instagram.com/username" },
- # { keybase = "https://keybase.io/username" },
- # { lastfm = "https://lastfm.com/user/username" },
- # { linkedin = "https://linkedin.com/in/username" },
- # { mastodon = "https://mastodon.instance/@username" },
- # { medium = "https://medium.com/username" },
- # { reddit = "https://reddit.com/user/username" },
- # { slack = "https://workspace.url/team/userid" },
- # { snapchat = "https://snapchat.com/add/username" },
- # { soundcloud = "https://soundcloud.com/username" },
- # { steam = "https://steamcommunity.com/profiles/userid" },
- # { tiktok = "https://tiktok.com/@username" },
- # { twitch = "https://twitch.tv/username" },
- # { twitter = "https://twitter.com/username" },
- # { youtube = "https://youtube.com/username" },
- # ]
diff --git a/config/_default/config.toml b/config/_default/config.toml
index fda0ff81..07f63055 100644
--- a/config/_default/config.toml
+++ b/config/_default/config.toml
@@ -1,23 +1,45 @@
# -- Site Configuration --
+# Refer to the theme docs for more details about each of these parameters.
+# https://jpanther.github.io/Congo/docs/getting-started/
+
theme = "congo"
-# Speficiy the base URL for the website.
# baseURL = "https://your_domain.com/"
-
-# The language code of the language that the website is written in.
-# This can be a base language (ie. "en") or a specific variant (ie. "en-AU").
languageCode = "en"
+defaultContentLanguage = "en"
-# The website title. This will be displayed in the site header.
title = "Congo"
-
-# A default copyright message is generated automatically.
-# Uncomment the line below to provide a custom copyright Markdown string.
# copyright = "Copy, _right?_ :thinking_face:"
-# To automatically convert strings such as :bang: to emoji, set this to true.
enableEmoji = true
-
-# Congo will generate a robots file that allows search engines to index
-# the entire site. If you don't want a robots file, set this to false.
enableRobotsTXT = true
+
+[author]
+ # name = "Your name here"
+ # image = "img/author.jpg"
+ # links = [
+ # { email = "mailto:hello@your_domain.com" },
+ # { link = "https://link-to-some-website.com/" },
+ # { codepen = "https://codepen.io/username" },
+ # { dev = "https://dev.to/username" },
+ # { discord = "https://discord.gg/invitecode" },
+ # { dribbble = "https://dribbble.com/username" },
+ # { facebook = "https://facebook.com/username" },
+ # { github = "https://github.com/username" },
+ # { gitlab = "https://gitlab.com/username" },
+ # { instagram = "https://instagram.com/username" },
+ # { keybase = "https://keybase.io/username" },
+ # { lastfm = "https://lastfm.com/user/username" },
+ # { linkedin = "https://linkedin.com/in/username" },
+ # { mastodon = "https://mastodon.instance/@username" },
+ # { medium = "https://medium.com/username" },
+ # { reddit = "https://reddit.com/user/username" },
+ # { slack = "https://workspace.url/team/userid" },
+ # { snapchat = "https://snapchat.com/add/username" },
+ # { soundcloud = "https://soundcloud.com/username" },
+ # { steam = "https://steamcommunity.com/profiles/userid" },
+ # { tiktok = "https://tiktok.com/@username" },
+ # { twitch = "https://twitch.tv/username" },
+ # { twitter = "https://twitter.com/username" },
+ # { youtube = "https://youtube.com/username" },
+ # ]
diff --git a/config/_default/params.toml b/config/_default/params.toml
index 99730681..7648c2cc 100644
--- a/config/_default/params.toml
+++ b/config/_default/params.toml
@@ -2,17 +2,21 @@
# These options control how the theme functions and allow you to
# customise the display of your website.
#
-# Refer to the README for more details about each of these parameters.
+# Refer to the theme docs for more details about each of these parameters.
+# https://jpanther.github.io/Congo/docs/configuration/#theme-parameters
+
+# description = "My awesome website"
+# mainSections = ["section1", "section2"]
[homepage]
layout = "page" # valid options: page, profile, custom
- showList = false
- listSections = ["blog"]
+ showRecent = false
[article]
showDate = true
dateFormat = "2 January 2006"
showAuthor = true
+ showBreadcrumbs = false
showDraftLabel = true
showHeadingAnchors = true
showPagination = true
@@ -20,6 +24,7 @@
# sharingLinks = ["facebook", "twitter", "reddit", "linkedin", "email"]
[list]
+ showBreadcrumbs = false
groupByYear = true
[taxonomy]
diff --git a/data/sharing.json b/data/sharing.json
index 327c9b1d..ff9dbc54 100644
--- a/data/sharing.json
+++ b/data/sharing.json
@@ -1,27 +1,27 @@
{
"email": {
"icon": "email",
- "title": "Send via email",
+ "title": "sharing.email",
"url": "mailto:?body=%s&subject=%s"
},
"facebook": {
"icon": "facebook",
- "title": "Share on Facebook",
+ "title": "sharing.facebook",
"url": "https://www.facebook.com/sharer/sharer.php?u=%s"e=%s"
},
"linkedin": {
"icon": "linkedin",
- "title": "Share on LinkedIn",
+ "title": "sharing.linkedin",
"url": "https://www.linkedin.com/shareArticle?mini=true&url=%s&title=%s"
},
"reddit": {
"icon": "reddit",
- "title": "Submit to Reddit",
+ "title": "sharing.reddit",
"url": "https://reddit.com/submit/?url=%s&resubmit=true&title=%s"
},
"twitter": {
"icon": "twitter",
- "title": "Tweet on Twitter",
+ "title": "sharing.twitter",
"url": "https://twitter.com/intent/tweet/?url=%s&text=%s"
}
}
diff --git a/exampleSite/config.toml b/exampleSite/config.toml
index 97990d99..857fd1cf 100755
--- a/exampleSite/config.toml
+++ b/exampleSite/config.toml
@@ -4,14 +4,16 @@
# as it does not contain all the required theme settings!
#
# Refer to the theme docs for configuration instructions if you're unsure.
-# https://github.com/jpanther/Congo#readme
+# https://jpanther.github.io/Congo/docs/
# --------------------------------------------------------------------------
-baseURL = "https://example.com"
+baseURL = "https://jpanther.github.io/Congo/"
theme = "Congo"
languageCode = "en-AU"
+defaultContentLanguage = "en"
title = "Congo"
enableEmoji = true
+relativeURLs = true
[author]
name = "Congo"
@@ -28,11 +30,15 @@ enableEmoji = true
[params.homepage]
layout = "custom"
- showList = true
- listSections = "samples"
+ showRecent = true
+ mainSections = ["samples"]
[params.list]
groupByYear = false
+ showBreadcrumbs = true
+
+[params.article]
+ showBreadcrumbs = true
[[menu.main]]
name = "Docs"
diff --git a/exampleSite/content/_index.md b/exampleSite/content/_index.md
index f228f37f..273d66f8 100755
--- a/exampleSite/content/_index.md
+++ b/exampleSite/content/_index.md
@@ -7,6 +7,21 @@ description: "This is a demo of the Congo theme for Hugo."
A simple, lightweight theme for Hugo built with Tailwind CSS.
{{< /lead >}}
+
+
+ {{< icon "exclamation-triangle" >}}
+
+
+ This is a demo of the page
layout.
+
+ Switch layout ↻
+
+
+
+
This is a demo site built entirely using Congo. It also contains a complete set of [theme documentation](/docs/). Congo is flexible and is great for both static page-based content (like this demo) or a traditional blog with a feed of recent posts.
Explore the [sample pages](/samples/) to get a feel for what Congo can do. If you like what you see, check out the project on [Github](https://github.com/jpanther/Congo) or read the [Installation guide](/docs/installation/) to get started.
diff --git a/exampleSite/content/docs/configuration.md b/exampleSite/content/docs/configuration.md
index f0720377..b5f20820 100644
--- a/exampleSite/content/docs/configuration.md
+++ b/exampleSite/content/docs/configuration.md
@@ -21,7 +21,33 @@ The default theme configuration is documented in each file so you can freely adj
As outlined in the [installation instructions](/docs/installation/#set-up-your-configuration-files), you should adjust your theme configuration by modifying the files in the `config/_default/` folder of your Hugo project and delete the `config.toml` file in your project root.
{{< /alert >}}
-## Parameters
+## Site Configuration
+
+Standard Hugo configuration variables are respected throughout the theme, however there are some specific things that should be configured for the best experience.
+
+The site configuration is managed through the `config/_default/config.toml` file. The table below outlines all the settings that the Congo takes advantage of.
+
+Note that the variable names provided in this table use dot notation to simplify the TOML data structure (ie. `author.name` refers to `[author] name`).
+
+
+|Name|Type|Default|Description|
+| --- | --- | --- | --- |
+|`theme`|string|`"congo"`|This must be set to `"congo"` for the theme to function.|
+|`baseURL`|string|_Not set_|The URL to the root of the website.|
+|`languageCode`|string|`"en"`|The language of the website for site metadata purposes. It can be a top-level language (ie. `"en"`) or a sub-variant (ie. `"en-AU"`)."|
+|`defaultContentLanguage`|string|`"en"`|This value determines the language of theme components."|
+|`title`|string|`"Congo"`|The title of the website. This will be displayed in the site header and footer.|
+|`copyright`|string|_Not set_|A Markdown string containing the copyright message to be displayed in the site footer. If none is provided, Congo will automatically generate a copyright string using the site `title`.
+|`enableEmoji`|boolean|`true`|Whether emoji strings in content should be converted to emoji symbols.|
+|`enableRobotsTXT`|boolean|`true`|When enabled a `robots.txt` file will be created in the site root that allows search engines to crawl the entire site. Set to `false` if you wish to provide your own file.|
+|`author.name`|string|_Not set_|The author's name. This will be displayed in article footers, and on the homepage when the profile layout is used.|
+|`author.image`|string|_Not set_|Path to the image file of the author. The image should be a 1:1 aspect ratio and placed in the site's `static/` folder.|
+|`author.links`|array of objects|_Not set_|The links to display alongside the author's details. The config file contains example links which can simply be uncommented to enable. The order that the links are displayed is determined by the order they appear in the array. Custom links can be added by providing corresponding SVG icon assets in `assets/icons/`.|
+|`[permalinks]`||_Not set_|Refer to the [Hugo docs](https://gohugo.io/content-management/urls/#permalinks) for permalink configuration.|
+|`[taxonomies]`||_Not set_|Refer to the [Hugo docs](https://gohugo.io/content-management/taxonomies/) for taxonomy configuration.|
+
+
+## Theme Parameters
Congo provides a large number of configuration parameters that control how the theme functions. The table below outlines every available parameter in the `config/_default/params.toml` file.
@@ -30,18 +56,21 @@ Many of the article defaults here can be overridden on a per article basis by sp
|Name|Type|Default|Description|
| --- | --- | --- | --- |
+|`description`|string|_Not set_|The description of the website for metadata purposes.|
+|`mainSections`|array of strings|_Not set_|The sections that should be displayed in the recent articles list. If not provided the section with the greatest number of articles is used.|
|`homepage.layout`|string|`"page"`|The layout of the homepage. Valid values are `page`, `profile` or `custom`. When set to `custom`, you must provide your own layout by creating a `/layouts/partials/home/custom.html` file. Refer to the [Homepage Layout](/docs/homepage-layout/) section for more details.|
-|`homepage.showList`|boolean|`false`|Whether or not recent articles are listed on the homepage beneath the page content. Refer to the [Recent Articles](/docs/homepage-layout/#recent-articles) docs for more details.|
-|`homepage.listSections`|array of strings|`["blog"]`|The sections of content to include in the recent list when `homepage.showList` is `true`.|
+|`homepage.showRecent`|boolean|`false`|Whether or not to display the recent articles list on the homepage.|
|`article.showDate`|boolean|`true`|Whether or not article dates are displayed.|
|`article.dateFormat`|string|`"2 January 2006"`|How article dates are formatted. Refer to the [Hugo docs](https://gohugo.io/functions/format/#gos-layout-string) for acceptable formats.|
|`article.showAuthor`|boolean|`true`|Whether or not the author box is displayed in the article footer.|
+|`article.showBreadcrumbs`|boolean|`false`|Whether or not breadcrumbs are displayed in the article header.|
|`article.showDraftLabel`|boolean|`true`|Whether or not the draft indicator is shown next to articles when site is built with `--buildDrafts`.|
|`article.showHeadingAnchors`|boolean|`true`|Whether or not heading anchor links are displayed alongside headings within articles.|
|`article.showPagination`|boolean|`true`|Whether or not the next/previous article links are displayed in the article footer.|
|`article.showReadingTime`|boolean|`true`|Whether or not article reading times are displayed.|
|`article.sharingLinks`|array of strings|_Not set_|Which sharing links to display at the end of each article. When not provided, or set to `false` no links will be displayed.|
-|`list.groupByYear`|boolean|`true`|Whether or not articles are grouped under years in the article listing.|
+|`list.showBreadcrumbs`|boolean|`false`|Whether or not breadcrumbs are displayed in the header on list pages.|
+|`list.groupByYear`|boolean|`true`|Whether or not articles are grouped by year on list pages.|
|`sitemap.excludedKinds`|array of strings|`["taxonomy", "term"]`|Kinds of content that should be excluded from the generated `/sitemap.xml` file. Refer to the [Hugo docs](https://gohugo.io/templates/section-templates/#page-kinds) for acceptable values.|
|`taxonomy.showTermCount`|boolean|`true`|Whether or not the number of articles within a taxonomy term is displayed on the taxonomy listing.|
|`fathomAnalytics.site`|string|_Not set_|The site code generated by Fathom Analytics for the website. Refer to the [Analytics docs](#analyticshtml) below for more details.|
diff --git a/exampleSite/content/docs/getting-started.md b/exampleSite/content/docs/getting-started.md
index 6dd36e4a..9ddc2d7f 100644
--- a/exampleSite/content/docs/getting-started.md
+++ b/exampleSite/content/docs/getting-started.md
@@ -22,22 +22,20 @@ A few things you need to set for a new installation:
baseURL = "https://your_domain.com"
languageCode = "en-AU"
-
title = "My awesome website"
-```
-
-It's also useful to set the author configuration in the `config/_default/author.toml` file. You can also add links to your profiles here to enable them in the theme.
-
-```toml
-# config/_default/author.toml
[author]
name = "Your name"
+image = "img/author.jpg"
links = [
{ twitter = "https://twitter.com/username" }
]
```
+The `[author]` configuration determines how the author information is displayed on the website. The image should be placed in the site's `static/` folder. Links will be displayed in the order they are listed.
+
+Further detail about these configuration options is covered in the [Configuration](/docs/configuration/) section.
+
## Organising content
By default, Congo doesn't force you to use a particular content type. In doing so you are free to define your content as you wish. You might prefer _pages_ for a static site, _posts_ for a blog, or _projects_ for a portfolio.
diff --git a/exampleSite/content/docs/homepage-layout/index.md b/exampleSite/content/docs/homepage-layout/index.md
index 7a54895c..0e84ca41 100644
--- a/exampleSite/content/docs/homepage-layout/index.md
+++ b/exampleSite/content/docs/homepage-layout/index.md
@@ -39,9 +39,11 @@ To enable the custom layout, set `homepage.layout = "custom"` in the `params.tom
With the configuration value set, create a new `custom.html` file and place it in `layouts/partials/home/custom.html`. Now whatever is in the `custom.html` file will be placed in the content area of the site homepage. You can use whatever HTML, Tailwind, or Hugo templating functions to define your layout.
+To include recent articles on the custom layout, use the `recent-articles.html` partial.
+
## Recent articles
-All homepage layouts have the option of displaying recent articles below the main page content. To enable this, simply set the `homepage.showList` setting to `true` in the `params.toml` configuration file.
+All homepage layouts have the option of displaying recent articles below the main page content. To enable this, simply set the `homepage.showRecent` setting to `true` in the `params.toml` configuration file.
![Profile layout with recent articles](home-profile-list.jpg)
diff --git a/exampleSite/layouts/partials/home/custom.html b/exampleSite/layouts/partials/home/custom.html
index 440c44a2..b301686a 100644
--- a/exampleSite/layouts/partials/home/custom.html
+++ b/exampleSite/layouts/partials/home/custom.html
@@ -1,38 +1,27 @@
-
-
-
-
- {{ partial "icon.html" "exclamation-triangle" }}
-
-
- This is a demo of the `page
` layout.
-
- Switch layout ↻
-
-
-
-
{{ partial "partials/home/page.html" . }}
-
+
{{ partial "partials/home/profile.html" . }}
+
+
diff --git a/go.mod b/go.mod
new file mode 100644
index 00000000..c3b624da
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module github.com/jpanther/congo
+
+go 1.16
diff --git a/i18n/en.yaml b/i18n/en.yaml
new file mode 100644
index 00000000..b7075399
--- /dev/null
+++ b/i18n/en.yaml
@@ -0,0 +1,33 @@
+article:
+ anchor_label: "Anchor"
+ draft: "Draft"
+ reading_time:
+ one: "{{ .Count }} min"
+ other: "{{ .Count }} mins"
+ reading_time_title: "Reading time"
+
+author:
+ byline_title: "Author"
+
+error:
+ 404_title: "Page Not Found :confused:"
+ 404_error: "Error 404"
+ 404_description: "It seems that the page you've requested does not exist."
+
+footer:
+ powered_by: "Powered by"
+
+list:
+ externalurl_title: "Link to external site"
+ no_articles: "There's no articles to list here yet."
+
+sharing:
+ email: "Send via email"
+ facebook: "Share on Facebook"
+ linkedin: "Share on LinkedIn"
+ reddit: "Submit to Reddit"
+ twitter: "Tweet on Twitter"
+
+shortcode:
+ recent_articles: "Recent"
+ icon_none: "Icon not found."
diff --git a/layouts/404.html b/layouts/404.html
index 464b13bc..2e14bb2f 100644
--- a/layouts/404.html
+++ b/layouts/404.html
@@ -1,7 +1,7 @@
{{ define "main" }}
-
-
Error 404
+
+
{{ i18n "error.404_error" | emojify }}
-
It seems that the page you've requested does not exist.
+
{{ i18n "error.404_description" | emojify }}
{{ end }}
diff --git a/layouts/_default/_markup/render-heading.html b/layouts/_default/_markup/render-heading.html
index 84253591..7415d617 100644
--- a/layouts/_default/_markup/render-heading.html
+++ b/layouts/_default/_markup/render-heading.html
@@ -1 +1 @@
-
{{ .Text | safeHTML }} {{ if .Page.Params.showHeadingAnchors | default (.Page.Site.Params.article.showHeadingAnchors | default true) }}# {{ end }}
+
{{ .Text | safeHTML }} {{ if .Page.Params.showHeadingAnchors | default (.Page.Site.Params.article.showHeadingAnchors | default true) }}# {{ end }}
diff --git a/layouts/_default/list.html b/layouts/_default/list.html
index e2081674..71d28664 100644
--- a/layouts/_default/list.html
+++ b/layouts/_default/list.html
@@ -1,5 +1,5 @@
{{ define "main" }}
- {{ partial "section-heading.html" . }}
+ {{ partial "section-header.html" . }}
{{ if gt .Pages 0 }}
{{ range (.Paginate (.Pages.GroupByDate "2006")).PageGroups }}
@@ -16,7 +16,7 @@
{{ else }}
- There's no articles to list here yet.
+ {{ i18n "list.no_articles" | emojify }}
{{ end }}
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
index 2d7653c8..84b0504c 100644
--- a/layouts/_default/single.html
+++ b/layouts/_default/single.html
@@ -1,15 +1,14 @@
{{ define "main" }}
diff --git a/layouts/_default/taxonomy.html b/layouts/_default/taxonomy.html
index ad46d4bf..e9c88b94 100644
--- a/layouts/_default/taxonomy.html
+++ b/layouts/_default/taxonomy.html
@@ -1,15 +1,17 @@
{{ define "main" }}
- {{ partial "section-heading.html" . }}
+ {{ partial "section-header.html" . }}
{{ range .Data.Terms }}
- {{ .Page.Title }}
{{ if $.Site.Params.taxonomy.showTermCount | default true }}
- ·
+ ·
{{ .Count }}
{{ end }}
diff --git a/layouts/_default/term.html b/layouts/_default/term.html
index 2d5d6baa..eba31292 100644
--- a/layouts/_default/term.html
+++ b/layouts/_default/term.html
@@ -1,5 +1,5 @@
{{ define "main" }}
- {{ partial "section-heading.html" . }}
+ {{ partial "section-header.html" . }}
{{ range (.Paginate (.Pages.GroupByDate "2006")).PageGroups }}
{{ .Key }}
diff --git a/layouts/index.html b/layouts/index.html
index 3caa782c..2feb97aa 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -5,12 +5,4 @@
{{ else }}
{{ partial "partials/home/page.html" . }}
{{ end }}
- {{ if .Site.Params.homepage.showList | default false }}
-
-
- {{ range first 5 (.Paginate (where .Site.RegularPages "Type" "in" .Site.Params.homepage.listSections)).Pages }}
- {{ partial "article-link.html" . }}
- {{ end }}
-
- {{ end }}
{{ end }}
diff --git a/layouts/partials/article-link.html b/layouts/partials/article-link.html
index e4ee5fc1..200d9fbf 100644
--- a/layouts/partials/article-link.html
+++ b/layouts/partials/article-link.html
@@ -7,11 +7,11 @@
↗
{{ else }}
- {{ .Title }}
+ {{ .Title }}
{{ end }}
{{ if and .Draft .Site.Params.article.showDraftLabel }}
{{ partial "badge.html" "Draft" }}
diff --git a/layouts/partials/article-meta.html b/layouts/partials/article-meta.html
index 0718f513..6edcb1a0 100644
--- a/layouts/partials/article-meta.html
+++ b/layouts/partials/article-meta.html
@@ -8,11 +8,10 @@
(.Params.showReadingTime | default (.Site.Params.article.showReadingTime | default true))
(ne .ReadingTime 0)
}}
- ·
+ ·
{{ end }}
{{ if and (.Params.showReadingTime | default (.Site.Params.article.showReadingTime | default true)) (ne .ReadingTime 0) }}
-
- {{ .ReadingTime }}
- min{{ if gt .ReadingTime 1 }}s{{ end }}
+
+ {{ i18n "article.reading_time" .ReadingTime | emojify }}
{{ end }}
diff --git a/layouts/partials/article-pagination.html b/layouts/partials/article-pagination.html
index 30457cf4..85442031 100644
--- a/layouts/partials/article-pagination.html
+++ b/layouts/partials/article-pagination.html
@@ -1,14 +1,14 @@
{{ if .Params.showPagination | default (.Site.Params.article.showPagination | default true) }}
{{ if or .NextInSection .PrevInSection }}
-
+
{{ if .NextInSection }}
- ←
+ ←
- {{ .NextInSection.Title }}
+ {{ .NextInSection.Title }}
{{ if .Params.showDate | default (.Site.Params.article.showDate | default true) }}
- {{ .PrevInSection.Title }}
+ {{ .PrevInSection.Title }}
{{ if .Params.showDate | default (.Site.Params.article.showDate | default true) }}
{{ end }}
- →
+ →
{{ end }}
diff --git a/layouts/partials/author.html b/layouts/partials/author.html
index befd7805..7f739c35 100644
--- a/layouts/partials/author.html
+++ b/layouts/partials/author.html
@@ -5,6 +5,9 @@
{{ end }}
{{ with .Site.Author.name }}
+
+ {{ i18n "author.byline_title" | emojify }}
+
{{ . }}
diff --git a/layouts/partials/badge.html b/layouts/partials/badge.html
index b96405c3..4da1fcba 100644
--- a/layouts/partials/badge.html
+++ b/layouts/partials/badge.html
@@ -1,5 +1,5 @@
{{ . }}
diff --git a/layouts/partials/breadcrumbs.html b/layouts/partials/breadcrumbs.html
new file mode 100644
index 00000000..520a8c91
--- /dev/null
+++ b/layouts/partials/breadcrumbs.html
@@ -0,0 +1,15 @@
+
+ {{ template "crumb" (dict "p1" . "p2" .) }}
+
+{{ define "crumb" }}
+ {{ if .p1.Parent }}
+ {{ template "crumb" (dict "p1" .p1.Parent "p2" .p2 ) }}
+ {{ else if not .p1.IsHome }}
+ {{ template "crumb" (dict "p1" .p1.Site.Home "p2" .p2 ) }}
+ {{ end }}
+
+ {{ .p1.Title }} /
+
+{{ end }}
diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html
index f19a05ba..1da851e6 100644
--- a/layouts/partials/footer.html
+++ b/layouts/partials/footer.html
@@ -12,10 +12,20 @@
{{/* Theme attribution */}}
{{ if .Site.Params.attribution | default true }}
- Powered by
- Hugo
+ {{ i18n "footer.powered_by" }}
+ Hugo
&
- Congo
+ Congo
{{ end }}
{{/* Extend footer - eg. for extra scripts, etc. */}}
diff --git a/layouts/partials/head.html b/layouts/partials/head.html
index f9fb7ad1..52063286 100644
--- a/layouts/partials/head.html
+++ b/layouts/partials/head.html
@@ -35,10 +35,10 @@
{{ if templates.Exists "partials/favicons.html" }}
{{ partialCached "favicons.html" .Site }}
{{ else }}
-
-
-
-
+
+
+
+
{{ end }}
{{/* Site Verification */}}
{{ with .Site.Params.verification.google }}
@@ -57,7 +57,7 @@
{{ template "_internal/opengraph.html" . }}
{{ template "_internal/twitter_cards.html" . }}
{{/* Schema */}}
- {{ template "_internal/schema.html" . }}
+ {{ partial "schema.html" . }}
{{/* Generator */}}
{{ if .Site.Params.attribution | default true }}
{{ hugo.Generator }}
diff --git a/layouts/partials/header.html b/layouts/partials/header.html
index 10dca7f9..6199ad07 100644
--- a/layouts/partials/header.html
+++ b/layouts/partials/header.html
@@ -1,12 +1,22 @@
diff --git a/layouts/partials/home/page.html b/layouts/partials/home/page.html
index b11f84e4..d2bef8f6 100644
--- a/layouts/partials/home/page.html
+++ b/layouts/partials/home/page.html
@@ -6,3 +6,6 @@
{{ end }}
+
+ {{ partial "recent-articles.html" . }}
+
diff --git a/layouts/partials/home/profile.html b/layouts/partials/home/profile.html
index 31626cef..b0b12ae9 100644
--- a/layouts/partials/home/profile.html
+++ b/layouts/partials/home/profile.html
@@ -1,12 +1,9 @@
-
+
{{ with .Site.Author.image }}
{{ end }}
@@ -19,3 +16,6 @@
+
+ {{ partial "recent-articles.html" . }}
+
diff --git a/layouts/partials/recent-articles.html b/layouts/partials/recent-articles.html
new file mode 100644
index 00000000..4d79fc33
--- /dev/null
+++ b/layouts/partials/recent-articles.html
@@ -0,0 +1,6 @@
+{{ if .Site.Params.homepage.showRecent | default false }}
+
+ {{ range first 5 (.Paginate (where .Site.RegularPages "Type" "in" .Site.Params.mainSections)).Pages }}
+ {{ partial "article-link.html" . }}
+ {{ end }}
+{{ end }}
diff --git a/layouts/partials/schema.html b/layouts/partials/schema.html
new file mode 100644
index 00000000..55fdf6cb
--- /dev/null
+++ b/layouts/partials/schema.html
@@ -0,0 +1,40 @@
+{{ if .IsHome -}}
+
+{{ else if .IsPage }}
+ {{- $iso8601 := "2006-01-02T15:04:05-07:00" -}}
+
+{{ end }}
diff --git a/layouts/partials/section-header.html b/layouts/partials/section-header.html
new file mode 100644
index 00000000..73bef669
--- /dev/null
+++ b/layouts/partials/section-header.html
@@ -0,0 +1,9 @@
+
+ {{ if .Site.Params.list.showBreadcrumbs | default false }}
+ {{ partial "breadcrumbs.html" . }}
+ {{ end }}
+
+
diff --git a/layouts/partials/section-heading.html b/layouts/partials/section-heading.html
deleted file mode 100644
index a6bd7184..00000000
--- a/layouts/partials/section-heading.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/layouts/partials/sharing-links.html b/layouts/partials/sharing-links.html
index dbd5b9cb..e4f5f3f3 100644
--- a/layouts/partials/sharing-links.html
+++ b/layouts/partials/sharing-links.html
@@ -6,7 +6,7 @@
{{ partial "icon.html" .icon }}
{{ end }}
diff --git a/layouts/shortcodes/button.html b/layouts/shortcodes/button.html
index 178f2a22..7f203e5f 100644
--- a/layouts/shortcodes/button.html
+++ b/layouts/shortcodes/button.html
@@ -1,7 +1,8 @@
-{{ .Inner }}
-
+>
+ {{ .Inner }}
+
diff --git a/layouts/shortcodes/figure.html b/layouts/shortcodes/figure.html
index c1de4995..ac0f6ab2 100644
--- a/layouts/shortcodes/figure.html
+++ b/layouts/shortcodes/figure.html
@@ -1,37 +1,29 @@
{{ if .Get "src" }}
{{ $image := .Page.Resources.GetMatch (printf "*%s*" (.Get "src")) }}
-
- {{- if .Get "link" -}}
-
- {{- end -}}
-
- {{- if .Get "link" }} {{ end -}}
- {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}}
-
- {{ with (.Get "title") -}}
- {{ . }}
- {{- end -}}
- {{- if or (.Get "caption") (.Get "attr") -}}
- {{- .Get "caption" | markdownify -}}
- {{- with .Get "attrlink" }}
-
- {{- end -}}
- {{- .Get "attr" | markdownify -}}
- {{- if .Get "attrlink" }} {{ end }}
- {{- end }}
-
+
+ {{- if .Get "link" -}}
+
+ {{- end -}}
+
+ {{- if .Get "link" }} {{ end -}}
+ {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}}
+
+ {{ with (.Get "title") -}}{{ . }} {{- end -}}
+ {{- if or (.Get "caption") (.Get "attr") -}}
+ {{- .Get "caption" | markdownify -}}
+ {{- with .Get "attrlink" }}{{- end -}}
+ {{- .Get "attr" | markdownify -}}
+ {{- if .Get "attrlink" }} {{ end }}
{{- end }}
+
+ {{- end }}
{{ end }}
-
-
-
-
diff --git a/layouts/shortcodes/icon.html b/layouts/shortcodes/icon.html
index e9251eac..3afb45b5 100644
--- a/layouts/shortcodes/icon.html
+++ b/layouts/shortcodes/icon.html
@@ -3,6 +3,6 @@
{{ if $icon }}
{{ $icon.Content | safeHTML }}
{{ else }}
- Icon not found.
+ {{ i18n "shortcode.icon_none" }}
{{ end }}
diff --git a/package-lock.json b/package-lock.json
index 90db93c2..440d9d0d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,17 +1,18 @@
{
- "name": "congo",
+ "name": "hugo-congo-theme",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "name": "congo",
+ "name": "hugo-congo-theme",
"version": "1.0.0",
"license": "MIT",
"devDependencies": {
"@tailwindcss/typography": "^0.4.1",
"prettier": "^2.3.2",
"prettier-plugin-go-template": "^0.0.11",
+ "tailwind-underline-utils": "^1.1.3",
"tailwindcss": "^2.2.7"
}
},
@@ -1379,6 +1380,12 @@
"node": ">=4"
}
},
+ "node_modules/tailwind-underline-utils": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tailwind-underline-utils/-/tailwind-underline-utils-1.1.3.tgz",
+ "integrity": "sha512-8FSynb8KOBFj7Y1wurCzx0MBAQtdOuRWlCk5wXFImI5ZfJ2yiRLvNbybiJ6pjWz5Htr+lStnowcTXl/00s8xRw==",
+ "dev": true
+ },
"node_modules/tailwindcss": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.7.tgz",
@@ -2587,6 +2594,12 @@
"has-flag": "^3.0.0"
}
},
+ "tailwind-underline-utils": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tailwind-underline-utils/-/tailwind-underline-utils-1.1.3.tgz",
+ "integrity": "sha512-8FSynb8KOBFj7Y1wurCzx0MBAQtdOuRWlCk5wXFImI5ZfJ2yiRLvNbybiJ6pjWz5Htr+lStnowcTXl/00s8xRw==",
+ "dev": true
+ },
"tailwindcss": {
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.7.tgz",
diff --git a/package.json b/package.json
index c8c5bc36..73c6760f 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,5 @@
{
- "name": "congo",
+ "name": "hugo-congo-theme",
"version": "1.0.0",
"description": "Congo theme for Hugo",
"main": "index.js",
@@ -28,6 +28,7 @@
"@tailwindcss/typography": "^0.4.1",
"prettier": "^2.3.2",
"prettier-plugin-go-template": "^0.0.11",
+ "tailwind-underline-utils": "^1.1.3",
"tailwindcss": "^2.2.7"
}
}
diff --git a/release.sh b/release.sh
new file mode 100755
index 00000000..53bbd406
--- /dev/null
+++ b/release.sh
@@ -0,0 +1,39 @@
+#!bin/bash
+
+# get current branch
+branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
+
+# push any local changes
+git push
+
+# checkout stable branch (this will catch uncommitted changes)
+git checkout stable || exit 1
+
+# branch validation
+if [ $branch = "dev" ]; then
+ echo "Enter the release version (eg. v1.0.0):"
+ read version
+
+ echo "Started releasing $version for Congo..."
+
+ # pull latest from stable
+ git pull
+
+ # merge in changes from dev branch
+ git merge --no-ff dev -m "🔖 Release $version"
+
+ # create tag
+ git tag $version
+
+ # push commit and tag to remote
+ git push
+ git push --tags
+
+ echo "$version successfully released!"
+ echo "Returning to dev branch..."
+
+ git checkout dev
+
+else
+ echo "Releases can only be published from the dev branch!"
+fi
diff --git a/static/css/main.css b/static/css/main.css
index 6fadbde9..00a770ad 100644
--- a/static/css/main.css
+++ b/static/css/main.css
@@ -1 +1 @@
-/*! tailwindcss v2.2.7 | MIT License | https://tailwindcss.com*//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:initial;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#a1a1aa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#a1a1aa}input::placeholder,textarea::placeholder{opacity:1;color:#a1a1aa}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(228,228,231,var(--tw-border-opacity))}.prose{color:#3f3f46;max-width:65ch}.prose [class~=lead]{color:#52525b;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose a{color:#6d28d9;text-decoration:underline;font-weight:500}.prose a:hover{background-color:#7c3aed;color:#fff;text-decoration:none}.prose strong{color:#18181b;font-weight:600}.prose ol[type=A]{--list-counter-style:upper-alpha}.prose ol[type=a]{--list-counter-style:lower-alpha}.prose ol[type=A s]{--list-counter-style:upper-alpha}.prose ol[type=a s]{--list-counter-style:lower-alpha}.prose ol[type=I]{--list-counter-style:upper-roman}.prose ol[type=i]{--list-counter-style:lower-roman}.prose ol[type=I s]{--list-counter-style:upper-roman}.prose ol[type=i s]{--list-counter-style:lower-roman}.prose ol[type="1"]{--list-counter-style:decimal}.prose ol>li{position:relative;padding-left:1.75em}.prose ol>li:before{content:counter(list-item,var(--list-counter-style,decimal)) ".";position:absolute;font-weight:400;color:#71717a;left:0}.prose ul>li{position:relative;padding-left:1.75em}.prose ul>li:before{content:"";position:absolute;background-color:#d4d4d8;border-radius:50%;width:.375em;height:.375em;top:.6875em;left:.25em}.prose hr{border-color:#e4e4e7;border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose blockquote{font-weight:500;font-style:italic;color:#18181b;border-left-width:.25rem;border-left-color:#e4e4e7;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose blockquote p:first-of-type:before{content:open-quote}.prose blockquote p:last-of-type:after{content:close-quote}.prose h1{color:#18181b;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose h2{color:#18181b;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333;position:relative}.prose h3{font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose h3,.prose h4{color:#18181b;font-weight:600;position:relative}.prose h4{margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose figure figcaption{color:#71717a;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose code{color:#a21caf;font-weight:600;font-size:.875em}.prose code:after,.prose code:before{content:"`"}.prose a code{color:#18181b}.prose pre{color:#e4e4e7;background-color:#fafafa;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose pre code{background-color:initial;border-width:0;border-radius:0;padding:0;font-weight:400;color:#3f3f46;font-size:inherit;font-family:inherit;line-height:inherit}.prose pre code:after,.prose pre code:before{content:none}.prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose thead{color:#18181b;font-weight:600;border-bottom-width:1px;border-bottom-color:#d4d4d8}.prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose tbody tr{border-bottom-width:1px;border-bottom-color:#e4e4e7}.prose tbody tr:last-child{border-bottom-width:0}.prose tbody td{vertical-align:top;padding:.5714286em}.prose{font-size:1rem;line-height:1.75}.prose p{margin-top:1.25em;margin-bottom:1.25em}.prose figure,.prose img,.prose video{margin-top:2em;margin-bottom:2em}.prose figure>*{margin-top:0;margin-bottom:0}.prose h2 code{font-size:.875em}.prose h3 code{font-size:.9em}.prose ol,.prose ul{margin-top:1.25em;margin-bottom:1.25em}.prose li{margin-top:.5em;margin-bottom:.5em}.prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.prose>ul>li>:first-child{margin-top:1.25em}.prose>ul>li>:last-child{margin-bottom:1.25em}.prose>ol>li>:first-child{margin-top:1.25em}.prose>ol>li>:last-child{margin-bottom:1.25em}.prose ol ol,.prose ol ul,.prose ul ol,.prose ul ul{margin-top:.75em;margin-bottom:.75em}.prose h2+*,.prose h3+*,.prose h4+*,.prose hr+*{margin-top:0}.prose thead th:first-child{padding-left:0}.prose thead th:last-child{padding-right:0}.prose tbody td:first-child{padding-left:0}.prose tbody td:last-child{padding-right:0}.prose>:first-child{margin-top:0}.prose>:last-child{margin-bottom:0}.prose kbd{background-color:#e4e4e7;padding:.1rem .4rem;border-radius:.25rem;font-size:.9rem;font-weight:600}.prose mark{background-color:#f5d0fe;padding:.1rem .2rem;border-radius:.12rem}.icon svg{height:1em;width:1em}.prose .heading-anchor{position:absolute;top:0;text-decoration:none;opacity:0;width:1.1em;left:-1.1em}.prose .heading-anchor:hover{background-color:initial;--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity));text-decoration:underline}.prose .heading-anchor:focus,.prose .heading-anchor:hover,.prose h2:hover>.heading-anchor,.prose h3:hover>.heading-anchor,.prose h4:hover>.heading-anchor{opacity:1}.no-prose>p{margin-top:0}.no-prose>p:last-child{margin-bottom:0}.prose .chroma{border-radius:.375rem;--tw-bg-opacity:1;background-color:rgba(250,250,250,var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(63,63,70,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.prose .chroma{--tw-bg-opacity:1;background-color:rgba(63,63,70,var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(228,228,231,var(--tw-text-opacity))}}.chroma .lntd,.chroma .lntd pre{margin:0;border-style:none;padding:0;vertical-align:top}.chroma .lntable{display:block;width:auto;overflow:hidden;padding:.75rem 1rem;font-size:1rem;line-height:1.5rem;border-spacing:0}.chroma .hl{margin-left:-1rem;margin-right:-1rem;display:block;width:auto;--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity));padding-left:1rem;padding-right:1rem}@media (prefers-color-scheme:dark){.chroma .hl{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}}.chroma .lntd .hl{margin:0;padding:0}.chroma .lnt{--tw-text-opacity:1;color:rgba(82,82,91,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .lnt{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}}.chroma .lnt{margin-right:.4em;padding:0 .4em}.chroma .ln{--tw-text-opacity:1;color:rgba(82,82,91,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ln{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}}.chroma .ln{margin-right:.4em;padding:0 .4em}.chroma .k{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .k{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kc{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kc{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .kd{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kd{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kn{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kn{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kp{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kp{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kr{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kr{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kt{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kt{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .n{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .n{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .na{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .na{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .nb{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nb{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .bp{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .bp{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .nc{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nc{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .no{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .no{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .nd{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nd{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .ni{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ni{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .ne{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ne{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .nf{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nf{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .fm{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .fm{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .nl{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nl{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .nn{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nn{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .nx{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nx{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .py{color:#cebc3a}.chroma .nt{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nt{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .nv{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nv{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .vc{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vc{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .vg{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vg{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .vi{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vi{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .vm{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vm{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .l{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .l{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .ld{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ld{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .s{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .s{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sa{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sa{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sb{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sb{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sc{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sc{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .dl{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .dl{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sd{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sd{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .s2{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .s2{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .se{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .se{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .sh{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sh{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .si{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .si{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sx{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sx{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sr{font-weight:600;--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sr{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .s1{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .s1{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .ss{font-weight:600;--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ss{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .m{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .m{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mb{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mb{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mf{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mf{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mh{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mh{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mi{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mi{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .il{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .il{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mo{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mo{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .o{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.chroma .ow{font-weight:600;--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ow{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}}.chroma .c{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .c{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .ch{font-weight:600;font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ch{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cm{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cm{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .c1{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .c1{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cs{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cs{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cp{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cp{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cpf{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cpf{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .ge{font-style:italic}.chroma .gh{font-weight:600;--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}.chroma .gi{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .gi{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .go{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .go{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .gp{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .gp{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .gs{font-weight:600}.chroma .gt,.chroma .gu{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}.chroma .gl{text-decoration:underline}.relative{position:relative}.m-auto{margin:auto}.m-1{margin:.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mb-3{margin-bottom:.75rem}.mt-8{margin-top:2rem}.mb-12{margin-bottom:3rem}.mt-12{margin-top:3rem}.mt-10{margin-top:2.5rem}.mt-0{margin-top:0}.ml-2{margin-left:.5rem}.mb-1{margin-bottom:.25rem}.mt-6{margin-top:1.5rem}.mr-3{margin-right:.75rem}.-mt-1{margin-top:-.25rem}.ml-3{margin-left:.75rem}.\!mt-0{margin-top:0!important}.\!mb-0{margin-bottom:0!important}.mr-4{margin-right:1rem}.ml-1{margin-left:.25rem}.\!mb-9{margin-bottom:2.25rem!important}.mb-8{margin-bottom:2rem}.mb-2{margin-bottom:.5rem}.mt-1{margin-top:.25rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.h-screen{height:100vh}.h-24{height:6rem}.h-full{height:100%}.h-36{height:9rem}.w-36{width:9rem}.w-full{width:100%}.w-24{width:6rem}.min-w-\[1\.8rem\]{min-width:1.8rem}.min-w-\[2\.4rem\]{min-width:2.4rem}.max-w-7xl{max-width:80rem}.max-w-prose{max-width:65ch}.max-w-full{max-width:100%}.flex-grow{flex-grow:1}.cursor-default{cursor:default}.list-none{list-style-type:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.overflow-hidden{overflow:hidden}.rounded-md{border-radius:.375rem}.rounded-full{border-radius:9999px}.rounded{border-radius:.25rem}.border{border-width:1px}.border-t{border-top-width:1px}.border-dotted{border-style:dotted}.border-gray-400{--tw-border-opacity:1;border-color:rgba(161,161,170,var(--tw-border-opacity))}.border-primary-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(212,212,216,var(--tw-border-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-primary-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgba(212,212,216,var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.p-1{padding:.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-\[2px\]{padding-top:2px;padding-bottom:2px}.px-2{padding-left:.5rem;padding-right:.5rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pt-8{padding-top:2rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pr-3{padding-right:.75rem}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-base{font-size:1rem;line-height:1.5rem}.text-xs{font-size:.75rem;line-height:1rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.font-extrabold{font-weight:800}.font-bold{font-weight:700}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-7{line-height:1.75rem}.leading-6{line-height:1.5rem}.text-gray-400{--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}.text-primary-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgba(39,39,42,var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(63,63,70,var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\!text-white{--tw-text-opacity:1!important;color:rgba(255,255,255,var(--tw-text-opacity))!important}.\!no-underline{text-decoration:none!important}.first\:mt-8:first-child{margin-top:2rem}.hover\:bg-primary-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.hover\:bg-primary-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.hover\:\!bg-primary-500:hover{--tw-bg-opacity:1!important;background-color:rgba(139,92,246,var(--tw-bg-opacity))!important}.hover\:text-primary-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:underline:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.dark\:prose-light{color:#a1a1aa}.dark\:prose-light a{color:#a78bfa}.dark\:prose-light strong{color:#fff}.dark\:prose-light ol>li:before{color:#a1a1aa}.dark\:prose-light ul>li:before{background-color:#52525b}.dark\:prose-light hr{border-color:#e4e4e7}.dark\:prose-light blockquote{color:#e4e4e7;border-left-color:#52525b}.dark\:prose-light h1,.dark\:prose-light h2,.dark\:prose-light h3,.dark\:prose-light h4{color:#fff}.dark\:prose-light figure figcaption{color:#a1a1aa}.dark\:prose-light code{color:#e879f9}.dark\:prose-light a code{color:#fff}.dark\:prose-light pre{color:#e4e4e7;background-color:#3f3f46}.dark\:prose-light pre code{color:#e4e4e7}.dark\:prose-light thead{color:#fff;border-bottom-color:#a1a1aa}.dark\:prose-light tbody tr{border-bottom-color:#52525b}.dark\:prose-light kbd{background-color:#3f3f46;color:#d4d4d8}.dark\:prose-light mark{background-color:#e879f9}.dark\:border-primary-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.dark\:border-gray-600{--tw-border-opacity:1;border-color:rgba(82,82,91,var(--tw-border-opacity))}.dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(39,39,42,var(--tw-bg-opacity))}.dark\:bg-primary-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(63,63,70,var(--tw-bg-opacity))}.dark\:bg-primary-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.dark\:bg-primary-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.dark\:text-gray-500{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}.dark\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.dark\:text-primary-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}.dark\:text-gray-600{--tw-text-opacity:1;color:rgba(82,82,91,var(--tw-text-opacity))}.dark\:text-gray-800{--tw-text-opacity:1;color:rgba(39,39,42,var(--tw-text-opacity))}.dark\:hover\:bg-primary-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.dark\:hover\:\!bg-primary-700:hover{--tw-bg-opacity:1!important;background-color:rgba(109,40,217,var(--tw-bg-opacity))!important}.dark\:hover\:text-primary-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.dark\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(39,39,42,var(--tw-text-opacity))}}@media (min-width:640px){.sm\:mr-7{margin-right:1.75rem}.sm\:w-1\/2{width:50%}.sm\:flex-row{flex-direction:row}.sm\:px-14{padding-left:3.5rem;padding-right:3.5rem}.sm\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.sm\:last\:mr-0:last-child{margin-right:0}}@media (min-width:768px){.md\:w-1\/3{width:33.333333%}.md\:px-24{padding-left:6rem;padding-right:6rem}}@media (min-width:1024px){.lg\:w-1\/4{width:25%}.lg\:px-32{padding-left:8rem;padding-right:8rem}}@media (min-width:1280px){.xl\:w-1\/5{width:20%}}
\ No newline at end of file
+/*! tailwindcss v2.2.7 | MIT License | https://tailwindcss.com*//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:initial;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#a1a1aa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#a1a1aa}input::placeholder,textarea::placeholder{opacity:1;color:#a1a1aa}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(228,228,231,var(--tw-border-opacity))}.prose{color:#3f3f46;max-width:65ch}.prose [class~=lead]{color:#52525b;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose a{color:#6d28d9;text-decoration:underline;font-weight:500;-webkit-text-decoration-color:#c4b5fd;text-decoration-color:#c4b5fd}.prose a:hover{background-color:#7c3aed;border-radius:.09rem;color:#fff;text-decoration:none}.prose strong{color:#18181b;font-weight:600}.prose ol[type=A]{--list-counter-style:upper-alpha}.prose ol[type=a]{--list-counter-style:lower-alpha}.prose ol[type=A s]{--list-counter-style:upper-alpha}.prose ol[type=a s]{--list-counter-style:lower-alpha}.prose ol[type=I]{--list-counter-style:upper-roman}.prose ol[type=i]{--list-counter-style:lower-roman}.prose ol[type=I s]{--list-counter-style:upper-roman}.prose ol[type=i s]{--list-counter-style:lower-roman}.prose ol[type="1"]{--list-counter-style:decimal}.prose ol>li{position:relative;padding-left:1.75em}.prose ol>li:before{content:counter(list-item,var(--list-counter-style,decimal)) ".";position:absolute;font-weight:400;color:#71717a;left:0}.prose ul>li{position:relative;padding-left:1.75em}.prose ul>li:before{content:"";position:absolute;background-color:#d4d4d8;border-radius:50%;width:.375em;height:.375em;top:.6875em;left:.25em}.prose hr{border-color:#e4e4e7;border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose blockquote{font-weight:500;font-style:italic;color:#18181b;border-left-width:.25rem;border-left-color:#ddd6fe;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose blockquote p:first-of-type:before{content:open-quote}.prose blockquote p:last-of-type:after{content:close-quote}.prose h1{color:#18181b;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose h2{color:#18181b;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333;position:relative}.prose h3{font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose h3,.prose h4{color:#18181b;font-weight:600;position:relative}.prose h4{margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose figure figcaption{color:#71717a;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose code{color:#a21caf;font-weight:600;font-size:.875em}.prose code:after,.prose code:before{content:"`"}.prose a code{color:#18181b}.prose pre{color:#e4e4e7;background-color:#fafafa;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding:.8571429em 1.1428571em}.prose pre code{background-color:initial;border-width:0;border-radius:0;padding:0;font-weight:400;color:#3f3f46;font-size:inherit;font-family:inherit;line-height:inherit}.prose pre code:after,.prose pre code:before{content:none}.prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose thead{color:#18181b;font-weight:600;border-bottom-width:1px;border-bottom-color:#d4d4d8}.prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose tbody tr{border-bottom-width:1px;border-bottom-color:#e4e4e7}.prose tbody tr:last-child{border-bottom-width:0}.prose tbody td{vertical-align:top;padding:.5714286em}.prose{font-size:1rem;line-height:1.75}.prose p{margin-top:1.25em;margin-bottom:1.25em}.prose figure,.prose img,.prose video{margin-top:2em;margin-bottom:2em}.prose figure>*{margin-top:0;margin-bottom:0}.prose h2 code{font-size:.875em}.prose h3 code{font-size:.9em}.prose ol,.prose ul{margin-top:1.25em;margin-bottom:1.25em}.prose li{margin-top:.5em;margin-bottom:.5em}.prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.prose>ul>li>:first-child{margin-top:1.25em}.prose>ul>li>:last-child{margin-bottom:1.25em}.prose>ol>li>:first-child{margin-top:1.25em}.prose>ol>li>:last-child{margin-bottom:1.25em}.prose ol ol,.prose ol ul,.prose ul ol,.prose ul ul{margin-top:.75em;margin-bottom:.75em}.prose h2+*,.prose h3+*,.prose h4+*,.prose hr+*{margin-top:0}.prose thead th:first-child{padding-left:0}.prose thead th:last-child{padding-right:0}.prose tbody td:first-child{padding-left:0}.prose tbody td:last-child{padding-right:0}.prose>:first-child{margin-top:0}.prose>:last-child{margin-bottom:0}.prose kbd{background-color:#e4e4e7;padding:.1rem .4rem;border-radius:.25rem;font-size:.9rem;font-weight:600}.prose mark{background-color:#f5d0fe;padding:.1rem .2rem;border-radius:.12rem}body a,body button{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.icon svg{height:1em;width:1em}.prose .heading-anchor{position:absolute;top:0;text-decoration:none;opacity:0;width:1.1em;left:-1.1em}.prose .heading-anchor:hover{background-color:initial;--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity));text-decoration:underline}.prose .heading-anchor:focus,.prose .heading-anchor:hover,.prose h2:hover>.heading-anchor,.prose h3:hover>.heading-anchor,.prose h4:hover>.heading-anchor{opacity:1}.no-prose>p{margin-top:0}.no-prose>p:last-child{margin-bottom:0}.article-pagination a:hover .article-pagination-title{text-decoration:underline;-webkit-text-decoration-color:#8b5cf6;text-decoration-color:#8b5cf6}.article-pagination a:hover .article-pagination-direction{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.article-pagination a:hover .article-pagination-direction{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.prose .chroma{border-radius:.375rem;--tw-bg-opacity:1;background-color:rgba(250,250,250,var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(63,63,70,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.prose .chroma{--tw-bg-opacity:1;background-color:rgba(63,63,70,var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(228,228,231,var(--tw-text-opacity))}}.chroma .lntd,.chroma .lntd pre{margin:0;border-style:none;padding:0;vertical-align:top}.chroma .lntable{display:block;width:auto;overflow:hidden;padding:.75rem 1rem;font-size:1rem;line-height:1.5rem;border-spacing:0}.chroma .hl{margin-left:-1rem;margin-right:-1rem;display:block;width:auto;--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity));padding-left:1rem;padding-right:1rem}@media (prefers-color-scheme:dark){.chroma .hl{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}}.chroma .lntd .hl{margin:0;padding:0}.chroma .lnt{--tw-text-opacity:1;color:rgba(82,82,91,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .lnt{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}}.chroma .lnt{margin-right:.4em;padding:0 .4em}.chroma .ln{--tw-text-opacity:1;color:rgba(82,82,91,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ln{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}}.chroma .ln{margin-right:.4em;padding:0 .4em}.chroma .k{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .k{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kc{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kc{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .kd{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kd{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kn{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kn{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kp{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kp{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kr{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kr{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .kt{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .kt{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .n{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .n{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .na{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .na{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .nb{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nb{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .bp{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .bp{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .nc{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nc{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .no{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .no{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .nd{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nd{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .ni{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ni{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .ne{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ne{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .nf{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nf{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .fm{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .fm{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .nl{--tw-text-opacity:1;color:rgba(112,26,117,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nl{--tw-text-opacity:1;color:rgba(245,208,254,var(--tw-text-opacity))}}.chroma .nn{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nn{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .nx{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nx{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .py{color:#cebc3a}.chroma .nt{--tw-text-opacity:1;color:rgba(134,25,143,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nt{--tw-text-opacity:1;color:rgba(240,171,252,var(--tw-text-opacity))}}.chroma .nv{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .nv{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .vc{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vc{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}}.chroma .vg{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vg{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .vi{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vi{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .vm{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .vm{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .l{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .l{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .ld{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ld{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .s{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .s{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sa{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sa{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sb{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sb{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sc{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sc{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .dl{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .dl{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sd{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sd{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .s2{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .s2{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .se{font-weight:600;--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .se{--tw-text-opacity:1;color:rgba(217,70,239,var(--tw-text-opacity))}}.chroma .sh{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sh{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .si{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .si{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sx{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sx{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .sr{font-weight:600;--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .sr{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .s1{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .s1{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .ss{font-weight:600;--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ss{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .m{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .m{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mb{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mb{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mf{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mf{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mh{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mh{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mi{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mi{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .il{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .il{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .mo{--tw-text-opacity:1;color:rgba(232,121,249,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .mo{--tw-text-opacity:1;color:rgba(192,38,211,var(--tw-text-opacity))}}.chroma .o{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.chroma .ow{font-weight:600;--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ow{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}}.chroma .c{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .c{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .ch{font-weight:600;font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .ch{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cm{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cm{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .c1{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .c1{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cs{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cs{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cp{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cp{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .cpf{font-style:italic;--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .cpf{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}}.chroma .ge{font-style:italic}.chroma .gh{font-weight:600;--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}.chroma .gi{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .gi{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .go{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .go{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .gp{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.chroma .gp{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}}.chroma .gs{font-weight:600}.chroma .gt,.chroma .gu{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}.chroma .gl{text-decoration:underline}.relative{position:relative}.m-auto{margin:auto}.m-1{margin:.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mb-3{margin-bottom:.75rem}.mt-8{margin-top:2rem}.mb-12{margin-bottom:3rem}.mt-12{margin-top:3rem}.mt-10{margin-top:2.5rem}.mt-0{margin-top:0}.mt-6{margin-top:1.5rem}.mr-3{margin-right:.75rem}.-mt-1{margin-top:-.25rem}.ml-3{margin-left:.75rem}.\!mt-0{margin-top:0!important}.\!mb-0{margin-bottom:0!important}.mr-4{margin-right:1rem}.ml-1{margin-left:.25rem}.mb-1{margin-bottom:.25rem}.\!mb-9{margin-bottom:2.25rem!important}.mb-2{margin-bottom:.5rem}.mt-1{margin-top:.25rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.hidden{display:none}.h-screen{height:100vh}.h-24{height:6rem}.h-full{height:100%}.h-36{height:9rem}.w-36{width:9rem}.w-full{width:100%}.w-24{width:6rem}.min-w-\[1\.8rem\]{min-width:1.8rem}.min-w-\[2\.4rem\]{min-width:2.4rem}.max-w-7xl{max-width:80rem}.max-w-prose{max-width:65ch}.max-w-full{max-width:100%}.flex-grow{flex-grow:1}.cursor-default{cursor:default}.list-none{list-style-type:none}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.overflow-hidden{overflow:hidden}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded{border-radius:.25rem}.border{border-width:1px}.border-t{border-top-width:1px}.border-dotted{border-style:dotted}.border-gray-400{--tw-border-opacity:1;border-color:rgba(161,161,170,var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(212,212,216,var(--tw-border-opacity))}.border-primary-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-primary-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgba(212,212,216,var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.p-1{padding:.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-\[1px\]{padding-top:1px;padding-bottom:1px}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.pl-2{padding-left:.5rem}.pt-8{padding-top:2rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pr-3{padding-right:.75rem}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-\[0\.6rem\]{font-size:.6rem}.font-extrabold{font-weight:800}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-normal{font-weight:400}.uppercase{text-transform:uppercase}.leading-7{line-height:1.75rem}.leading-3{line-height:.75rem}.leading-6{line-height:1.5rem}.text-gray-400{--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgba(39,39,42,var(--tw-text-opacity))}.text-primary-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(63,63,70,var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\!text-white{--tw-text-opacity:1!important;color:rgba(255,255,255,var(--tw-text-opacity))!important}.\!no-underline{text-decoration:none!important}.underline-gray-300{-webkit-text-decoration-color:#d4d4d8;text-decoration-color:#d4d4d8}.underline-primary-300{-webkit-text-decoration-color:#c4b5fd;text-decoration-color:#c4b5fd}.underline-primary-500{-webkit-text-decoration-color:#8b5cf6;text-decoration-color:#8b5cf6}.underline-offset-small{text-underline-offset:2px}.underline-thickness-bold{text-decoration-thickness:2px}.first\:mt-8:first-child{margin-top:2rem}.hover\:bg-primary-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.hover\:bg-primary-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.hover\:\!bg-primary-500:hover{--tw-bg-opacity:1!important;background-color:rgba(139,92,246,var(--tw-bg-opacity))!important}.hover\:text-primary-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.hover\:text-primary-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:underline:hover{text-decoration:underline}@media (prefers-color-scheme:dark){.dark\:prose-light{color:#a1a1aa}.dark\:prose-light a{color:#a78bfa;-webkit-text-decoration-color:#71717a;text-decoration-color:#71717a}.dark\:prose-light strong{color:#fff}.dark\:prose-light ol>li:before{color:#a1a1aa}.dark\:prose-light ul>li:before{background-color:#52525b}.dark\:prose-light hr{border-color:#e4e4e7}.dark\:prose-light blockquote{color:#e4e4e7;border-left-color:#4c1d95}.dark\:prose-light h1,.dark\:prose-light h2,.dark\:prose-light h3,.dark\:prose-light h4{color:#fff}.dark\:prose-light figure figcaption{color:#a1a1aa}.dark\:prose-light code{color:#e879f9}.dark\:prose-light a code{color:#fff}.dark\:prose-light pre{color:#e4e4e7;background-color:#3f3f46}.dark\:prose-light pre code{color:#e4e4e7}.dark\:prose-light thead{color:#fff;border-bottom-color:#a1a1aa}.dark\:prose-light tbody tr{border-bottom-color:#52525b}.dark\:prose-light kbd{background-color:#3f3f46;color:#d4d4d8}.dark\:prose-light mark{background-color:#e879f9}.dark\:border-gray-600{--tw-border-opacity:1;border-color:rgba(82,82,91,var(--tw-border-opacity))}.dark\:border-primary-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.dark\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(39,39,42,var(--tw-bg-opacity))}.dark\:bg-primary-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.dark\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(63,63,70,var(--tw-bg-opacity))}.dark\:bg-primary-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.dark\:bg-primary-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.dark\:text-gray-500{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity))}.dark\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.dark\:text-gray-300{--tw-text-opacity:1;color:rgba(212,212,216,var(--tw-text-opacity))}.dark\:text-primary-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.dark\:text-gray-600{--tw-text-opacity:1;color:rgba(82,82,91,var(--tw-text-opacity))}.dark\:text-gray-800{--tw-text-opacity:1;color:rgba(39,39,42,var(--tw-text-opacity))}.dark\:underline-gray-600{-webkit-text-decoration-color:#52525b;text-decoration-color:#52525b}.dark\:hover\:bg-primary-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.dark\:hover\:\!bg-primary-700:hover{--tw-bg-opacity:1!important;background-color:rgba(109,40,217,var(--tw-bg-opacity))!important}.dark\:hover\:text-primary-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.dark\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(39,39,42,var(--tw-text-opacity))}}@media (min-width:640px){.sm\:mr-7{margin-right:1.75rem}.sm\:w-1\/2{width:50%}.sm\:flex-row{flex-direction:row}.sm\:px-14{padding-left:3.5rem;padding-right:3.5rem}.sm\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.sm\:last\:mr-0:last-child{margin-right:0}}@media (min-width:768px){.md\:w-1\/3{width:33.333333%}.md\:px-24{padding-left:6rem;padding-right:6rem}}@media (min-width:1024px){.lg\:w-1\/4{width:25%}.lg\:px-32{padding-left:8rem;padding-right:8rem}}@media (min-width:1280px){.xl\:w-1\/5{width:20%}}
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
index 3e8fa598..812241bd 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -19,6 +19,12 @@ module.exports = {
primary: colors.violet,
secondary: colors.fuchsia,
},
+ underlineOffset: {
+ small: "2px",
+ },
+ underlineThickness: {
+ bold: "2px",
+ },
extend: {
typography: (theme) => ({
DEFAULT: {
@@ -27,13 +33,18 @@ module.exports = {
a: {
color: theme("colors.primary.700"),
textDecoration: "underline",
+ textDecorationColor: theme("colors.primary.300"),
fontWeight: "500",
"&:hover": {
backgroundColor: theme("colors.primary.600"),
+ borderRadius: "0.09rem",
color: theme("colors.white"),
textDecoration: "none",
},
},
+ blockquote: {
+ borderLeftColor: theme("colors.primary.200"),
+ },
h2: {
position: "relative",
},
@@ -73,6 +84,7 @@ module.exports = {
color: theme("colors.gray.400"),
a: {
color: theme("colors.primary.400"),
+ textDecorationColor: theme("colors.gray.500"),
},
strong: {
color: theme("colors.white"),
@@ -88,7 +100,7 @@ module.exports = {
},
blockquote: {
color: theme("colors.gray.200"),
- borderLeftColor: theme("colors.gray.600"),
+ borderLeftColor: theme("colors.primary.900"),
},
h1: {
color: theme("colors.white"),
@@ -143,5 +155,5 @@ module.exports = {
typography: ["dark"],
},
},
- plugins: [require("@tailwindcss/typography")],
+ plugins: [require("@tailwindcss/typography"), require("tailwind-underline-utils")],
};
diff --git a/theme.toml b/theme.toml
index ceb3a4ac..8140820c 100644
--- a/theme.toml
+++ b/theme.toml
@@ -2,13 +2,17 @@
name = "Congo"
license = "MIT"
-licenselink = "https://github.com/jpanther/hugo-congo/blob/master/LICENSE"
-description = "A simple, clean Hugo theme based on Tailwind CSS"
-homepage = "http://github.com/jpanther/hugo-congo/"
-tags = ["blog", "minimal", "dark mode", "dark", "light", "tailwind"]
-features = ["syntax higlighting", "dark mode", "emoji"]
+licenselink = "https://github.com/jpanther/Congo/blob/master/LICENSE"
+description = "A simple, lightweight theme for Hugo built with Tailwind CSS."
+
min_version = "0.86.1"
+homepage = "https://github.com/jpanther/Congo/"
+demosite = "https://jpanther.github.io/Congo/"
+
+tags = ["blog", "minimal", "responsive", "dark mode", "dark", "light", "tailwind", "personal"]
+features = ["syntax higlighting", "dark mode", "emoji"]
+
[author]
name = "James Panther"
homepage = "https://jamespanther.com/"