Jared 2 年之前
當前提交
6367a41f83
共有 100 個文件被更改,包括 4691 次插入0 次删除
  1. 0 0
      .hugo_build.lock
  2. 21 0
      LICENSE
  3. 1 0
      README.md
  4. 24 0
      archetypes/post.md
  5. 3 0
      build.sh
  6. 52 0
      build_optimized.sh
  7. 140 0
      config.toml
  8. 5 0
      config/_default/languages.toml
  9. 24 0
      config/_default/menus/menu.en.toml
  10. 23 0
      configTaxo.toml
  11. 7 0
      content/_index.md
  12. 24 0
      content/about.md
  13. 5 0
      content/archives.md
  14. 9 0
      content/contact.html
  15. 30 0
      content/formeonly.md
  16. 6 0
      content/posts/_index.md
  17. 二進制
      content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/assembled.png
  18. 二進制
      content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/can-bus.png
  19. 二進制
      content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/hardware-connection.png
  20. 二進制
      content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/hardware-design.png
  21. 15 0
      content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/index.md
  22. 二進制
      content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/main-functions.png
  23. 二進制
      content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/thumbnail.png
  24. 6 0
      content/search.md
  25. 3 0
      content/tags/config/_index.md
  26. 3 0
      content/tags/og/_index.md
  27. 10 0
      data/social.yaml
  28. 1 0
      deploy.sh
  29. 1 0
      deploy_optimized.sh
  30. 2 0
      install_optimization_tools.sh
  31. 0 0
      layouts/.gitkeep
  32. 8 0
      netlify.toml
  33. 0 0
      resources/_gen/assets/sass/sass/main.sass_a10bf61979d021e1086eb7fc032d3f90.content
  34. 1 0
      resources/_gen/assets/sass/sass/main.sass_a10bf61979d021e1086eb7fc032d3f90.json
  35. 0 0
      static/.gitignore
  36. 18 0
      static/admin/config.yml
  37. 14 0
      static/admin/index.html
  38. 二進制
      static/cover.jpg
  39. 二進制
      static/favicon-32x32.png
  40. 二進制
      static/favicon.ico
  41. 二進制
      static/favicon.png
  42. 二進制
      static/icons/android-chrome-192x192.png
  43. 二進制
      static/icons/android-chrome-256x256.png
  44. 二進制
      static/icons/apple-touch-icon.png
  45. 1 0
      static/icons/bar.svg
  46. 9 0
      static/icons/browserconfig.xml
  47. 42 0
      static/icons/cancel.svg
  48. 1 0
      static/icons/caret-icon.svg
  49. 1 0
      static/icons/carly.svg
  50. 1 0
      static/icons/close.svg
  51. 66 0
      static/icons/copy.svg
  52. 1 0
      static/icons/expand.svg
  53. 二進制
      static/icons/favicon-16x16.png
  54. 二進制
      static/icons/favicon-32x32.png
  55. 二進制
      static/icons/favicon.ico
  56. 1 0
      static/icons/link.svg
  57. 二進制
      static/icons/logo.png
  58. 23 0
      static/icons/mail.svg
  59. 二進制
      static/icons/mstile-150x150.png
  60. 66 0
      static/icons/order.svg
  61. 2 0
      static/icons/search.svg
  62. 19 0
      static/icons/site.webmanifest
  63. 二進制
      static/images/engineer.png
  64. 117 0
      static/images/logo.svg
  65. 0 0
      static/images/top.svg
  66. 二進制
      static/logo.png
  67. 3 0
      themes/hugo-curious/.gitignore
  68. 22 0
      themes/hugo-curious/LICENSE.md
  69. 440 0
      themes/hugo-curious/README.md
  70. 22 0
      themes/hugo-curious/archetypes/post.md
  71. 277 0
      themes/hugo-curious/assets/js/code.js
  72. 13 0
      themes/hugo-curious/assets/js/custom.js
  73. 196 0
      themes/hugo-curious/assets/js/functions.js
  74. 1 0
      themes/hugo-curious/assets/js/highlight.js
  75. 405 0
      themes/hugo-curious/assets/js/index.js
  76. 151 0
      themes/hugo-curious/assets/sass/_base.sass
  77. 49 0
      themes/hugo-curious/assets/sass/_card.scss
  78. 30 0
      themes/hugo-curious/assets/sass/_color_tag.scss
  79. 691 0
      themes/hugo-curious/assets/sass/_components.sass
  80. 87 0
      themes/hugo-curious/assets/sass/_custom.scss
  81. 13 0
      themes/hugo-curious/assets/sass/_disqus.scss
  82. 456 0
      themes/hugo-curious/assets/sass/_excerpt.scss
  83. 1 0
      themes/hugo-curious/assets/sass/_fonts.sass
  84. 56 0
      themes/hugo-curious/assets/sass/_form.scss
  85. 80 0
      themes/hugo-curious/assets/sass/_mobile.sass
  86. 11 0
      themes/hugo-curious/assets/sass/_note_pages.scss
  87. 29 0
      themes/hugo-curious/assets/sass/_quotes.scss
  88. 208 0
      themes/hugo-curious/assets/sass/_subscriber_form.scss
  89. 238 0
      themes/hugo-curious/assets/sass/_syntax.sass
  90. 19 0
      themes/hugo-curious/assets/sass/_toc.scss
  91. 66 0
      themes/hugo-curious/assets/sass/_utils.sass
  92. 113 0
      themes/hugo-curious/assets/sass/_variables.sass
  93. 20 0
      themes/hugo-curious/assets/sass/main.sass
  94. 47 0
      themes/hugo-curious/i18n/en.toml
  95. 47 0
      themes/hugo-curious/i18n/pt.toml
  96. 47 0
      themes/hugo-curious/i18n/tr.toml
  97. 47 0
      themes/hugo-curious/i18n/zh.toml
  98. 二進制
      themes/hugo-curious/images/screenshot.png
  99. 二進制
      themes/hugo-curious/images/tags.png
  100. 二進制
      themes/hugo-curious/images/toc.png

+ 0 - 0
.hugo_build.lock


+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2021 Viet Anh Nguyen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 1 - 0
README.md

@@ -0,0 +1 @@
+# Example blog

+ 24 - 0
archetypes/post.md

@@ -0,0 +1,24 @@
+---
+title: "{{ replace .Name "-" " " | title }}" # Title of the blog post.
+date: {{ .Date }} # Date of post creation.
+description: "Article description." # Description used for search engine.
+featured: true # Sets if post is a featured post, making appear on the home page side bar.
+draft: true # Sets whether to render this page. Draft of true will not be rendered.
+toc: false # Controls if a table of contents should be generated for first-level links automatically.
+# menu: main
+featureImage: "/images/path/file.jpg" # Sets featured image on blog post.
+thumbnail: "/images/path/thumbnail.png" # Sets thumbnail image appearing inside card on homepage.
+shareImage: "/images/path/share.png" # Designate a separate image for social media sharing.
+codeMaxLines: 10 # Override global value for how many lines within a code block before auto-collapsing.
+codeLineNumbers: false # Override global value for showing of line numbers within code block.
+figurePositionShow: true # Override global value for showing the figure label.
+categories:
+  - Technology
+tags:
+  - Tag_name1
+  - Tag_name2
+# comment: false # Disable comment if false.
+# math: false # Disable comment if false.
+---
+
+**Insert Lead paragraph here.**

+ 3 - 0
build.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+hugo --gc --minify --buildDrafts=false

+ 52 - 0
build_optimized.sh

@@ -0,0 +1,52 @@
+#!/bin/bash
+
+MAXIMUM_JPG_SIZE=250
+PNG_OPTIMIZATION_LEVEL=2
+hugo --gc --minify --buildDrafts=false
+
+if hash exiftool 2>/dev/null; then
+	# remove exif data on all images in new_images
+	exiftool -r -all= -ext jpg -ext gif -ext png public
+else
+	echo "Install perl-image-exiftool to optimize images"
+fi
+
+THREADS=$(nproc)
+
+optimize_jpeg() {
+    mogrify -resize '1400>' $1
+	jpegoptim --strip-all --size=$MAXIMUM_JPG_SIZE $1
+}
+if hash jpegoptim 2>/dev/null; then
+	(
+	for image in $(find public -regextype posix-extended -iregex ".*\.(jpeg|jpg)"); do
+		# Every THREADSth job, stop and wait for everything
+		# to complete.
+		if (( i % THREADS == 0 )); then
+			wait
+		fi
+		((i++))
+		optimize_jpeg $image &
+	done;
+	)
+else
+	echo "Install jpegoptim to optimize JPEG images"
+fi
+
+optimize_png() {
+    mogrify -resize '1400>' $1
+	optipng -clobber -strip all -o $PNG_OPTIMIZATION_LEVEL $1
+}
+if hash optipng 2>/dev/null; then
+	for image in $(find public -regextype posix-extended -iregex ".*\.(png)"); do
+		# Every THREADSth job, stop and wait for everything
+		# to complete.
+		if (( i % THREADS == 0 )); then
+			wait
+		fi
+		((i++))
+		optimize_png $image &
+	done;
+else
+	echo "Install optipng to optimize PNG images"
+fi

+ 140 - 0
config.toml

@@ -0,0 +1,140 @@
+# set `baseurl` to your root domain
+# if you set it to "/" share icons won't work properly on production
+baseurl = "https://www.nobad.news/"  # Include trailing slash
+title = "News"
+author = "news"
+#canonifyurls = true
+paginate = 8
+PaginatePath = "/posts/"
+theme = "hugo-curious"
+publishDir= "/tmp/tony-chin"
+
+
+DefaultContentLanguage = "en"
+# [languages]
+# config/_default/languages.toml
+
+# [menus]
+# config/_default/menus/menu.xx.toml
+
+[taxonomies]
+category = "categories"
+tag = "tags"
+series = "series"
+
+[markup]
+  [markup.goldmark]
+    [markup.goldmark.renderer]
+      hardWraps = false
+      unsafe = true # change to false to disable inclusion of rawHTML and math functions
+      xhtml = false
+    [markup.goldmark.extensions]
+      typographer = false
+  [markup.highlight]
+    codeFences = true
+    guessSyntax = false
+    hl_Lines = "--"
+    lineNoStart = 1
+    lineNos = true # always set to true # else line numbers won't show at all! even when you toggle them on in the UI
+    lineNumbersInTable = false # toggling this on (i.e to true) or deleting this line will break the code blocks functionality. Will
+    noClasses = false
+    # style = "monokai"
+    tabWidth = 2
+
+[permalinks]
+  page = "/:slug/"
+  posts = "/:slug/"
+  notes = "/:slug/"
+
+[params]
+author = "steelers"
+twitter = "@vietanhdev"
+largeTwitterCard = false # set to true if you want to show a large twitter card image. The default is a small twitter card image
+introDescription = "test"
+description = "test"
+searchTypes = ["posts", "notes"]
+
+codeLineNumbers = true
+
+# Google analytics Id
+ga_analytics = "UA-176023093-1"
+
+# limit the number of taxonomies links shown on the sidebar of each page by default.
+numberOfTagsShown = 8 # Applies for all other default & custom taxonomies. e.g categories, brands see https://gohugo.io/content-management/taxonomies#what-is-a-taxonomy
+
+# will be used on share >> twitter, facebook, linkedin
+fallBackOgImage = "images/thumbnail.jpg" 
+
+# directory(s) where your articles are located
+mainSections = ["posts"] # see config details here https://gohugo.io/functions/where/#mainsections
+
+# center logo on navbar
+centerLogo = false # Set to "true" for centering or "false" for left aligned.
+
+logo = "logo.png"
+
+# Set the collapsed mobile navigation to either appear from the left or the right
+mobileNavigation = "right" # if you prefer right change to 'right'
+
+# some site owners want to decide how they would like their sites to be introduced users. These settings give you as a site owner to decide how the user will view your site for the first time.
+
+# please note that you cannot enforce both modes at the same time. i.e by enforcing one mode, you priotise it over the other (by setting it to true). enforceDarkMode will be commented out
+
+# please also not that mode toggle UI will remain in place. That way, if a user prefers darkmode, they can have their way.
+
+enforceLightMode = true
+# enforceDarkMode = false
+
+# Text for the languages menu.
+# languageMenuName = "🌐"
+
+# Title separator, default to |.
+# titleSeparator = "|"
+
+# Enable or disable comment globally. Default to true.
+# comment = false
+
+# Maximum number of recent posts.
+numberOfRecentPosts = 8
+
+# Maximum number of featured posts.
+numberOfFeaturedPosts = 8
+
+# Comment
+talkyardServerUrl = "https://comments-for-aicurious-io.talkyard.net"
+talkyardScriptUrl = "https://c1.ty-cdn.net/-/talkyard-comments.min.js"
+
+# Contact form
+contactFormSubmitUrl = "https://formspree.io/xaypalea"
+
+# Buy me a coffee
+# Comment below line to disable
+buyMeACoffeeId = "vietanhdev"
+
+# MailChimp Subscriber form
+# Comment below line to disable
+mailChimpUrl = "https://vietanhdev.us13.list-manage.com/subscribe/post?u=c5f9d88238b4c0ec0106fe459&id=e74e121dc8"
+
+# Google Adsense
+# adsenseDataAdClient = ""
+
+# Cookie Consent
+showCookieConsent = true
+privacyPolicyPage = "https://aicurious.io/privacy-policy/"
+
+[related]
+  includeNewer = true
+  threshold = 10
+  toLower = false
+
+  [[related.indices]]
+    name = "keywords"
+    weight = 100
+
+  [[related.indices]]
+    name = "date"
+    weight = 10
+
+
+[outputs]
+  home = ["HTML", "RSS", "JSON"]

+ 5 - 0
config/_default/languages.toml

@@ -0,0 +1,5 @@
+
+[en]
+  title = "News"
+  LanguageName = "English"
+  weight = 1

+ 24 - 0
config/_default/menus/menu.en.toml

@@ -0,0 +1,24 @@
+[[main]]
+  name = "Main"
+  url = ""
+  weight = 10
+
+[[main]]
+  name = "Notes"
+  url = "/notes/"
+  weight = 20
+
+[[main]]
+  name = "About"
+  url = "/about/"
+  weight = 30
+
+[[main]]
+  name = "<img src=\"/icons/mail.svg\" style=\"height:1.2rem; display: inline; margin: 0;\">"
+  url = "/contact/"
+  weight = 50
+
+[[main]]
+  name = "<img src=\"/icons/search.svg\" style=\"height:1.2rem; display: inline; margin: 0;\">"
+  url = "/search/"
+  weight = 60

+ 23 - 0
configTaxo.toml

@@ -0,0 +1,23 @@
+timeout = 30000
+enableInlineShortcodes = true
+footnoteReturnLinkContents = "^"
+
+[privacy]
+
+[privacy.vimeo]
+disabled = false
+simple = true
+
+[privacy.twitter]
+disabled = false
+enableDNT = true
+simple = true
+disableInlineCSS = true
+
+[privacy.instagram]
+disabled = false
+simple = true
+
+[privacy.youtube]
+disabled = false
+privacyEnhanced = true

+ 7 - 0
content/_index.md

@@ -0,0 +1,7 @@
++++
+author = "vietanhdev"
+title = "test"
++++
+
+{{< quote author="Andrew Ng">}}this is a test
+{{< /quote >}}

+ 24 - 0
content/about.md

@@ -0,0 +1,24 @@
+---
+title: "About me"
+slug: "/about/"
+discussionId: "/about/"
+date: 2020-10-10
+---
+
+<img id="my-photo" alt="Viet Anh Nguyen" src="/images/engineer.png">
+<style>
+#my-photo {
+    width: 16rem;
+    margin:0;
+    padding: 0;
+    margin: 1rem 1rem 0.5rem 0;
+    border-radius: 50%;
+    clear: both;
+}
+@media screen and (min-width: 400px) {
+    #my-photo {
+        float: right;
+    }
+}
+</style>
+

+ 5 - 0
content/archives.md

@@ -0,0 +1,5 @@
+---
+date: 2019-05-28
+type: section
+layout: "archives"
+---

+ 9 - 0
content/contact.html

@@ -0,0 +1,9 @@
+---
+title: "Send me a messagge"
+weight: 2
+slug: "/contact/"
+discussionId: "/contact/"
+date: 2020-10-10
+---
+
+{{< contact-form >}}

+ 30 - 0
content/formeonly.md

@@ -0,0 +1,30 @@
+---
+card: "/formeonly/"
+date: 2020-10-10
+---
+
+This page is writing instruction **for me only**.
+
+### Card
+
+<pre>
+{{&lt; card title="Bước 0 - Học lập trình cơ bản với Python" icon="python.svg">}}
+&lt;p style="width: 100%">Lập trình là điều đầu tiên bạn cần học để có thể bắt kịp việc thực hành về sau. Python hiện tại là một ngôn ngữ rất phổ biến trong ngành trí tuệ nhân tạo. Có rất nhiều các khoá học được dạy với Python. Do vậy tôi khuyến khích các bạn bắt đầu với ngôn ngữ này. Có một vài khoá học và tài liệu tôi nghĩ có thể dùng được như:&lt;/p>
+{{&lt; card-list >}}
+{{&lt; card-list-item link="https://www.codecademy.com/learn/learn-python-3" >}}
+Khoá **Learn Python 3** của Codecademy
+{{&lt; /card-list-item >}}
+{{&lt; card-list-item link="https://www.howkteam.vn/course/lap-trinh-python-co-ban-37" >}}
+Khoá **Lập trình Python** cơ bản của How kTeam
+{{&lt; /card-list-item >}}
+{{&lt; card-list-item link="https://greenteapress.com/wp/think-python/" >}}
+Sách **Think Python: How to Think Like a Computer Scientist** - Allen B. Downey.
+{{&lt; /card-list-item >}}
+{{&lt; /card >}}
+</pre>
+
+
+### Table 
+
+- Generator: https://tableconvert.com/
+- Word table to markdown: https://tabletomarkdown.com/convert-spreadsheet-to-markdown/

+ 6 - 0
content/posts/_index.md

@@ -0,0 +1,6 @@
++++
+aliases = ["posts", "articles", "blog", "showcase", "docs"]
+title = "Posts"
+author = "test"
+tags = ["index"]
++++

二進制
content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/assembled.png


二進制
content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/can-bus.png


二進制
content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/hardware-connection.png


二進制
content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/hardware-design.png


+ 15 - 0
content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/index.md

@@ -0,0 +1,15 @@
+---
+title: "test"
+date: 2020-09-10
+categories: ["test"]
+tags:
+- gambling
+- news
+description: "test"
+thumbnail: /posts/adas-jetson-nano-intro-and-hardware/thumbnail.png
+slug: "/posts/adas-jetson-nano-intro-and-hardware/"
+discussionId: "/posts/adas-jetson-nano-intro-and-hardware/"
+featured: true
+toc: true
+---
+test

二進制
content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/main-functions.png


二進制
content/posts/ai-projects/2020-09-10-adas-jetson-nano-intro-and-hardware/thumbnail.png


+ 6 - 0
content/search.md

@@ -0,0 +1,6 @@
+---
+title: "Local Search Engine"
+sitemap:
+  priority : 0.1
+layout: "search"
+---

+ 3 - 0
content/tags/config/_index.md

@@ -0,0 +1,3 @@
+---
+title: Configuration
+---

+ 3 - 0
content/tags/og/_index.md

@@ -0,0 +1,3 @@
+---
+title: Opengraph
+---

+ 10 - 0
data/social.yaml

@@ -0,0 +1,10 @@
+# Show or hide by uncommenting and vice versa
+- item: "youtube"
+  url: "https://tha3011.net"
+# - item: "facebook"
+#  url: "https://facebook.com/#"
+# - item: "instagram"
+# url: "https://instagram.com/#"
+# - item: "rss"
+#   url: "index.xml"
+#   internal:  true

+ 1 - 0
deploy.sh

@@ -0,0 +1 @@
+bash build.sh && netlify deploy -p

+ 1 - 0
deploy_optimized.sh

@@ -0,0 +1 @@
+bash build_optimized.sh && netlify deploy -p

+ 2 - 0
install_optimization_tools.sh

@@ -0,0 +1,2 @@
+sudo apt-get install -y exiftool jpegoptim optipng
+npm install -g autoprefixer postcss postcss-cli

+ 0 - 0
layouts/.gitkeep


+ 8 - 0
netlify.toml

@@ -0,0 +1,8 @@
+[build]
+publish = "public"
+command = "npm install -g autoprefixer postcss postcss-cli && hugo --gc --minify --buildDrafts=false"
+
+[context.production.environment]
+HUGO_VERSION = "0.76.4"
+HUGO_ENV = "production"
+HUGO_ENABLEGITINFO = "true"

文件差異過大導致無法顯示
+ 0 - 0
resources/_gen/assets/sass/sass/main.sass_a10bf61979d021e1086eb7fc032d3f90.content


+ 1 - 0
resources/_gen/assets/sass/sass/main.sass_a10bf61979d021e1086eb7fc032d3f90.json

@@ -0,0 +1 @@
+{"Target":"css/styles.css","MediaType":"text/css","Data":{}}

+ 0 - 0
static/.gitignore


+ 18 - 0
static/admin/config.yml

@@ -0,0 +1,18 @@
+backend:
+  name: git-gateway
+  branch: master # Branch to update (optional; defaults to master)
+media_folder: static/images
+public_folder: /images
+collections:
+  - name: 'posts'
+    label: 'Posts'
+    folder: 'content/posts'
+    create: true
+    slug: '{{slug}}'
+    editor:
+      preview: false
+    fields:
+      - { label: 'Title', name: 'title', widget: 'string' }
+      - { label: 'Publish Date', name: 'date', widget: 'datetime' }
+      - { label: 'Description', name: 'description', widget: 'string' }
+      - { label: 'Body', name: 'body', widget: 'markdown' }

+ 14 - 0
static/admin/index.html

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Content Manager</title>
+    <!-- Include the script that enables Netlify Identity on this page. -->
+    <script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>
+  </head>
+  <body>
+    <!-- Include the script that builds the page and powers Netlify CMS -->
+    <script src="https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>
+  </body>
+</html>

二進制
static/cover.jpg


二進制
static/favicon-32x32.png


二進制
static/favicon.ico


二進制
static/favicon.png


二進制
static/icons/android-chrome-192x192.png


二進制
static/icons/android-chrome-256x256.png


二進制
static/icons/apple-touch-icon.png


+ 1 - 0
static/icons/bar.svg

@@ -0,0 +1 @@
+<svg fill="none" height="67" viewBox="0 0 100 67" width="100" xmlns="http://www.w3.org/2000/svg"><g fill="#fff"><path d="m0 6.66667h1e2V0H0z"></path><path d="m0 35.2082h1e2v-6.6666H0z"></path><path d="m1e2 66.6665H0v-6.6667h1e2z"></path></g></svg>

+ 9 - 0
static/icons/browserconfig.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+    <msapplication>
+        <tile>
+            <square150x150logo src="/mstile-150x150.png"/>
+            <TileColor>#da532c</TileColor>
+        </tile>
+    </msapplication>
+</browserconfig>

+ 42 - 0
static/icons/cancel.svg

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve" fill="#fff">
+<g>
+	<g>
+		<path d="M294.111,256.001L504.109,46.003c10.523-10.524,10.523-27.586,0-38.109c-10.524-10.524-27.587-10.524-38.11,0L256,217.892
+			L46.002,7.894c-10.524-10.524-27.586-10.524-38.109,0s-10.524,27.586,0,38.109l209.998,209.998L7.893,465.999
+			c-10.524,10.524-10.524,27.586,0,38.109c10.524,10.524,27.586,10.523,38.109,0L256,294.11l209.997,209.998
+			c10.524,10.524,27.587,10.523,38.11,0c10.523-10.524,10.523-27.586,0-38.109L294.111,256.001z"/>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 1 - 0
static/icons/caret-icon.svg

@@ -0,0 +1 @@
+<svg fill="none" height="5" viewBox="0 0 10 5" width="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><mask id="a" height="5" maskUnits="userSpaceOnUse" width="10" x="0" y="0"><path d="m.833008.333496 4.166662 4.166664 4.16667-4.166664z" fill="#fff"/></mask><g fill="#80868b" mask="url(#a)"><path d="m-5-8h20v20h-20z"/><path d="m-5-8h20v20h-20z"/><path d="m-5-8h20v20h-20z"/></g></svg>

+ 1 - 0
static/icons/carly.svg

@@ -0,0 +1 @@
+<svg id="Layer" enable-background="new 0 0 512 512" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m504.971 239.029-56.971-56.97v-98.059c0-46.317-37.682-84-84-84h-44c-13.255 0-24 10.745-24 24s10.745 24 24 24h44c19.851 0 36 16.149 36 36v108c0 6.365 2.529 12.47 7.029 16.971l47.03 47.029-47.029 47.029c-4.501 4.501-7.03 10.606-7.03 16.971v108c0 19.851-16.149 36-36 36h-44c-13.255 0-24 10.745-24 24s10.745 24 24 24h44c46.318 0 84-37.683 84-84v-98.059l56.971-56.971c9.372-9.372 9.372-24.568 0-33.941z"/><path d="m112 192v-108c0-19.851 16.149-36 36-36h44c13.255 0 24-10.745 24-24s-10.745-24-24-24h-44c-46.318 0-84 37.683-84 84v98.059l-56.971 56.97c-9.373 9.373-9.373 24.568 0 33.941l56.971 56.971v98.059c0 46.317 37.682 84 84 84h44c13.255 0 24-10.745 24-24s-10.745-24-24-24h-44c-19.851 0-36-16.149-36-36v-108c0-6.365-2.529-12.47-7.029-16.971l-47.03-47.029 47.029-47.029c4.501-4.501 7.03-10.606 7.03-16.971z"/></svg>

+ 1 - 0
static/icons/close.svg

@@ -0,0 +1 @@
+<svg enable-background="new 0 0 15.642 15.642" viewBox="0 0 15.642 15.642" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="m8.882 7.821 6.541-6.541c.293-.293.293-.768 0-1.061s-.768-.293-1.061 0l-6.541 6.541-6.541-6.54c-.293-.293-.768-.293-1.061 0s-.293.768 0 1.061l6.541 6.541-6.54 6.54c-.293.293-.293.768 0 1.061.147.146.338.22.53.22s.384-.073.53-.22l6.541-6.541 6.541 6.541c.147.146.338.22.53.22s.384-.073.53-.22c.293-.293.293-.768 0-1.061z"/></svg>

+ 66 - 0
static/icons/copy.svg

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+	<g>
+		<path d="M366.905,108.016h-141.91c-11.048,0-20.003,8.955-20.003,20.003s8.955,20.003,20.003,20.003h141.91
+			c11.048,0,20.003-8.955,20.003-20.003S377.952,108.016,366.905,108.016z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path d="M366.905,188.027h-141.91c-11.048,0-20.003,8.955-20.003,20.003s8.955,20.003,20.003,20.003h141.91
+			c11.047,0,20.003-8.955,20.003-20.003S377.953,188.027,366.905,188.027z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path d="M286.004,268.039h-61.009c-11.048,0-20.003,8.955-20.003,20.003c0,11.048,8.955,20.003,20.003,20.003h61.009
+			c11.048,0,20.003-8.955,20.003-20.003C306.007,276.994,297.052,268.039,286.004,268.039z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path d="M448.028,272.039c11.048,0,20.003-8.955,20.003-20.003V80.012C468.031,35.893,432.137,0,388.019,0H203.992
+			c-44.094,0-79.971,35.853-80.012,79.938c-44.118,0-80.012,35.893-80.012,80.012v272.039c0,44.118,35.893,80.012,80.012,80.012
+			h194.028c44.118,0,80.012-35.893,80.012-80.012v-0.608c39.414-4.938,70.01-38.662,70.01-79.389
+			c0-11.048-8.955-20.003-20.003-20.003c-11.048,0-20.003,8.955-20.003,20.003c0,22.054-17.942,40.001-39.996,40.006l-184.027,0.045
+			h-0.009c-10.685,0-20.73-4.16-28.285-11.715c-7.558-7.556-11.721-17.604-11.721-28.291V80.012
+			c0-22.059,17.947-40.006,40.006-40.006H388.02c22.059,0,40.006,17.947,40.006,40.006v172.025
+			C428.025,263.084,436.98,272.039,448.028,272.039z M203.992,432.047h0.02l154.002-0.038
+			c-0.012,22.049-17.954,39.984-40.006,39.984H123.981c-22.059,0-40.006-17.947-40.006-40.006V159.948
+			c0-22.059,17.947-40.006,40.006-40.006v232.094c0,21.375,8.325,41.471,23.441,56.583
+			C162.535,423.729,182.622,432.047,203.992,432.047z"/>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 1 - 0
static/icons/expand.svg

@@ -0,0 +1 @@
+<svg height="512pt" viewBox="0 0 512.016 512" width="512pt" xmlns="http://www.w3.org/2000/svg"><path d="m240 426.675781h-181.332031c-32.363281 0-58.667969-26.304687-58.667969-58.667969v-309.332031c0-32.363281 26.304688-58.6679685 58.667969-58.6679685h309.332031c32.363281 0 58.667969 26.3046875 58.667969 58.6679685v181.332031c0 8.832032-7.167969 16-16 16s-16-7.167968-16-16v-181.332031c0-14.699219-11.96875-26.667969-26.667969-26.667969h-309.332031c-14.699219 0-26.667969 11.96875-26.667969 26.667969v309.332031c0 14.699219 11.96875 26.667969 26.667969 26.667969h181.332031c8.832031 0 16 7.167969 16 16s-7.167969 16-16 16zm0 0"/><path d="m496 512.007812h-138.667969c-8.832031 0-16-7.167968-16-16 0-8.832031 7.167969-16 16-16h122.667969v-122.667968c0-8.832032 7.167969-16 16-16s16 7.167968 16 16v138.667968c0 8.832032-7.167969 16-16 16zm0 0"/><path d="m496 512.007812c-4.097656 0-8.191406-1.558593-11.308594-4.691406l-181.332031-181.335937c-6.25-6.25-6.25-16.382813 0-22.632813s16.382813-6.25 22.636719 0l181.332031 181.332032c6.25 6.25 6.25 16.382812 0 22.636718-3.136719 3.132813-7.230469 4.691406-11.328125 4.691406zm0 0"/></svg>

二進制
static/icons/favicon-16x16.png


二進制
static/icons/favicon-32x32.png


二進制
static/icons/favicon.ico


+ 1 - 0
static/icons/link.svg

@@ -0,0 +1 @@
+<svg enable-background="new 0 0 64 64" height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m19 40c1.104 0 2-.896 2-2s-.896-2-2-2c-3.86 0-7-3.14-7-7 0-1.873.728-3.628 2.059-4.95 1.313-1.322 3.068-2.05 4.941-2.05h10c3.86 0 7 3.14 7 7 0 .258-.015.509-.048.78-.174 1.574-.885 3.052-2.017 4.176-.532.54-1.137.974-1.797 1.289-.997.476-1.419 1.669-.944 2.666.476.996 1.669 1.419 2.667.943 1.08-.516 2.063-1.219 2.908-2.075 1.763-1.75 2.885-4.08 3.156-6.539.051-.413.075-.819.075-1.24 0-6.065-4.935-11-11-11h-10c-2.947 0-5.709 1.147-7.77 3.221-2.083 2.07-3.23 4.832-3.23 7.779 0 6.065 4.935 11 11 11z"/><path d="m45 28c-1.104 0-2 .896-2 2s.896 2 2 2c3.86 0 7 3.141 7 7 0 1.873-.728 3.628-2.059 4.95-1.313 1.322-3.068 2.05-4.941 2.05h-10c-3.86 0-7-3.141-7-7 0-.258.015-.509.048-.78.174-1.574.885-3.052 2.017-4.176.532-.54 1.136-.974 1.796-1.289.997-.476 1.419-1.67.944-2.667s-1.669-1.418-2.667-.944c-1.081.516-2.064 1.22-2.908 2.076-1.763 1.75-2.885 4.08-3.156 6.538-.05.415-.074.821-.074 1.242 0 6.065 4.935 11 11 11h10c2.946 0 5.709-1.147 7.77-3.221 2.083-2.07 3.23-4.833 3.23-7.779 0-6.065-4.935-11-11-11z"/></g></svg>

二進制
static/icons/logo.png


+ 23 - 0
static/icons/mail.svg

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 490.667 490.667" style="enable-background:new 0 0 490.667 490.667;" xml:space="preserve">
+<path style="fill:#FFD54F;" d="M480.427,32.642L301.014,162.348l-29.44,21.333c-15.596,11.522-36.884,11.522-52.48,0l-29.44-21.333
+	L10.027,32.855c9.991-13.972,26.13-22.241,43.307-22.187h384C454.385,10.683,470.401,18.85,480.427,32.642z"/>
+<g>
+	<path style="fill:#FFC107;" d="M10.027,32.855l179.627,129.493l-174.08,174.08C5.578,326.407-0.025,312.823,0,298.668V64.002
+		C-0.047,52.818,3.464,41.91,10.027,32.855z"/>
+	<path style="fill:#FFC107;" d="M490.667,64.002v234.667c0.025,14.155-5.577,27.739-15.573,37.76l-174.08-174.08L480.427,32.642
+		C487.088,41.74,490.674,52.725,490.667,64.002z"/>
+</g>
+<path style="fill:#455A64;" d="M320,394.668c-14.165,0-21.333-10.667-21.333-32c0.349-29.807-23.531-54.252-53.338-54.601
+	c-29.807-0.349-54.252,23.531-54.601,53.338c-0.349,29.807,23.531,54.252,53.338,54.601c15.975,0.187,31.212-6.713,41.609-18.842
+	c7.083,12.138,20.282,19.381,34.325,18.837c42.667,0,42.667-40.149,42.667-53.333c0.001-64.801-52.53-117.334-117.331-117.336
+	S128.002,297.862,128,362.664c-0.001,64.801,52.53,117.334,117.331,117.336c30.445,0.001,59.699-11.833,81.581-33
+	c4.236-4.124,4.326-10.9,0.203-15.136c-4.124-4.236-10.9-4.326-15.136-0.203l0,0c-38.161,36.807-98.935,35.709-135.742-2.452
+	s-35.709-98.935,2.452-135.742c38.161-36.807,98.935-35.709,135.742,2.452c17.284,17.92,26.93,41.854,26.903,66.75
+	C341.334,386.583,335.958,394.668,320,394.668z M245.334,394.668c-17.673,0-32-14.327-32-32s14.327-32,32-32s32,14.327,32,32
+	S263.007,394.668,245.334,394.668z"/>
+<path style="fill:#FFA000;" d="M301.014,162.348l-29.44,21.333c-15.596,11.522-36.884,11.522-52.48,0l-29.44-21.333l-174.08,174.08
+	c10.021,9.996,23.605,15.599,37.76,15.573H107.2c5.771-76.283,72.288-133.445,148.572-127.674
+	c68.259,5.164,122.51,59.415,127.674,127.674h53.888c14.155,0.025,27.739-5.577,37.76-15.573L301.014,162.348z"/>
+</svg>

二進制
static/icons/mstile-150x150.png


+ 66 - 0
static/icons/order.svg

@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+	<g>
+		<path d="M492,236H144.262c-11.046,0-20,8.954-20,20s8.954,20,20,20H492c11.046,0,20-8.954,20-20C512,244.954,503.046,236,492,236z
+			"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path d="M492,86H144.262c-11.046,0-20,8.954-20,20s8.954,20,20,20H492c11.046,0,20-8.954,20-20S503.046,86,492,86z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<path d="M492,386H144.262c-11.046,0-20,8.954-20,20c0,11.046,8.954,20,20,20H492c11.046,0,20-8.954,20-20
+			C512,394.954,503.046,386,492,386z"/>
+	</g>
+</g>
+<g>
+	<g>
+		<circle cx="27" cy="106" r="27"/>
+	</g>
+</g>
+<g>
+	<g>
+		<circle cx="27" cy="256" r="27"/>
+	</g>
+</g>
+<g>
+	<g>
+		<circle cx="27" cy="406" r="27"/>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 2 - 0
static/icons/search.svg

@@ -0,0 +1,2 @@
+
+<svg id="Layer_1" enable-background="new 0 0 496.999 496.999" height="512" viewBox="0 0 496.999 496.999" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m106.265 358.913-95.282 127.102c14.644 14.644 38.389 14.644 53.033 0l84.675-84.675z" fill="#1b74d6"/><path d="m127.478 380.126-84.675 84.675c-14.644 14.644-28.892 24.141-31.82 21.213-14.644-14.644-14.644-38.389 0-53.033l84.675-84.675z" fill="#1e8aff"/><path d="m111.193 325.807h75v45h-75z" fill="#ffeac3" transform="matrix(.707 -.707 .707 .707 -202.739 207.159)"/><path d="m143.335 279.419-13.86 32.403c-1.205 2.818-.575 6.086 1.592 8.253l45.858 45.857c2.167 2.167 5.435 2.798 8.253 1.592l32.403-13.86z" fill="#ffd17e"/><path d="m159.299 390.734-21.213-21.213-21.213 21.213 21.213 21.213c5.858 5.858 15.355 5.858 21.213 0s5.858-15.355 0-21.213z" fill="#ffb739"/><path d="m138.086 390.734c5.858-5.858 5.858-15.355 0-21.213l-31.82-31.82c-5.858-5.858-15.355-5.858-21.213 0s-5.858 15.355 0 21.213l31.82 31.82c5.858 5.858 15.355 5.858 21.213 0z" fill="#ffd17e"/><circle cx="308.499" cy="188.501" fill="#ffb739" r="188.5"/><path d="m308.499 30.001v317c87.537 0 158.5-70.963 158.5-158.5s-70.963-158.5-158.5-158.5z" fill="#dbebff"/><path d="m436.999 188.501c0-87.537-57.531-158.5-128.5-158.5-87.537 0-158.5 70.963-158.5 158.5s70.963 158.5 158.5 158.5c70.969 0 128.5-70.963 128.5-158.5z" fill="#fff"/></g></svg>

+ 19 - 0
static/icons/site.webmanifest

@@ -0,0 +1,19 @@
+{
+    "name": "",
+    "short_name": "",
+    "icons": [
+        {
+            "src": "/icons/android-chrome-192x192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+        },
+        {
+            "src": "/icons/android-chrome-256x256.png",
+            "sizes": "256x256",
+            "type": "image/png"
+        }
+    ],
+    "theme_color": "#ffffff",
+    "background_color": "#ffffff",
+    "display": "standalone"
+}

二進制
static/images/engineer.png


+ 117 - 0
static/images/logo.svg

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg3511"
+   version="1.1"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   width="640"
+   height="640"
+   viewBox="0 0 640 640"
+   sodipodi:docname="logo.svg"
+   inkscape:export-filename="/Users/adam/workingCopies/engimo/static/favicon.png"
+   inkscape:export-xdpi="2.25"
+   inkscape:export-ydpi="2.25">
+  <metadata
+     id="metadata3517">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs3515" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1848"
+     inkscape:window-height="1022"
+     id="namedview3513"
+     showgrid="false"
+     inkscape:zoom="1"
+     inkscape:cx="144.03509"
+     inkscape:cy="222.83487"
+     inkscape:window-x="72"
+     inkscape:window-y="21"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg3511" />
+  <path
+     style="fill:#44ccff;fill-opacity:1"
+     d="M 299.97126,638.83374 C 186.84352,631.36916 86.745294,565.59634 35.680934,465.17309 11.850948,418.30901 1.027719,372.99814 1.027719,320.09927 c 0,-52.89886 10.823229,-98.20973 34.653215,-145.07381 C 79.506044,88.838939 161.96472,26.051526 256.22126,7.09702 c 40.14812,-8.0735808 87.35187,-8.0735808 127.5,0 94.25653,18.954506 176.71521,81.741919 220.54032,167.92844 23.82999,46.86408 34.65321,92.17495 34.65321,145.07381 0,52.89887 -10.82322,98.20974 -34.65321,145.07382 -57.46231,113.00547 -178.3087,181.97336 -304.29032,173.66065 z"
+     id="path3470"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="ssssssssss" />
+  <path
+     style="fill:#000000;fill-opacity:0.20512821;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 453.96588,123.04741 -206.13385,75.64986 -67.75,318.07812 123.47852,122.25977 c 124.68252,6.78183 243.78493,-61.92977 300.70117,-173.86133 23.82999,-46.86408 34.65234,-92.17535 34.65234,-145.07422 0,-3.41593 -0.0459,-6.79919 -0.13672,-10.1543 z"
+     id="path3420"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="ccccsscc" />
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:49.40930557px;line-height:1.25;font-family:'DejaVu Math TeX Gyre';-inkscape-font-specification:'DejaVu Math TeX Gyre';letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.23523295"
+     x="125.68716"
+     y="480.00455"
+     id="text3715"
+     transform="scale(1.0034501,0.99656176)"><tspan
+       sodipodi:role="line"
+       x="125.68716"
+       y="480.00455"
+       id="tspan3717"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:515.74127197px;line-height:1017.83184814px;font-family:'DejaVu Math TeX Gyre';-inkscape-font-specification:'DejaVu Math TeX Gyre';letter-spacing:0.04275446px;word-spacing:0.01710179px;fill:#ffffff;fill-opacity:1;stroke-width:1.23523295"
+       dx="0.01710178">A</tspan></text>
+  <flowRoot
+     xml:space="preserve"
+     id="flowRoot3719"
+     style="fill:black;fill-opacity:1;stroke:none;font-family:'Tlwg Typist';font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:'Tlwg Typist';font-stretch:normal;font-variant:normal;"><flowRegion
+       id="flowRegion3721"
+       style="-inkscape-font-specification:'Tlwg Typist';font-family:'Tlwg Typist';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;"><rect
+         id="rect3723"
+         width="11.313708"
+         height="52.325901"
+         x="104.6518"
+         y="140.78261"
+         style="-inkscape-font-specification:'Tlwg Typist';font-family:'Tlwg Typist';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;" /></flowRegion><flowPara
+       id="flowPara3725" /></flowRoot>  <flowRoot
+     xml:space="preserve"
+     id="flowRoot3727"
+     style="fill:black;fill-opacity:1;stroke:none;font-family:'Tlwg Typist';font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:'Tlwg Typist';font-stretch:normal;font-variant:normal;"><flowRegion
+       id="flowRegion3729"
+       style="-inkscape-font-specification:'Tlwg Typist';font-family:'Tlwg Typist';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;"><rect
+         id="rect3731"
+         width="21.213203"
+         height="62.225395"
+         x="281.4285"
+         y="143.61104"
+         style="-inkscape-font-specification:'Tlwg Typist';font-family:'Tlwg Typist';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;" /></flowRegion><flowPara
+       id="flowPara3733" /></flowRoot>  <flowRoot
+     xml:space="preserve"
+     id="flowRoot3728"
+     style="fill:black;fill-opacity:1;stroke:none;font-family:'Tlwg Typist';font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:'Tlwg Typist';font-stretch:normal;font-variant:normal;"><flowRegion
+       id="flowRegion3730"
+       style="-inkscape-font-specification:'Tlwg Typist';font-family:'Tlwg Typist';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;"><rect
+         id="rect3732"
+         width="32"
+         height="42"
+         x="8"
+         y="311"
+         style="-inkscape-font-specification:'Tlwg Typist';font-family:'Tlwg Typist';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;" /></flowRegion><flowPara
+       id="flowPara3734" /></flowRoot></svg>

文件差異過大導致無法顯示
+ 0 - 0
static/images/top.svg


二進制
static/logo.png


+ 3 - 0
themes/hugo-curious/.gitignore

@@ -0,0 +1,3 @@
+.DS_Store
+/public
+/exampleSite/public

+ 22 - 0
themes/hugo-curious/LICENSE.md

@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2020 Chip Zoller and Dan Weru
+Copyright (c) 2021 Viet Anh Nguyen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 440 - 0
themes/hugo-curious/README.md

@@ -0,0 +1,440 @@
+# Hugo Curious
+
+The official theme for [AICurious Blog](https://aicurious.io) based on [Hugo Clarity](https://github.com/vietanhdev/hugo-curious). See a live demo at **[hugo-curious.aicurious.io](https://hugo-curious.aicurious.io)** or **[aicurious.io](https://aicurious.io)**.
+
+![Screenshot](images/screenshot.png)
+
+## Features
+
+* Blog with tagging and category options
+* Deeplinks
+* Native Image Lazy Loading
+* Customizable (see config)
+* Dark Mode (with UI controls for user preference setting)
+* Toggleable table of contents
+* Flexible image configuration
+* Logo alignment
+* Mobile support with configurable menu alignment
+* Syntax Highlighting
+* Rich code block functions
+* Math typing using MathJax
+* Auto TOC using tocbot
+* Search page
+* Contact form
+* Subscription form
+
+## Prerequisites
+
+Firstly, __ensure you have installed the [extended version of Hugo](https://github.com/gohugoio/hugo/releases)__. See installation steps from [Hugo's official docs](https://gohugo.io/getting-started/installing/).
+
+## Getting up and running
+
+Read the [prerequisites](#prerequisites) above and verify you're using the extended version of Hugo.
+### Option 1 (recommended)
+
+Generate a new Hugo site and add this theme as a Git submodule inside your themes folder:
+
+```bash
+hugo new site yourSiteName
+cd yourSiteName
+git init
+git submodule add https://github.com/vietanhdev/hugo-curious themes/hugo-curious
+cp -a themes/hugo-curious/exampleSite/* .
+```
+
+Then run
+
+```bash
+hugo server
+```
+
+Hurray!
+
+### Option 2 (Great for testing quickly)
+
+You can run your site directly from the `exampleSite`. To do so, use the following commands:
+
+```bash
+git clone https://github.com/vietanhdev/hugo-curious themes/hugo-curious
+cd hugo-curious/exampleSite/
+hugo server --themesDir ../..
+```
+
+> Although, option 2 is great for quick testing, it is somewhat problematic when you want to update your theme. You would need to be careful not to overwrite your changes.
+
+## Configuration
+
+If set, jump over to the `config.toml` file and start [configuring](#configuration) your site.
+
+This section will mainly cover settings that are unique to this theme. If something is not covered here (or elsewhere in this file), there's a good chance it is covered in [this Hugo docs page](https://gohugo.io/getting-started/configuration/#configuration-file).
+
+### Global Parameters
+
+These options set global values that some pages or all pages in the site use by default.
+
+| Parameter | Value Type | Overridable on Page |
+|:---- | ---- | ---- |
+| author | string | no |
+| twitter | string | no |
+| largeTwitterCard | boolean | no |
+| ga_analytics | string | no |
+| baidu_analytics | string | no |
+| plausible_analytics | boolean | no |
+| description | string | yes |
+| introDescription | string | no |
+| introURL | string/false | no |
+| numberOfTagsShown | integer | no |
+| fallBackOgImage | file path (string) | no |
+| codeMaxLines | integer | yes |
+| codeLineNumbers | boolean | yes |
+| mainSections | array/string | no |
+| centerLogo | boolean | no |
+| logo | file path (string) | no |
+| iconsDir | dir path (string) | no |
+| mobileNavigation | string | no |
+| figurePositionShow | boolean | yes |
+| customCSS | array of file path (string) | no |
+| customJS | array of file path (string) | no |
+| enforceLightMode | boolean | N/A |
+| enforceDarkMode | boolean | N/A |
+| titleSeparator| string | no |
+| showShare | boolean | yes |
+| comments | boolean | yes |
+| numberOfRecentPosts | integer | no |
+| numberOfFeaturedPosts | integer | no |
+| dateFormat | string | no |
+| enableMathNotation | boolean | yes |
+| customFonts | boolean | no |
+| since | integer | N/A |
+| rss_summary | boolean | N/A |
+| rss_summary_read_more_link | boolean | N/A |
+| footerLogo | string | N/A |
+| talkyardServerUrl | string | N/A |
+| talkyardScriptUrl | string | N/A |
+| contactFormSubmitUrl | string | N/A |
+| contactFormSubmitUrl | string | N/A |
+| buyMeACoffeeId | string | N/A |
+| mailChimpUrl | string | N/A |
+### Page Parameters
+
+These options can be set from a page [frontmatter](https://gohugo.io/content-management/front-matter#readout) or via [archetypes](https://gohugo.io/content-management/archetypes/#readout).
+
+| Parameter | Value Type | Overrides Global |
+|:---- | ---- | ---- |
+| title | string | N/A |
+| date | date | N/A |
+| description | string | N/A |
+| draft | boolean | N/A |
+| featured | boolean | N/A |
+| tags | array/string | N/A |
+| categories | array/string | N/A |
+| toc | boolean | N/A |
+| thumbnail | file path (string) | N/A |
+| featureImage | file path (string) | N/A |
+| shareImage | file path (string) | N/A |
+| codeMaxLines | integer | yes |
+| codeLineNumbers | boolean | yes |
+| comments | boolean | yes |
+| enableMathNotation | boolean | yes |
+| showDate | boolean | N/A |
+| showShare | boolean | N/A |
+| showReadTime | boolean | N/A |
+| sidebar | boolean | N/A |
+| singleColumn | boolean | N/A |
+| math | boolean | no |
+
+### Modify Menus
+
+#### Main Menu
+
+To add, remove, or reorganize top menu items, [edit the files here](https://github.com/vietanhdev/hugo-curious/tree/master/exampleSite/config/_default/menus). Specifically look for items with `[[main]]`.
+
+If you prefer the more [traditional approach](https://gohugo.io/content-management/menus/#readout), delete `content\config` folder and enter a [main menu entry](https://gohugo.io/content-management/menus/#add-non-content-entries-to-a-menut) inside the `config.toml` file
+
+#### Social media
+
+To edit your social media profile links, edit the files referenced above. Specifically, look for items with `[[social]]`
+
+If you wish to globally use a [large Twitter summary card](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/summary-card-with-large-image) when sharing posts, set the global parameter `largeTwitterCard` to `true`.
+
+### Web site analytics
+
+If using Google Analytics, configure the `ga_analytics` global parameter in your site with your ID.
+
+If using Baidu Analytics, configure the `baidu_analytics` global parameter in your site with your ID.
+
+If using Plausible Analytics, configure the `plausible_analytics` global parameters in your site with following.
+
+`enable` To enable plausible analytics change to `true`.
+
+`websiteDomain` Set domain name of your website, most cases same as your base URL this is required.
+
+`plausibleDomain`  Default is set to plausible.io, this parameter is only required if plausible is self-hosted.
+
+`scriptName`  Default is set to plausible, this parameter is only required if using a custom name for script.
+
+### Blog directory
+
+Edit `config.toml` and change the `mainSections` key. Values will be directories where the blogs reside.
+
+```yaml
+[params]
+...
+mainSections = ["posts", "docs", "blogs"]
+...
+```
+
+For more info, see the [Hugo docs](https://gohugo.io/functions/where/#mainsections).
+
+### Mobile menu positioning
+
+The navigation menu when mobile browsing can be configured in `config.toml` to open right or left depending on preference. The "hamburger" menu icon will always display in the upper right hand corner regardless.
+
+```yaml
+[params]
+...
+mobileNavigation = "left" # Mobile nav menu will open to the left of the screen.
+...
+```
+
+### Tags and Taxonomies
+
+#### Show number of tags
+
+The number of tags and taxonomies (including categories) that should be shown can be configured so that any more than this value will only be accessible when clicking the All Tags button. This is to ensure a large number of tags or categories can be easily managed without consuming excess screen real estate. Edit the `numberOfTagsShown` parameter and set accordingly.
+
+```yaml
+[params]
+...
+numberOfTagsShown = 14 # Applies for all other default & custom taxonomies. e.g categories, brands see https://gohugo.io/content-management/taxonomies#what-is-a-taxonomy
+...
+```
+
+#### Number of tags example
+
+![Tags](https://github.com/vietanhdev/hugo-curious/blob/master/images/tags.png)
+
+#### Add classes to images
+
+To add a class image to the left, append `::<classname>` to its alt text. You can also add multiple classes to an image separated by space. `::<classname1> <classname2>`.
+
+#### Article thumbnail image
+
+Blog articles can specify a thumbnail image which will be displayed to the left of the card on the home page. Thumbnails should be square (height:width ratio of `1:1`) and a suggested dimension of 150 x 150 pixels. They will be specified using a frontmatter variable as follows:
+
+```yaml
+...
+thumbnail: "images/2020-04/capv-overview/thumbnail.jpg"
+...
+```
+
+The thumbnail image will take precedence on opengraph share tags if the [shareImage](#share-image) parameter is not specified.
+
+#### Article featured image
+
+Each article can specify an image that appears at the top of the content. When sharing the blog article on social media, if a thumbnail is not specified, the featured image will be used as a fallback on opengraph share tags.
+
+```yaml
+...
+featureImage: "images/2020-04/capv-overview/featured.jpg"
+...
+```
+
+#### Share Image
+
+Sometimes, you want to explicitly set the image that will be used in the preview when you share an article on social media. You can do so in the front matter.
+
+```yaml
+...
+shareImage = "images/theImageToBeUsedOnShare.png"
+...
+```
+
+Note that if a share image is not specified, the order of precedence that will be used to determine which image applies is `thumbnail` => `featureImage` => `fallbackOgImage`. When sharing a link to the home page address of the site (as opposed to a specific article), the `fallbackOgImage` will be used.
+
+#### Align logo
+
+You can left align or center your site's logo.
+
+```yaml
+...
+centerLogo = true # Change to false to align left
+...
+```
+
+If no logo is specified, the title of the site will appear in its place.
+
+### Code
+
+#### Display line numbers
+
+Choose whether to display line numbers within a code block globally with the parameter `codeLineNumbers` setting to `true` or `false`.
+
+```yaml
+[params]
+...
+codeLineNumbers = true # Shows line numbers for all code blocks globally.
+...
+```
+
+#### Limit code block height
+
+You can globally control the number of lines which are displayed by default for your code blocks. Code which has the number of lines exceed this value will dynamically cause two code block expansion buttons to appear, allowing the user to expand to full length and contract. This is useful when sharing code or scripts with tens or hundreds of lines where you wish to control how many are displayed. Under params in `config.toml` file, add a value as follows:
+
+```yaml
+[params]
+...
+codeMaxLines = 10 # Maximum number of lines to be shown by default across all articles.
+...
+```
+
+> If the value already exists, change it to the desired number. This will apply globally.
+
+If you need more granular control, this parameter can be overridden at the blog article level. Add the same value to your article frontmatter as follows:
+
+```yaml
+...
+codeMaxLines = 15 # Maximum number of lines to be shown in code blocks in this blog post.
+...
+```
+
+If `codeMaxLines` is specified both in `config.toml` and in the article frontmatter, the value specified in the article frontmatter will apply to the given article. In the above example, the global default is `10` and yet the article value is `15` so code blocks in this article will auto-collapse after 15 lines.
+
+If `codeMaxLines` is not specified anywhere, an internal default value of `100` will be assumed.
+
+### Table of contents
+
+Each article can optionally have a table of contents (TOC) generated for it based on top-level links. By configuring the `toc` parameter in the article frontmatter and setting it to `true`, a TOC will be generated only for that article. The TOC will then render under the featured image.
+
+#### Table of contents (TOC) example
+
+![Article table of contents](images/toc.png)
+
+### Custom CSS and JS
+
+To minimize HTTP requests per page, we would recommend loading CSS styles and JavaScript helpers in single bundles. That is to say, one CSS file and one JavaScript file. Using Hugo minify functions, these files will be minified to optimize the size.
+
+Going by the above 👆🏻 reason, we recommend adding custom CSS and JS via these files:
+
+1. [`_override.sass`](https://github.com/vietanhdev/hugo-curious/blob/master/assets/sass/_override.sass).
+    This file should only be used to override sass & css variables e.g theme colors
+2. [`_custom.sass`](https://github.com/vietanhdev/hugo-curious/blob/master/assets/sass/_custom.sass).
+    This file should only be used to override everything else except sass & css variables.
+3. [`custom.js`](https://github.com/vietanhdev/hugo-curious/blob/master/assets/js/custom.js).
+
+> __Pro Tip__: Ensure that your changes are git trackable by creating these files outside the theme directory. That is, at the root level of your site's directory. See tree below.
+
+```
+├── yourSite
+│   ├── archetypes
+│   │   └── post.md
+│   ├── assets
+│   │   ├── js
+│   │   │   └── custom.js
+│   │   └── sass
+│   │       ├── _custom.sass
+│   │       └── _override.sass
+│   ├── config
+│   │   └── _default
+│   │       ├── config.toml
+│   │       ├── configTaxo.toml
+│   │       ├── languages.toml
+│   │       ├── markup.toml
+│   │       ├── menus
+│   │       │   ├── menu.en.toml
+│   │       │   └── menu.pt.toml
+│   │       └── params.toml
+│   ├── content
+│   │   ├── _index.md
+```
+
+However, sometimes you may need to load additional style or script files. In such cases, you can add custom `.css` and `.js` files by listing them in the `config.toml` file (see the snippet below). Similar to images, these paths should be relative to the `static` directory.
+
+```yaml
+[params]
+...
+customCSS = ["css/custom.css"] # Include custom CSS files
+customJS = ["js/custom.js"] # Include custom JS files
+...
+```
+
+### Forcing light or dark mode
+
+By default, sites authored using Clarity will load in the browser with the user's system-wide settings. I.e., if the underlying OS is set to dark mode, the site will automatically load in dark mode. Regardless of the default mode, a UI control switch exists to override the theme mode at the user's discretion.
+
+In order to override this behavior and force one mode or another, add either `enforceLightMode` or `enforceDarkMode` to your `config.toml` file. If neither value is present, add it.
+
+To enforce Light Mode by default, turn `enforceLightMode`  to `true`.
+
+To enforce Dark Mode by default, turn `enforceDarkMode`  to `true`
+
+```yaml
+[params]
+...
+enforceLightMode = true # Force the site to always load in light mode.
+...
+```
+
+Please note that you cannot enforce both modes at the same time. It wouldn't make sense, would it?
+
+> ⚠️ Please also note that the mode toggle UI will remain in place. That way, if a user prefers dark mode, they can have their way. The best of both worlds.
+
+### I18N
+
+This theme supports Multilingual (i18n / internationalization / translations)
+
+The `exampleSite` gives you some examples already.
+You may extend the multilingual functionality by following the [official documentation](https://gohugo.io/content-management/multilingual/).
+
+Things to consider in multilingual:
+
+* **supported languages** are configured in [config/_default/languages.toml](./exampleSite/config/_default/languages.toml)
+* **add new language support** by creating a new file inside [i18n](./i18n/) directory.
+  Check for missing translations using `hugo server --i18n-warnings`
+* **taxonomy** names (tags, categories, etc...) are translated in [i18n](./i18n/) as well (translate the key)
+* **menus** are translated manually in the config files [config/_default/menus/menu.xx.toml](./exampleSite/config/_default/menus/)
+* **menu's languages list** are semi-hardcoded. You may chose another text for the menu entry with [languageMenuName](./exampleSite/config/config.toml). Please, do better and create a PR for that.
+* **content** must be translated individually. Read the [official documentation](https://gohugo.io/content-management/multilingual/#translate-your-content) for information on how to do it.
+
+**note:** if you do NOT want any translations (thus removing the translations menu entry), then you must not have any translations.
+In the exampleSite that's as easy as removing the extra translations from the `config/_default/...` or executing this one-liner:
+
+```sh
+sed '/^\[pt]$/,$d' -i config/_default/languages.toml && rm config/_default/menus/menu.pt.toml
+```
+
+To change the values of translatable text, such as `read_more` or `copyright`, edit the values in the language file you are using in the [`i18n`](i18n) directory. If you have no such directory, copy the one inside the theme to your root Hugo directory.
+
+### Hooks
+
+Clarity provides some hooks for adding code on a page.
+
+If you need to add some code (CSS import, HTML meta or similar) to the head section on every page, add a partial to your project:
+
+```
+layouts/partials/hooks/head-end.html
+```
+
+Similar, if you want to add some code right before the body end (e.g fonts' links), create your own version of the following file:
+
+```
+layouts/partials/hooks/body-end.html
+```
+
+### Comments
+
+I replace the default comment system with Talkyard. Configure the comment system using following variables in `config.toml`.
+
+```
+talkyardServerUrl = ""
+talkyardScriptUrl = ""
+```
+### Contact form
+
+This theme use [formspree.io](https://formspree.io/) as the contact form service. Update `contactFormSubmitUrl` to your form URL.
+### Subscription form
+
+This theme use [MailChimp](https://mailchimp.com/) for the subscription form. Update `mailChimpUrl` to your MailChimp URL.
+### MathJax
+
+To write Math equation, put `math: true` in the frontmatter of each post to enable MathJax.

+ 22 - 0
themes/hugo-curious/archetypes/post.md

@@ -0,0 +1,22 @@
+---
+title: "{{ replace .Name "-" " " | title }}" # Title of the blog post.
+date: {{ .Date }} # Date of post creation.
+description: "Article description." # Description used for search engine.
+featured: true # Sets if post is a featured post, making it appear on the sidebar. A featured post won't be listed on the sidebar if it's the current page
+draft: true # Sets whether to render this page. Draft of true will not be rendered.
+toc: false # Controls if a table of contents should be generated for first-level links automatically.
+# menu: main
+featureImage: "/images/path/file.jpg" # Sets featured image on blog post.
+thumbnail: "/images/path/thumbnail.png" # Sets thumbnail image appearing inside card on homepage.
+shareImage: "/images/path/share.png" # Designate a separate image for social media sharing.
+codeMaxLines: 10 # Override global value for how many lines within a code block before auto-collapsing.
+codeLineNumbers: false # Override global value for showing of line numbers within code block.
+figurePositionShow: true # Override global value for showing the figure label.
+categories:
+  - Technology
+tags:
+  - Tag_name1
+  - Tag_name2
+---
+
+**Insert Lead paragraph here.**

+ 277 - 0
themes/hugo-curious/assets/js/code.js

@@ -0,0 +1,277 @@
+const codeActionButtons = [
+  {
+    icon: 'copy', 
+    id: 'copy',
+    title: 'Copy Code',
+    show: true
+  },
+  {
+    icon: 'order',
+    id: 'lines',
+    title: 'Toggle Line Numbers',
+    show: true 
+  },
+  {
+    icon: 'carly',
+    id: 'wrap',
+    title: 'Toggle Line Wrap',
+    show: false
+  },
+  {
+    icon: 'expand',
+    id: 'expand',
+    title: 'Toggle code block expand',
+    show: false 
+  }
+];
+
+const body = elem('body');
+const maxLines = parseInt(body.dataset.code);
+const copyId = 'panel_copy';
+const wrapId = 'panel_wrap';
+const linesId = 'panel_lines';
+const panelExpand = 'panel_expand';
+const panelExpanded = 'panel_expanded';
+const panelHide = 'panel_hide';
+const panelFrom = 'panel_from';
+const panelBox = 'panel_box';
+const fullHeight = 'initial';
+const highlightWrap = 'highlight_wrap'
+
+function wrapOrphanedPreElements() {
+  const pres = elems('pre');
+  Array.from(pres).forEach(function(pre){
+    const parent = pre.parentNode;
+    const isOrpaned = !containsClass(parent, 'highlight');
+    if(isOrpaned) {
+      const preWrapper = createEl();
+      preWrapper.className = 'highlight';
+      const outerWrapper = createEl();
+      outerWrapper.className = highlightWrap;
+      wrapEl(pre, preWrapper);
+      wrapEl(preWrapper, outerWrapper);
+    }
+  })
+  /*
+  @Todo
+  1. Add UI control to orphaned blocks
+  */
+}
+
+wrapOrphanedPreElements();
+
+function codeBlocks() {
+  const markedCodeBlocks = elems('code');
+  const blocks = Array.from(markedCodeBlocks).filter(function(block){
+    return hasClasses(block) && !Array.from(block.classList).includes('noClass');
+  }).map(function(block){
+    return block
+  });
+  return blocks;
+}
+
+function codeBlockFits(block) {
+  // return false if codeblock overflows
+  const blockWidth = block.offsetWidth;
+  const highlightBlockWidth = block.parentNode.parentNode.offsetWidth;
+  return blockWidth <= highlightBlockWidth ? true : false;
+}
+
+function maxHeightIsSet(elem) {
+  let maxHeight = elem.style.maxHeight;
+  return maxHeight.includes('px')
+}
+
+function restrainCodeBlockHeight(lines) {
+  const lastLine = lines[maxLines-1];
+  let maxCodeBlockHeight = fullHeight;
+  if(lastLine) {
+    const lastLinePos = lastLine.offsetTop;
+    if(lastLinePos !== 0) {
+      maxCodeBlockHeight = `${lastLinePos}px`;
+      const codeBlock = lines[0].parentNode;
+      const outerBlock = codeBlock.closest('.highlight');
+      const isExpanded = containsClass(outerBlock, panelExpanded);
+      if(!isExpanded) {
+        codeBlock.dataset.height = maxCodeBlockHeight;
+        codeBlock.style.maxHeight = maxCodeBlockHeight;
+      }
+    }
+  }
+}
+
+const blocks = codeBlocks();
+
+function collapseCodeBlock(block) {
+  const lines = elems('.ln', block);
+  const codeLines = lines.length;
+  if (codeLines > maxLines) {
+    const expandDot = createEl()
+    pushClass(expandDot, panelExpand);
+    pushClass(expandDot, panelFrom);
+    expandDot.title = "Toggle code block expand";
+    expandDot.textContent = "...";
+    const outerBlock = block.closest('.highlight');
+    window.setTimeout(function(){
+      const expandIcon = outerBlock.nextElementSibling.lastElementChild;
+      deleteClass(expandIcon, panelHide);
+    }, 150)
+
+    restrainCodeBlockHeight(lines);
+    const highlightElement = block.parentNode.parentNode;
+    highlightElement.appendChild(expandDot);
+  }
+}
+
+blocks.forEach(function(block){
+  collapseCodeBlock(block);
+})
+
+function actionPanel() {
+  const panel = createEl();
+  panel.className = panelBox;
+
+  codeActionButtons.forEach(function(button) {
+    // create button
+    const btn = createEl('a');
+    btn.href = '#';
+    btn.title = button.title;
+    btn.className = `icon panel_icon panel_${button.id}`;
+    button.show ? false : pushClass(btn, panelHide);
+    // load icon inside button
+    loadSvg(button.icon, btn);
+    // append button on panel
+    panel.appendChild(btn);
+  });
+
+  return panel;
+}
+
+function toggleLineNumbers(elems) {
+  elems.forEach(function (elem, index) {
+    // mark the code element when there are no lines
+    modifyClass(elem, 'pre_nolines')
+  });
+  restrainCodeBlockHeight(elems);
+}
+
+function toggleLineWrap(elem) {
+  modifyClass(elem, 'pre_wrap');
+  // retain max number of code lines on line wrap
+  const lines = elems('.ln', elem);
+  restrainCodeBlockHeight(lines);
+}
+
+function copyCode(codeElement) {
+  lineNumbers = elems('.ln', codeElement);
+  // remove line numbers before copying
+  if(lineNumbers.length) {
+    lineNumbers.forEach(function(line){
+      line.remove();
+    });
+  }
+
+  const codeToCopy = codeElement.textContent;
+  // copy code
+  copyToClipboard(codeToCopy);
+}
+
+function disableCodeLineNumbers(block){
+  const lines = elems('.ln', block)
+  toggleLineNumbers(lines);
+}
+
+(function codeActions(){
+  const blocks = codeBlocks();
+
+  const highlightWrapId = highlightWrap;
+  blocks.forEach(function(block){
+    // disable line numbers if disabled globally
+    const showLines = elem('body').dataset.lines;
+    parseBoolean(showLines) === false ? disableCodeLineNumbers(block) : false;
+
+    const highlightElement = block.parentNode.parentNode;
+    // wrap code block in a div
+    const highlightWrapper = createEl();
+    highlightWrapper.className = highlightWrapId;
+    wrapEl(highlightElement, highlightWrapper);
+
+    const panel = actionPanel();
+    // show wrap icon only if the code block needs wrapping
+    const wrapIcon = elem(`.${wrapId}`, panel);
+    codeBlockFits(block) ? false : deleteClass(wrapIcon, panelHide);
+
+    // append buttons 
+    highlightWrapper.appendChild(panel);
+  });
+
+  function isItem(target, id) {
+    // if is item or within item
+    return target.matches(`.${id}`) || target.closest(`.${id}`);
+  }
+
+  function showActive(target, targetClass,activeClass = 'active') {
+    const active = activeClass;
+    const targetElement = target.matches(`.${targetClass}`) ? target : target.closest(`.${targetClass}`);
+
+    deleteClass(targetElement, active);
+    setTimeout(function() {
+      modifyClass(targetElement, active)
+    }, 50)
+  }
+
+  doc.addEventListener('click', function(event){
+    // copy code block
+    const target = event.target;
+    const isCopyIcon = isItem(target, copyId);
+    const isWrapIcon = isItem(target, wrapId);
+    const isLinesIcon = isItem(target, linesId);
+    const isExpandIcon = isItem(target, panelExpand);
+    const isActionable = isCopyIcon || isWrapIcon || isLinesIcon || isExpandIcon;
+
+    if(isActionable) {
+      event.preventDefault();
+      showActive(target, 'icon');
+      const codeElement = target.closest(`.${highlightWrapId}`).firstElementChild.firstElementChild;
+      let lineNumbers = elems('.ln', codeElement);
+
+      isWrapIcon ? toggleLineWrap(codeElement) : false;
+
+      isLinesIcon ? toggleLineNumbers(lineNumbers) : false;
+
+      if (isExpandIcon) {
+        let thisCodeBlock = codeElement.firstElementChild;
+        const outerBlock = thisCodeBlock.closest('.highlight');
+        if(maxHeightIsSet(thisCodeBlock)) {
+          thisCodeBlock.style.maxHeight = fullHeight;
+          // mark code block as expanded
+          pushClass(outerBlock, panelExpanded)
+        } else {
+          thisCodeBlock.style.maxHeight = thisCodeBlock.dataset.height;
+          // unmark code block as expanded
+          deleteClass(outerBlock, panelExpanded)
+        }
+      }
+
+      if(isCopyIcon) {
+        // clone code element
+        const codeElementClone = codeElement.cloneNode(true);
+        copyCode(codeElementClone);
+      }
+    }
+  });
+
+  (function addLangLabel() {
+    const blocks = codeBlocks();
+    blocks.forEach(function(block){
+      let label = block.dataset.lang;
+      label = label === 'sh' ? 'bash' : label;
+      if(label !== "fallback") {
+        const labelEl = createEl();
+        labelEl.textContent = label;
+        pushClass(labelEl, 'lang');
+        block.closest(`.${highlightWrap}`).appendChild(labelEl);
+      }
+    });
+  })();
+})();

+ 13 - 0
themes/hugo-curious/assets/js/custom.js

@@ -0,0 +1,13 @@
+// add custom js in this file
+
+// Auto hide navbar when scrolling down
+var prevScrollpos = window.pageYOffset;
+window.onscroll = function() {
+var currentScrollPos = window.pageYOffset;
+  if (prevScrollpos > currentScrollPos) {
+    document.getElementById("top-navbar").style.top = "0";
+  } else {
+    document.getElementById("top-navbar").style.top = "-50px";
+  }
+  prevScrollpos = currentScrollPos;
+}

+ 196 - 0
themes/hugo-curious/assets/js/functions.js

@@ -0,0 +1,196 @@
+// global variables
+const doc = document.documentElement;
+const inline = ":inline";
+// variables read from your hugo configuration
+const parentURL = '{{ absURL "" }}';
+
+function isObj(obj) {
+  return (obj && typeof obj === 'object' && obj !== null) ? true : false;
+}
+
+function createEl(element = 'div') {
+  return document.createElement(element);
+}
+
+function elem(selector, parent = document){
+  let elem = parent.querySelector(selector);
+  return elem != false ? elem : false;
+}
+
+function elems(selector, parent = document) {
+  let elems = parent.querySelectorAll(selector);
+  return elems.length ? elems : false;
+}
+
+function pushClass(el, targetClass) {
+  if (isObj(el) && targetClass) {
+    elClass = el.classList;
+    elClass.contains(targetClass) ? false : elClass.add(targetClass);
+  }
+}
+
+function hasClasses(el) {
+  if(isObj(el)) {
+    const classes = el.classList;
+    return classes.length
+  }
+}
+
+(function markInlineCodeTags(){
+  const codeBlocks = elems('code');
+  if(codeBlocks) {
+    codeBlocks.forEach(function(codeBlock){
+      hasClasses(codeBlock) ? false: pushClass(codeBlock, 'noClass');
+    });
+  }
+})();
+
+function deleteClass(el, targetClass) {
+  if (isObj(el) && targetClass) {
+    elClass = el.classList;
+    elClass.contains(targetClass) ? elClass.remove(targetClass) : false;
+  }
+}
+
+function modifyClass(el, targetClass) {
+  if (isObj(el) && targetClass) {
+    elClass = el.classList;
+    elClass.contains(targetClass) ? elClass.remove(targetClass) : elClass.add(targetClass);
+  }
+}
+
+function containsClass(el, targetClass) {
+  if (isObj(el) && targetClass && el !== document ) {
+    return el.classList.contains(targetClass) ? true : false;
+  }
+}
+
+function elemAttribute(elem, attr, value = null) {
+  if (value) {
+    elem.setAttribute(attr, value);
+  } else {
+    value = elem.getAttribute(attr);
+    return value ? value : false;
+  }
+}
+
+function wrapEl(el, wrapper) {
+  el.parentNode.insertBefore(wrapper, el);
+  wrapper.appendChild(el);
+}
+
+function deleteChars(str, subs) {
+  let newStr = str;
+  if (Array.isArray(subs)) {
+    for (let i = 0; i < subs.length; i++) {
+      newStr = newStr.replace(subs[i], '');
+    }
+  } else {
+    newStr = newStr.replace(subs, '');
+  }
+  return newStr;
+}
+
+function isBlank(str) {
+  return (!str || str.trim().length === 0);
+}
+
+function isMatch(element, selectors) {
+  if(isObj(element)) {
+    if(selectors.isArray) {
+      let matching = selectors.map(function(selector){
+        return element.matches(selector)
+      })
+      return matching.includes(true);
+    }
+    return element.matches(selectors)
+  }
+}
+
+function copyToClipboard(str) {
+  let copy, selection, selected;
+  copy = createEl('textarea');
+  copy.value = str;
+  copy.setAttribute('readonly', '');
+  copy.style.position = 'absolute';
+  copy.style.left = '-9999px';
+  selection = document.getSelection();
+  doc.appendChild(copy);
+  // check if there is any selected content
+  selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;
+  copy.select();
+  document.execCommand('copy');
+  doc.removeChild(copy);
+  if (selected) { // if a selection existed before copying
+    selection.removeAllRanges(); // unselect existing selection
+    selection.addRange(selected); // restore the original selection
+  }
+}
+
+function loadSvg(file, parent, path = 'icons/') {
+  const link = `${parentURL}${path}${file}.svg`;
+  fetch(link)
+  .then((response) => {
+    return response.text();
+  })
+  .then((data) => {
+    parent.innerHTML = data;
+  });
+}
+
+function getMobileOperatingSystem() {
+  let userAgent = navigator.userAgent || navigator.vendor || window.opera;
+
+  if (/android/i.test(userAgent)) {
+    return "Android";
+  }
+
+  if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {
+    return "iOS";
+  }
+
+  return "unknown";
+}
+
+function horizontalSwipe(element, func, direction) {
+  // call func if result of swipeDirection() 👇🏻 is equal to direction
+  let touchstartX = 0;
+  let touchendX = 0;
+  let swipeDirection = null;
+
+  function handleGesure() {
+    return (touchendX + 50 < touchstartX) ? 'left' : (touchendX < touchstartX + 50) ? 'right' : false;
+  }
+
+  element.addEventListener('touchstart', e => {
+    touchstartX = e.changedTouches[0].screenX
+  });
+
+  element.addEventListener('touchend', e => {
+    touchendX = e.changedTouches[0].screenX
+    swipeDirection = handleGesure()
+    swipeDirection === direction ? func() : false;
+  });
+
+}
+
+function parseBoolean(string) {
+  let bool;
+  string = string.trim().toLowerCase();
+  switch (string) {
+    case 'true':
+      return true;
+    case 'false':
+      return false;
+    default:
+      return undefined;
+  }
+};
+
+(function() {
+  const bodyElement = elem('body');
+  const platform = navigator.platform.toLowerCase();
+  if(platform.includes("win")) {
+    pushClass(bodyElement, 'windows');
+  }
+})();

文件差異過大導致無法顯示
+ 1 - 0
themes/hugo-curious/assets/js/highlight.js


+ 405 - 0
themes/hugo-curious/assets/js/index.js

@@ -0,0 +1,405 @@
+(function toggleColorModes(){
+  const light = 'lit';
+  const dark = 'dim';
+  const storageKey = 'colorMode';
+  const key = '--color-mode';
+  const data = 'data-mode';
+  const bank = window.localStorage;
+
+  function currentMode() {
+    let acceptableChars = light + dark;
+    acceptableChars = [...acceptableChars];
+    let mode = getComputedStyle(doc).getPropertyValue(key).replace(/\"/g, '').trim();
+
+    mode = [...mode].filter(function(letter){
+      return acceptableChars.includes(letter);
+    });
+
+    return mode.join('');
+  }
+
+  function changeMode(isDarkMode) {
+    if(isDarkMode) {
+      bank.setItem(storageKey, light)
+      elemAttribute(doc, data, light);
+    } else {
+      bank.setItem(storageKey, dark);
+      elemAttribute(doc, data, dark);
+    }
+  }
+
+  function setUserColorMode(mode = false) {
+    const isDarkMode = currentMode() == dark;
+    const storedMode = bank.getItem(storageKey);
+    if(storedMode) {
+      if(mode) {
+        changeMode(isDarkMode);
+      } else {
+        elemAttribute(doc, data, storedMode);
+      }
+    } else {
+      if(mode === true) {
+        changeMode(isDarkMode) 
+      }
+    }
+  }
+
+  setUserColorMode();
+
+  doc.addEventListener('click', function(event) {
+    let target = event.target;
+    let modeClass = 'color_choice';
+    let animateClass = 'color_animate';
+    let isModeToggle = containsClass(target, modeClass);
+    if(isModeToggle) {
+      pushClass(target, animateClass);
+      setUserColorMode(true);
+    }
+  });
+})();
+
+function fileClosure(){
+
+  (function updateDate() {
+    const date = new Date();
+    const year = date.getFullYear();
+    const yearEl = elem('.year');
+    yearEl ? yearEl.innerHTML = year : false;
+  })();
+
+  (function makeExternalLinks(){
+    let links = elems('a');
+    if(links) {
+      Array.from(links).forEach(function(link){
+        let target, rel, blank, noopener, attr1, attr2, url, isExternal;
+        url = elemAttribute(link, 'href');
+        isExternal = (url && typeof url == 'string' && url.startsWith('http')) && !url.startsWith(parentURL) ? true : false;
+        if(isExternal) {
+          target = 'target';
+          rel = 'rel';
+          blank = '_blank';
+          noopener = 'noopener';
+          attr1 = elemAttribute(link, target);
+          attr2 = elemAttribute(link, noopener);
+
+          attr1 ? false : elemAttribute(link, target, blank);
+          attr2 ? false : elemAttribute(link, rel, noopener);
+        }
+      });
+    }
+  })();
+
+  let headingNodes = [], results, link, icon, current, id,
+  tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
+
+  current = document.URL;
+
+  tags.forEach(function(tag){
+    const article = elem('.post_content');
+    if (article) {
+      results = article.getElementsByTagName(tag);
+      Array.prototype.push.apply(headingNodes, results);
+    }
+  });
+
+  headingNodes.forEach(function(node){
+    link = createEl('a');
+    loadSvg('link', link);
+    link.className = 'link icon';
+    id = node.getAttribute('id');
+    if(id) {
+      link.href = `${current}#${id}`;
+      node.appendChild(link);
+      pushClass(node, 'link_owner');
+    }
+  });
+
+  let inlineListItems = elems('ol li');
+  if(inlineListItems) {
+    inlineListItems.forEach(function(listItem){
+      let firstChild = listItem.children[0]
+      let containsHeading = isMatch(firstChild, tags);
+      containsHeading ? pushClass(listItem, 'align') : false;
+    })
+  }
+
+  function copyFeedback(parent) {
+    const copyText = document.createElement('div');
+    const yanked = 'link_yanked';
+    copyText.classList.add(yanked);
+    copyText.innerText = 'Link Copied';
+    if(!elem(`.${yanked}`, parent)) {
+      parent.appendChild(copyText);
+      setTimeout(function() { 
+        parent.removeChild(copyText)
+      }, 3000);
+    }
+  }
+
+  (function copyHeadingLink() {
+    let deeplink, deeplinks, newLink, parent, target;
+    deeplink = 'link';
+    deeplinks = elems(`.${deeplink}`);
+    if(deeplinks) {
+      document.addEventListener('click', function(event)
+      {
+        target = event.target;
+        parent = target.parentNode;
+        if (target && containsClass(target, deeplink) || containsClass(parent, deeplink)) {
+          event.preventDefault();
+          newLink = target.href != undefined ? target.href : target.parentNode.href;
+          copyToClipboard(newLink);
+          target.href != undefined ?  copyFeedback(target) : copyFeedback(target.parentNode);
+        }
+      });
+    }
+  })();
+
+  (function copyLinkToShare() {
+    let  copy, copied, excerpt, isCopyIcon, isInExcerpt, link, postCopy, postLink, target;
+    copy = 'copy';
+    copied = 'copy_done';
+    excerpt = 'excerpt';
+    postCopy = 'post_copy';
+    postLink = 'post_card';
+
+    doc.addEventListener('click', function(event) {
+      target = event.target;
+      isCopyIcon = containsClass(target, copy);
+      let isWithinCopyIcon = target.closest(`.${copy}`);
+      if (isCopyIcon || isWithinCopyIcon) {
+        let icon = isCopyIcon ? isCopyIcon : isWithinCopyIcon;
+        isInExcerpt =  containsClass(icon, postCopy);
+        if (isInExcerpt) {
+          link = target.closest(`.${excerpt}`).previousElementSibling;
+          link = containsClass(link, postLink)? elemAttribute(link, 'href') : false;
+        } else {
+          link = window.location.href;
+        }
+        if(link) {
+          copyToClipboard(link);
+          pushClass(icon, copied);
+        }
+      }
+      const yankLink = '.link_yank';
+      const isCopyLink = target.matches(yankLink);
+      const isCopyLinkIcon = target.closest(yankLink);
+
+      if(isCopyLink || isCopyLinkIcon) {
+        event.preventDefault();
+        const yankContent = isCopyLinkIcon ? elemAttribute(target.closest(yankLink), 'href') : elemAttribute(target, 'href');
+        copyToClipboard(yankContent);
+        isCopyLink ?  copyFeedback(target) : copyFeedback(target.parentNode);
+      }
+    });
+  })();
+
+  (function hideAside(){
+    let aside, title, posts;
+    aside = elem('.aside');
+    title = aside ? aside.previousElementSibling : null;
+    if(aside && title.nodeName.toLowerCase() === 'h3') {
+      posts = Array.from(aside.children);
+      posts.length < 1 ? title.remove() : false;
+    }
+  })();
+
+  (function goBack() {
+    let backBtn = elem('.btn_back');
+    let history = window.history;
+    if (backBtn) {
+      backBtn.addEventListener('click', function(){
+        history.back();
+      });
+    }
+  })();
+
+  function showingImagePosition(){
+    // whether or not to track image position for non-linear images within the article body element.
+    const thisPage = document.documentElement;
+    let showImagePositionOnPage = thisPage.dataset.figures;
+
+    if(showImagePositionOnPage) {
+      showImagePosition = showImagePositionOnPage;
+    }
+    return showImagePosition === "true" ? true : false;
+  }
+
+  function largeImages(baseParent, images = []) {
+    if(images) {
+      images.forEach(function(image) {
+        image.addEventListener('load', function(){
+          let actualWidth = image.naturalWidth;
+          let parentWidth = baseParent.offsetWidth;
+          let actionableRatio = actualWidth / parentWidth;
+
+          if (actionableRatio > 1) {
+            pushClass(image, "image-scalable");
+            image.dataset.scale = actionableRatio;
+            let figure = createEl('figure');
+            wrapEl(image, figure)
+          }
+        });
+      })
+    }
+  }
+
+  doc.addEventListener('click', function(event) {
+    let target = event.target;
+    isClickableImage = target.matches('.image-scalable');
+
+    let isFigure = target.matches('figure');
+
+    if(isFigure) {
+      let hasClickableImage = containsClass(target.children[0], 'image-scalable');
+      if(hasClickableImage) {
+        modifyClass(target, 'image-scale');
+      }
+    }
+
+    if(isClickableImage) {
+      let figure = target.parentNode;
+      modifyClass(figure, 'image-scale');
+    }
+  });
+
+  const tables = elems('table');
+  if (tables) {
+    const scrollable = 'scrollable';
+    tables.forEach(function(table) {
+      const wrapper = createEl();
+      wrapper.className = scrollable;
+      wrapEl(table, wrapper);
+    });
+  }
+
+  function toggleTags(target = null) {
+    const tagsButtonClass = 'post_tags_toggle';
+    const tagsButtonClass2 = 'tags_hide';
+    const tagsShowClass = 'jswidgetopen';
+    const postTagsWrapper = elem(`.${tagsShowClass}`);
+    target = target === null ? postTagsWrapper : target;
+    const showingAllTags = target.matches(`.${tagsShowClass}`);
+    const isExandButton = target.matches(`.${tagsButtonClass}`);
+    const isCloseButton = target.matches(`.${tagsButtonClass2}`) || target.closest(`.${tagsButtonClass2}`);
+    const isButton =  isExandButton || isCloseButton;
+    const isActionable = isButton || showingAllTags;
+
+    if(isActionable) {
+      if(isButton) {
+        if(isExandButton) {
+          let allTagsWrapper = target.nextElementSibling 
+          pushClass(allTagsWrapper, tagsShowClass); 
+        } else {
+          deleteClass(postTagsWrapper, tagsShowClass);
+        }
+      } else {
+        isActionable ? deleteClass(target, tagsShowClass) : false;
+      }
+    }
+  }
+
+  (function showAllPostTags(){
+    doc.addEventListener('click', function(event){
+      const target = event.target;
+      toggleTags(target)
+    });
+
+    horizontalSwipe(doc, toggleTags, 'left');
+  })();
+
+  (function navToggle() {
+    doc.addEventListener('click', function(event){
+      const target = event.target;
+      const open = 'jsopen';
+      const navCloseIconClass = '.nav_close';
+      const navClose = elem(navCloseIconClass);
+      const isNavToggle = target.matches(navCloseIconClass) || target.closest(navCloseIconClass);
+      const harmburgerIcon = navClose.firstElementChild.firstElementChild;
+      if(isNavToggle) {
+        event.preventDefault();
+        modifyClass(doc, open);
+        modifyClass(harmburgerIcon, 'isopen');
+      }
+
+      if(!target.closest('.nav') && elem(`.${open}`)) {
+        modifyClass(doc, open);
+        let navIsOpen = containsClass(doc, open);
+        !navIsOpen  ? modifyClass(harmburgerIcon, 'isopen') : false;
+      }
+
+      const navItem = 'nav_item';
+      const navSub = 'nav_sub';
+      const showSub = 'nav_open';
+      const isNavItem = target.matches(`.${navItem}`);
+      const isNavItemIcon = target.closest(`.${navItem}`)
+
+      if(isNavItem || isNavItemIcon) {
+        const thisItem = isNavItem ? target : isNavItemIcon;
+        const hasNext = thisItem.nextElementSibling
+        const hasSubNav = hasNext ? hasNext.matches(`.${navSub}`) : null;
+        if (hasSubNav) {
+          event.preventDefault();
+          Array.from(thisItem.parentNode.parentNode.children).forEach(function(item){
+            const targetItem = item.firstElementChild;
+             targetItem != thisItem ? deleteClass(targetItem, showSub) : false;
+          });
+          modifyClass(thisItem, showSub);
+        }
+      }
+    });
+  })();
+
+  function isMobileDevice() {
+    const agent = navigator.userAgent.toLowerCase();
+    const isMobile = agent.includes('android') || agent.includes('iphone');
+    return  isMobile;
+  };
+
+  (function ifiOS(){
+    // modify backto top button
+    const backToTopButton = elem('.to_top');
+    const thisOS = getMobileOperatingSystem();
+    const ios = 'ios';
+    if(backToTopButton && thisOS === 'iOS') {
+      pushClass(backToTopButton, ios);
+    }
+    if(!isMobileDevice()){
+      backToTopButton.style.right = `100px`;
+    }
+  })();
+
+  (function sortTags() {
+    doc.addEventListener('click', function(event){
+      const active = 'active';
+      const target = event.target;
+      const isSortButton = target.matches('.tags_sort') || target.matches('.tags_sort span');
+      if(isSortButton) {
+        const tagsList = target.closest('.tags_list');
+        const sortButton = elem('.tags_sort', tagsList);
+        modifyClass(sortButton, 'sorted');
+        const tags = elems('.post_tag', tagsList);
+        Array.from(tags).forEach(function(tag){
+          const order = tag.dataset.position;
+          const reverseSorting = containsClass(tag, active);
+          tag.style.order = reverseSorting ? 0 : -order;
+          modifyClass(tag, active);
+        })
+      }
+    })
+  })();
+
+  (function shareViaLinkedin() {
+    doc.addEventListener('click', function(event){
+      const linkedin = '.linkedin';
+      const target = event.target;
+      if(target.matches(linkedin) || target.closest(linkedin)) {
+        window.open('http://www.linkedin.com/shareArticle?mini=true&url='+encodeURIComponent(window.location.href), '', 'left=0,top=0,width=650,height=420,personalbar=0,toolbar=0,scrollbars=0,resizable=0');
+      }
+    });
+  })();
+
+  // add new code above this line
+}
+
+window.addEventListener('load', fileClosure());

+ 151 - 0
themes/hugo-curious/assets/sass/_base.sass

@@ -0,0 +1,151 @@
+*
+  box-sizing: border-box
+  -webkit-appearance: none
+  margin: 0
+  padding: 0
+
+body, html
+  scroll-behavior: smooth
+  -webkit-text-size-adjust: 100%
+  font-kerning: normal
+  -webkit-font-feature-settings: "kern" 1
+  text-rendering: optimizeLegibility
+  text-rendering: geometricPrecision
+  -webkit-text-size-adjust: 100%
+  font-size: 100%
+  &::-webkit-scrollbar-corner
+    background-color: transparent
+body
+  font-family: var(--font)
+  background: var(--choice-bg)
+  color: var(--text)
+  font-size: 1.25rem
+  line-height: 1.5
+  // max-width: 1100px
+  margin: 0 auto
+  position: relative
+  display: flex
+  flex-direction: column
+  justify-content: space-between
+  min-height: 100vh
+  font-kerning: normal
+  -webkit-font-smoothing: antialiased
+  -moz-osx-font-smoothing: grayscale
+a
+  text-decoration: none
+  color: inherit
+  -ms-word-break: break-all
+  word-break: break-all
+  word-break: break-word
+  -webkit-hyphens: auto
+  -moz-hyphens: auto
+  hyphens: auto
+
+  &:focus, &:focus-within
+    outline: none !important
+
+h1,h2,h3,h4,h5
+  font-family: inherit
+  font-weight: 300
+  padding: 5px 0
+  margin: 15px 0
+  color: var(--header-text)
+  line-height: 1.35
+  &:hover .link
+    opacity: 1
+
+h1
+  font-size: 200%
+  font-weight: 400
+h2
+  font-size: 175%
+h3
+  font-size: 150%
+h4
+  font-size: 125%
+h5
+  font-size: 120%
+h6
+  font-size: 100%
+img, svg
+  max-width: 100%
+  vertical-align: middle
+img
+  height: auto
+  margin: 1rem auto
+  padding: 0
+  &:focus, &:focus-within
+    outline: none !important
+    border: none !important
+
+main
+  flex: 1
+
+ul
+  list-style: none
+  -webkit-padding-start: 0
+  -moz-padding-start: 0
+
+b, strong, em 
+  font-weight: 500
+
+hr 
+  border: none
+  padding: 1px
+  background: darken($haze, 7.5%)
+  opacity: 0.5
+  margin: 1rem 0
+  @media (prefers-color-scheme: dark)
+    background: var(--theme)
+
+aside
+  h3
+    position: relative
+    margin: 0 !important
+  ul
+    list-style: initial
+    padding-left: 1rem
+  li
+    padding: 0.25rem 0
+
+table
+  border-radius: 0.5rem
+  width: 100%
+  border-collapse: collapse
+  margin-bottom: 1.5rem
+  &:not(.ln-table) t
+    background: var(--table-bg)
+  background: none;
+  width: fit-content;
+  margin-left: auto;
+  margin-right: auto;
+  table-layout: fixed;
+  display: block;
+  overflow-x: auto;
+
+td, th
+  padding: 0.5rem 1rem
+  border: 1px solid var(--table-border)
+
+td,
+th
+  padding: 0.5rem 1rem
+  font-weight: 400
+  &:not(:first-child)
+    padding-left: 1.5rem
+
+th
+  font-weight: 700
+  background-color: var(--table-haze);
+
+tbody
+  padding: 0
+  tr
+    &:nth-child(even)
+      background-color: var(--table-haze)
+    &:nth-child(odd)
+      background-color: var(--table-bg)
+
+
+p
+  padding: 0.5rem 0

+ 49 - 0
themes/hugo-curious/assets/sass/_card.scss

@@ -0,0 +1,49 @@
+.card {
+
+    margin-top: 1rem;
+    position: relative;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    word-wrap: break-word;
+    background-clip: border-box;
+    border-radius: .3rem;
+    overflow: hidden;
+
+    .card-header {
+        font-weight: 500;
+        background: rgba(200, 200, 200, 0.3);
+        text-transform: capitalize;
+        font-size: 1.4rem;
+        .icon {
+            height: 2.6rem;
+            width: 2.6rem;
+            float: left;
+            background: none;
+        }
+        .title {
+            line-height: 2.6rem;
+            margin-left: 1rem;
+        }
+    }
+    .card-body {
+        background: rgba(200, 200, 200, 0.1);
+    }
+    .card-list-wrapper {
+        columns: 350px 2;
+        flex: 1 1 auto;
+        padding-left: 1rem;
+        li {
+            cursor: default;
+        }
+    }
+    .card-header, .card-body {
+        padding: 0.5rem;
+    }
+    @media screen and (min-width: 800px) {
+        .card-header, .card-body {
+            padding: 1rem;
+        }
+    }
+}

+ 30 - 0
themes/hugo-curious/assets/sass/_color_tag.scss

@@ -0,0 +1,30 @@
+.color-tag {
+
+    padding: 0.2rem 0.3rem;
+    box-shadow: inset 0 2px rgba(160, 160, 160, 0.25);
+    background-color: rgb(226, 226, 226);
+    border-radius: 0.2rem;
+    margin-left: 0.1rem;
+    margin-right: 0.1rem;   
+
+    &.green {
+        background-color: rgb(0, 151, 25);
+        color: #fff;
+    }
+
+    &.orange {
+        background-color: rgb(255, 115, 0);
+        color: #fff;
+    }
+
+    &.red {
+        background-color: rgb(151, 13, 0);
+        color: #fff;
+    }
+
+    &.yellow {
+        background-color: rgb(255, 238, 0);
+        color: rgb(36, 36, 36);
+    }
+
+}

+ 691 - 0
themes/hugo-curious/assets/sass/_components.sass

@@ -0,0 +1,691 @@
+%upcaret
+  width: 0
+  height: 0
+  border-left: 0.33rem solid transparent
+  border-right: 0.33rem solid transparent
+  top: -0.5rem
+  left: 1rem
+.nav
+  color: $haze
+  display: flex
+  justify-content: space-between
+  @include content
+  &_active
+    background-color: rgba($light, 0.05)
+    border-radius: 0.25rem
+  &, &_body
+  &_icon
+    width: 0.7rem
+    margin: 0.8rem 0.2rem
+    transition: transform 0.3s var(--ease)
+    transform-origin: 50% 50%
+  &_body
+    display: flex
+    flex: 1
+  &_header
+    background-color: $bg
+    padding: 0.25rem 2.2rem
+    position: fixed
+    width: 100%
+    z-index: 99
+    left: 0
+    // border-bottom: 3px solid #44CCFF;
+    box-shadow: 0.05rem 0.05rem 0.25rem rgba(100, 100, 100, 0.5)
+  &_item
+    padding: 0 1rem
+    display: inline-flex
+    align-items: center
+    white-space: nowrap
+  &_sub
+    width: 100%
+    left: 0
+    position: absolute
+    z-index: 20
+    border-radius: 0 0 0.5rem 0.5rem 
+    top: 3rem
+    transition: height 0.3s ease-in-out
+    height: 0
+    overflow: hidden
+    padding: 0.96rem 0 0
+    background: transparent
+
+  &_parent
+    position: relative
+    display: flex
+    align-items: center
+    margin: 0.25rem 0
+    border-radius: 0.5rem
+
+  &_open + &_sub &_child
+    padding-top: 0.5rem
+    padding-bottom: 0.5rem
+    z-index: 3
+    & + a
+      @media screen and (min-width: 769px)
+        padding-top: 0
+    &:not(:first-child)
+      position: relative
+    &:first-child::before
+      position: absolute
+      content: ""
+      @extend %upcaret
+      border-bottom: 0.5rem solid var(--translucent-light)
+      z-index: 2
+  &_open + &_sub
+    height: initial
+    z-index: 999
+    overflow: initial
+    border-radius: 0.5rem
+    padding-bottom: 0.5rem
+    @media screen and (min-width: 769px)
+      color: var(--text)
+    &::before, &::after
+      content: ""
+      position: absolute
+    &::before
+      @extend %upcaret
+      z-index: 1
+      @media screen and (min-width: 769px)
+        border-bottom: 0.5rem solid var(--choice-bg)
+    &::after
+      top: 0
+      left: 0
+      right: 0
+      bottom: 0
+      background: var(--translucent-light)
+      border-radius: 0.5rem
+      box-shadow: 0 1rem 3rem rgba(0,0,0,0.25)
+    @media screen and (min-width: 769px)
+      background: var(--choice-bg)
+      width: auto
+      white-space: nowrap;
+  &_open &_icon
+    transform: rotate(180deg)
+
+  &_sub &_item
+    &:not(.nav_child)
+      position: relative
+    z-index: 5
+    display: block
+    padding-top: 0.75rem
+    padding-bottom: 0.75rem
+    transition: background 0.3s ease-out
+    margin: 0
+
+  &_brand
+    .site-title
+      display: none
+    @media screen and (min-width: 300px)
+      .site-title
+        display: initial
+    img
+      max-width: 2.6rem
+      margin: 0
+      margin-right: 0.5rem
+    @media screen and (min-width: 769px)
+      padding-left: 0
+      // margin-left: -16rem
+      // transform: translateX(50rem)
+      img.logo
+        background: transparent !important
+        max-height: 2.6rem;
+        margin-bottom: -0.1rem;
+        box-shadow: 0.1rem 0.1rem 0.5rem #002538;
+        border-radius: 50%;
+        border: 2px solid #002538;
+        margin-right: 0.5rem;
+        &:hover
+          -o-transform: scale(1.2)
+          -webkit-transform: scale(1.2)
+          -ms-transform: scale(1.2)
+          transform: scale(1.2) rotate(360deg)
+          left: -2rem
+          transition: all 0.3s
+
+  &_center
+    display: none
+    @media screen and (min-width: 769px)
+      display: flex
+      flex: 1
+      align-items: center
+      justify-content: center
+      + .follow
+        flex: initial
+
+  &_hide
+    @media screen and (min-width: 769px)
+      display: none
+  &_close
+    display: none
+
+.content, .footer
+  padding: 0.5rem
+  @media screen and (min-width: 1441px)
+    padding: 1.5rem 0
+
+.content
+  max-width: 1024px
+  padding-top: 4rem
+  @media screen and (min-width: 768px)
+    padding-left: 3rem
+    padding-bottom: 3rem
+  @include content
+
+@media screen and (min-width: 800px)
+  .content
+    padding-top: 5rem
+
+.content.without-toc
+  margin-left: auto
+  margin-right: auto
+  display: block
+  max-width: 800px
+
+@media screen and (min-width: 1366px)
+    .content
+      max-width: 1500px
+    .content.without-toc
+      max-width: 1200px
+
+.footer 
+  border-top: 1px solid $xhaze
+  background: var(--footer-bg)
+  margin-top: 2rem
+  font-size: 0.9rem
+  &_inner
+    @include content
+    display: grid
+    grid-template-columns: 4rem 1fr
+    align-items: center
+    position: relative
+
+.button
+  background-color: $theme
+  color: $light
+  display: inline-flex
+  padding: 0.5rem 1.0rem
+  text-transform: uppercase
+  border: 1px solid $theme
+  border-radius: 0.5rem
+  font-size: 0.9rem
+  align-items: center
+  user-select: none
+  &:hover, &:focus
+    background-color: darken($theme, 20%)
+    color: $light
+    border: 1px solid darken($theme, 20%)
+    
+  &_translucent
+    background-color: rgba($theme, 0.15)
+    color: $theme
+    border: 1px solid transparent
+  &_tally
+    padding: 0 0.75rem
+    border-radius: 0.5rem
+    background-color: $theme
+    display: inline-flex
+    justify-content: center
+    align-items: center
+    color: $light
+    margin: 0.1rem 0 0.1rem 0.2rem
+    font-size: 0.7rem
+
+.post
+  &_link, &_title
+    margin-bottom: 0
+  &s
+    margin-top: 2rem
+  &_header
+    height: 50vh
+    max-height: 35rem
+    background-color: $bg
+    // background-image: url(/images/island.jpg)
+    background-size: cover
+    background-position: center
+    margin-top: 4.2rem
+    @media screen and (max-width: 992px)
+      height: 40vh
+      margin-top: 3rem
+    @media screen and (max-width: 667px)
+      height: 30vh
+    & + .content
+      padding-top: 0
+  &_item
+    box-shadow: 0 4px 8px 0 var(--shadow)
+    margin-top: 0.5rem
+    margin-bottom: 0.2rem
+    border-radius: 0.5rem
+    background: var(--post-bg)
+    @media screen and (min-width: 664px)
+      margin-top: 1.5rem
+  &_tag
+    padding: 0.2rem 0.8rem
+    font-size: 0.8rem
+    &s
+      display: none
+      &.jswidgetopen
+        display: initial
+        position: fixed
+        top: 0
+        left: 0
+        height: 100vh
+        overflow-y: auto
+        width: 100vw
+        padding: 5rem 1.5rem
+        background: var(--translucent-light)
+        cursor: pointer
+        z-index: 999
+        overflow-y: auto
+      &_toggle
+        margin-top: 0.5rem
+        margin-left: 0.5rem
+        cursor: pointer
+  &_tag, &_share
+    margin: 0.5rem
+  &_share
+    display: inline-flex
+  &_meta
+    display: inline-flex
+    flex-flow: row wrap
+    align-items: center
+    .button
+      margin-bottom: 0
+  &_date
+    margin-right: 0.5rem
+    margin-left: 0.25rem
+  &_content
+    overflow-x: auto
+    a
+      color: $theme
+    ul, ol
+      list-style: initial
+      padding: 0.5rem 1.25rem
+      li
+        padding-top: 0.25rem
+    ol
+      list-style: decimal
+    img
+      display: block
+      margin-left: auto
+      margin-right: auto
+      background-color: #fff
+      padding: 0.5rem
+    h2
+      color: #0061bb
+      border-bottom: 2px solid #ddd
+      font-weight: bolder
+    h3
+      font-weight: 400
+      &::before
+        content: "● "
+        color: #8ed08e
+    h4
+      font-weight: 400
+      &::before
+        content: "+ "
+        color: #ff5e00
+
+
+h3.post_link
+  font-weight: bolder
+
+.scrollable
+  display: grid
+  width: 100%
+  max-width: 100%
+  overflow-x: auto
+
+.to-top
+  position: fixed
+  bottom: 2rem
+  @media screen and (max-width: 667px)
+    bottom: 2.25rem
+  right: 1.5rem
+  height: 2.25rem
+  width: 2.25rem
+  background-color: $theme
+  display: flex
+  align-items: center
+  justify-content: center
+  border: none
+  -webkit-appearance: none
+  border-radius: 50%
+  color: $light !important
+  text-decoration: none !important
+  font-size: 1.25rem
+  cursor: pointer
+  &, &:focus
+    outline: none
+
+.mb-0
+  margin-bottom: 0 !important
+
+.tag
+  &s
+    &_list
+      cursor: initial
+      background: var(--choice-bg)
+      padding: 4.5rem 1.5rem 1.5rem 1.5rem
+      border-radius: 1rem
+      max-width: 720px
+      margin: 0 auto
+      box-shadow: 0 0.5rem 1.5rem rgba(0,0,0,0.12)
+      position: relative
+      display: flex
+      flex-flow: row wrap
+    &_nav
+      position: relative
+    &_hide
+      position: absolute
+      top: 1rem
+      right: 1.5rem
+      padding: 0.5rem
+      border-radius: 50%
+      cursor: pointer
+      @media screen and (min-width: 992px)
+        display: none
+    &_sort
+      font-size: 1rem
+      color: var(--light)
+      background: var(--theme)
+      position: absolute
+      top: 1.5rem
+      left: 1.5rem
+      border-radius: 1.5rem
+      padding: 0.1rem
+      &, span
+        user-select: none
+      span
+        display: inline-flex
+        justify-content: center
+        align-items: center
+        height: 2rem
+        position: relative
+        z-index: 5
+        cursor: pointer
+        width: 5rem
+        font-weight: 500
+      &::before
+        content: ""
+        position: absolute
+        width: 4.5rem
+        top: 0.25rem
+        bottom: 0.25rem
+        left: 0.25rem
+        z-index: 3
+        background: var(--bg)
+        opacity: 0.5
+        border-radius: 1.5rem
+        transition: 0.25s transform var(--ease)
+      &.sorted
+        &::before
+          transform: translateX(5rem)
+  &-title
+    border-bottom: none !important
+    display: inline-block !important
+    position: relative
+    font-size: 2rem
+    margin-bottom: -1rem
+    &::after
+      content: attr(data-count)
+      margin-left: 1.5rem
+      background-color: #eee
+      padding: 0.25rem 1rem
+      border-radius: 15%
+      font-size: 1.5rem
+
+.icon
+  display: inline-flex
+  justify-content: center
+  align-items: center
+  margin: 0 1.0rem
+  &, img, svg
+    width: 1.1rem
+    height: 1.1rem
+  &_2
+    width: 2.2rem
+    height: 2.2rem
+.link
+  opacity: 0
+  position: relative
+  &_yank
+    opacity: 1
+    &ed
+      position: absolute
+      right: -1rem
+      top: -2rem
+      background-color: $theme
+      color: $light
+      width: 7rem
+      padding: 0.25rem 0.5rem
+      font-size: 0.9rem
+      border-radius: 1rem
+      text-align: center
+      &::after
+        position: absolute
+        top: 1rem
+        content: ""
+        border-color: $theme transparent
+        border-style: solid
+        border-width: 1rem 1rem 0 1rem
+        height: 0
+        width: 0
+        transform-origin: 50% 50%
+        transform: rotate(145deg)
+        right: 0.45rem
+
+.excerpt
+  &_header, &_footer
+    padding: 1rem
+  &_header .post_link
+    margin-top: 0
+  &_footer
+    padding: 0 1rem 2.25rem 1rem
+    padding-bottom: 0.5rem;
+  &_thumbnail
+    min-height: 10rem
+    display: none
+    @media screen and (min-width: 769px)
+      display: block 
+      border-radius: 0.5rem
+  &_footer
+    &.partition
+      display: grid
+      @media screen and (min-width: 769px) 
+        grid-template-columns: 2fr 7fr
+        grid-gap: 1rem
+
+.sidebar
+  margin-top: 1rem
+  @media screen and (min-width: 672px)
+    margin-top: 0
+  &_inner
+    position: relative
+    &::before
+      content: ""
+      padding: 0.5px
+      top: 0
+      bottom: 0
+      // background: var(--light)
+      background: linear-gradient(to bottom, var(--haze), var(--light), var(--haze))
+      position: absolute
+      left: -2rem
+    .intro
+      margin-bottom: 2rem
+      h2
+        margin-top: 0
+        margin-bottom: 0
+        font-weight: bold
+      p
+        margin-top: 0
+        margin-bottom: 0
+        padding-bottom: 0
+    h2.widget-title
+      background: rgba(100, 100, 100, 0.1)
+      border-left: 8px solid var(--header-text)
+      font-size: 1.4rem
+      padding-left: 1rem
+      border-radius: 0.5rem
+      font-weight: bold
+    
+
+.pagination
+  display: flex
+  margin-top: 1.5rem
+
+.page
+  &-item
+    padding: 0.2rem
+    &.disabled
+      opacity: 0.7
+    &:first-child, &:last-child
+      display: none
+    &.active a
+      background-color: darken($theme, 20%)
+  &-link
+    padding: 0.25rem 0.75rem
+    background-color: $theme
+    color: $light
+    border-radius: 1rem
+
+
+.float
+  &_left
+    float: left
+    margin-right: 1rem
+    + p 
+      padding-top: 0
+  &_right
+    float: right
+    margin-left: 1rem
+  &_left, &_right
+    &::after
+      clear: both
+
+.follow
+  display: flex
+  align-items: center
+  flex: 1
+  justify-content: flex-end
+  svg
+    fill: $haze
+    margin-left: 0.75rem
+
+.img
+  &_alt
+    font-style: italic
+    padding-top: 0rem
+    opacity: 0.67
+    font-size: 0.9rem
+
+.to
+  &_top
+    background-color: $theme
+    width: 2.75rem
+    height: 2.75rem
+    display: flex
+    justify-content: center
+    align-items: center
+    cursor: pointer
+    border-radius: 50%
+    position: fixed
+    bottom: 1.5rem
+    right: 1.5rem
+    z-index: 9999
+    &.ios
+      position: absolute
+      bottom: 0.75rem
+      right: 0
+    &:hover
+      background-color: $theme
+    svg
+      fill: $light
+      opacity: 0.5
+      transition: 0.3s opacity var(--ease)
+    &:hover svg
+      opacity: 1
+
+.color 
+  &_mode 
+    // width: 3rem
+    height: 1.5rem
+    display: grid
+    align-items: center
+    margin: 0 0.5rem
+    @media screen and (min-width: 769px)
+      margin: 0 1.5rem
+      grid-template-columns: 1fr
+
+  &_choice
+    width: 3rem
+    background-color: var(--translucent-light)
+    border-radius: 1rem
+    height: 1.5rem
+    outline: none
+    border: none
+    -webkit-appearance: none
+    cursor: pointer
+    position: relative
+    position: relative
+    overflow: hidden
+    box-shadow: 0 0.25rem 1rem rgba(0,0,0,0.15)
+    &::after
+      content: ""
+      position: absolute
+      top: 0.1rem
+      left: 0.1rem
+      width: 1.3rem
+      height: 1.3rem
+      background-image: url("#{$images}sun.svg")
+      background-position: center
+      background-size: cover
+      border-radius: 50%
+      z-index: 2
+  &_animate
+    transition: transform 0.5s cubic-bezier(0.075, 0.82, 0.165, 1)
+    &::after
+      transition: transform 0.5s cubic-bezier(.19,1,.22,1)
+      will-change: transform
+
+.taxonomy
+  text-transform: capitalize
+
+.image
+  &-scale
+    position: fixed
+    z-index: 999999
+    left: 0
+    right: 0
+    height: 100vh
+    top: 0
+    padding: 1.5rem
+    background-color: var(--bg)
+    display: grid
+    align-items: center
+    overflow: auto
+  &-scale &-scalable
+    background-color: var(--text)
+  &-scalable
+    cursor: pointer
+    transition: transform 0.3s var(--ease)
+  &_featured
+    display: block
+    margin-left: auto !important
+    margin-right: auto !important
+
+
+#posts
+  margin-top: 0
+
+.page-title
+    margin-top: 0
+    margin-bottom: 0
+
+.page-description
+    padding-top: 0
+
+
+// Auto hide navbar when scrolling down
+#top-navbar
+  top: 0
+  transition: top 0.5s

+ 87 - 0
themes/hugo-curious/assets/sass/_custom.scss

@@ -0,0 +1,87 @@
+// add custom sass in this file
+
+/* Background */ .chroma { color: #272822; background-color: #fafafa }
+/* Error */ .chroma .err { color: #960050; background-color: #1e0010 }
+/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
+/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
+/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc }
+/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
+/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
+/* Keyword */ .chroma .k { color: #00a8c8 }
+/* KeywordConstant */ .chroma .kc { color: #00a8c8 }
+/* KeywordDeclaration */ .chroma .kd { color: #00a8c8 }
+/* KeywordNamespace */ .chroma .kn { color: #f92672 }
+/* KeywordPseudo */ .chroma .kp { color: #00a8c8 }
+/* KeywordReserved */ .chroma .kr { color: #00a8c8 }
+/* KeywordType */ .chroma .kt { color: #00a8c8 }
+/* Name */ .chroma .n { color: #111111 }
+/* NameAttribute */ .chroma .na { color: #75af00 }
+/* NameBuiltin */ .chroma .nb { color: #111111 }
+/* NameBuiltinPseudo */ .chroma .bp { color: #111111 }
+/* NameClass */ .chroma .nc { color: #75af00 }
+/* NameConstant */ .chroma .no { color: #00a8c8 }
+/* NameDecorator */ .chroma .nd { color: #75af00 }
+/* NameEntity */ .chroma .ni { color: #111111 }
+/* NameException */ .chroma .ne { color: #75af00 }
+/* NameFunction */ .chroma .nf { color: #75af00 }
+/* NameFunctionMagic */ .chroma .fm { color: #111111 }
+/* NameLabel */ .chroma .nl { color: #111111 }
+/* NameNamespace */ .chroma .nn { color: #111111 }
+/* NameOther */ .chroma .nx { color: #75af00 }
+/* NameProperty */ .chroma .py { color: #111111 }
+/* NameTag */ .chroma .nt { color: #f92672 }
+/* NameVariable */ .chroma .nv { color: #111111 }
+/* NameVariableClass */ .chroma .vc { color: #111111 }
+/* NameVariableGlobal */ .chroma .vg { color: #111111 }
+/* NameVariableInstance */ .chroma .vi { color: #111111 }
+/* NameVariableMagic */ .chroma .vm { color: #111111 }
+/* Literal */ .chroma .l { color: #ae81ff }
+/* LiteralDate */ .chroma .ld { color: #d88200 }
+/* LiteralString */ .chroma .s { color: #d88200 }
+/* LiteralStringAffix */ .chroma .sa { color: #d88200 }
+/* LiteralStringBacktick */ .chroma .sb { color: #d88200 }
+/* LiteralStringChar */ .chroma .sc { color: #d88200 }
+/* LiteralStringDelimiter */ .chroma .dl { color: #d88200 }
+/* LiteralStringDoc */ .chroma .sd { color: #d88200 }
+/* LiteralStringDouble */ .chroma .s2 { color: #d88200 }
+/* LiteralStringEscape */ .chroma .se { color: #8045ff }
+/* LiteralStringHeredoc */ .chroma .sh { color: #d88200 }
+/* LiteralStringInterpol */ .chroma .si { color: #d88200 }
+/* LiteralStringOther */ .chroma .sx { color: #d88200 }
+/* LiteralStringRegex */ .chroma .sr { color: #d88200 }
+/* LiteralStringSingle */ .chroma .s1 { color: #d88200 }
+/* LiteralStringSymbol */ .chroma .ss { color: #d88200 }
+/* LiteralNumber */ .chroma .m { color: #ae81ff }
+/* LiteralNumberBin */ .chroma .mb { color: #ae81ff }
+/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff }
+/* LiteralNumberHex */ .chroma .mh { color: #ae81ff }
+/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff }
+/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff }
+/* LiteralNumberOct */ .chroma .mo { color: #ae81ff }
+/* Operator */ .chroma .o { color: #f92672 }
+/* OperatorWord */ .chroma .ow { color: #f92672 }
+/* Punctuation */ .chroma .p { color: #111111 }
+/* Comment */ .chroma .c { color: #75715e }
+/* CommentHashbang */ .chroma .ch { color: #75715e }
+/* CommentMultiline */ .chroma .cm { color: #75715e }
+/* CommentSingle */ .chroma .c1 { color: #75715e }
+/* CommentSpecial */ .chroma .cs { color: #75715e }
+/* CommentPreproc */ .chroma .cp { color: #75715e }
+/* CommentPreprocFile */ .chroma .cpf { color: #75715e }
+/* GenericEmph */ .chroma .ge { font-style: italic }
+/* GenericStrong */ .chroma .gs { font-weight: bold }
+
+
+.js-toc-content p {
+    text-align: justify;
+}
+
+.content.type-post {
+    max-width: 1250px;
+}
+
+@media (min-width: 768px) {
+    body {
+        padding-right: 2rem;
+    }
+}

+ 13 - 0
themes/hugo-curious/assets/sass/_disqus.scss

@@ -0,0 +1,13 @@
+/* Disqus button */
+#disqus-button {
+    padding: 1rem;
+    width: 100%;
+    background-color: #fff;
+    margin-top: 2rem;
+    border: 2px solid #888;
+    font-size: 1rem;
+    font-weight: bold;
+}
+#disqus-button:hover {
+    background-color: #bbe1ff;
+}

+ 456 - 0
themes/hugo-curious/assets/sass/_excerpt.scss

@@ -0,0 +1,456 @@
+@media (min-width:900px) {
+    .tag-template .post-feed {
+        margin-top: -70px;
+        padding-top: 0;
+    }
+}
+
+.author-list-item {
+    color: #333;
+}
+
+.author-list-item,
+.post-card-image-link,
+.post-feed {
+    position: relative;
+}
+
+.reading-time {
+    font-size: 0.8rem;
+    font-weight: 500;
+}
+
+.post-feed {
+    -ms-flex-wrap: wrap;
+    flex-wrap: wrap;
+    margin: 0 -10px;
+    padding: 2rem 0 0;
+
+    .post_tag {
+        margin-left: 0;
+    }
+}
+
+.post-card,
+.post-feed {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+}
+
+.post-card {
+    color: #555;
+    font-size: 1rem;
+    -webkit-box-flex: 1;
+    -ms-flex: 1 1 20rem;
+    flex: 1 1 20rem;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    overflow: hidden;
+    margin: 0 0.5rem 2rem;
+    min-height: 20rem;
+    background: rgba(255, 255, 255, 0.6);
+    background-size: cover;
+    border-radius: 5px;
+    -webkit-box-shadow: rgba(39, 44, 49, .06) 8px 14px 38px, rgba(39, 44, 49, .03) 1px 3px 8px;
+    box-shadow: 8px 14px 38px rgba(39, 44, 49, .06), 1px 3px 8px rgba(39, 44, 49, .03);
+    -webkit-transition: scale .5s ease, translate3D .5s ease;
+    transition: scale .5s ease, translate3D .5s ease;
+}
+
+.post-card:hover {
+    -webkit-box-shadow: rgba(39, 44, 49, .07) 8px 28px 50px, rgba(39, 44, 49, .04) 1px 6px 12px;
+    box-shadow: 8px 28px 50px rgba(39, 44, 49, .07), 1px 6px 12px rgba(39, 44, 49, .04);
+    -webkit-transition: scale .5s ease, translate3D .5s ease;
+    transition: scale .5s ease, translate3D .5s ease;
+    -webkit-transform: translate3D(0, -1px, 0) scale(1.02);
+}
+
+.post-card-image-link {
+    display: block;
+    overflow: hidden;
+    border-radius: 5px 5px 0 0;
+}
+
+.post-card-image {
+    width: 100%;
+    height: 200px;
+    background: 50% no-repeat #c5d2d9;
+    -o-object-fit: cover;
+    object-fit: cover;
+}
+
+.post-card-content-link {
+    position: relative;
+    -webkit-box-flex: 1;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    display: block;
+    padding: 0.5rem 1.5rem 0;
+    color: #15171a;
+}
+
+.post-card-title {
+    font-weight: bold;
+    font-size: 1.1rem;
+    margin-top: 0;
+    margin-bottom: 0.2rem;
+    text-transform: uppercase;
+}
+
+.post-card-content {
+    -webkit-box-flex: 1;
+    -ms-flex-positive: 1;
+    flex-grow: 1;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    -webkit-box-pack: justify;
+    -ms-flex-pack: justify;
+    justify-content: space-between;
+}
+
+.post-card-meta {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-pack: justify;
+    -ms-flex-pack: justify;
+    justify-content: space-between;
+    -webkit-box-align: end;
+    -ms-flex-align: end;
+    align-items: flex-end;
+    padding: 0 25px 25px;
+}
+
+.author-list-item {
+    -ms-flex-negative: 0;
+    flex-shrink: 0;
+    margin: 0;
+    padding: 0;
+}
+
+.author-list-item:first-child {
+    z-index: 10;
+}
+
+.reading-time {
+    color: #738a94;
+    text-transform: uppercase;
+}
+
+.reading-time {
+    -ms-flex-negative: 0;
+    flex-shrink: 0;
+    margin-left: 20px;
+    line-height: 33px;
+    letter-spacing: .5px;
+}
+
+@media (min-width:795px) {
+    .post-card-large {
+        -webkit-box-flex: 1;
+        -ms-flex: 1 1 100%;
+        flex: 1 1 100%;
+        -webkit-box-orient: horizontal;
+        -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+        flex-direction: row;
+    }
+
+    .post-card-large .post-card-image-link {
+        position: relative;
+        -webkit-box-flex: 1;
+        -ms-flex: 1 1 auto;
+        flex: 1 1 auto;
+        border-radius: 5px 0 0 5px;
+    }
+
+    .post-card-large .post-card-image {
+        position: absolute;
+        width: 100%;
+        height: 100%;
+    }
+
+    .post-card-large .post-card-content {
+        -webkit-box-flex: 0;
+        -ms-flex: 0 1 357px;
+        flex: 0 1 357px;
+    }
+
+
+    .post-card-large p {
+        line-height: 1.55em;
+    }
+
+    .post-card-large .post-card-content-link {
+        padding: 30px 40px 0;
+    }
+
+    .post-card-large .post-card-meta {
+        padding: 0 40px 30px;
+    }
+}
+
+@media (max-width:650px) {
+
+    .post-feed {
+        padding-top: 5vw;
+    }
+
+    .post-card {
+        margin: 0 20px 5vw;
+    }
+}
+
+[data-aos^=fade][data-aos^=fade] {
+    opacity: 0;
+    transition-property: opacity, transform;
+}
+
+[data-aos^=fade][data-aos^=fade].aos-animate {
+    opacity: 1;
+    transform: translateZ(0);
+}
+
+[data-aos=fade-up] {
+    transform: translate3d(0, 100px, 0);
+}
+
+.post-card-excerpt {
+    font-family: Verdana, Arial, sans-serif;
+}
+
+.center {
+    align-items: center;
+}
+
+a:active,
+a:link,
+a:visited,
+footer a:hover {
+    text-decoration: none;
+}
+
+.header-time {
+    color: var(--midgrey);
+    font-size: 1.1rem;
+}
+
+.header-container {
+    display: flex;
+    justify-content: space-between;
+    align-items: flex-end;
+    padding-bottom: 12px;
+    white-space: nowrap;
+    overflow: hidden;
+}
+
+.footer-color {
+    color: var(--darkgrey);
+}
+
+.user-icon-static {
+    text-align: center;
+    color: #fff;
+    display: inline-block;
+}
+
+.hover-effect {
+    -webkit-backface-visibility: hidden;
+    backface-visibility: hidden;
+    -webkit-transition: all .3s ease;
+    -moz-transition: all .3s ease;
+    -ms-transition: all .3s ease;
+    -o-transition: all .3s ease;
+    transition: all .3s ease;
+}
+
+.hover-effect:hover {
+    opacity: .8;
+}
+
+.user-icon-static {
+    width: 30px;
+    height: 30px;
+    border-radius: 3px;
+    line-height: 29px;
+    font-size: 1.5em;
+    margin-right: 2px;
+}
+
+.reading-time {
+    margin-top: 5px;
+}
+
+.post-card:hover {
+    transform: translate3D(0, -1px, 0) scale(1.02) !important;
+}
+
+article:hover .share {
+    opacity: 1;
+}
+
+article .share {
+    position: absolute;
+    top: 3px;
+    left: 3px;
+    opacity: 0;
+}
+
+
+.post-card:hover .share {
+    -webkit-transition: opacity .3s ease-in-out;
+    -moz-transition: opacity .3s ease-in-out;
+    -o-transition: opacity .3s ease-in-out;
+    transition: opacity .3s ease-in-out;
+}
+
+.share {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+}
+
+.share .twitter {
+    background: #1da1f2;
+}
+
+.share .facebook {
+    background: #3b5998;
+}
+
+.share .email {
+    background: #fff;
+}
+
+.share a:hover {
+    filter: brightness(1.1);
+}
+
+.share a {
+    width: 30px;
+    height: 30px;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 12px;
+    color: #fff;
+    border-radius: 5px;
+    margin-bottom: 3px;
+    background: #52565e;
+}
+
+.card-link {
+    color: #15171a;
+}
+
+a.footer-color:hover {
+    color: var(--blue);
+}
+
+.gradient-effect a:hover {
+    background-size: 100% 2px;
+}
+
+.gradient-effect a {
+    padding-bottom: 5px;
+    background: -webkit-gradient(linear, left top, right top, from(#7169FE), to(#41e3e4));
+    background: -webkit-linear-gradient(left, #7169FE, #41e3e4);
+    background: -o-linear-gradient(left, #7169FE, #41e3e4);
+    background: linear-gradient(to right, #7169FE, #41e3e4);
+    background-size: 0 2px;
+    background-repeat: no-repeat;
+    background-position: left 87%;
+    -webkit-transition: background 0.6s ease;
+    -moz-transition: background 0.6s ease;
+    -ms-transition: background 0.6s ease;
+    -o-transition: background 0.6s ease;
+    transition: background 0.6s ease;
+}
+
+.post-card-meta {
+    border-top: 2px solid rgba(240, 240, 240, 0.6);
+    padding-top: 13px !important;
+}
+
+.header-tag {
+    padding: 4px 10px;
+    border: 1px solid #000;
+    color: #000;
+    font-size: 1.2rem;
+    line-height: 1em;
+    border-radius: 10px;
+    opacity: .8;
+}
+
+.header-tag:hover {
+    border: 1px solid #005abb;
+    color: #007bff;
+}
+
+.post-card-image:active,
+.post-card-image:focus,
+.post-card-image:hover {
+    -webkit-transform: scale(1.1) rotate(1deg);
+    -ms-transform: scale(1.1) rotate(1deg);
+    transform: scale(1.1) rotate(1deg);
+}
+
+.post-card-excerpt {
+    max-width: 56em;
+    color: #555;
+}
+
+.post-card {
+    border: 1px solid #ddd;
+}
+
+.post-card:hover {
+    border-color: #3eb0ef !important;
+    text-decoration: none;
+}
+
+.ico-domain {
+    border-radius: 2px;
+    border-style: none;
+    display: unset !important;
+}
+
+.circle {
+    border-radius: 100%;
+}
+
+.footer-color {
+    display: inline-flex;
+    align-items: flex-end;
+}
+
+.footer-color img {
+    margin-right: 8px;
+}
+
+@media (min-width:500px) {
+    .post-card-title {
+        font-size: 1.2rem;
+    }
+}
+
+@media (min-width:1180px) {
+    .flex-50 {
+        flex: 0 1 50% !important;
+    }
+}
+
+.next-page-btn {
+    display: block;
+    max-width: 25%;
+    padding: 0.5rem 1rem;
+    text-align: center;
+}

+ 1 - 0
themes/hugo-curious/assets/sass/_fonts.sass

@@ -0,0 +1 @@
+@import url('https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@100;200;300;400;500;600;700;800;900&display=swap');

+ 56 - 0
themes/hugo-curious/assets/sass/_form.scss

@@ -0,0 +1,56 @@
+form label{
+	display: block;
+	margin: 0px 0px 15px 0px;
+}
+form span[required]{
+	color:red;
+}
+input, 
+textarea, 
+select {
+	box-sizing: border-box;
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	border: 1px solid #C2C2C2;
+	box-shadow: 1px 1px 4px #EBEBEB;
+	-moz-box-shadow: 1px 1px 4px #EBEBEB;
+	-webkit-box-shadow: 1px 1px 4px #EBEBEB;
+	border-radius: 0.5rem;
+	-webkit-border-radius: 0.5rem;
+	-moz-border-radius: 0.5rem;
+	padding: 7px;
+	outline: none;
+}
+
+input:focus, 
+textarea:focus, 
+select:focus {
+	border: 1px solid $theme;
+}
+textarea{
+	height:100px;
+}
+input[type=submit],
+input[type=button],
+button{
+	border: none;
+	padding: 8px 15px 8px 15px;
+	background: $theme;
+	color: #fff;
+	box-shadow: 1px 1px 4px #DADADA;
+	-moz-box-shadow: 1px 1px 4px #DADADA;
+	-webkit-box-shadow: 1px 1px 4px #DADADA;
+	border-radius: 0.5rem;
+	-webkit-border-radius: 0.5rem;
+	-moz-border-radius: 0.5rem;
+}
+input[type=submit]:hover,
+input[type=button]:hover,
+button:hover{
+	background: $theme;
+	color: #fff;
+}
+
+form, input, textarea, button, select {
+	font-size: inherit;
+}

+ 80 - 0
themes/hugo-curious/assets/sass/_mobile.sass

@@ -0,0 +1,80 @@
+@media screen and (max-width: 769px)
+  .nav
+    // padding-bottom: 2rem
+    &, &_body
+      flex-direction: column
+    &_body
+      position: fixed
+      width: 90%
+      max-width: 16.5rem
+      top: 0
+      bottom: 0
+      background-color: $bg
+      transition: transform 0.3s var(--easing)
+      &_right
+        transform: translateX(100vw)
+        right: 0
+      &_left
+        transform: translateX(-100vw)
+        left: 0
+
+    &_close
+      width: 3rem
+      position: absolute
+      right: -4rem
+      top: 0
+      bottom: 0
+      height: 100%
+      cursor: pointer
+      z-index: 1000
+      display: flex
+      justify-content: center
+      align-items: center
+      svg
+        width: 1.25rem
+        fill: var(--light)
+        height: 1.25rem
+        display: none
+        &:first-child
+          display: initial
+        &.isopen
+          display: none
+          + svg
+            display: initial
+
+    &_brand
+      position: relative
+      z-index: 999
+      width: calc(100% - 3rem)
+      padding-left: 0
+
+    &_parent
+      display: grid
+    &_sub
+      position: relative
+      top: initial
+      padding-top: 0
+
+  .jsopen
+    &::after
+      content: ""
+      position: fixed
+      z-index: 2
+      background-color: rgba(0,0,0,0.3)
+      top: 0
+      left: 0
+      right: 0
+      bottom: 0
+    .nav
+      &_body
+        transform: translateX(0)
+        padding-left: 1.5rem
+        padding-right: 1.5rem
+      &_parent
+        &:first-child
+         margin-top: 4.4rem
+
+      .follow
+        justify-content: flex-start
+        flex: initial
+        margin-top: 0.75rem

+ 11 - 0
themes/hugo-curious/assets/sass/_note_pages.scss

@@ -0,0 +1,11 @@
+.note-pages {
+    img {
+        margin-top: 0;
+        margin-bottom: 0;
+        padding-top: 0!important;
+        padding-bottom: 0!important;
+    }
+
+    margin-top: 1rem;
+    margin-bottom: 1rem;
+}

+ 29 - 0
themes/hugo-curious/assets/sass/_quotes.scss

@@ -0,0 +1,29 @@
+blockquote {
+    border-radius: 0.5rem;
+    font-family: var(--font);
+    font-style: italic;
+    padding: 1rem 1rem 1rem 3rem;
+    border-left: 8px solid var(--bg);
+    position: relative;
+    background: rgba(0, 0, 0, 0.05);
+    margin-bottom: 0.5rem;
+    margin-top: 0.5rem;
+}
+blockquote::before {
+    content: "\201C";
+    color:  var(--header-text);
+    font-size: 4em;
+    position: absolute;
+    left: 0.2rem;
+    top: -1rem;
+}
+blockquote::after {
+    content: "";
+}
+blockquote span {
+    display: block;
+    color:  var(--header-text);
+    font-style: normal;
+    font-weight: bold;
+    margin-top: 0.25rem;
+}

+ 208 - 0
themes/hugo-curious/assets/sass/_subscriber_form.scss

@@ -0,0 +1,208 @@
+/* MailChimp Form Embed Code - Classic - 12/17/2015 v10.7 */
+#mc_embed_signup form {
+    display: block;
+    position: relative;
+    text-align: left;
+    border: 0;
+}
+#mc_embed_signup input {
+    border: 1px solid #abb0b2;
+}
+#mc_embed_signup input[type="checkbox"] {
+    -webkit-appearance: checkbox;
+}
+#mc_embed_signup input[type="radio"] {
+    -webkit-appearance: radio;
+}
+#mc_embed_signup input:focus {
+    border-color: #333;
+}
+#mc_embed_signup .button {
+    clear: both;
+    color: #ffffff;
+    cursor: pointer;
+    display: inline-block;
+    font-size: 15px;
+    font-weight: normal;
+    height: 32px;
+    line-height: 32px;
+    margin: 0 5px 10px 0;
+    padding: 0 22px;
+    text-align: center;
+    text-decoration: none;
+    vertical-align: top;
+    white-space: nowrap;
+    width: auto;
+}
+#mc_embed_signup .small-meta {
+    font-size: 11px;
+}
+#mc_embed_signup .nowrap {
+    white-space: nowrap;
+}
+
+#mc_embed_signup .mc-field-group {
+    clear: left;
+    position: relative;
+    padding-bottom: 0.5rem;
+    min-height: 50px;
+}
+#mc_embed_signup .size1of2 {
+    clear: none;
+    float: left;
+    display: inline-block;
+    width: 46%;
+    margin-right: 4%;
+}
+* html #mc_embed_signup .size1of2 {
+    margin-right: 2%; /* Fix for IE6 double margins. */
+}
+#mc_embed_signup .mc-field-group label {
+    display: block;
+    margin-bottom: 3px;
+}
+#mc_embed_signup .mc-field-group input {
+    display: block;
+    width: 100%;
+    padding: 8px 0;
+    text-indent: 2%;
+}
+#mc_embed_signup .mc-field-group select {
+    display: inline-block;
+    width: 99%;
+    padding: 5px 0;
+    margin-bottom: 2px;
+}
+
+#mc_embed_signup .datefield,
+#mc_embed_signup .phonefield-us {
+    padding: 5px 0;
+}
+#mc_embed_signup .datefield input,
+#mc_embed_signup .phonefield-us input {
+    display: inline;
+    width: 60px;
+    margin: 0 2px;
+    letter-spacing: 1px;
+    text-align: center;
+    padding: 5px 0 2px 0;
+}
+#mc_embed_signup .phonefield-us .phonearea input,
+#mc_embed_signup .phonefield-us .phonedetail1 input {
+    width: 40px;
+}
+#mc_embed_signup .datefield .monthfield input,
+#mc_embed_signup .datefield .dayfield input {
+    width: 30px;
+}
+#mc_embed_signup .datefield label,
+#mc_embed_signup .phonefield-us label {
+    display: none;
+}
+
+#mc_embed_signup .indicates-required {
+    text-align: right;
+    font-size: 11px;
+    margin-right: 4%;
+}
+#mc_embed_signup .asterisk {
+    color: #e85c41;
+    font-size: 150%;
+    font-weight: normal;
+    position: relative;
+    top: 5px;
+}
+#mc_embed_signup .clear {
+    clear: both;
+}
+
+#mc_embed_signup .mc-field-group.input-group ul {
+    margin: 0;
+    padding: 5px 0;
+    list-style: none;
+}
+#mc_embed_signup .mc-field-group.input-group ul li {
+    display: block;
+    padding: 3px 0;
+    margin: 0;
+}
+#mc_embed_signup .mc-field-group.input-group label {
+    display: inline;
+}
+#mc_embed_signup .mc-field-group.input-group input {
+    display: inline;
+    width: auto;
+    border: none;
+}
+
+#mc_embed_signup div#mce-responses {
+    float: left;
+    overflow: hidden;
+    clear: both;
+    margin-bottom: 1rem;
+}
+#mc_embed_signup div.response {
+    padding: 1em 0.5em 0.5em 0;
+    font-weight: bold;
+    float: left;
+    top: -1.5em;
+    z-index: 1;
+}
+#mc_embed_signup #mce-error-response {
+    display: none;
+}
+#mc_embed_signup #mce-success-response {
+    color: #529214;
+    display: none;
+}
+#mc_embed_signup label.error {
+    display: block;
+    float: none;
+    width: auto;
+    text-align: left;
+    padding: 0.5em 0;
+}
+
+#mc-embedded-subscribe {
+    clear: both;
+    width: auto;
+    display: block;
+    margin: 1em 0 1em 5%;
+}
+#mc_embed_signup #num-subscribers {
+    font-size: 1.1em;
+}
+#mc_embed_signup #num-subscribers span {
+    padding: 0.5em;
+    border: 1px solid #ccc;
+    margin-right: 0.5em;
+    font-weight: bold;
+}
+
+#mc_embed_signup #mc-embedded-subscribe-form div.mce_inline_error {
+    display: inline-block;
+    margin: 2px 0 1em 0;
+    padding: 5px 10px;
+    background-color: rgba(255, 255, 255, 0.85);
+    font-size: 14px;
+    font-weight: normal;
+    z-index: 1;
+    color: #e85c41;
+}
+#mc_embed_signup #mc-embedded-subscribe-form input.mce_inline_error {
+    border: 2px solid #e85c41;
+}
+
+
+#mce-responses {
+    margin: 0;
+}
+
+#mce-responses .response {
+    margin-top: 0;
+    margin-left: 0;
+}
+
+.mc-field-group {
+    margin-bottom: 0;
+}

+ 238 - 0
themes/hugo-curious/assets/sass/_syntax.sass

@@ -0,0 +1,238 @@
+@keyframes pulse
+  0%
+    opacity: 1
+  75%
+    opacity: 0.1
+  100%
+    opacity: 1
+
+code
+  font-size: 15px
+  font-weight: 400
+  overflow-y: hidden
+  display: block
+  font-family: 'Monaco', monospace
+  word-break: break-all
+  &.noClass
+    --inlineColor: rgb(194, 29, 0)
+    color: var(--inlineColor)
+    display: inline
+    line-break: anywhere
+.windows .highlight
+  overflow-x: hidden
+  &:hover
+    overflow-x: auto
+
+.highlight
+  display: grid
+  width: 100%
+  border-radius: 0 0.2rem 0.2rem 0
+  overflow-x: auto
+  // @media screen and (min-width: 1240px)
+  //   overflow-x: hidden
+  //   &:hover
+  //     overflow-x: auto
+  position: relative
+  &_wrap
+    background: #fafafa
+    border-radius: 0.5rem
+    position: relative
+    padding: 0 1rem
+    margin: 1.5rem auto 1rem auto
+    & + &
+      margin-top: 2.25rem
+    &:hover > div
+      opacity: 1
+    .lang
+      position: absolute
+      // background-color: var(--bg)
+      top: 0
+      right: 0
+      text-align: right
+      width: 7.5rem
+      padding: 0.5rem 1rem
+      font-style: italic
+      text-transform: uppercase
+      font-size: 67%
+      opacity: 0.5
+      color: #333
+    &:hover .lang
+      opacity: 0.1
+  & &
+    margin: 0
+  pre
+    background: #fafafa
+    color: #333 !important
+    border-radius: 4px
+    font-family: 'Monaco', monospace
+    padding-top: 1.5rem
+    padding-bottom: 2rem
+
+  table
+    display: grid
+    max-width: 100%
+    margin-bottom: 0
+    background: transparent
+  td, th
+    padding: 0
+
+  .lntd
+    width: 100%
+    border: none
+    &:first-child
+      &, pre
+        width: 2.5rem !important
+        padding-left: 0
+        padding-right: 0
+        color: rgba(255,255,255,0.5)
+        user-select: none
+
+      pre
+        width: 100%
+        display: flex
+        align-items: center
+        flex-direction: column
+
+code
+  .err
+    color: #a61717
+    background-color: #e3d2d2
+  .hl
+    width: 100%
+    background-color: rgba(255,255,255,0.25)
+  .ln, .lnt
+    margin-right: 0.75rem
+    padding: 0
+    transition: opacity 0.3s var(--ease)
+    &, span
+      color: #666
+
+  .k, .kc, .kd, .kn, .kp, .kr, .kt, .nt  
+    color: #6ab825
+    font-weight: 500
+
+  .kn, .kp
+    font-weight: 400
+
+  .nb, .no, .nv
+    color: #24909d
+
+  .nc, .nf, .nn
+    color: #447fcf
+
+  .s, .sa, .sb, .sc, .dl, .sd, .s2, .se, .sh, .si, .sx, .sr, .s1, .ss
+    color: #ed9d13
+
+  .m, .mb, .mf, .mh, .mi, .il, .mo
+    color: #3677a9
+
+  .ow
+    color: #6ab825
+    font-weight: 500
+
+  .c, .ch, .cm, .c1
+    color: #999
+    font-style: italic
+
+  .cs
+    color: #e50808
+    background-color: #520000
+    font-weight: 500
+
+  .cp, .cpf
+    color: #cd2828
+    font-weight: 500
+
+  .gd, .gr
+    color: #d22323
+
+  .ge
+    font-style: italic
+
+  .gh, .gu, .nd, .na, .ne
+    color: #ffa500
+    font-weight: 500
+
+  .gi
+    color: #589819
+
+  .go
+    color: #ccc
+
+  .gp
+    color: #aaa
+
+  .gs
+    font-weight: 500
+
+  .gt
+    color: #d22323
+  .w
+    color: #666
+
+  .hljs
+    &-string
+      color: #6ab825
+    &-attr
+      color: #ed9d13
+    .p &-attr
+      color: var(--light)
+
+.pre
+  &_wrap
+    white-space: pre-wrap
+    white-space: -moz-pre-wrap
+    white-space: -pre-wrap
+    white-space: -o-pre-wrap
+    word-wrap: break-word
+
+  &_nolines.ln
+    display: none
+
+// crayon-like widget styles
+.panel
+  &_box
+    display: inline-flex
+    // grid-template-columns: repeat(3, 1fr)
+    // max-width: 10rem
+    perspective: 300px
+    grid-gap: 0.5rem
+    transition: opacity 0.3s var(--easing)
+    background: var(--code-bg)
+    padding: 0.5rem 1.5rem
+    border-radius: 2rem
+    align-items: center
+    position: absolute
+    right: 0rem
+    top: -2.1rem
+    opacity: 0
+  &_icon
+    display: inline-flex
+    align-items: center
+    justify-content: center
+    cursor: pointer
+    // transition: opacity 0.3s var(--easing)
+    padding: 0.1rem
+    transform-origin: 50% 50%
+    // opacity: 0.7
+    &.active
+      animation: pulse 0.1s linear
+    svg
+      fill: var(--light)
+      width: 1.5rem
+      height: 1.5rem
+  &_hide
+    // hide icon if not needed
+    display: none
+  &_from
+    position: absolute
+    color: var(--theme)
+    bottom: 0
+    font-size: 1.5rem
+    font-weight: 500
+    padding: 0.5rem 0
+    cursor: pointer
+    letter-spacing: 0.1px
+    z-index: 19
+  &_expanded &_from
+    display: none

+ 19 - 0
themes/hugo-curious/assets/sass/_toc.scss

@@ -0,0 +1,19 @@
+/* Table of contents */
+.sticky-toc {
+    position: fixed;
+    z-index: 1020;
+    top: 7rem;
+    display: none;
+    max-width: 20rem;
+}
+.js-toc ol {
+    list-style-type: none;
+}
+.toc-list {
+    padding-left: 30px;
+}
+@media screen and (min-width: 980px) {
+    .sticky-toc {
+        display: block;
+    }
+}

+ 66 - 0
themes/hugo-curious/assets/sass/_utils.sass

@@ -0,0 +1,66 @@
+@for $i from 1 through 2
+  $size: $i * 1.5rem
+  $x-size: $size * 0.5
+  .pt-#{$i}
+    padding-top: $size
+
+  .pb-#{$i}
+    padding-bottom: $size
+
+  .mt-#{$i}
+    margin-top: $size
+
+  .mb-#{$i}
+    margin-bottom: $size
+
+.flex
+  display: flex
+  flex-direction: column
+  align-items: center
+
+.shadow
+  box-shadow: 0 0 60px rgba(0, 0, 0, 0.17)
+
+@media screen and (min-width: 60rem)
+  %grid
+    display: grid
+    grid-template-columns: 1fr
+
+  [class*='grid-']
+    grid-gap: 2rem
+
+  .grid-2, .grid-3, .grid-4, .grid-auto, .grid-inverse
+    @extend %grid
+  .grid-inverse
+    grid-template-columns: 1fr 18rem
+    grid-column-gap: 4rem
+  .grid-2
+    grid-template-columns: 1fr 1fr
+  .grid-3
+    grid-template-columns: repeat(auto-fit, minmax(19rem, 1fr))
+  .grid-4
+    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr))
+
+$sites: ("facebook": #325c94, "twitter": #00abdc,"linkedin": #007bb6)
+
+@each $item, $color in $sites
+  .#{$item}
+    svg
+      fill: $color
+
+// 404 page
+.never
+  height: 75vh
+  display: flex
+  justify-content: center
+  align-items: center
+  flex-direction: column
+  padding: 1.5rem
+  text-align: center
+
+.inline
+  display: inline
+  margin: 0
+
+.hidden
+  display: none

+ 113 - 0
themes/hugo-curious/assets/sass/_variables.sass

@@ -0,0 +1,113 @@
+$font-path: '../fonts'
+$icons: '../icons/'
+$images: '../images/'
+$light: #fff
+$haze: #fafafa
+$xhaze: darken($haze, 5%)
+$bg: #002538
+$theme: #006094
+
+@mixin  content()
+  --maxWidth: 1440px
+  max-width: var(--maxWidth)
+  margin-left: auto
+  margin-right: auto
+
+@mixin viewport($width: 1024px, $margin: 25px)
+  max-width: $width
+  margin: $margin auto
+  @content
+
+@mixin shadow($opacity: 0.24)
+  box-shadow: 0 0 3rem rgba(0,0,0,$opacity)
+  &:hover
+    box-shadow: 0 0 5rem rgba(0,0,0, (1.5 * $opacity))
+
+html
+  --color-mode: 'lit'
+  --light: #fff
+  --dark: #000
+  --bg: #002538
+  --haze: #f2f2f2
+  --gray: #020202
+  --accent: var(--gray)
+  --text: #363636
+  --header-text: var(--dark)
+  --font: 'Roboto Slab', sans-serif
+  --theme: #0077b8
+  --ease: cubic-bezier(.19,1,.22,1)
+  --code-bg: #888
+  --table-bg: var(--light)
+  --table-haze: var(--haze)
+  --table-border: #dedede
+  --footer-bg: var(--haze)
+  --shadow: rgba(0,0,0,0.12)
+  --translucent: rgba(0,0,0,0.05)
+  --translucent-light: rgba(255,255,255,0.05)
+  --post-bg: var(--light)
+  --choice-bg: var(--haze)
+  --ease: cubic-bezier(0.39, 0.575, 0.565, 1)
+  --easing: cubic-bezier(.19,1,.22,1)
+  &.page
+    --choice-bg: var(--light)
+  @mixin darkmode
+    --color-mode: 'dim'
+    --text: #c4cdd5
+    --accent: var(--bubble)
+    --choice-bg: var(--bg)
+    --code-bg: var(--translucent-light)
+    --header-text: var(--light)
+    --table-bg: var(--code-bg)
+    --table-haze: rgba(255,255,255,0.1)
+    --table-border: var(--code-bg)
+    --footer-bg: var(--bg)
+    --post-bg: var(--translucent-light)
+    *
+      box-shadow: none !important
+
+  &[data-mode="dim"]
+    @include darkmode
+    blockquote
+      background: var(--translucent-light)
+      border-color: var(--translucent-light)
+      color: #dedede
+    svg.icon
+      fill: var(--light)
+    .icon
+      img
+        background: none
+      svg
+        fill: #fafafa
+    .sidebar
+      &_inner
+        &::before
+          display: none
+    .color
+      &_choice
+        &::after
+          background-image: url("#{$images}night-moon.jpg")
+          transform: translateX(1.4rem)
+
+  @media (prefers-color-scheme: dark)
+
+    &:not([data-mode="lit"])
+      @include darkmode
+      blockquote
+        background: var(--translucent-light)
+        color: #dedede
+      svg.icon
+        fill: var(--light)
+      .icon
+        img
+          background: none
+        svg
+          fill: #fafafa
+      .sidebar
+        &_inner
+          &::before
+            display: none
+      .color
+        &_choice
+          &::after
+            background-image: url("#{$images}night-moon.jpg")
+            transform: translateX(1.4rem)

+ 20 - 0
themes/hugo-curious/assets/sass/main.sass

@@ -0,0 +1,20 @@
+@import 'variables'
+@import '../../assets/sass/variables'
+@import 'fonts'
+@import 'base'
+@import 'form'
+@import 'subscriber_form'
+@import 'note_pages'
+@import 'components'
+@import 'utils'
+@import 'mobile'
+@import 'syntax'
+@import 'custom'
+@import 'quotes'
+@import 'color_tag'
+@import 'card'
+@import 'toc'
+@import 'disqus'
+@import 'excerpt'
+@import '../../static/tocbot/tocbot'
+@import '../../assets/sass/custom'

+ 47 - 0
themes/hugo-curious/i18n/en.toml

@@ -0,0 +1,47 @@
+[read_more]
+other = "Read More"
+
+[copyright]
+other = "Copyright"
+
+[all_rights]
+other = "All Rights Reserved"
+
+[share_on]
+other = "Share on"
+
+[featured_posts]
+other = "Featured Posts"
+
+[recent_posts]
+other = "Recent Posts"
+
+[404_title]
+other = "Lost"
+
+[could_not_find]
+other = "We couldn't find the page you're looking for"
+
+[go_back]
+other = "Go Back"
+
+[translations]
+other = "Translations"
+
+[categories]
+other = "Categories"
+
+[tags]
+other = "Tags"
+
+[series]
+other = "Series"
+
+[all_categories]
+other = "All Categories"
+
+[all_tags]
+other = "All Tags"
+
+[all_series]
+other = "All Series"

+ 47 - 0
themes/hugo-curious/i18n/pt.toml

@@ -0,0 +1,47 @@
+[read_more]
+other = "Ler Mais"
+
+[copyright]
+other = "Copyright"
+
+[all_rights]
+other = "Todos os Direitos Reservados"
+
+[share_on]
+other = "Partilhar"
+
+[featured_posts]
+other = "Principais Artigos"
+
+[recent_posts]
+other = "Artigos Mais Recentes"
+
+[404_title]
+other = "Ooops"
+
+[could_not_find]
+other = "Não foi possível encontrar esta página"
+
+[go_back]
+other = "Voltar"
+
+[translations]
+other = "Traduções"
+
+[categories]
+other = "Categorias"
+
+[tags]
+other = "Etiquetas"
+
+[series]
+other = "Séries"
+
+[all_categories]
+other = "Todas as Categorias"
+
+[all_tags]
+other = "Todas as Etiquetas"
+
+[all_series]
+other = "Todas as Séries"

+ 47 - 0
themes/hugo-curious/i18n/tr.toml

@@ -0,0 +1,47 @@
+[read_more]
+other = "Okumaya Devam Et"
+
+[copyright]
+other = "Telif Hakkı"
+
+[all_rights]
+other = "Tüm Hakları Saklıdır"
+
+[share_on]
+other = "Paylaş:"
+
+[featured_posts]
+other = "Seçkin Makaleler"
+
+[recent_posts]
+other = "En Son Makaleler"
+
+[404_title]
+other = "Kayıp"
+
+[could_not_find]
+other = "Aradığınız sayfayı bulamadık"
+
+[go_back]
+other = "Geri Git"
+
+[translations]
+other = "Çeviriler"
+
+[categories]
+other = "Kategoriler"
+
+[tags]
+other = "Etiketler"
+
+[series]
+other = "Seriler"
+
+[all_categories]
+other = "Tüm Kategoriler"
+
+[all_tags]
+other = "Tüm Etiketler"
+
+[all_series]
+other = "Tüm Seriler"

+ 47 - 0
themes/hugo-curious/i18n/zh.toml

@@ -0,0 +1,47 @@
+[read_more]
+other = "阅读更多"
+
+[copyright]
+other = "Copyright"
+
+[all_rights]
+other = "All Rights Reserved"
+
+[share_on]
+other = "分享到"
+
+[featured_posts]
+other = "精选文章"
+
+[recent_posts]
+other = "最新文章"
+
+[404_title]
+other = "页面不见了"
+
+[could_not_find]
+other = "页面不存在或已被删除"
+
+[go_back]
+other = "返回"
+
+[translations]
+other = "翻译"
+
+[categories]
+other = "分类"
+
+[tags]
+other = "标签"
+
+[series]
+other = "专栏"
+
+[all_categories]
+other = "所有分类"
+
+[all_tags]
+other = "所有标签"
+
+[all_series]
+other = "所有专栏"

二進制
themes/hugo-curious/images/screenshot.png


二進制
themes/hugo-curious/images/tags.png


二進制
themes/hugo-curious/images/toc.png


部分文件因文件數量過多而無法顯示