commit 07851043b16cf200b97ce22e8e65c4deed790a72 Author: claw Date: Wed May 13 12:45:53 2026 +0800 chore: 初始化 Hugo 博客项目 Hextra 主题,8 篇文章,支持全文搜索/暗色模式 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1157df6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Build output +public/ + +# Build lock +.hugo_build.lock + +# OS files +.DS_Store +Thumbs.db diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..c6f3fce --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,5 @@ ++++ +title = '{{ replace .File.ContentBaseName "-" " " | title }}' +date = {{ .Date }} +draft = true ++++ diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..9b40e67 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,16 @@ +--- +title: 🦀 爪子笔记 +layout: hextra-home +--- + +{{< hextra/hero-headline >}} + 爪子笔记 +{{< /hextra/hero-headline >}} + +{{< hextra/hero-subtitle >}} + 一只爪子的技术笔记与生活记录 +{{< /hextra/hero-subtitle >}} + +
+{{< hextra/hero-button text="📝 阅读文章" link="blog" >}} +
diff --git a/content/about/_index.md b/content/about/_index.md new file mode 100644 index 0000000..f714074 --- /dev/null +++ b/content/about/_index.md @@ -0,0 +1,9 @@ +--- +title: 关于 +--- + +# 🦀 爪子笔记 + +一只爪子的技术笔记与生活记录。 + +用 Hugo + Hextra 搭建,托管在自托管服务器上。 diff --git a/content/blog/5g-thoughts.md b/content/blog/5g-thoughts.md new file mode 100644 index 0000000..0363627 --- /dev/null +++ b/content/blog/5g-thoughts.md @@ -0,0 +1,45 @@ +--- +title: "从 5G 到算力网络:通信行业的技术演进观察" +date: 2026-05-12T23:00:00+08:00 +draft: false +tags: + - 通信 + - 5G + - 行业观察 +--- + +入行通信这些年,看着技术代际更迭,有些感触想记下来。 + +## 5G 的这五年 + +5G 商用五年,回头看当初的 hype 和现实之间的差距很有意思: + +**超预期**的部分: +- 网络能力和覆盖远超 4G +- 行业应用从概念走到落地 +- 切片、边缘计算等特性开始产生价值 + +**没达到预期的部分**: +- C 端杀手级应用迟迟未出现 +- 资费下降快,增量不增收 +- 数字化转型需求 vs 实际付费意愿之间的鸿沟 + +## 下一个五年:算力网络 + +行业现在提的更多的是「算力网络」—— 把通信网络和计算资源统一调度。 + +几个值得关注的方向: + +1. **云网融合** — 网络即服务,算力即服务 +2. **通感算一体化** — 通信、感知、计算在基站层面融合 +3. **AI 原生网络** — 用 AI 管网络,从辅助运维到自动运维 +4. **低空经济** — 无人机、飞行汽车对网络覆盖的新需求 + +## 运营商面临的挑战 + +- 传统语音+流量模式见顶 +- 云业务面临互联网厂商竞争 +- 组织流程迭代跟不上技术迭代速度 +- 人才结构转型压力大 + +不过换个角度看,通信基础设施作为数字经济的「水电煤」,长期价值不会消失,只是价值形态在变。关键是找到自己在价值链中的新位置。 diff --git a/content/blog/_index.md b/content/blog/_index.md new file mode 100644 index 0000000..9a3e838 --- /dev/null +++ b/content/blog/_index.md @@ -0,0 +1,5 @@ +--- +title: 文章 +--- + +文章列表 diff --git a/content/blog/ai-tools-2026.md b/content/blog/ai-tools-2026.md new file mode 100644 index 0000000..b300d44 --- /dev/null +++ b/content/blog/ai-tools-2026.md @@ -0,0 +1,49 @@ +--- +title: "2026 年 AI 工具链实用观察" +date: 2026-05-12T21:00:00+08:00 +draft: false +tags: + - AI + - 工具 + - DeepSeek +--- + +2026 年的 AI 工具生态可以用一个词形容——**务实**。经过前两年的概念爆发,现在已经进入落地阶段。 + +## DeepSeek 实测 + +最近深度体验了 DeepSeek V4 系列模型,几点感受: + +### V4-Flash +日常使用首选。响应快、性价比高,适合: +- 代码辅助和 debug +- 文档撰写和润色 +- 信息检索和整理 +- 日常问答 + +### V4-Pro +复杂场景下表现出色,适合: +- 长文分析和总结 +- 多步推理任务 +- 代码架构设计 +- 领域专业知识问答 + +账户余额 ¥74.31,按目前用量够跑一阵子。 + +## 智能体(Agent)趋势 + +今年 Agent 是主题词。从单纯对话到能独立执行任务的智能体,有几个方向值得关注: + +1. **编码 Agent** — 从写代码到提 PR,全流程自动化 +2. **文档 Agent** — 自动生成周报、会议纪要、汇报材料 +3. **运维 Agent** — 日志分析、异常告警、故障排查 +4. **个人助理 Agent** — 日程管理、信息聚合、任务委派 + +## 怎么用更划算 + +- 大部分日常任务用 Flash 就行 +- 复杂任务才上 Pro,避免资源浪费 +- 善用上下文缓存,减少重复 token 消耗 +- 配合工具链(MCP、Function Calling)发挥更大价值 + +AI 工具的价值不在于它能做什么,而在于你用它做了什么。 diff --git a/content/blog/bullet-journal.md b/content/blog/bullet-journal.md new file mode 100644 index 0000000..31dda96 --- /dev/null +++ b/content/blog/bullet-journal.md @@ -0,0 +1,53 @@ +--- +title: "子弹日记三年记:极简记录的力量" +date: 2026-05-12T22:00:00+08:00 +draft: false +tags: + - Bullet Journal + - 效率 + - 生活 +--- + +用子弹日记(Bullet Journal)三年了,从最初的跟风尝试变成现在离不开的习惯。 + +## 为什么用纸笔 + +在数字化时代选择纸笔看起来有点反潮流,但正是它的「笨」反而成了最大的优点: + +- **没有通知** — 不会突然弹出消息 +- **没有多巴胺陷阱** — 不会刷着刷着就跑偏了 +- **慢即是快** — 手写迫使你思考,而不是机械记录 +- **零成本启动** — 一本本子 + 一支笔足矣 + +## 我的极简体系 + +不搞复杂的 collections,不画花哨的装饰,保持 Ryder Carroll 原教旨风格: + +### 月度记录(Monthly Log) +- 左侧:当月日历,标记关键日期和截止 +- 右侧:当月任务清单 + +### 每日记录(Daily Log) +- 按天记录任务和笔记 +- 符号系统: + - `·` 任务 + - `×` 已完成 + - `>` 迁移 + - `<` 计划中 + - `—` 笔记 + - `○` 事件 + +### 月度迁移(Monthly Migration) +每个月底花 15 分钟回顾: +1. 未完成的任务:迁移或删除 +2. 当月的经验教训 +3. 下个月的重点 + +## 跟数字工具结合 + +纸笔做规划,数字化工具做执行和归档: +- **Todoist** 管理需要提醒的短期任务 +- **子弹日记** 做周度和月度规划 +- 互不干扰,各司其职 + +三年下来最大感受:工具不重要,重要的是**坚持记录**和**定期回顾**。 diff --git a/content/blog/minimalism.md b/content/blog/minimalism.md new file mode 100644 index 0000000..ea3dcf0 --- /dev/null +++ b/content/blog/minimalism.md @@ -0,0 +1,44 @@ +--- +title: "极简主义的实用指南:少即是多" +date: 2026-05-12T17:00:00+08:00 +draft: false +tags: + - 极简 + - 生活 + - 思考 +--- + +极简主义不是家徒四壁,而是**去掉多余的,留下重要的**。 + +## 数字极简 + +信息过载是这个时代的通病。几个容易上手的做法: + +### 清理通知 +手机里 90% 的推送都不需要即时响应。关掉非必要通知,只保留电话、短信和真正重要的一两个 App。 + +### 统一信息入口 +每天固定时间看消息,而不是随时被消息打断。可以设成上午、下午各一次。 + +### 减少「收藏即学到」 +收藏夹里存了几百篇「以后再看」的文章,真正回看的不到 5%。不如看到就处理:要么现在读,要么归档待读,要么直接删。 + +## 物品极简 + +一个简单的判断标准:**这件东西在过去一年里用过吗?** + +- 用过 → 保留 +- 没用到但将来可能用 → 先收起来,再给一年期限 +- 没用到将来也不会用 → 送人或扔掉 + +## 精神极简 + +比物品和信息更重要的,是减少内心的负担: + +- **少承诺** — 不会做的事不要答应,做不了的事及时说 +- **少比较** — 别人的进度和你的关系不大 +- **少内耗** — 纠结 5 分钟还没决定的事,说明选哪个都行 + +--- + +极简不是目的,是手段。腾出空间和精力,才能放在真正重要的事情上。 diff --git a/content/blog/reading-2026.md b/content/blog/reading-2026.md new file mode 100644 index 0000000..c9816c9 --- /dev/null +++ b/content/blog/reading-2026.md @@ -0,0 +1,44 @@ +--- +title: "2026 上半年阅读清单与推荐" +date: 2026-05-12T16:00:00+08:00 +draft: false +tags: + - 阅读 + - 书单 + - 推荐 +--- + +上半年读了十几本书,挑几本值得推荐的记一下。 + +## 技术类 + +### 《软件设计的哲学》 +不是讲设计模式的,而是讲**复杂度管理**。核心观点:软件设计的本质是降低复杂度。写得深入浅出,适合有几年经验想突破瓶颈的开发者。 + +### 《凤凰项目》 +用小说的形式讲 DevOps 转型。IT 运维的日常在书里无比真实,读起来很有代入感。 + +## 效率类 + +### 《深度工作》 +Cal Newport 的代表作。核心论点:在这个随时被打断的时代,深度专注的能力越来越稀缺,也越来越有价值。 + +书里给了一些具体的训练方法,比如: +- 安排固定的深度工作时间段 +- 社交媒体断舍离 +- 用仪式感帮助进入状态 + +## 人文类 + +### 《你以为你以为的就是你以为的吗?》 +一本有意思的思维训练书,帮助识别日常思考中的逻辑漏洞。适合碎片时间翻几页。 + +## 阅读习惯 + +今年调整了阅读方式: + +- **早上的时间给深度阅读** — 30 分钟,不碰手机 +- **通勤时间给信息类阅读** — RSS、Newsletter、技术文章 +- **周末下午给整本书** — 泡杯茶,一次读一两章 + +读书不求多,读完、消化、能用上,一本顶十本。 diff --git a/content/blog/setup-blog.md b/content/blog/setup-blog.md new file mode 100644 index 0000000..05f63d7 --- /dev/null +++ b/content/blog/setup-blog.md @@ -0,0 +1,57 @@ +--- +title: "从零搭建个人博客:Hugo + PaperMod 实践记录" +date: 2026-05-12T20:00:00+08:00 +draft: false +tags: + - Hugo + - 博客 + - 教程 +--- + +## 为什么选 Hugo + +静态博客框架不少,选 Hugo 主要看中三点: + +1. **快** — 编译以毫秒计,生成纯静态文件,部署无压力 +2. **简单** — 一个二进制文件,无需 Node.js、PHP 等运行时依赖 +3. **主题丰富** — PaperMod 主题简洁优雅,阅读体验好 + +## 环境 + +- **服务器**: 腾讯云 Lighthouse,北京地域 +- **系统**: Ubuntu 24.04 LTS +- **域名**: 备案审核中 +- **Hugo**: v0.161.1 (extended) +- **主题**: PaperMod v8 + +## 踩坑记录 + +### GitHub 下载慢 + +国内 VPS 下载 GitHub 上的文件速度感人,最终通过 GitHub API 的 `/zipball/master` 接口才成功拉下 PaperMod 主题: + +```bash +curl -L -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/adityatelange/hugo-PaperMod/zipball/master" \ + -o papermod.zip +``` + +### Snap 里的 Hugo + +系统里 apt 源的 Hugo 版本较旧(v0.123.7),snap 里有最新的 v0.161.1 但 snap 在 LXC 容器里有 cgroup 问题。解决方式是直接从 snap 挂载目录拷贝二进制: + +```bash +cp /snap/hugo/current/bin/hugo /usr/local/bin/ +``` + +## 最终效果 + +现在博客跑着 PaperMod 主题,支持: + +- 明暗主题自动切换 +- RSS 订阅 +- 标签分类 +- 代码高亮与复制 +- 响应式布局 + +后续等备案通过后绑定域名,配上 HTTPS 正式证书就齐活了。 diff --git a/content/blog/tool-setup.md b/content/blog/tool-setup.md new file mode 100644 index 0000000..17d66a0 --- /dev/null +++ b/content/blog/tool-setup.md @@ -0,0 +1,43 @@ +--- +title: "我的效率工具链 2026" +date: 2026-05-12T18:00:00+08:00 +draft: false +tags: + - 工具 + - 效率 + - 推荐 +--- + +持续折腾工具多年,今年终于稳定下来。记录一下目前的工具链,给想优化工作流的朋友参考。 + +## 笔记与知识管理 + +**子弹日记(纸笔)** — 每日规划和自我对话的核心载体。具体用法之前写过,不再重复。 + +**Hugo + Hextra** — 个人博客,用于对外输出。纯静态,零维护成本。 + +**GitHub** — 技术笔记和代码片段的存档。Markdown 文件 + 搜索,比任何笔记软件都好用。 + +## 任务管理 + +**Todoist** — 短期任务和提醒工具。优点是快速、跨平台、自然语言识别能力强。「今天要做的事」用它就够了。 + +## AI 工具 + +**DeepSeek V4** — 主力 AI 助手。Flash 模型日常用,Pro 模型处理复杂任务。API 接入各种场景。 + +## 开发相关 + +- **VS Code** — 主力编辑器 +- **Hugo** — 静态博客生成器 +- **Nginx** — Web 服务器 +- **Git** — 版本控制 + +## 选工具的原则 + +1. **够用就好** — 不追求功能最全,追求用得顺手 +2. **数据可控** — 优先选能导出、能自托管的方案 +3. **学习成本低** — 花在学工具上的时间要能赚回来 +4. **跨平台** — 手机和电脑都能用 + +好工具的标准不是功能多,而是让你忘记工具的存在,专注于事情本身。 diff --git a/content/blog/vps-basics.md b/content/blog/vps-basics.md new file mode 100644 index 0000000..a8bbe50 --- /dev/null +++ b/content/blog/vps-basics.md @@ -0,0 +1,83 @@ +--- +title: "VPS 新手入门:从购买到上线一个网站" +date: 2026-05-12T19:00:00+08:00 +draft: false +tags: + - Linux + - VPS + - 教程 +--- + +买了一台云服务器之后,怎么让它真正跑起来?这篇文章记录基本的 VPS 初始化和安全配置流程。 + +## 购买后的第一件事 + +拿到服务器 IP 和 root 密码后: + +### 1. SSH 登录 + +```bash +ssh root@你的服务器IP +``` + +第一次登录会提示确认主机指纹,输入 `yes` 即可。 + +### 2. 创建普通用户 + +root 权限太大,日常操作应该用普通用户: + +```bash +adduser 用户名 +usermod -aG sudo 用户名 +``` + +### 3. 配置 SSH 密钥登录 + +```bash +# 在本地机器上生成密钥 +ssh-keygen -t ed25519 + +# 把公钥传到服务器 +ssh-copy-id 用户名@服务器IP +``` + +然后编辑 `/etc/ssh/sshd_config`,关闭密码登录: + +``` +PasswordAuthentication no +``` + +### 4. 防火墙配置 + +用 ufw 简单配置: + +```bash +ufw allow OpenSSH +ufw allow 80/tcp +ufw allow 443/tcp +ufw enable +``` + +### 5. 安装必要的软件 + +```bash +apt update && apt upgrade -y +apt install -y nginx curl wget git +``` + +## 部署静态网站 + +最简单的方式是用 Nginx: + +1. 把构建好的静态文件放到 `/var/www/html` 或自定义目录 +2. 配置 Nginx 站点文件指向该目录 +3. 运行 `nginx -t && systemctl reload nginx` + +## 安全底线 + +- 不要用 root 直接操作日常任务 +- 关闭 SSH 密码登录 +- 定期更新系统包 +- 非必要不开放额外端口 + +服务器就像一间屋子,基础装修做好才能住得安心。 diff --git a/hugo.toml.terminal.bak b/hugo.toml.terminal.bak new file mode 100644 index 0000000..375ac83 --- /dev/null +++ b/hugo.toml.terminal.bak @@ -0,0 +1,37 @@ +baseURL = 'https://62.234.90.54/' +languageCode = 'zh-CN' +title = '爪子笔记' +theme = 'terminal' +defaultContentLanguage = 'zh' + +[markup] + [markup.goldmark] + [markup.goldmark.renderer] + unsafe = true + +[params] + contentTypeName = 'posts' + fullWidthTheme = false + centerTheme = false + +[languages] + [languages.zh] + copyright = '爪子笔记' + [languages.zh.params] + subtitle = '一只爪子的技术笔记与生活记录' + readMore = '阅读全文' + readOtherPosts = '更多文章' + + [languages.zh.params.logo] + logoText = '🦀 爪子笔记' + logoHomeLink = '/' + + [languages.zh.menu] + [[languages.zh.menu.main]] + identifier = 'posts' + name = '文章' + url = '/posts/' + [[languages.zh.menu.main]] + identifier = 'about' + name = '关于' + url = '/about' diff --git a/hugo.yaml b/hugo.yaml new file mode 100644 index 0000000..ca3591c --- /dev/null +++ b/hugo.yaml @@ -0,0 +1,97 @@ +baseURL: "https://62.234.90.54/" +title: "🦀 爪子笔记" + +enableRobotsTXT: true +enableGitInfo: false +hasCJKLanguage: true + +outputs: + home: [html] + page: [html] + section: [html, rss] + +defaultContentLanguage: zh-cn +languages: + zh-cn: + label: 简体中文 + locale: zh-CN + weight: 1 + title: 🦀 爪子笔记 + +theme: hextra + +markup: + highlight: + noClasses: false + goldmark: + renderer: + unsafe: true + extensions: + passthrough: + delimiters: + block: [['\[', '\]'], ['$$', '$$']] + inline: [['\(', '\)']] + enable: true + +enableInlineShortcodes: true + +menu: + main: + - identifier: blog + name: 文章 + pageRef: /blog + weight: 1 + - identifier: about + name: 关于 + pageRef: /about + weight: 2 + - name: Search + weight: 3 + params: + type: search + +params: + description: 一只爪子的技术笔记与生活记录 + + navbar: + displayTitle: true + displayLogo: false + width: wide + + theme: + default: system + displayToggle: true + + footer: + enable: true + displayCopyright: true + displayPoweredBy: false + width: normal + + displayUpdatedDate: false + dateFormat: "2006-01-02" + + search: + enable: true + type: flexsearch + flexsearch: + index: content + tokenize: forward + + blog: + list: + displayTags: true + sortBy: date + sortOrder: desc + pagerSize: 20 + article: + displayPagination: true + + toc: + displayTags: true + + page: + width: normal + + comments: + enable: false diff --git a/static/images/ai.jpg b/static/images/ai.jpg new file mode 100644 index 0000000..0d054a2 Binary files /dev/null and b/static/images/ai.jpg differ diff --git a/static/images/coding.jpg b/static/images/coding.jpg new file mode 100644 index 0000000..2ffe4ad Binary files /dev/null and b/static/images/coding.jpg differ diff --git a/static/images/journal.jpg b/static/images/journal.jpg new file mode 100644 index 0000000..7d62217 Binary files /dev/null and b/static/images/journal.jpg differ diff --git a/static/images/logo-dark.svg b/static/images/logo-dark.svg new file mode 100644 index 0000000..fe3b61c --- /dev/null +++ b/static/images/logo-dark.svg @@ -0,0 +1,3 @@ + + 🦀 + diff --git a/static/images/logo.svg b/static/images/logo.svg new file mode 100644 index 0000000..fe3b61c --- /dev/null +++ b/static/images/logo.svg @@ -0,0 +1,3 @@ + + 🦀 + diff --git a/static/images/thinking.jpg b/static/images/thinking.jpg new file mode 100644 index 0000000..3856875 Binary files /dev/null and b/static/images/thinking.jpg differ diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml b/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 0000000..d7d7656 --- /dev/null +++ b/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,112 @@ +name: Bug Report 🐞 +description: Create a report to help us improve +title: "[Bug]: " +labels: ["bug", "triage"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report :) + - Kindly **DO NOT** ask for instructions. + - Use [Discussions](https://github.com/adityatelange/hugo-PaperMod/discussions) section if you have a query or doubts or any other relevant question. + - You may join [Discord community](https://discord.gg/ahpmTvhVmp) to interact with fellow contributors and users + - Read project's [Wiki](https://github.com/adityatelange/hugo-PaperMod/wiki) for detailed documentation. + - Read project's [FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs) section for Frequently asked questions. + - Search for previous [Issues](https://github.com/adityatelange/hugo-PaperMod/issues)/[Pull Requests](https://github.com/adityatelange/hugo-PaperMod/pulls) if this issue is already reported or fix has been created. + - type: textarea + id: what_happened + attributes: + label: What happened? + description: Also tell us, what did you expect to happen? + placeholder: A bug happened! Here are the screenshots.. Tell us what you see! + validations: + required: true + - type: textarea + id: steps_to_reproduce + attributes: + label: Steps to reproduce + description: How to reproduce this issue. Here are the steps... + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + - type: dropdown + id: hugo_version + attributes: + label: Hugo Version + description: What version of Hugo are you running? + options: + - Hugo >= 0.146.0 (Recommended - Minimum version required for PaperMod) + - Hugo < 0.146.0 (Incompatible - Not recommended to build PaperMod on lower versions) + validations: + required: true + - type: input + id: papermod_version + attributes: + label: PaperMod Version + description: What version of PaperMod are you running? + placeholder: | + PaperMod v7.0 or + Branch master or + Commit-id: 3f50861a0ced88f9b614a43662edeb4c0bc45da8 + validations: + required: true + - type: dropdown + id: browser_type + attributes: + label: What kind of devices are you seeing the problem on? + multiple: true + options: + - Mobile + - Desktop + validations: + required: false + - type: dropdown + id: browsers + attributes: + label: What browsers are you seeing the problem on? + multiple: true + options: + - Firefox + - Chrome + - Safari + - Microsoft Edge + validations: + required: false + - type: input + id: browser_version + attributes: + label: Browser Version + description: Please add browser version or enter user agent string (navigator.userAgent) + placeholder: ex. Google Chrome 86.0 + validations: + required: false + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. + render: shell + validations: + required: true + - type: input + id: repo_url + attributes: + label: Repository/Source Code link where this issue can be reproduced + description: Please add url of the repository where this issue can be reproduced + placeholder: https://github.com// + validations: + required: false + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/adityatelange/hugo-PaperMod?tab=coc-ov-file#readme). + options: + - label: I agree to follow this project's Code of Conduct + required: true + validations: + required: true diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml b/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..eeb6e55 --- /dev/null +++ b/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: PaperMod Discussions + url: https://github.com/adityatelange/hugo-PaperMod/discussions + about: Please ask and answer questions/doubts here, DO NOT open an issue for questions. diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml b/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml new file mode 100644 index 0000000..3976a80 --- /dev/null +++ b/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -0,0 +1,32 @@ +name: Enhancement 🚀 +description: Propose a new feature or change for enhancing the experience. +title: "[Enhancement]: " +labels: ["enhancement", "triage"] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this enhancement form :) + - Use [Discussions](https://github.com/adityatelange/hugo-PaperMod/discussions) section if you have a query or doubts or any other relevant question. + - You may join [Discord community](https://discord.gg/ahpmTvhVmp) to interact with fellow contributors and users + - Read project's [Wiki](https://github.com/adityatelange/hugo-PaperMod/wiki) for detailed documentation. + - Read project's [FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs) section for Frequently asked questions. + - Search for previous [Issues](https://github.com/adityatelange/hugo-PaperMod/issues)/[Pull Requests](https://github.com/adityatelange/hugo-PaperMod/pulls) if this issue is already reported or fix has been created. + - type: textarea + id: what_happened + attributes: + label: What you'd like to propose? + description: + placeholder: + validations: + required: true + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/adityatelange/hugo-PaperMod?tab=coc-ov-file#readme). + options: + - label: I agree to follow this project's Code of Conduct + required: true + validations: + required: true \ No newline at end of file diff --git a/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md b/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..dcc52d6 --- /dev/null +++ b/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,44 @@ + + + +**What does this PR change? What problem does it solve?** + + + + +**Was the change discussed in an issue or in the Discussions before?** + + + + +## PR Checklist + +- [ ] This change adds/updates translations and I have used the [template present here](https://github.com/adityatelange/hugo-PaperMod/wiki/Translations#want-to-add-your-language-). +- [ ] I have enabled [maintainer edits for this PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork). +- [ ] I have verified that the code works as described/as intended. +- [ ] This change adds a Social Icon which has a permissive license to use it. +- [ ] This change **does not** include any CDN resources/links. +- [ ] This change **does not** include any unrelated scripts such as bash and python scripts. +- [ ] This change updates the overridden internal templates from HUGO's repository. diff --git a/themes/PaperMod/.github/workflows/build-check.yml b/themes/PaperMod/.github/workflows/build-check.yml new file mode 100644 index 0000000..3f239dd --- /dev/null +++ b/themes/PaperMod/.github/workflows/build-check.yml @@ -0,0 +1,56 @@ +name: Build Check + +on: + push: + paths-ignore: + - "images/**" + - "LICENSE" + - "README.md" + branches: + - master + - exampleSite + pull_request: + paths-ignore: + - "images/**" + - "LICENSE" + - "README.md" + branches: + - master + - exampleSite + workflow_dispatch: + # manual run + inputs: + hugoVersion: + description: "Hugo Version" + required: false + default: "0.146.0" + +defaults: + run: + shell: bash + +jobs: + build-check: + runs-on: ubuntu-latest + env: + # min_version from theme.toml + HUGO_VERSION: ${{ github.event.inputs.hugoVersion || '0.146.0' }} + steps: + - name: Install Hugo CLI + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + + - name: Checkout + uses: actions/checkout@v6 + with: + ref: exampleSite + + - name: Get Theme + run: git submodule update --init --recursive + + - name: Update theme to Latest commit + run: git submodule update --remote --merge + + - name: Build with Hugo + run: hugo --buildDrafts --gc diff --git a/themes/PaperMod/.github/workflows/gh-pages.yml b/themes/PaperMod/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..7f84d94 --- /dev/null +++ b/themes/PaperMod/.github/workflows/gh-pages.yml @@ -0,0 +1,82 @@ +name: Deploy Hugo PaperMod Demo to Pages + +on: + push: + paths-ignore: + - "images/**" + - "LICENSE" + - "README.md" + branches: + - master + - exampleSite + workflow_dispatch: + # manual run + inputs: + hugoVersion: + description: "Hugo Version" + required: false + default: "latest" + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +# Default to bash +defaults: + run: + shell: bash + +jobs: + # Build job + build: + permissions: + contents: read + runs-on: ubuntu-latest + env: + HUGO_VERSION: ${{ github.event.inputs.hugoVersion || 'latest' }} + steps: + - name: Resolve Hugo version + run: | + if [ "${HUGO_VERSION}" = "latest" ]; then + HUGO_VERSION=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/') + echo "HUGO_VERSION=${HUGO_VERSION}" >> $GITHUB_ENV + fi + - name: Install Hugo CLI + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + - name: Checkout + uses: actions/checkout@v6 + with: + ref: exampleSite + - name: Setup Pages + id: pages + uses: actions/configure-pages@v6 + - name: Get Theme + run: git submodule update --init --recursive + - name: Update theme to Latest commit + run: git submodule update --remote --merge + - name: Build with Hugo + run: | + hugo \ + --buildDrafts --gc \ + --baseURL ${{ steps.pages.outputs.base_url }} + - name: Upload artifact + uses: actions/upload-pages-artifact@v5 + with: + path: ./public + # Deployment job + deploy: + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/themes/PaperMod/LICENSE b/themes/PaperMod/LICENSE new file mode 100644 index 0000000..0215fa5 --- /dev/null +++ b/themes/PaperMod/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2020 nanxiaobei and adityatelange +Copyright (c) 2021-2026 adityatelange + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/themes/PaperMod/README.md b/themes/PaperMod/README.md new file mode 100644 index 0000000..0dc04be --- /dev/null +++ b/themes/PaperMod/README.md @@ -0,0 +1,99 @@ +# Hugo PaperMod + +**A fast, clean, and responsive theme for [Hugo](https://gohugo.io/).** + +[![hugo-papermod](https://img.shields.io/badge/Hugo--Themes-@PaperMod-blue)](https://themes.gohugo.io/themes/hugo-papermod/) +[![Minimum Hugo Version](https://img.shields.io/static/v1?label=Hugo&message=v0.146.0%2B&color=blue&logo=hugo)](https://github.com/gohugoio/hugo/releases/tag/v0.146.0) +[![Discord](https://img.shields.io/discord/971046860317921340?label=Discord&logo=discord)](https://discord.gg/ahpmTvhVmp) + +> Based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper/tree/4330c8b12aa48bfdecbcad6ad66145f679a430b3), with additional features and customization options. + + + + + + + + + + + + + + + + + + + + +
Live Demoadityatelange.github.io/hugo-PaperMod
Documentation 📚Github Wiki
Example Site SourceexampleSite branch
Star History Rankko-fi
+ + +

+ Mockup image +

+ +--- + +## Features 💥 + +`☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive` + +- **Asset pipeline** -- Hugo's built-in asset generator with fingerprinting, bundling, and minification. +- **Three layout modes** -- [Regular](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode), [Home-Info](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode), and [Profile](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode). +- **Light and dark themes** -- Automatic switching based on browser preference, plus a manual toggle. +- **Multilingual support** -- Includes a built-in language selector. +- **Search** -- Client-side search powered by Fuse.js. +- **SEO optimized** -- Open Graph, Twitter Cards, and Schema.org structured data out of the box. +- **Cover images** -- Per-post cover images with responsive image support. +- **Table of contents** -- Auto-generated from heading structure. +- **Multiple authors** -- Native support for multi-author sites. +- **Social icons and share buttons** -- Configurable social links and per-post sharing. +- **Breadcrumb navigation** +- **Post archives and taxonomies** +- **Code block copy buttons** -- One-click copying with Chroma syntax highlighting. +- **Related post suggestions** +- **Zero JS build dependencies** -- No webpack, Node.js, or other tooling required. + +| Topic | Description | +| ------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| **[Installation guide](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)** | Detailed installation and update instructions | +| **[Features wiki page](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)** | In-depth explanations of all features | +| **[FAQ wiki](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)** | Common questions and configuration walkthroughs | +| **[Icons wiki](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)** | Documentation for social icons and share icons | +| **[Variables wiki](https://github.com/adityatelange/hugo-PaperMod/wiki/Variables)** | List of all available template variables | +| **[Overiding templates](https://github.com/adityatelange/hugo-PaperMod/wiki/Template_Overrides)** | Guide to customizing templates without forking | +| **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)** | Detailed history of releases | + +--- + +## Performance ☄️ + +PaperMod consistently scores near-perfect results on [Pagespeed Insights](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/). + +image + +--- + +## Support 🫶 + +- Star this repository to show your support. +- Share PaperMod with others who might find it useful. +- Sponsor the project on [GitHub Sponsors](https://github.com/sponsors/adityatelange) or [Ko-Fi](https://ko-fi.com/adityatelange). + +--- + +## Special Thanks 🌟 + +- [Highlight.js](https://github.com/highlightjs/highlight.js) +- [Fuse.js](https://github.com/krisk/fuse) +- [Feather Icons](https://github.com/feathericons/feather) +- [Simple Icons](https://github.com/simple-icons/simple-icons) +- All contributors and supporters + +--- + +## Stargazers 📈 + +[![Stargazers over time](https://starchart.cc/adityatelange/hugo-PaperMod.svg?background=%23ffffff00&axis=%23858585&line=%236b63ff)](https://starchart.cc/adityatelange/hugo-PaperMod) diff --git a/themes/PaperMod/assets/css/common/404.css b/themes/PaperMod/assets/css/common/404.css new file mode 100644 index 0000000..8a23430 --- /dev/null +++ b/themes/PaperMod/assets/css/common/404.css @@ -0,0 +1,11 @@ +.not-found { + position: absolute; + left: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center; + height: 80%; + font-size: 160px; + font-weight: 700; +} diff --git a/themes/PaperMod/assets/css/common/archive.css b/themes/PaperMod/assets/css/common/archive.css new file mode 100644 index 0000000..7e7e245 --- /dev/null +++ b/themes/PaperMod/assets/css/common/archive.css @@ -0,0 +1,44 @@ +.archive-posts { + width: 100%; + font-size: 16px; +} + +.archive-year { + margin-top: 40px; +} + +.archive-year:not(:last-of-type) { + border-bottom: 2px solid var(--border); +} + +.archive-month { + display: flex; + align-items: flex-start; + padding: 10px 0; +} + +.archive-month-header { + margin: 25px 0; + width: 200px; +} + +.archive-month:not(:last-of-type) { + border-bottom: 1px solid var(--border); +} + +.archive-entry { + position: relative; + padding: 5px; + margin: 10px 0; +} + +.archive-entry-title { + margin: 5px 0; + font-weight: 400; +} + +.archive-count, +.archive-meta { + color: var(--secondary); + font-size: 14px; +} diff --git a/themes/PaperMod/assets/css/common/footer.css b/themes/PaperMod/assets/css/common/footer.css new file mode 100644 index 0000000..240df53 --- /dev/null +++ b/themes/PaperMod/assets/css/common/footer.css @@ -0,0 +1,56 @@ +.footer, +.top-link { + font-size: 12px; + color: var(--secondary); +} + +.footer { + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap); + text-align: center; + line-height: 24px; +} + +.footer span { + margin-inline-start: 1px; + margin-inline-end: 1px; +} + +.footer span:last-child { + white-space: nowrap; +} + +.footer a { + color: inherit; + text-underline-offset: 0.25rem; + text-decoration: underline; +} + +.top-link { + position: fixed; + bottom: 4rem; + right: 2rem; + z-index: 99; + background: var(--tertiary); + width: 2.5rem; + height: 2.5rem; + padding: 10px; + border-radius: 64px; + transition: visibility .3s, opacity .3s cubic-bezier(0.4, 0, 1, 1); +} + +.hidden { + visibility: hidden; + opacity: 0; +} + +.top-link, +.top-link svg { + filter: drop-shadow(0px 0px 0px var(--theme)); +} + +.footer a:hover, +.top-link:hover { + color: var(--primary); +} diff --git a/themes/PaperMod/assets/css/common/header.css b/themes/PaperMod/assets/css/common/header.css new file mode 100644 index 0000000..14e36e3 --- /dev/null +++ b/themes/PaperMod/assets/css/common/header.css @@ -0,0 +1,101 @@ +.header-nav { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + max-width: calc(var(--nav-width) + var(--gap) * 2); + margin: auto; + line-height: var(--header-height); + padding: 0 var(--gap); + column-gap: var(--gap); +} + +.header-nav a { + display: block; +} + +.logo, +.menu { + display: flex; +} + +.logo { + align-items: center; + column-gap: 0.55rem; + flex-wrap: wrap; +} + +.logo a { + font-size: 24px; + font-weight: 700; + display: flex; + align-items: center; + column-gap: 0.55rem; +} + +.logo a img, +.logo a svg { + pointer-events: none; + border-radius: 6px; +} + +.theme-toggle { + padding: 0 0.4rem; +} + +[data-theme="dark"] .moon { + display: none; +} + +[data-theme="light"] .sun { + display: none; +} + +.logo-switches { + display: inline-flex; + gap: 0.4rem; + align-items: inherit; + min-height: stretch; + flex-wrap: inherit; +} + +.logo-switches>* { + min-height: inherit; + align-items: center; + display: inline-flex; +} + +.nav-sep { + color: var(--secondary); +} + +.lang-menu * { + display: inherit; + min-height: inherit; + align-items: inherit; +} + +.lang-menu a { + font-size: 1rem; + font-weight: 500; + padding: 0 0.4rem; + display: inline-flex +} + +.menu { + list-style: none; + word-break: keep-all; + overflow-x: auto; + white-space: nowrap; + column-gap: var(--gap); +} + +.menu a { + font-size: 16px; +} + +.menu .active { + font-weight: 500; + text-decoration: underline; + text-underline-offset: 0.3rem; + text-decoration-thickness: 2px; +} diff --git a/themes/PaperMod/assets/css/common/main.css b/themes/PaperMod/assets/css/common/main.css new file mode 100644 index 0000000..25ae4da --- /dev/null +++ b/themes/PaperMod/assets/css/common/main.css @@ -0,0 +1,66 @@ +.main { + position: relative; + min-height: calc(100vh - var(--header-height) - var(--footer-height)); + max-width: calc(var(--main-width) + var(--gap) * 2); + margin: auto; + padding: var(--gap); +} + +.page-header h1 { + font-size: 40px; +} + +.pagination { + display: flex; +} + +.pagination a { + color: var(--theme); + font-size: 13px; + line-height: 36px; + background: var(--primary); + border-radius: calc(36px / 2); + padding: 0 16px; +} + +.pagination .next { + margin-inline-start: auto; +} + + +.social-icons a { + display: inline-flex; + padding: 10px; +} + +.social-icons a svg { + height: 26px; + width: 26px; +} + +code { + direction: ltr; +} + +div.highlight, +pre { + position: relative; +} + +.copy-code { + display: none; + position: absolute; + top: 4px; + right: 4px; + color: rgba(255, 255, 255, 0.8); + background: rgba(78, 78, 78, 0.8); + border-radius: var(--radius); + padding: 0 5px; + font-size: 14px; + user-select: none; +} + +div.highlight:hover .copy-code, +pre:hover .copy-code { + display: block; +} diff --git a/themes/PaperMod/assets/css/common/md-content.css b/themes/PaperMod/assets/css/common/md-content.css new file mode 100644 index 0000000..bac29bb --- /dev/null +++ b/themes/PaperMod/assets/css/common/md-content.css @@ -0,0 +1,253 @@ +.md-content h3, +.md-content h4, +.md-content h5, +.md-content h6 { + margin: 24px 0 16px; +} + +.md-content h1 { + margin: 40px auto 32px; + font-size: 40px; +} + +.md-content h2 { + margin: 32px auto 24px; + font-size: 32px; +} + +.md-content h3 { + font-size: 24px; +} + +.md-content h4 { + font-size: 16px; +} + +.md-content h5 { + font-size: 14px; +} + +.md-content h6 { + font-size: 12px; +} + +.md-content a:not(.anchor) { + text-underline-offset: 0.3rem; + text-decoration: underline; +} + +.md-content del { + text-decoration: line-through; +} + +.md-content dl:not(:last-child), +.md-content ol:not(:last-child), +.md-content p:not(:last-child), +.md-content figure:not(:last-child), +.md-content ul:not(:last-child) { + margin-bottom: var(--content-gap); +} + +.md-content ol, +.md-content ul { + padding-inline-start: 1.25rem; +} + +.md-content li { + margin-top: 0.3rem; +} + +.md-content li p { + margin-bottom: 0; +} + +.md-content dl { + display: flex; + flex-wrap: wrap; + margin: 0; +} + +.md-content dt { + width: 25%; + font-weight: 700; +} + +.md-content dd { + width: 75%; + margin-inline-start: 0; + padding-inline-start: 10px; +} + +.md-content dd~dd, +.md-content dt~dt { + margin-top: 10px; +} + +.md-content table { + margin-bottom: var(--content-gap); +} + +.md-content table th, +.md-content table:not(.highlighttable, .highlight table, .gist .highlight) td { + min-width: 80px; + padding: 6px 13px; + line-height: 1.5; + border: 1px solid var(--border); +} + +.md-content table th { + text-align: start; +} + +.md-content table:not(.highlighttable) td code:only-child { + margin: auto 0; +} + +.md-content .highlight table { + border-radius: var(--radius); +} + +.md-content .highlight:not(table) { + margin-bottom: var(--content-gap); + background: var(--code-block-bg) !important; + border-radius: var(--radius); + direction: ltr; +} + +.md-content li>.highlight { + margin-inline-end: 0; +} + +.md-content ul pre { + margin-inline-start: calc(var(--gap) * -2); +} + +.md-content .highlight pre { + margin: 0; +} + +.md-content .highlighttable { + table-layout: fixed; +} + +.md-content .highlighttable td:first-child { + width: 40px; +} + +.md-content .highlighttable td .linenodiv { + padding-inline-end: 0 !important; +} + +.md-content .highlighttable td .highlight, +.md-content .highlighttable td .linenodiv pre { + margin-bottom: 0; +} + +.post-content code { + padding: 0.2rem 0.3rem; + font-size: 0.78em; + line-height: 1.5; + background: var(--code-bg); + border-radius: 0.2rem; +} + +.md-content pre code { + display: grid; + margin: auto 0; + padding: 10px; + color: rgb(213, 213, 214); + background: var(--code-block-bg) !important; + border-radius: var(--radius); + overflow-x: auto; + word-break: break-all; +} + +.md-content blockquote { + margin: 1rem 0; + padding-inline-start: 1rem; + border-inline-start: 0.3rem solid var(--content); +} + +.md-content hr { + margin: 30px 0; + height: 2px; + background: var(--tertiary); + border: 0; +} + +.md-content iframe { + max-width: 100%; +} + +.md-content img { + border-radius: var(--radius); + margin: 1rem 0; +} + +.md-content img[src*="#center"] { + margin: 1rem auto; +} + +.md-content figure.align-center { + text-align: center; +} + +.md-content figure>figcaption { + color: var(--primary); + font-size: 16px; + font-weight: bold; + margin: 8px 0 16px; +} + +.md-content figure>figcaption>p { + color: var(--secondary); + font-size: 14px; + font-weight: normal; +} + +.md-content h1:hover .anchor, +.md-content h2:hover .anchor, +.md-content h3:hover .anchor, +.md-content h4:hover .anchor, +.md-content h5:hover .anchor, +.md-content h6:hover .anchor { + display: inline-flex; + color: var(--secondary); + margin-inline-start: 0.5em; + font-weight: 500; + user-select: none; +} + +.anchor:hover { + color: var(--content) !important; +} + +.md-content img.in-text { + display: inline; + margin: auto; +} + +mark { + border-radius: 2px; + padding: 0 2px; +} + +audio { + display: block; + width: 100%; + border: 1px solid var(--border); + border-radius: var(--radius); + overflow: hidden; + height: 2.5rem; + margin-bottom: var(--content-gap); +} + +audio::-webkit-media-controls-enclosure { + border-radius: 0; +} + +video { + border: 1px solid var(--code-bg); + border-radius: var(--radius); + max-width: 100%; +} diff --git a/themes/PaperMod/assets/css/common/post-entry.css b/themes/PaperMod/assets/css/common/post-entry.css new file mode 100644 index 0000000..8422455 --- /dev/null +++ b/themes/PaperMod/assets/css/common/post-entry.css @@ -0,0 +1,129 @@ +.first-entry { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + min-height: 320px; + margin: var(--gap) 0 calc(var(--gap) * 2) 0; +} + +.first-entry .entry-header { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} + +.first-entry .entry-header h1 { + font-size: 34px; + line-height: 1.3; +} + +.first-entry .entry-header h2 { + font-size: 40px; +} + +.first-entry .entry-content { + margin: 14px 0; + font-size: 16px; + -webkit-line-clamp: 3; +} + +.first-entry .entry-footer { + font-size: 14px; +} + +.home-info .entry-content { + --content-gap: 0.5rem; + -webkit-line-clamp: unset; + margin: 0; +} + +.home-info .social-icons a:first-of-type { + padding-inline-start: 0; +} + + +.post-entry { + position: relative; + margin-bottom: var(--gap); + padding: var(--gap); + background: var(--entry); + border-radius: var(--radius); + transition: transform 0.25s ease; + border: 1px solid var(--border); +} + +.post-entry:hover, +.post-entry:focus-within { + transform: translateY(-2px); + border-color: var(--tertiary); +} + +.tag-entry .entry-cover { + display: none; +} + +.entry-header h2 { + font-size: 24px; + line-height: 1.3; +} + +.entry-content { + margin: 8px 0; + color: var(--secondary); + font-size: 14px; + line-height: 1.6; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.home-info .entry-content p { + margin-block-start: 1em; + margin-block-end: 1em; +} + +.entry-footer { + color: var(--secondary); + font-size: 13px; +} + +.entry-link { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + border-radius: var(--radius); +} + +.entry-hint { + color: var(--secondary); +} + +.entry-hint-parent { + display: flex; + justify-content: space-between; +} + +.entry-cover { + font-size: 14px; + margin-bottom: var(--gap); + text-align: center; + display: flex; + flex-direction: column; + gap: .5rem; +} + +.entry-cover img { + border-radius: var(--radius); + width: 100%; + height: auto; +} + +.entry-cover a { + text-underline-offset: 0.3rem; + text-decoration: underline; +} diff --git a/themes/PaperMod/assets/css/common/post-single.css b/themes/PaperMod/assets/css/common/post-single.css new file mode 100644 index 0000000..ca6d26c --- /dev/null +++ b/themes/PaperMod/assets/css/common/post-single.css @@ -0,0 +1,215 @@ +.page-header, +.post-header { + margin: 24px auto var(--content-gap) auto; +} + +.post-title { + font-size: 40px; +} + +.post-description { + margin-top: 10px; +} + +.post-meta { + margin-top: 5px; +} + +.post-meta, +.breadcrumbs { + color: var(--secondary); + font-size: 14px; +} + +.breadcrumbs { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.2rem; +} + +.breadcrumbs a { + font-size: 16px; +} + +.breadcrumbs svg { + height: 1em; +} + +.i18n_list { + display: inline-flex; +} + +.post-meta .i18n_list li { + list-style: none; + margin: auto 3px; +} + +.post-meta a, +.toc a:hover { + text-underline-offset: 0.3rem; + text-decoration: underline; +} + +.post-meta a { + color: var(--secondary); + text-decoration-style: dotted; +} + +details.toc { + margin-bottom: var(--content-gap); + background: var(--code-bg); + border-radius: var(--radius); + border: 1px solid var(--border); +} + +[data-theme="dark"] details.toc { + background: var(--entry); +} + +details.toc summary { + padding: 0.3rem 1.2rem; + border-radius: var(--radius); +} + +details summary { + cursor: pointer; + display: list-item; + width: 100%; + margin-inline-start: 0; + user-select: none; +} + +details .title { + display: inline; + font-weight: 500; + margin-inline-start: 0.2rem; +} + +details { + interpolate-size: allow-keywords; +} + +details::details-content { + height: 0; + opacity: 0; + overflow: clip; + transition: height 150ms ease, + opacity 150ms ease, + content-visibility 150ms allow-discrete; +} + +details[open]::details-content { + height: auto; + opacity: 1; +} + +details .inner { + margin: 0 2.4rem; + padding-bottom: 0.6rem; +} + +details li ul { + margin-inline-start: var(--gap); +} + +.post-content { + color: var(--content); + margin: 30px 0; +} + +.post-footer { + margin-top: var(--content-gap); +} + +.post-footer>* { + margin-bottom: 10px; +} + +.post-tags { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.post-tags li { + display: inline-block; +} + +.post-tags a, +.share-buttons, +.paginav { + border-radius: var(--radius); + background: var(--code-bg); + border: 1px solid var(--border); +} + +.post-tags a { + display: block; + padding: 0 14px; + color: var(--secondary); + font-size: 14px; + line-height: 34px; + background: var(--code-bg); +} + +.post-tags a:hover, +.paginav a:hover { + background: var(--border); +} + +.share-buttons { + padding: 10px; + display: flex; + justify-content: center; + overflow-x: auto; + gap: 10px; +} + +.share-buttons li, +.share-buttons a { + display: inline-flex; +} + +.share-buttons a:not(:last-of-type) { + margin-inline-end: 12px; +} + +.paginav { + display: flex; + line-height: 1.2; +} + +.paginav .title { + letter-spacing: 1px; + text-transform: uppercase; + font-size: 0.8rem; + color: var(--secondary); +} + +.paginav a { + width: 50%; + display: flex; + flex-direction: column; + gap: 0.5rem; + padding: 0.8rem; + border-radius: var(--radius); +} + +.paginav span:hover:not(.title) { + text-underline-offset: 0.2rem; + text-decoration: underline; +} + +.paginav .next { + margin-inline-start: auto; + text-align: right; +} + +[dir="rtl"] .paginav .next { + text-align: left; +} + +h1>a>svg { + display: inline; +} diff --git a/themes/PaperMod/assets/css/common/profile-mode.css b/themes/PaperMod/assets/css/common/profile-mode.css new file mode 100644 index 0000000..8f6d183 --- /dev/null +++ b/themes/PaperMod/assets/css/common/profile-mode.css @@ -0,0 +1,34 @@ +.buttons, +.main .profile { + display: flex; + justify-content: center; +} + +.main .profile { + align-items: center; + min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2)); + text-align: center; +} + +.profile .profile_inner { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; +} + +.profile img { + border-radius: 50%; +} + +.buttons { + flex-wrap: wrap; + max-width: 400px; + gap: 1rem; +} + +.button { + background: var(--tertiary); + border-radius: var(--radius); + padding: 0.4rem 0.8rem; +} diff --git a/themes/PaperMod/assets/css/common/search.css b/themes/PaperMod/assets/css/common/search.css new file mode 100644 index 0000000..b14dfc4 --- /dev/null +++ b/themes/PaperMod/assets/css/common/search.css @@ -0,0 +1,41 @@ +.searchbox input { + padding: 4px 10px; + width: 100%; + color: var(--primary); + font-weight: bold; + border: 2px solid var(--tertiary); + border-radius: var(--radius); +} + +.searchResults li { + list-style: none; + border-radius: var(--radius); + padding: 10px 15px; + position: relative; + font-weight: 500; + display: flex; + align-items: center; + justify-content: space-between; + background: var(--entry); + transition: transform .25s ease; + border: 1px solid var(--border); +} + +.searchResults { + margin: var(--content-gap) 0; + width: 100%; + display: flex; + flex-direction: column; + gap: 10px; +} + +.searchResults li:hover, +.searchResults li:focus-within { + transform: translateY(-2px); + border-color: var(--tertiary); +} + +.searchResults li .entry-link:focus { + outline: 2px solid var(--secondary); + outline-offset: -2px; +} diff --git a/themes/PaperMod/assets/css/common/terms.css b/themes/PaperMod/assets/css/common/terms.css new file mode 100644 index 0000000..017bf34 --- /dev/null +++ b/themes/PaperMod/assets/css/common/terms.css @@ -0,0 +1,19 @@ +.terms-tags { + display: flex; + flex-wrap: wrap; + gap: 1em; + margin-top: var(--content-gap); +} + +.terms-tags li { + display: inline-block; + font-weight: 500; +} + +.terms-tags a { + display: block; + padding: 4px 10px; + background: var(--tertiary); + border-radius: var(--radius); + transition: transform 0.1s; +} diff --git a/themes/PaperMod/assets/css/core/license.css b/themes/PaperMod/assets/css/core/license.css new file mode 100644 index 0000000..1bc9fbf --- /dev/null +++ b/themes/PaperMod/assets/css/core/license.css @@ -0,0 +1,6 @@ +/* + PaperMod v8+ + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2026 adityatelange +*/ diff --git a/themes/PaperMod/assets/css/core/reset.css b/themes/PaperMod/assets/css/core/reset.css new file mode 100644 index 0000000..7393d57 --- /dev/null +++ b/themes/PaperMod/assets/css/core/reset.css @@ -0,0 +1,118 @@ +*, +::after, +::before { + box-sizing: border-box; +} + +html { + -webkit-tap-highlight-color: transparent; + overflow-y: scroll; + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; +} + +a, +button, +body, +h1, +h2, +h3, +h4, +h5, +h6 { + color: var(--primary); +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-size: 18px; + line-height: 1.6; + word-break: break-word; + background: var(--theme); +} + +article, +aside, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +table { + display: block; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1, +h2, +h3, +h4, +h5, +h6, +p { + margin-top: 0; + margin-bottom: 0; +} + +ul { + padding: 0; +} + +a { + text-decoration: none; +} + +body, +figure, +ul { + margin: 0; +} + +table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow-x: auto; + word-break: keep-all; +} + +button, +input, +textarea { + padding: 0; + font: inherit; + background: 0 0; + border: 0; +} + +input, +textarea { + outline: 0; +} + +button, +input[type=button], +input[type=submit] { + cursor: pointer; +} + +input:-webkit-autofill, +textarea:-webkit-autofill { + box-shadow: 0 0 0 50px var(--theme) inset; +} + +img { + display: block; + max-width: 100%; +} diff --git a/themes/PaperMod/assets/css/core/theme-vars.css b/themes/PaperMod/assets/css/core/theme-vars.css new file mode 100644 index 0000000..1ce34ef --- /dev/null +++ b/themes/PaperMod/assets/css/core/theme-vars.css @@ -0,0 +1,40 @@ +:root { + --gap: 24px; + --content-gap: 20px; + --nav-width: 1024px; + --main-width: 720px; + --header-height: 60px; + --footer-height: 60px; + --radius: 8px; + --theme: rgb(255, 255, 255); + --entry: rgb(255, 255, 255); + --primary: rgb(30, 30, 30); + --secondary: rgb(108, 108, 108); + --tertiary: rgb(214, 214, 214); + --content: rgb(31, 31, 31); + --code-block-bg: rgb(28, 29, 33); + --code-bg: rgb(245, 245, 245); + --border: rgb(238, 238, 238); + color-scheme: light; +} + +:root[data-theme="dark"] { + --theme: rgb(29, 30, 32); + --entry: rgb(46, 46, 51); + --primary: rgb(218, 218, 219); + --secondary: rgb(155, 156, 157); + --tertiary: rgb(65, 66, 68); + --content: rgb(196, 196, 197); + --code-block-bg: rgb(46, 46, 51); + --code-bg: rgb(55, 56, 62); + --border: rgb(51, 51, 51); + color-scheme: dark; +} + +.list { + background: var(--code-bg); +} + +[data-theme="dark"] .list { + background: var(--theme); +} diff --git a/themes/PaperMod/assets/css/core/zmedia.css b/themes/PaperMod/assets/css/core/zmedia.css new file mode 100644 index 0000000..6a3355e --- /dev/null +++ b/themes/PaperMod/assets/css/core/zmedia.css @@ -0,0 +1,55 @@ +@media screen and (max-width: 768px) { + /* theme-vars */ + :root { + --gap: 14px; + } + + /* profile-mode */ + .profile img { + transform: scale(0.85); + } + + /* post-entry */ + .first-entry { + min-height: 260px; + } + + /* archive */ + .archive-month { + flex-direction: column; + } + + .archive-year { + margin-top: 20px; + } + + /* footer */ + .footer { + padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap); + } +} + +/* footer */ +@media screen and (max-width: 900px) { + .list .top-link { + transform: translateY(-5rem); + } +} + +@media screen and (max-width: 340px) { + .share-buttons { + justify-content: unset; + } +} + +@media (prefers-reduced-motion) { + /* terms; profile-mode; post-single; post-entry; post-entry; search; search */ + .terms-tags a:active, + .button:active, + .post-entry:active, + .top-link, + .searchResults .focus, + .searchResults li:active { + transform: none; + } +} diff --git a/themes/PaperMod/assets/css/extended/blank.css b/themes/PaperMod/assets/css/extended/blank.css new file mode 100644 index 0000000..a577295 --- /dev/null +++ b/themes/PaperMod/assets/css/extended/blank.css @@ -0,0 +1,5 @@ +/* +This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles + +Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info +*/ diff --git a/themes/PaperMod/assets/css/includes/chroma-mod.css b/themes/PaperMod/assets/css/includes/chroma-mod.css new file mode 100644 index 0000000..ad89b96 --- /dev/null +++ b/themes/PaperMod/assets/css/includes/chroma-mod.css @@ -0,0 +1,24 @@ +.chroma { + background-color: unset !important; +} + +.chroma .hl { + display: flex; +} + +.chroma .lnt { + padding: 0 0 0 12px; +} + +.highlight pre.chroma code { + padding: 8px 0; +} + +.highlight pre.chroma .line .cl, +.chroma .ln { + padding: 0 10px; +} + +.chroma .lntd:last-of-type { + width: 100%; +} diff --git a/themes/PaperMod/assets/css/includes/chroma-styles.css b/themes/PaperMod/assets/css/includes/chroma-styles.css new file mode 100644 index 0000000..63a73ab --- /dev/null +++ b/themes/PaperMod/assets/css/includes/chroma-styles.css @@ -0,0 +1,86 @@ +/* Background */ .bg { color: #cad3f5; background-color: #24273a; } +/* PreWrapper */ .chroma { color: #cad3f5; background-color: #24273a; } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { color: #ed8796 } +/* CodeLine */ .chroma .cl { } +/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #474733 } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 } +/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #c6a0f6 } +/* KeywordConstant */ .chroma .kc { color: #f5a97f } +/* KeywordDeclaration */ .chroma .kd { color: #ed8796 } +/* KeywordNamespace */ .chroma .kn { color: #8bd5ca } +/* KeywordPseudo */ .chroma .kp { color: #c6a0f6 } +/* KeywordReserved */ .chroma .kr { color: #c6a0f6 } +/* KeywordType */ .chroma .kt { color: #ed8796 } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { color: #8aadf4 } +/* NameBuiltin */ .chroma .nb { color: #91d7e3 } +/* NameBuiltinPseudo */ .chroma .bp { color: #91d7e3 } +/* NameClass */ .chroma .nc { color: #eed49f } +/* NameConstant */ .chroma .no { color: #eed49f } +/* NameDecorator */ .chroma .nd { color: #8aadf4; font-weight: bold } +/* NameEntity */ .chroma .ni { color: #8bd5ca } +/* NameException */ .chroma .ne { color: #f5a97f } +/* NameFunction */ .chroma .nf { color: #8aadf4 } +/* NameFunctionMagic */ .chroma .fm { color: #8aadf4 } +/* NameLabel */ .chroma .nl { color: #91d7e3 } +/* NameNamespace */ .chroma .nn { color: #f5a97f } +/* NameOther */ .chroma .nx { } +/* NameProperty */ .chroma .py { color: #f5a97f } +/* NameTag */ .chroma .nt { color: #c6a0f6 } +/* NameVariable */ .chroma .nv { color: #f4dbd6 } +/* NameVariableClass */ .chroma .vc { color: #f4dbd6 } +/* NameVariableGlobal */ .chroma .vg { color: #f4dbd6 } +/* NameVariableInstance */ .chroma .vi { color: #f4dbd6 } +/* NameVariableMagic */ .chroma .vm { color: #f4dbd6 } +/* Literal */ .chroma .l { } +/* LiteralDate */ .chroma .ld { } +/* LiteralString */ .chroma .s { color: #a6da95 } +/* LiteralStringAffix */ .chroma .sa { color: #ed8796 } +/* LiteralStringBacktick */ .chroma .sb { color: #a6da95 } +/* LiteralStringChar */ .chroma .sc { color: #a6da95 } +/* LiteralStringDelimiter */ .chroma .dl { color: #8aadf4 } +/* LiteralStringDoc */ .chroma .sd { color: #6e738d } +/* LiteralStringDouble */ .chroma .s2 { color: #a6da95 } +/* LiteralStringEscape */ .chroma .se { color: #8aadf4 } +/* LiteralStringHeredoc */ .chroma .sh { color: #6e738d } +/* LiteralStringInterpol */ .chroma .si { color: #a6da95 } +/* LiteralStringOther */ .chroma .sx { color: #a6da95 } +/* LiteralStringRegex */ .chroma .sr { color: #8bd5ca } +/* LiteralStringSingle */ .chroma .s1 { color: #a6da95 } +/* LiteralStringSymbol */ .chroma .ss { color: #a6da95 } +/* LiteralNumber */ .chroma .m { color: #f5a97f } +/* LiteralNumberBin */ .chroma .mb { color: #f5a97f } +/* LiteralNumberFloat */ .chroma .mf { color: #f5a97f } +/* LiteralNumberHex */ .chroma .mh { color: #f5a97f } +/* LiteralNumberInteger */ .chroma .mi { color: #f5a97f } +/* LiteralNumberIntegerLong */ .chroma .il { color: #f5a97f } +/* LiteralNumberOct */ .chroma .mo { color: #f5a97f } +/* Operator */ .chroma .o { color: #91d7e3; font-weight: bold } +/* OperatorWord */ .chroma .ow { color: #91d7e3; font-weight: bold } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #6e738d; font-style: italic } +/* CommentHashbang */ .chroma .ch { color: #6e738d; font-style: italic } +/* CommentMultiline */ .chroma .cm { color: #6e738d; font-style: italic } +/* CommentSingle */ .chroma .c1 { color: #6e738d; font-style: italic } +/* CommentSpecial */ .chroma .cs { color: #6e738d; font-style: italic } +/* CommentPreproc */ .chroma .cp { color: #6e738d; font-style: italic } +/* CommentPreprocFile */ .chroma .cpf { color: #6e738d; font-weight: bold; font-style: italic } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { color: #ed8796; background-color: #363a4f } +/* GenericEmph */ .chroma .ge { font-style: italic } +/* GenericError */ .chroma .gr { color: #ed8796 } +/* GenericHeading */ .chroma .gh { color: #f5a97f; font-weight: bold } +/* GenericInserted */ .chroma .gi { color: #a6da95; background-color: #363a4f } +/* GenericOutput */ .chroma .go { } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { color: #f5a97f; font-weight: bold } +/* GenericTraceback */ .chroma .gt { color: #ed8796 } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { } diff --git a/themes/PaperMod/assets/js/fastsearch.js b/themes/PaperMod/assets/js/fastsearch.js new file mode 100644 index 0000000..cb4eabf --- /dev/null +++ b/themes/PaperMod/assets/js/fastsearch.js @@ -0,0 +1,194 @@ +import * as params from '@params'; + +const resList = document.getElementById('searchResults'); +const sInput = document.getElementById('searchInput'); +const searchBox = document.getElementById('searchbox'); + +let fuse; +let currentElement = null; +let firstResult = null; +let lastResult = null; + +const defaultFuseOptions = { + distance: 100, + threshold: 0.4, + ignoreLocation: true, + keys: ['title', 'permalink', 'summary', 'content'] +}; + +const buildFuseOptions = () => { + if (!params.fuseOpts) { + return defaultFuseOptions; + } + + return { + isCaseSensitive: params.fuseOpts.iscasesensitive ?? false, + includeScore: params.fuseOpts.includescore ?? false, + includeMatches: params.fuseOpts.includematches ?? false, + minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1, + shouldSort: params.fuseOpts.shouldsort ?? true, + findAllMatches: params.fuseOpts.findallmatches ?? false, + keys: params.fuseOpts.keys ?? defaultFuseOptions.keys, + location: params.fuseOpts.location ?? 0, + threshold: params.fuseOpts.threshold ?? defaultFuseOptions.threshold, + distance: params.fuseOpts.distance ?? defaultFuseOptions.distance, + ignoreLocation: params.fuseOpts.ignorelocation ?? defaultFuseOptions.ignoreLocation + }; +}; + +const debounce = (fn, delay) => { + let timeout; + return (...args) => { + clearTimeout(timeout); + timeout = window.setTimeout(() => fn(...args), delay); + }; +}; + +const reset = () => { + currentElement = null; + firstResult = null; + lastResult = null; + resList.innerHTML = ''; + sInput.value = ''; + sInput.focus(); +}; + +const setActiveResult = (element) => { + document.querySelectorAll('.focus').forEach((item) => item.classList.remove('focus')); + + if (!element) { + return; + } + + element.focus(); + element.parentElement?.classList.add('focus'); + currentElement = element; +}; + +const renderResults = (results) => { + if (!Array.isArray(results) || results.length === 0) { + resList.innerHTML = ''; + firstResult = lastResult = currentElement = null; + return; + } + + const fragment = document.createDocumentFragment(); + + for (const result of results) { + const li = document.createElement('li'); + const titleText = document.createTextNode(result.item.title); + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + svg.setAttribute('width', '24'); + svg.setAttribute('height', '24'); + svg.setAttribute('viewBox', '0 0 24 24'); + svg.setAttribute('fill', 'none'); + svg.setAttribute('stroke', 'currentColor'); + svg.setAttribute('stroke-width', '2'); + svg.setAttribute('stroke-linecap', 'round'); + svg.setAttribute('stroke-linejoin', 'round'); + svg.classList.add('feather', 'feather-chevrons-right'); + + svg.innerHTML = ''; + + const link = document.createElement('a'); + link.className = 'entry-link'; + link.href = result.item.permalink; + link.setAttribute('aria-label', result.item.title); + + li.appendChild(titleText); + li.appendChild(svg); + li.appendChild(link); + fragment.appendChild(li); + } + + resList.innerHTML = ''; + resList.appendChild(fragment); + firstResult = resList.firstElementChild; + lastResult = resList.lastElementChild; +}; + +const performSearch = () => { + if (!fuse) { + return; + } + + const query = sInput.value.trim(); + if (!query) { + renderResults([]); + return; + } + + const searchOptions = params.fuseOpts?.limit ? { limit: params.fuseOpts.limit } : undefined; + const results = searchOptions ? fuse.search(query, searchOptions) : fuse.search(query); + renderResults(results); +}; + +const initSearch = async () => { + if (!sInput || !resList) { + return; + } + + sInput.disabled = false; + sInput.focus(); + + try { + const response = await fetch('../index.json'); + if (!response.ok) { + throw new Error(`Search index load failed: ${response.status}`); + } + + const data = await response.json(); + if (data) { + fuse = new Fuse(data, buildFuseOptions()); + } + } catch (error) { + console.error(error); + } +}; + +window.addEventListener('load', initSearch); + +sInput?.addEventListener('input', debounce(performSearch, 150)); + +sInput?.addEventListener('search', () => { + if (!sInput.value) { + reset(); + } +}); + +document.addEventListener('keydown', (event) => { + const { key } = event; + const active = document.activeElement; + const isInSearchBox = searchBox?.contains(active); + + if (key === 'Escape') { + reset(); + return; + } + + if (!firstResult || !isInSearchBox) { + return; + } + + if (key === 'ArrowDown') { + event.preventDefault(); + + if (active === sInput) { + setActiveResult(firstResult.querySelector('.entry-link')); + } else if (active?.parentElement !== lastResult) { + setActiveResult(active?.parentElement?.nextElementSibling?.querySelector('.entry-link')); + } + } else if (key === 'ArrowUp') { + event.preventDefault(); + + if (active?.parentElement === firstResult) { + setActiveResult(sInput); + } else if (active !== sInput) { + setActiveResult(active?.parentElement?.previousElementSibling?.querySelector('.entry-link')); + } + } else if (key === 'ArrowRight') { + if (active?.matches?.('.entry-link')) { + active.click(); + } + } +}); diff --git a/themes/PaperMod/assets/js/fuse.basic.min.js b/themes/PaperMod/assets/js/fuse.basic.min.js new file mode 100644 index 0000000..7457721 --- /dev/null +++ b/themes/PaperMod/assets/js/fuse.basic.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?O.getFn:n,o=t.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(j).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),a=parseFloat(Math.round(o*r)/r);return n.set(i,a),a},clear:function(){n.clear()}}}(a,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,f(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();f(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?O.getFn:r,o=n.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o,c=new A({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(x)),c.setSources(t),c.create(),c}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?O.distance:s,u=t.ignoreLocation,l=void 0===u?O.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}var F=32;function C(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?O.location:i,a=r.distance,c=void 0===a?O.distance:a,s=r.threshold,h=void 0===s?O.threshold:s,u=r.findAllMatches,l=void 0===u?O.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?O.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?O.includeMatches:v,y=r.ignoreLocation,p=void 0===y?O.ignoreLocation:y;if(t.length>F)throw new Error("Pattern length exceeds max of ".concat(F,"."));for(var m,b=t.length,k=e.length,M=Math.max(0,Math.min(o,k)),w=h,x=M,L=f>1||g,S=L?Array(k):[];(m=e.indexOf(t,x))>-1;){var _=I(t,{currentLocation:m,expectedLocation:M,distance:c,ignoreLocation:p});if(w=Math.min(_,w),x=m+b,L)for(var j=0;j=$;z-=1){var J=z-1,R=n[e.charAt(J)];if(L&&(S[J]=+!!R),K[z]=(K[z+1]<<1|1)&R,P&&(K[z]|=(A[z+1]|A[z])<<1|1|A[z+1]),K[z]&N&&(E=I(t,{errors:P,currentLocation:J,expectedLocation:M,distance:c,ignoreLocation:p}))<=w){if(w=E,(x=J)<=M)break;$=Math.max(1,2*M-x)}}if(I(t,{errors:P+1,currentLocation:M,expectedLocation:M,distance:c,ignoreLocation:p})>w)break;A=K}var U={isMatch:x>=0,score:Math.max(.001,E)};if(L){var B=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}(S,f);B.length?g&&(U.indices=B):U.isMatch=!1}return U}function N(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?O.location:o,c=i.threshold,s=void 0===c?O.threshold:c,h=i.distance,u=void 0===h?O.distance:h,l=i.includeMatches,d=void 0===l?O.includeMatches:l,f=i.findAllMatches,v=void 0===f?O.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?O.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?O.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?O.ignoreLocation:b;if(r(this,e),this.options={location:a,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){n.chunks.push({pattern:e,alphabet:N(e),startIndex:t})},w=this.pattern.length;if(w>F){for(var x=0,L=w%F,S=w-L;x-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function D(e,t){t.score=e.score}var K=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;if(r(this,e),this.options=t(t({},O),i),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new w(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof A))throw new Error("Incorrect 'index' type");this._myIndex=t||E(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){y(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,a=r.shouldSort,c=r.sortFn,s=r.ignoreFieldNorm,h=f(e)?f(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?O.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,a=n?n.weight:null;t*=Math.pow(0===o&&a?Number.EPSILON:o,(a||1)*(r?1:i))})),e.score=t}))}(h,{ignoreFieldNorm:s}),a&&h.sort(c),v(n)&&n>-1&&(h=h.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?O.includeMatches:r,o=n.includeScore,a=void 0===o?O.includeScore:o,c=[];return i&&c.push($),a&&c.push(D),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}(h,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=T(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(y(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=T(e,this.options),r=this._myIndex,i=r.keys,o=r.records,a=[];return o.forEach((function(e){var r=e.$,o=e.i;if(y(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,c(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&a.push({idx:o,item:r,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!y(n))return[];var i=[];if(u(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(y(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),s=c.isMatch,h=c.score,l=c.indices;s&&i.push({score:h,key:t,value:o,norm:a,indices:l})}return i}}]),e}();return K.version="7.0.0",K.createIndex=E,K.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?O.getFn:n,i=t.fieldNormWeight,o=void 0===i?O.fieldNormWeight:i,a=e.keys,c=e.records,s=new A({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},K.config=O,K},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/themes/PaperMod/assets/js/license.js b/themes/PaperMod/assets/js/license.js new file mode 100644 index 0000000..1bc9fbf --- /dev/null +++ b/themes/PaperMod/assets/js/license.js @@ -0,0 +1,6 @@ +/* + PaperMod v8+ + License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE + Copyright (c) 2020 nanxiaobei and adityatelange + Copyright (c) 2021-2026 adityatelange +*/ diff --git a/themes/PaperMod/go.mod b/themes/PaperMod/go.mod new file mode 100644 index 0000000..4a79471 --- /dev/null +++ b/themes/PaperMod/go.mod @@ -0,0 +1,3 @@ +module github.com/adityatelange/hugo-PaperMod + +go 1.16 diff --git a/themes/PaperMod/i18n/ar.yaml b/themes/PaperMod/i18n/ar.yaml new file mode 100644 index 0000000..52990c2 --- /dev/null +++ b/themes/PaperMod/i18n/ar.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "السابق" + +- id: next_page + translation: "التالي" + +- id: read_time + translation: + one: "دقيقة واحدة" + two: "دقيقتان" + few: "بضع ثوان" + zero: "الآن" + other: "دقائق {{ .Count }}" + +- id: toc + translation: "فهرس المحتوى" + +- id: translations + translation: "ترجمات أخرى" + +- id: home + translation: "الصفحة الرئيسية" + +- id: code_copied + translation: "تم النسخ!" + +- id: code_copy + translation: "نسخ الكود" diff --git a/themes/PaperMod/i18n/be.yaml b/themes/PaperMod/i18n/be.yaml new file mode 100644 index 0000000..22902ab --- /dev/null +++ b/themes/PaperMod/i18n/be.yaml @@ -0,0 +1,39 @@ +- id: prev_page + translation: "Папярэдняя" + +- id: next_page + translation: "Наступная" + +- id: read_time + translation: + zero: "0 хвілін" + one: "1 хвіліна" + few: "{{ .Count }} хвіліны" + many: "{{ .Count }} хвілін" + other: "{{ .Count }} хвілін" + +- id: words + translation: + zero: "няма слоў" + one: "1 слова" + few: "{{ .Count }} слова" + many: "{{ .Count }} слоў" + other: "{{ .Count }} слова" + +- id: toc + translation: "Змест" + +- id: translations + translation: "Пераклады" + +- id: home + translation: "Галоўная" + +- id: edit_post + translation: "Рэдагаваць" + +- id: code_copy + translation: "капіяваць" + +- id: code_copied + translation: "скапіявана!" diff --git a/themes/PaperMod/i18n/bg.yaml b/themes/PaperMod/i18n/bg.yaml new file mode 100644 index 0000000..1e314af --- /dev/null +++ b/themes/PaperMod/i18n/bg.yaml @@ -0,0 +1,16 @@ +- id: prev_page + translation: "Предишна страница" + +- id: next_page + translation: "Следваща страница" + +- id: read_time + translation: + one : "1 мин" + other: "{{ .Count }} мин" + +- id: toc + translation: "Съдържание" + +- id: translations + translation: "Преводи" diff --git a/themes/PaperMod/i18n/bn.yaml b/themes/PaperMod/i18n/bn.yaml new file mode 100644 index 0000000..f42780f --- /dev/null +++ b/themes/PaperMod/i18n/bn.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "পূর্ববর্তী" + +- id: next_page + translation: "পরবর্তী" + +- id: read_time + translation: + one : "১ মিনিট" + other: "{{ .Count }} মিনিট" + +- id: words + translation: + one : "১ টি শব্দ" + other: "{{ .Count }} টি শব্দ" + +- id: toc + translation: "সূচিপত্র" + +- id: translations + translation: "অনুবাদসমূহ" + +- id: home + translation: "হোম" + +- id: edit_post + translation: "সম্পাদনা করুন" + +- id: code_copy + translation: "কপি করুন" + +- id: code_copied + translation: "কপি হয়েছে!" diff --git a/themes/PaperMod/i18n/ca.yaml b/themes/PaperMod/i18n/ca.yaml new file mode 100644 index 0000000..f2b2e35 --- /dev/null +++ b/themes/PaperMod/i18n/ca.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Pàgina anterior" + +- id: next_page + translation: "Pàgina següent" + +- id: read_time + translation: + one : "1 minut" + other: "{{ .Count }} minuts" + +- id: words + translation: + one : "paraula" + other: "{{ .Count }} paraules" + +- id: toc + translation: "Taula de Continguts" + +- id: translations + translation: "Traduccions" + +- id: home + translation: "Inici" + +- id: edit_post + translation: "Editar" + +- id: code_copy + translation: "copiar" + +- id: code_copied + translation: "copiat!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/ckb.yaml b/themes/PaperMod/i18n/ckb.yaml new file mode 100644 index 0000000..25789d1 --- /dev/null +++ b/themes/PaperMod/i18n/ckb.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "پەڕەی پێشتر" + +- id: next_page + translation: "پەڕەی دواتر" + +- id: read_time + translation: + one : "1 خولەک" + other: "{{ .Count }} خولەک" + +- id: toc + translation: "پێڕست" + +- id: translations + translation: "وەرگێڕانەکان" + +- id: home + translation: "ماڵەوە" + +- id: code_copy + translation: "لەبەری بگرەوە" + +- id: code_copied + translation: "لەبەر گیرایەوە!" diff --git a/themes/PaperMod/i18n/cs.yaml b/themes/PaperMod/i18n/cs.yaml new file mode 100644 index 0000000..058c3a1 --- /dev/null +++ b/themes/PaperMod/i18n/cs.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Předchozí" + +- id: next_page + translation: "Další" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "slovo" + other: "{{ .Count }} slov" + +- id: toc + translation: "Obsah" + +- id: translations + translation: "Překlady" + +- id: home + translation: "Domů" + +- id: edit_post + translation: "Upravit" + +- id: code_copy + translation: "kopírovat" + +- id: code_copied + translation: "zkopírováno!" diff --git a/themes/PaperMod/i18n/da.yaml b/themes/PaperMod/i18n/da.yaml new file mode 100644 index 0000000..03b0abe --- /dev/null +++ b/themes/PaperMod/i18n/da.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Forrige Side" + +- id: next_page + translation: "Næste Side" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Indholdsfortegnelse" + +- id: translations + translation: "Oversættelser" + +- id: home + translation: "Start" + +- id: edit_post + translation: "Rediger" + +- id: code_copy + translation: "kopier" + +- id: code_copied + translation: "kopieret!" diff --git a/themes/PaperMod/i18n/de.yaml b/themes/PaperMod/i18n/de.yaml new file mode 100644 index 0000000..f64aad9 --- /dev/null +++ b/themes/PaperMod/i18n/de.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Vorherige" + +- id: next_page + translation: "Nächste" + +- id: read_time + translation: + one: "1 Minute" + other: "{{ .Count }} Minuten" + +- id: words + translation: + one : "Wort" + other: "{{ .Count }} Wörter" + +- id: toc + translation: "Inhaltsverzeichnis" + +- id: translations + translation: "Übersetzungen" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Bearbeiten" + +- id: code_copy + translation: "Kopieren" + +- id: code_copied + translation: "Kopiert!" diff --git a/themes/PaperMod/i18n/el.yaml b/themes/PaperMod/i18n/el.yaml new file mode 100644 index 0000000..4257bac --- /dev/null +++ b/themes/PaperMod/i18n/el.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Προηγούμενο" + +- id: next_page + translation: "Επόμενο" + +- id: read_time + translation: + one: "1 λεπτό" + other: "{{ .Count }} λεπτά" + +- id: words + translation: + one: "λέξη" + other: "{{ .Count }} λέξεις" + +- id: toc + translation: "Πίνακας Περιεχομένων" + +- id: translations + translation: "Μεταφράσεις" + +- id: home + translation: "Αρχική" + +- id: edit_post + translation: "Επεξεργασία" + +- id: code_copy + translation: "αντιγραφή" + +- id: code_copied + translation: "αντιγράφηκε!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/en.yaml b/themes/PaperMod/i18n/en.yaml new file mode 100644 index 0000000..3a1e215 --- /dev/null +++ b/themes/PaperMod/i18n/en.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Prev" + +- id: next_page + translation: "Next" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "word" + other: "{{ .Count }} words" + +- id: toc + translation: "Table of Contents" + +- id: translations + translation: "Translations" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Edit" + +- id: code_copy + translation: "copy" + +- id: code_copied + translation: "copied!" diff --git a/themes/PaperMod/i18n/eo.yaml b/themes/PaperMod/i18n/eo.yaml new file mode 100644 index 0000000..de5d744 --- /dev/null +++ b/themes/PaperMod/i18n/eo.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "antaŭa paĝo" + +- id: next_page + translation: "sekva paĝo" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Enhavo" + +- id: translations + translation: "tradukoj" + +- id: home + translation: "ĉefpaĝo" + +- id: code_copy + translation: "kopii" + +- id: code_copied + translation: "kopiite!" diff --git a/themes/PaperMod/i18n/es.yaml b/themes/PaperMod/i18n/es.yaml new file mode 100644 index 0000000..52a559c --- /dev/null +++ b/themes/PaperMod/i18n/es.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Anterior" + +- id: next_page + translation: "Siguiente" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "palabra" + other: "{{ .Count }} palabras" + +- id: toc + translation: "Tabla de Contenidos" + +- id: translations + translation: "Traducciones" + +- id: home + translation: "Inicio" + +- id: edit_post + translation: "Editar" + +- id: code_copy + translation: "copiar" + +- id: code_copied + translation: "¡copiado!" diff --git a/themes/PaperMod/i18n/fa.yaml b/themes/PaperMod/i18n/fa.yaml new file mode 100644 index 0000000..3fd5927 --- /dev/null +++ b/themes/PaperMod/i18n/fa.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "صفحه قبلی" + +- id: next_page + translation: "صفحه بعدی" + +- id: read_time + translation: + one: "۱ دقیقه" + other: "{{ .Count }} دقیقه" + +- id: toc + translation: "فهرست مطالب" + +- id: translations + translation: "ترجمه ها" + +- id: home + translation: "خانه" + +- id: edit_post + translation: "ویرایش" + +- id: code_copy + translation: "کپی" + +- id: code_copied + translation: "کپی شد!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/fi.yaml b/themes/PaperMod/i18n/fi.yaml new file mode 100644 index 0000000..cbbf3c4 --- /dev/null +++ b/themes/PaperMod/i18n/fi.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Edellinen" + +- id: next_page + translation: "Seuraava" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} minuuttia" + +- id: words + translation: + one : "sana" + other: "{{ .Count }} sanaa" + +- id: toc + translation: "Sisällysluettelo" + +- id: translations + translation: "Käännökset" + +- id: home + translation: "Etusivu" + +- id: edit_post + translation: "Muokkaa" + +- id: code_copy + translation: "Kopioi" + +- id: code_copied + translation: "Kopioitu!" diff --git a/themes/PaperMod/i18n/fr.yaml b/themes/PaperMod/i18n/fr.yaml new file mode 100644 index 0000000..e48d8e9 --- /dev/null +++ b/themes/PaperMod/i18n/fr.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Précédent" + +- id: next_page + translation: "Suivant" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "mot" + other: "{{ .Count }} mots" + +- id: toc + translation: "Table des matières" + +- id: translations + translation: "Traductions" + +- id: home + translation: "Accueil" + +- id: edit_post + translation: "Modifier" + +- id: code_copy + translation: "Copier" + +- id: code_copied + translation: "Copié !" diff --git a/themes/PaperMod/i18n/he.yaml b/themes/PaperMod/i18n/he.yaml new file mode 100644 index 0000000..30c3e74 --- /dev/null +++ b/themes/PaperMod/i18n/he.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "הקודם" + +- id: next_page + translation: "הבא" + +- id: read_time + translation: + one: "דקה אחת" + other: "{{ .Count }} דקות" + +- id: words + translation: + one: "מילה אחת" + other: "{{ .Count }} מילים" + +- id: toc + translation: "תוכן עניינים" + +- id: translations + translation: "תרגומים" + +- id: home + translation: "בית" + +- id: edit_post + translation: "ערוך" + +- id: code_copy + translation: "העתק" + +- id: code_copied + translation: "הועתק!" diff --git a/themes/PaperMod/i18n/hi.yaml b/themes/PaperMod/i18n/hi.yaml new file mode 100644 index 0000000..681efdc --- /dev/null +++ b/themes/PaperMod/i18n/hi.yaml @@ -0,0 +1,19 @@ +- id: prev_page + translation: "पिछला" + +- id: next_page + translation: "अगला" + +- id: read_time + translation: + one : "एक मिनट" + other: "{{ .Count }} मिनट" + +- id: edit_post + translation: "सुधारें" + +- id: toc + translation: "विषय - सूची" + +- id: translations + translation: "अनुवाद" diff --git a/themes/PaperMod/i18n/hr.yaml b/themes/PaperMod/i18n/hr.yaml new file mode 100644 index 0000000..2f2d228 --- /dev/null +++ b/themes/PaperMod/i18n/hr.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Prethodna stranica" + +- id: next_page + translation: "Sljedeća stranica" + +- id: read_time + translation: + one : "1 minuta" + other: "{{ .Count }} minute" + +- id: words + translation: + one : "riječ" + other: "{{ .Count }} riječi" + +- id: toc + translation: "Tablica Sadržaja" + +- id: translations + translation: "Prijevodi" + +- id: home + translation: "Početna stranica" + +- id: edit_post + translation: "Promjeni" + +- id: code_copy + translation: "kopiraj" + +- id: code_copied + translation: "kopirano!" diff --git a/themes/PaperMod/i18n/hu.yaml b/themes/PaperMod/i18n/hu.yaml new file mode 100644 index 0000000..a039dda --- /dev/null +++ b/themes/PaperMod/i18n/hu.yaml @@ -0,0 +1,16 @@ +- id: prev_page + translation: "Előző oldal" + +- id: next_page + translation: "Következő oldal" + +- id: read_time + translation: + one: "1 perc" + other: "{{ .Count }} perc" + +- id: toc + translation: "Tartalomjegyzék" + +- id: translations + translation: "Fordítások" diff --git a/themes/PaperMod/i18n/id.yaml b/themes/PaperMod/i18n/id.yaml new file mode 100644 index 0000000..93d34f5 --- /dev/null +++ b/themes/PaperMod/i18n/id.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Sebelumnya" + +- id: next_page + translation: "Selanjutnya" + +- id: read_time + translation: + one : "1 menit" + other: "{{ .Count }} menit" + +- id: words + translation: + one : "kata" + other: "{{ .Count }} kata" + +- id: toc + translation: "Daftar isi" + +- id: translations + translation: "Terjemahan" + +- id: home + translation: "Beranda" + +- id: edit_post + translation: "Sunting" + +- id: code_copy + translation: "salin" + +- id: code_copied + translation: "disalin!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/it.yaml b/themes/PaperMod/i18n/it.yaml new file mode 100644 index 0000000..c87c95d --- /dev/null +++ b/themes/PaperMod/i18n/it.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Precedente" + +- id: next_page + translation: "Successivo" + +- id: read_time + translation: + one: "1 minuto" + other: "{{ .Count }} minuti" + +- id: words + translation: + one : "parola" + other: "{{ .Count }} parole" + +- id: toc + translation: "Indice contenuti" + +- id: translations + translation: "Traduzioni" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Modifica" + +- id: code_copy + translation: "copia" + +- id: code_copied + translation: "copiato!" diff --git a/themes/PaperMod/i18n/ja.yaml b/themes/PaperMod/i18n/ja.yaml new file mode 100644 index 0000000..93948d3 --- /dev/null +++ b/themes/PaperMod/i18n/ja.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "前へ" + +- id: next_page + translation: "次へ" + +- id: read_time + translation: + one : "1 分" + other: "{{ .Count }} 分" + +- id: words + translation: + one: "文字" + other: "{{ .Count }} 文字" + +- id: toc + translation: "目次" + +- id: translations + translation: "言語" + +- id: home + translation: "ホーム" + +- id: edit_post + translation: "編集" + +- id: code_copy + translation: "コピー" + +- id: code_copied + translation: "コピーされました!" diff --git a/themes/PaperMod/i18n/ko.yaml b/themes/PaperMod/i18n/ko.yaml new file mode 100644 index 0000000..777dd93 --- /dev/null +++ b/themes/PaperMod/i18n/ko.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "이전 페이지" + +- id: next_page + translation: "다음 페이지" + +- id: read_time + translation: + one : "1 분" + other: "{{ .Count }} 분" + +- id: words + translation: + one : "단어" + other: "{{ .Count }} 단어" + +- id: toc + translation: "목차" + +- id: translations + translation: "번역" + +- id: home + translation: "홈" + +- id: edit_post + translation: "편집" + +- id: code_copy + translation: "복사" + +- id: code_copied + translation: "복사 완료!" diff --git a/themes/PaperMod/i18n/ku.yaml b/themes/PaperMod/i18n/ku.yaml new file mode 100644 index 0000000..d1d30a5 --- /dev/null +++ b/themes/PaperMod/i18n/ku.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Rûpela Paş" + +- id: next_page + translation: "Rûpela Pêş" + +- id: read_time + translation: + one : "1 xulek" + other: "{{ .Count }} xulek" + +- id: toc + translation: "Pêrist" + +- id: translations + translation: "Wergeran" + +- id: home + translation: "Xanî" + +- id: code_copy + translation: "Jê bigire" + +- id: code_copied + translation: "Hat jêgirtin!" diff --git a/themes/PaperMod/i18n/mn.yaml b/themes/PaperMod/i18n/mn.yaml new file mode 100644 index 0000000..dbce2ce --- /dev/null +++ b/themes/PaperMod/i18n/mn.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Ѳмнѳх" + +- id: next_page + translation: "Дараах" + +- id: read_time + translation: + one : "1 МИН" + other: "{{ .Count }} МИН" + +- id: toc + translation: "Агуулга" + +- id: translations + translation: "Орчуулга" + +- id: home + translation: "Нүүр" + +- id: code_copy + translation: "хуулах" + +- id: code_copied + translation: "хуулсан!" diff --git a/themes/PaperMod/i18n/ms.yaml b/themes/PaperMod/i18n/ms.yaml new file mode 100644 index 0000000..d8a9eff --- /dev/null +++ b/themes/PaperMod/i18n/ms.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Halaman Sebelumnya" + +- id: next_page + translation: "Halaman Seterusnya" + +- id: read_time + translation: + one: "1 minit" + other: "{{ .Count }} minit" + +- id: toc + translation: "Isi Kandungan" + +- id: translations + translation: "Terjemahan" + +- id: home + translation: "Home" + +- id: edit_post + translation: "Sunting" + +- id: code_copy + translation: "Salin" + +- id: code_copied + translation: "Disalin!" diff --git a/themes/PaperMod/i18n/nl.yaml b/themes/PaperMod/i18n/nl.yaml new file mode 100644 index 0000000..e9d06fa --- /dev/null +++ b/themes/PaperMod/i18n/nl.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Vorige" + +- id: next_page + translation: "Volgende" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "woord" + other: "{{ .Count }} woorden" + +- id: toc + translation: "Inhoudsopgave" + +- id: translations + translation: "Vertalingen" + +- id: home + translation: "Startpagina" + +- id: edit_post + translation: "Bewerk" + +- id: code_copy + translation: "kopieer" + +- id: code_copied + translation: "gekopieerd!" diff --git a/themes/PaperMod/i18n/no.yaml b/themes/PaperMod/i18n/no.yaml new file mode 100644 index 0000000..2400348 --- /dev/null +++ b/themes/PaperMod/i18n/no.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Forrige Side" + +- id: next_page + translation: "Neste Side" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one: "ord" + other: "{{ .Count }} ord" + +- id: toc + translation: "Innholdsfortegnelse" + +- id: translations + translation: "Oversettelser" + +- id: home + translation: "Hjem" + +- id: edit_post + translation: "Rediger" + +- id: code_copy + translation: "Kopier" + +- id: code_copied + translation: "Kopiert!" diff --git a/themes/PaperMod/i18n/oc.yaml b/themes/PaperMod/i18n/oc.yaml new file mode 100644 index 0000000..9292fd8 --- /dev/null +++ b/themes/PaperMod/i18n/oc.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Prec." + +- id: next_page + translation: "Seg." + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "mot" + other: "{{ .Count }} motss" + +- id: toc + translation: "Taula de contengut" + +- id: translations + translation: "Traduccions" + +- id: home + translation: "Acuèlh" + +- id: edit_post + translation: "Modificar" + +- id: code_copy + translation: "copiar" + +- id: code_copied + translation: "copiat !" diff --git a/themes/PaperMod/i18n/pa.yaml b/themes/PaperMod/i18n/pa.yaml new file mode 100644 index 0000000..32192c5 --- /dev/null +++ b/themes/PaperMod/i18n/pa.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "ਪਿਛਲਾ" + +- id: next_page + translation: "ਅਗਲਾ" + +- id: read_time + translation: + one: "1 ਮਿੰਟ" + other: "{{ .Count }} ਮਿੰਟ" + +- id: words + translation: + one: "ਸ਼ਬਦ" + other: "{{ .Count }} ਸ਼ਬਦ" + +- id: toc + translation: "ਤਤਕਰਾ" + +- id: translations + translation: "ਅਨੁਵਾਦ" + +- id: home + translation: "ਘਰ" + +- id: edit_post + translation: "ਸੋਧ" + +- id: code_copy + translation: "ਕਾਪੀ" + +- id: code_copied + translation: "ਕਾਪੀ ਕੀਤੀ ਗਈ!!" diff --git a/themes/PaperMod/i18n/pl.yaml b/themes/PaperMod/i18n/pl.yaml new file mode 100644 index 0000000..81b0e77 --- /dev/null +++ b/themes/PaperMod/i18n/pl.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Poprzednia" + +- id: next_page + translation: "Następna" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "słowo" + other: "{{ .Count }} słów" + +- id: toc + translation: "Spis treści" + +- id: translations + translation: "Tłumaczenia" + +- id: home + translation: "Strona Główna" + +- id: edit_post + translation: "Edytuj" + +- id: code_copy + translation: "Kopiuj" + +- id: code_copied + translation: "Skopiowano!" diff --git a/themes/PaperMod/i18n/pnb.yaml b/themes/PaperMod/i18n/pnb.yaml new file mode 100644 index 0000000..fa2f8a8 --- /dev/null +++ b/themes/PaperMod/i18n/pnb.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "پِچھلا" + +- id: next_page + translation: "اگلا" + +- id: read_time + translation: + one: "ایک منٹ" + other: "مِنٹ {{ .Count }}" + +- id: words + translation: + one: "لفظ" + other: "لفظ {{ .Count }}" + +- id: toc + translation: "تتکرا" + +- id: translations + translation: "انوواد" + +- id: home + translation: "گھر" + +- id: edit_post + translation: "سودھ" + +- id: code_copy + translation: "کاپی" + +- id: code_copied + translation: "کاپی کیتی گئی!" diff --git a/themes/PaperMod/i18n/pt.yaml b/themes/PaperMod/i18n/pt.yaml new file mode 100644 index 0000000..ab06429 --- /dev/null +++ b/themes/PaperMod/i18n/pt.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Página Anterior" + +- id: next_page + translation: "Próxima Página" + +- id: read_time + translation: + one: "1 minuto" + other: "{{ .Count }} minutos" + +- id: words + translation: + one : "palavra" + other: "{{ .Count }} palavras" + +- id: toc + translation: "Conteúdo" + +- id: translations + translation: "Traduções" + +- id: home + translation: "Início" + +- id: edit_post + translation: "Editar" + +- id: code_copy + translation: "copiar" + +- id: code_copied + translation: "copiado!" diff --git a/themes/PaperMod/i18n/ro.yaml b/themes/PaperMod/i18n/ro.yaml new file mode 100644 index 0000000..694f20b --- /dev/null +++ b/themes/PaperMod/i18n/ro.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Înapoi" + +- id: next_page + translation: "Înainte" + +- id: read_time + translation: + one : "1 minut" + other: "{{ .Count }} minute" + +- id: words + translation: + one : "cuvânt" + other: "{{ .Count }} cuvinte" + +- id: toc + translation: "Sumar" + +- id: translations + translation: "Traduceri" + +- id: home + translation: "Acasă" + +- id: edit_post + translation: "Editează" + +- id: code_copy + translation: "copiază" + +- id: code_copied + translation: "copiat!" diff --git a/themes/PaperMod/i18n/ru.yaml b/themes/PaperMod/i18n/ru.yaml new file mode 100644 index 0000000..a5dbb5c --- /dev/null +++ b/themes/PaperMod/i18n/ru.yaml @@ -0,0 +1,39 @@ +- id: prev_page + translation: "Предыдущая" + +- id: next_page + translation: "Следующая" + +- id: read_time + translation: + zero: "0 минут" + one: "1 минута" + few: "{{ .Count }} минуты" + many: "{{ .Count }} минут" + other: "{{ .Count }} минута" + +- id: words + translation: + zero: "0 слов" + one: "1 слово" + few: "{{ .Count }} слова" + many: "{{ .Count }} слов" + other: "{{ .Count }} слово" + +- id: toc + translation: "Оглавление" + +- id: translations + translation: "Переводы" + +- id: home + translation: "Главная" + +- id: edit_post + translation: "Редактировать" + +- id: code_copy + translation: "копировать" + +- id: code_copied + translation: "скопировано!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/sk.yaml b/themes/PaperMod/i18n/sk.yaml new file mode 100644 index 0000000..f129d37 --- /dev/null +++ b/themes/PaperMod/i18n/sk.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Predch" + +- id: next_page + translation: "Ďaľší" + +- id: read_time + translation: + one : "1 min" + other: "{{ .Count }} min" + +- id: words + translation: + one : "slovo" + other: "{{ .Count }} slov" + +- id: toc + translation: "Obsah" + +- id: translations + translation: "Preklady" + +- id: home + translation: "Domov" + +- id: edit_post + translation: "Upraviť" + +- id: code_copy + translation: "kopírovať" + +- id: code_copied + translation: "skopírované!" diff --git a/themes/PaperMod/i18n/sv.yaml b/themes/PaperMod/i18n/sv.yaml new file mode 100644 index 0000000..65ce422 --- /dev/null +++ b/themes/PaperMod/i18n/sv.yaml @@ -0,0 +1,28 @@ +- id: prev_page + translation: "Förra Sidan" + +- id: next_page + translation: "Nästa Sida" + +- id: read_time + translation: + one: "1 min" + other: "{{ .Count }} min" + +- id: toc + translation: "Innehållsförteckning" + +- id: translations + translation: "Översättningar" + +- id: home + translation: "Hem" + +- id: edit_post + translation: "Redigera" + +- id: code_copy + translation: "kopiera" + +- id: code_copied + translation: "kopierad!" diff --git a/themes/PaperMod/i18n/sw.yaml b/themes/PaperMod/i18n/sw.yaml new file mode 100644 index 0000000..5fceb1a --- /dev/null +++ b/themes/PaperMod/i18n/sw.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Uliopita" + +- id: next_page + translation: "Ujao" + +- id: read_time + translation: + one : "dakika 1" + other: "dakika {{ .Count }}" + +- id: words + translation: + one : "neno" + other: "maneno {{ .Count }}" + +- id: toc + translation: "Jedwali la Yaliyomo" + +- id: translations + translation: "Tafsiri" + +- id: home + translation: "Mwanzo" + +- id: edit_post + translation: "Hariri" + +- id: code_copy + translation: "nakili" + +- id: code_copied + translation: "nakiliwa!" diff --git a/themes/PaperMod/i18n/th.yaml b/themes/PaperMod/i18n/th.yaml new file mode 100644 index 0000000..d8036ae --- /dev/null +++ b/themes/PaperMod/i18n/th.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "ก่อนหน้า" + +- id: next_page + translation: "ถัดไป" + +- id: read_time + translation: + one : "1 นาที" + other: "{{ .Count }} นาที" + +- id: words + translation: + one : "คำ" + other: "{{ .Count }} คำ" + +- id: toc + translation: "สารบัญ" + +- id: translations + translation: "การแปล" + +- id: home + translation: "หน้าหลัก" + +- id: edit_post + translation: "แก้ไข" + +- id: code_copy + translation: "คัดลอก" + +- id: code_copied + translation: "คัดลอกแล้ว!" diff --git a/themes/PaperMod/i18n/tr.yaml b/themes/PaperMod/i18n/tr.yaml new file mode 100644 index 0000000..b014a15 --- /dev/null +++ b/themes/PaperMod/i18n/tr.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Önceki" + +- id: next_page + translation: "Sonraki" + +- id: read_time + translation: + one : "1 dk" + other: "{{ .Count }} dk" + +- id: words + translation: + one : "sözcük" + other: "{{ .Count }} sözcük" + +- id: toc + translation: "İçindekiler" + +- id: translations + translation: "Çeviriler" + +- id: home + translation: "Ana Sayfa" + +- id: edit_post + translation: "Düzenle" + +- id: code_copy + translation: "Kopyala" + +- id: code_copied + translation: "Kopyalandı!" diff --git a/themes/PaperMod/i18n/uk.yaml b/themes/PaperMod/i18n/uk.yaml new file mode 100644 index 0000000..41be964 --- /dev/null +++ b/themes/PaperMod/i18n/uk.yaml @@ -0,0 +1,25 @@ +- id: prev_page + translation: "Попередня" + +- id: next_page + translation: "Наступна" + +- id: read_time + translation: + one : "1 хвилина" + other: "{{ .Count }} хвилин" + +- id: toc + translation: "Зміст" + +- id: translations + translation: "Переклади" + +- id: home + translation: "Головна" + +- id: code_copy + translation: "копіювати" + +- id: code_copied + translation: "скопійовано!" \ No newline at end of file diff --git a/themes/PaperMod/i18n/uz.yaml b/themes/PaperMod/i18n/uz.yaml new file mode 100644 index 0000000..c9f2375 --- /dev/null +++ b/themes/PaperMod/i18n/uz.yaml @@ -0,0 +1,20 @@ +- id: prev_page + translation: "Oldingi sahifa" + +- id: next_page + translation: "Keyingi sahifa" + +- id: read_time + translation: + one : "Bir daqiqa" + other: "{{ .Count }} daqiqa" + +- id: toc + translation: "Mundarija" + +- id: translations + translation: "Tarjimalar" + +- id: home + translation: "Bosh sahifa" + diff --git a/themes/PaperMod/i18n/vi.yaml b/themes/PaperMod/i18n/vi.yaml new file mode 100644 index 0000000..2eb05d0 --- /dev/null +++ b/themes/PaperMod/i18n/vi.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "Trang trước" + +- id: next_page + translation: "Trang tiếp theo" + +- id: read_time + translation: + one: "1 phút" + other: "{{ .Count }} phút" + +- id: words + translation: + one: "từ" + other: "{{ .Count }} từ" + +- id: toc + translation: "Mục lục" + +- id: translations + translation: "Bản dịch" + +- id: home + translation: "Trang chủ" + +- id: edit_post + translation: "Chỉnh sửa" + +- id: code_copy + translation: "Sao chép" + +- id: code_copied + translation: "Đã sao chép!" diff --git a/themes/PaperMod/i18n/zh-tw.yaml b/themes/PaperMod/i18n/zh-tw.yaml new file mode 100644 index 0000000..48b84d2 --- /dev/null +++ b/themes/PaperMod/i18n/zh-tw.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "上一頁" + +- id: next_page + translation: "下一頁" + +- id: read_time + translation: + one : "1 分鐘" + other: "{{ .Count }} 分鐘" + +- id: words + translation: + one: "字" + other: "{{ .Count }} 字" + +- id: toc + translation: "目錄" + +- id: translations + translation: "語言" + +- id: home + translation: "首頁" + +- id: edit_post + translation: "編輯" + +- id: code_copy + translation: "複製" + +- id: code_copied + translation: "已複製!" diff --git a/themes/PaperMod/i18n/zh.yaml b/themes/PaperMod/i18n/zh.yaml new file mode 100644 index 0000000..0280425 --- /dev/null +++ b/themes/PaperMod/i18n/zh.yaml @@ -0,0 +1,33 @@ +- id: prev_page + translation: "上一页" + +- id: next_page + translation: "下一页" + +- id: read_time + translation: + one : "1 分钟" + other: "{{ .Count }} 分钟" + +- id: words + translation: + one: "字" + other: "{{ .Count }} 字" + +- id: toc + translation: "目录" + +- id: translations + translation: "语言" + +- id: home + translation: "主页" + +- id: edit_post + translation: "编辑" + +- id: code_copy + translation: "复制" + +- id: code_copied + translation: "已复制!" diff --git a/themes/PaperMod/images/screenshot.png b/themes/PaperMod/images/screenshot.png new file mode 100644 index 0000000..a37c485 Binary files /dev/null and b/themes/PaperMod/images/screenshot.png differ diff --git a/themes/PaperMod/images/tn.png b/themes/PaperMod/images/tn.png new file mode 100644 index 0000000..cf83179 Binary files /dev/null and b/themes/PaperMod/images/tn.png differ diff --git a/themes/PaperMod/layouts/404.html b/themes/PaperMod/layouts/404.html new file mode 100644 index 0000000..a405573 --- /dev/null +++ b/themes/PaperMod/layouts/404.html @@ -0,0 +1,3 @@ +{{- define "main" }} +
404
+{{- end }}{{/* end main */ -}} diff --git a/themes/PaperMod/layouts/_markup/render-image.html b/themes/PaperMod/layouts/_markup/render-image.html new file mode 100644 index 0000000..f368ff8 --- /dev/null +++ b/themes/PaperMod/layouts/_markup/render-image.html @@ -0,0 +1,22 @@ +{{- $u := urls.Parse .Destination -}} +{{- $src := $u.String -}} +{{- if not $u.IsAbs -}} + {{- $path := strings.TrimPrefix "./" $u.Path }} + {{- with or (.PageInner.Resources.Get $path) (resources.Get $path) -}} + {{- $src = .RelPermalink -}} + {{- with $u.RawQuery -}} + {{- $src = printf "%s?%s" $src . -}} + {{- end -}} + {{- with $u.Fragment -}} + {{- $src = printf "%s#%s" $src . -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- $attributes := merge .Attributes (dict "alt" .Text "src" $src "title" (.Title | transform.HTMLEscape) "loading" "lazy") -}} + +{{- /**/ -}} diff --git a/themes/PaperMod/layouts/_partials/anchored_headings.html b/themes/PaperMod/layouts/_partials/anchored_headings.html new file mode 100644 index 0000000..a4b0c63 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/anchored_headings.html @@ -0,0 +1,6 @@ +{{- /* formats .Content headings by adding an anchor */ -}} +{{ . | replaceRE + "()" + "${1}${3}" + | safeHTML +}} diff --git a/themes/PaperMod/layouts/_partials/author.html b/themes/PaperMod/layouts/_partials/author.html new file mode 100644 index 0000000..e3a8617 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/author.html @@ -0,0 +1,10 @@ +{{- if or .Params.author site.Params.author }} + {{- $author := (.Params.author | default site.Params.author) }} + {{- $author_type := (printf "%T" $author) }} + + {{- if (or (eq $author_type "[]string") (eq $author_type "[]interface {}")) }} + {{- (delimit $author ", " ) }} + {{- else }} + {{- $author }} + {{- end }} +{{- end -}} diff --git a/themes/PaperMod/layouts/_partials/breadcrumbs.html b/themes/PaperMod/layouts/_partials/breadcrumbs.html new file mode 100644 index 0000000..bae40c9 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/breadcrumbs.html @@ -0,0 +1,20 @@ +{{- if (.Param "ShowBreadCrumbs") -}} + +{{- end -}} diff --git a/themes/PaperMod/layouts/_partials/comments.html b/themes/PaperMod/layouts/_partials/comments.html new file mode 100644 index 0000000..918451a --- /dev/null +++ b/themes/PaperMod/layouts/_partials/comments.html @@ -0,0 +1,3 @@ +{{- /* Comments area start */ -}} +{{- /* to add comments read => https://gohugo.io/content-management/comments/ */ -}} +{{- /* Comments area end */ -}} diff --git a/themes/PaperMod/layouts/_partials/cover.html b/themes/PaperMod/layouts/_partials/cover.html new file mode 100644 index 0000000..9c1f9ea --- /dev/null +++ b/themes/PaperMod/layouts/_partials/cover.html @@ -0,0 +1,65 @@ +{{- with .cxt}} {{/* Apply proper context from dict */}} +{{- if (and .Params.cover.image (not $.isHidden)) }} +
+ {{- $loading := cond $.IsSingle "eager" "lazy" }} + {{- $addLink := (and site.Params.cover.linkFullImages $.IsSingle) }} + {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }} + {{- $alt := (.Params.cover.alt | default .Params.cover.caption | plainify) }} + {{- $responsiveImages := (.Params.cover.responsiveImages | default site.Params.cover.responsiveImages) | default true }} + + {{- $pageBundleCover := (.Resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }} + {{- $globalResourcesCover := (resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }} + {{- $cover := (or $pageBundleCover $globalResourcesCover)}} + {{- /* We are not using the .Param.cover.relative to decide the location of image */}} + {{- /* If we have the image in pageBundle or globalResources we can process the image */}} + + {{- $sizes := (slice "360" "480" "720" "1080" "1500") }} + {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}} + {{- if hugo.IsExtended -}} + {{- $processableFormats = $processableFormats | append "webp" -}} + {{- end -}} + + {{- $imgdl := (.Params.cover.image) | absURL }} + {{- if $cover -}} + {{- $imgdl = $cover.Permalink }} + {{- end -}} + + {{- if $addLink }} + + {{- end }} + + {{- if $cover -}} + {{/* i.e it is present in page bundle */}} + {{- if (and (in $processableFormats $cover.MediaType.SubType) ($responsiveImages) (eq $prod true)) }} + {{ $alt }} + {{- else }}{{/* Unprocessable image or responsive images disabled */}} + {{ $alt }} + {{- end }} + {{- else }} + {{- /* For absolute urls and external links, no img processing here */}} + {{ $alt }} + {{- end }} + + {{- if $addLink }} + + {{- end -}} + + {{- /* Display Caption */}} + {{- if $.IsSingle }} + {{ with .Params.cover.caption -}} +
{{ . | markdownify }}
+ {{- end }} + {{- end }} +
+{{- end }}{{/* End image */}} +{{- end -}}{{/* End context */ -}} diff --git a/themes/PaperMod/layouts/_partials/edit_post.html b/themes/PaperMod/layouts/_partials/edit_post.html new file mode 100644 index 0000000..b4bf44f --- /dev/null +++ b/themes/PaperMod/layouts/_partials/edit_post.html @@ -0,0 +1,20 @@ +{{- if and (.Param "editPost.URL") (not (.Param "editPost.disabled")) -}} + {{- if or (.Param "author") (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated }} + {{- printf " | " | safeHTML -}} + {{- end -}} + + {{- $editURL := .Param "editPost.URL" }} + {{- $appendFilePath := .Param "editPost.appendFilePath" | default false }} + {{- $editText := .Param "editPost.Text" | default (i18n "edit_post" ) -}} + + {{- if $appendFilePath -}} + {{- $fileUrlPath := path.Join .File.Path }} + {{- $editURL = printf "%s/%s" $editURL $fileUrlPath -}} + {{- end -}} + + + + {{- $editText -}} + + +{{- end }} diff --git a/themes/PaperMod/layouts/_partials/extend_footer.html b/themes/PaperMod/layouts/_partials/extend_footer.html new file mode 100644 index 0000000..0519748 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/extend_footer.html @@ -0,0 +1,3 @@ +{{- /* Footer custom content area start */ -}} +{{- /* Insert any custom code web-analytics, resources, etc. here */ -}} +{{- /* Footer custom content area end */ -}} diff --git a/themes/PaperMod/layouts/_partials/extend_head.html b/themes/PaperMod/layouts/_partials/extend_head.html new file mode 100644 index 0000000..150cbef --- /dev/null +++ b/themes/PaperMod/layouts/_partials/extend_head.html @@ -0,0 +1,4 @@ +{{- /* Head custom content area start */ -}} +{{- /* Insert any custom code (web-analytics, resources, etc.) - it will appear in the section of every page. */ -}} +{{- /* Can be overwritten by partial with the same name in the global layouts. */ -}} +{{- /* Head custom content area end */ -}} diff --git a/themes/PaperMod/layouts/_partials/extend_post_content.html b/themes/PaperMod/layouts/_partials/extend_post_content.html new file mode 100644 index 0000000..34a8a07 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/extend_post_content.html @@ -0,0 +1,4 @@ +{{- /* Post content custom area start */ -}} +{{- /* Insert any custom code after post content - it will appear after the post body, before the footer. */ -}} +{{- /* Can be overwritten by partial with the same name in the global layouts. */ -}} +{{- /* Post content custom area end */ -}} diff --git a/themes/PaperMod/layouts/_partials/footer.html b/themes/PaperMod/layouts/_partials/footer.html new file mode 100644 index 0000000..6378b10 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/footer.html @@ -0,0 +1,158 @@ +{{- if not (.Param "hideFooter") }} +
+ {{- if not site.Params.footer.hideCopyright }} + {{- if site.Copyright }} + {{ site.Copyright | markdownify }} + {{- else }} + © {{ now.Year }} {{ site.Title }} + {{- end }} + {{- print " · "}} + {{- end }} + + {{- with site.Params.footer.text }} + {{ . | markdownify }} + {{- print " · "}} + {{- end }} + + {{/* + - The "Powered by Hugo" text is intentionally left at the end of the footer to give it more prominence. + - We kindly encourage you to keep this line. Keeping this credit helps open source projects like PaperMod and Hugo reach more people, supports the open source ecosystem, and shows appreciation for the work that goes into these tools. + - If you choose to remove it, please consider adding a link to the PaperMod GitHub repository somewhere on your site to give credit to the project and its contributors. + - Support us by sponsoring the project on GitHub Sponsors: https://github.com/sponsors/adityatelange + */}} + + + Powered by + Hugo & + PaperMod + +
+{{- end }} + +{{- if (not site.Params.disableScrollToTop) }} + +{{- end }} + +{{- partial "extend_footer.html" . }} + + + +{{- if (not site.Params.disableScrollToTop) }} + +{{- end }} + +{{- if (not site.Params.disableThemeToggle) }} + +{{- end }} + +{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }} + +{{- end }} diff --git a/themes/PaperMod/layouts/_partials/head.html b/themes/PaperMod/layouts/_partials/head.html new file mode 100644 index 0000000..9edc894 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/head.html @@ -0,0 +1,194 @@ + + + +{{- if hugo.IsProduction | or (eq site.Params.env "production") | and (ne .Params.robotsNoIndex true) }} + +{{- else }} + +{{- end }} + +{{- /* Title */}} +{{ if .IsHome }}{{ else }}{{ if .Title }}{{ .Title }} | {{ end }}{{ end }}{{ site.Title }} + +{{- /* Meta */}} +{{- if .IsHome }} +{{ with site.Params.keywords -}}{{ end }} +{{- else }} + +{{- end }} + + + +{{- if site.Params.analytics.google.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.yandex.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.bing.SiteVerificationTag }} + +{{- end }} +{{- if site.Params.analytics.naver.SiteVerificationTag }} + +{{- end }} + +{{- /* Styles */}} + +{{- /* includes */}} +{{- $includes := slice }} +{{- $includes = $includes | append (" " | resources.FromString "assets/css/includes-blank.css")}} + +{{- $includes_all := $includes | resources.Concat "assets/css/includes.css" }} + +{{- $theme_vars := (resources.Get "css/core/theme-vars.css") }} +{{- $reset := (resources.Get "css/core/reset.css") }} +{{- $media := (resources.Get "css/core/zmedia.css") }} +{{- $license_css := (resources.Get "css/core/license.css") }} +{{- $common := (resources.Match "css/common/*.css") | resources.Concat "assets/css/common.css" }} + +{{- /* markup.highlight.noClasses should be set to `false` */}} +{{- $chroma_styles := (resources.Get "css/includes/chroma-styles.css") }} +{{- $chroma_mod := (resources.Get "css/includes/chroma-mod.css") }} + +{{- /* order is important */}} +{{- $core := (slice $theme_vars $reset $common $chroma_styles $chroma_mod $includes_all $media) | resources.Concat "assets/css/core.css" | resources.Minify }} +{{- $extended := (resources.Match "css/extended/*.css") | resources.Concat "assets/css/extended.css" | resources.Minify }} + +{{- /* bundle all required css */}} +{{- /* Add extended css after theme style */ -}} +{{- $stylesheet := (slice $license_css $core $extended) | resources.Concat "assets/css/stylesheet.css" }} + +{{- if not site.Params.assets.disableFingerprinting }} +{{- $stylesheet := $stylesheet | fingerprint }} + +{{- else }} + +{{- end }} + +{{- /* Search */}} +{{- if (eq .Layout `search`) -}} + +{{- $fastsearch := resources.Get "js/fastsearch.js" | js.Build (dict "params" (dict "fuseOpts" site.Params.fuseOpts)) | resources.Minify }} +{{- $fusejs := resources.Get "js/fuse.basic.min.js" }} +{{- $license_js := resources.Get "js/license.js" }} +{{- if not site.Params.assets.disableFingerprinting }} +{{- $search := (slice $fusejs $license_js $fastsearch ) | resources.Concat "assets/js/search.js" | fingerprint }} + +{{- else }} +{{- $search := (slice $fusejs $fastsearch ) | resources.Concat "assets/js/search.js" }} + +{{- end }} +{{- end -}} + +{{- /* Favicons */}} + + + + + + + + +{{- /* RSS */}} +{{ range .AlternativeOutputFormats -}} + +{{ end -}} +{{- range .AllTranslations -}} + +{{ end -}} + + + +{{- /* theme-toggle is enabled */}} +{{- if (not site.Params.disableThemeToggle) }} +{{- /* theme is light */}} +{{- if (eq site.Params.defaultTheme "light") }} + +{{- /* theme is dark */}} +{{- else if (eq site.Params.defaultTheme "dark") }} + +{{- else }} +{{- /* theme is auto */}} + +{{- end }} +{{- /* theme-toggle is disabled and theme is auto */}} +{{- else if (and (ne site.Params.defaultTheme "light") (ne site.Params.defaultTheme "dark"))}} + +{{- end }} + +{{- partial "extend_head.html" . -}} + +{{- /* Misc */}} +{{- if hugo.IsProduction | or (eq site.Params.env "production") }} +{{- partial "google_analytics.html" . }} +{{- partial "templates/opengraph.html" . }} +{{- partial "templates/twitter_cards.html" . }} +{{- partial "templates/schema_json.html" . }} +{{- end -}} diff --git a/themes/PaperMod/layouts/_partials/header.html b/themes/PaperMod/layouts/_partials/header.html new file mode 100644 index 0000000..1abc9f5 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/header.html @@ -0,0 +1,114 @@ +
+ +
diff --git a/themes/PaperMod/layouts/_partials/home_info.html b/themes/PaperMod/layouts/_partials/home_info.html new file mode 100644 index 0000000..9d29961 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/home_info.html @@ -0,0 +1,14 @@ +{{- with site.Params.homeInfoParams }} +
+
+

{{ .Title | markdownify }}

+
+
+ {{ $opts := dict "display" "block" }} + {{ .Content | $.Page.RenderString $opts }} +
+
+ {{ partial "social_icons.html" (dict "align" site.Params.homeInfoParams.AlignSocialIconsTo) }} +
+
+{{- end -}} diff --git a/themes/PaperMod/layouts/_partials/index_profile.html b/themes/PaperMod/layouts/_partials/index_profile.html new file mode 100644 index 0000000..6882f39 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/index_profile.html @@ -0,0 +1,58 @@ +
+ {{- with site.Params.profileMode }} +
+ {{- if .imageUrl -}} + {{- $img := "" }} + {{- if not (urls.Parse .imageUrl).IsAbs }} + {{- $img = resources.Get .imageUrl }} + {{- end }} + {{- if $img }} + {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}} + {{- if hugo.IsExtended -}} + {{- $processableFormats = $processableFormats | append "webp" -}} + {{- end -}} + {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }} + {{- if and (in $processableFormats $img.MediaType.SubType) (eq $prod true)}} + {{- if (not (and (not .imageHeight) (not .imageWidth))) }} + {{- $img = $img.Resize (printf "%dx%d" .imageWidth .imageHeight) }} + {{- else if .imageHeight }} + {{- $img = $img.Resize (printf "x%d" .imageHeight) }} + {{ else if .imageWidth }} + {{- $img = $img.Resize (printf "%dx" .imageWidth) }} + {{ else }} + {{- $img = $img.Resize "150x150" }} + {{- end }} + {{- end }} + {{ .imageTitle | default + {{- else }} + {{ .imageTitle | default + {{- end }} + {{- end }} +

{{ .title | default site.Title | markdownify }}

+ {{ .subtitle | markdownify }} + {{- partial "social_icons.html" -}} + + {{- with .buttons }} + + {{- end }} +
+ {{- end}} +
diff --git a/themes/PaperMod/layouts/_partials/post_canonical.html b/themes/PaperMod/layouts/_partials/post_canonical.html new file mode 100644 index 0000000..abfc1e3 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/post_canonical.html @@ -0,0 +1,9 @@ +{{ if and (.Params.canonicalURL) (.Params.ShowCanonicalLink ) -}} +{{ $url := urls.Parse .Params.canonicalURL }} + +{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated (or .Params.editPost.URL site.Params.editPost.URL) }} | {{- end -}} + + {{- (site.Params.CanonicalLinkText | default .Params.CanonicalLinkText) | default "Originally published at" -}} +  {{ $url.Host }} + +{{- end }} diff --git a/themes/PaperMod/layouts/_partials/post_meta.html b/themes/PaperMod/layouts/_partials/post_meta.html new file mode 100644 index 0000000..c7c2635 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/post_meta.html @@ -0,0 +1,25 @@ +{{- $scratch := newScratch }} + +{{- if not .Date.IsZero -}} + {{- $scratch.Add "meta" (slice (printf "%s" (.Date) (.Date | time.Format (default ":date_long" site.Params.DateFormat)))) }} +{{- end }} + +{{- if (.Param "ShowReadingTime") -}} + {{- $scratch.Add "meta" (slice (printf "%s" (i18n "read_time" .ReadingTime | default (printf "%d min" .ReadingTime)))) }} +{{- end }} + +{{- if (.Param "ShowWordCount") -}} + {{- $scratch.Add "meta" (slice (printf "%s" (i18n "words" .WordCount | default (printf "%d words" .WordCount)))) }} +{{- end }} + +{{- if not (.Param "hideAuthor") -}} + {{- with (partial "author.html" .) }} + {{- $scratch.Add "meta" (slice (printf "%s" .)) }} + {{- end }} +{{- end }} + +{{/* Combine all meta information into a single string with separators and render it as HTML.*/}} + +{{- with ($scratch.Get "meta") }} + {{- delimit . " · " | safeHTML -}} +{{- end -}} diff --git a/themes/PaperMod/layouts/_partials/post_nav_links.html b/themes/PaperMod/layouts/_partials/post_nav_links.html new file mode 100644 index 0000000..c2a4862 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/post_nav_links.html @@ -0,0 +1,17 @@ +{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }} +{{- if and (gt (len $pages) 1) (in $pages . ) }} + +{{- end }} diff --git a/themes/PaperMod/layouts/_partials/share_icons.html b/themes/PaperMod/layouts/_partials/share_icons.html new file mode 100644 index 0000000..910ba7f --- /dev/null +++ b/themes/PaperMod/layouts/_partials/share_icons.html @@ -0,0 +1,95 @@ +{{- $pageurl := .Permalink }} +{{- $title := .Title }} + +{{- $.Scratch.Set "tags" ""}} + +{{- with .Params.Tags }} +{{- $hashtags := newScratch}} +{{- range . }}{{ $hashtags.Add "tags" (slice (replaceRE "(\\s)" "" . ))}}{{end}} +{{- $.Scratch.Set "tags" (delimit ($hashtags.Get "tags") ",") }} +{{- end -}} + +{{- $custom := false }} +{{- $ShareButtons := (.Param "ShareButtons")}} +{{- with $ShareButtons }}{{ $custom = true }}{{ end }} + + diff --git a/themes/PaperMod/layouts/_partials/social_icons.html b/themes/PaperMod/layouts/_partials/social_icons.html new file mode 100644 index 0000000..ce76a30 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/social_icons.html @@ -0,0 +1,8 @@ + diff --git a/themes/PaperMod/layouts/_partials/svg.html b/themes/PaperMod/layouts/_partials/svg.html new file mode 100644 index 0000000..d2ccbb9 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/svg.html @@ -0,0 +1,1017 @@ +{{- $icon_name := ( trim .name " " | lower )}} +{{- if (eq $icon_name "123rf") -}} + + + + +{{- else if (eq $icon_name "500px") -}} + + + +{{- else if (eq $icon_name "adobestock") -}} + + + + +{{- else if (eq $icon_name "anilist") -}} + + + +{{- else if or (eq $icon_name "ao3") (eq $icon_name "archiveofourown") -}} + + + + + + +{{- else if (eq $icon_name "applemusic") -}} + + + +{{- else if (eq $icon_name "applepodcasts") -}} + + + +{{- else if (eq $icon_name "bandcamp") -}} + + + +{{- else if (eq $icon_name "behance") -}} + + + +{{- else if (eq $icon_name "bilibili") -}} + + + + + + + +{{- else if (eq $icon_name "bitcoin") -}} + + + +{{- else if (eq $icon_name "bluesky") -}} + + + +{{- else if (eq $icon_name "bookwyrm") -}} + + + +{{- else if (eq $icon_name "bugcrowd") -}} + + + +{{- else if (eq $icon_name "buttondown") -}} + + + + + + + + + + +{{- else if (eq $icon_name "buymeacoffee") -}} + + + + + + + + + + + + + + + + +{{- else if (eq $icon_name "codeberg") -}} + + + +{{- else if (eq $icon_name "codeforces") -}} + + + +{{- else if (eq $icon_name "codepen") -}} + + + + + + + +{{- else if (eq $icon_name "credly") -}} + + + +{{- else if (eq $icon_name "cryptohack") -}} + + + + + + +{{- else if (eq $icon_name "ctftime") -}} + + + + + + +{{- else if (eq $icon_name "cv") -}} + + + + + + +{{- else if (eq $icon_name "deezer") -}} + + + +{{- else if (eq $icon_name "dev") -}} + + + +{{- else if (eq $icon_name "deviantart") -}} + + + +{{- else if (eq $icon_name "discogs") -}} + + + +{{- else if (eq $icon_name "discord") -}} + + + +{{- else if (eq $icon_name "douban") -}} + + + + + +{{- else if (eq $icon_name "dreamstime") -}} + + + +{{- else if (eq $icon_name "dribbble") -}} + + + + + +{{- else if (eq $icon_name "dzen") -}} + + + +{{- else if (eq $icon_name "ebird") -}} + + + +{{- else if (eq $icon_name "email") -}} + + + + +{{- else if (eq $icon_name "ethereum") -}} + + + +{{- else if (eq $icon_name "exercism") -}} + + + + +{{- else if (eq $icon_name "facebook") -}} + + + +{{- else if (eq $icon_name "farcaster") -}} + + + + + +{{- else if (eq $icon_name "fediverse") -}} + + + + + + + + + + +{{- else if (eq $icon_name "firefish") -}} + + + +{{- else if (eq $icon_name "flickr") -}} + + + +{{- else if (eq $icon_name "forgejo") -}} + + + +{{- else if (eq $icon_name "freepik") -}} + + + + + + +{{- else if (eq $icon_name "git") -}} + + + +{{- else if (eq $icon_name "gitea") -}} + + + +{{- else if (eq $icon_name "github") -}} + + + + +{{- else if (eq $icon_name "gitlab") -}} + + + + +{{- else if (eq $icon_name "goodreads") -}} + + + +{{- else if (eq $icon_name "googleplaystore") -}} + + + +{{- else if (eq $icon_name "googlepodcasts") -}} + + + +{{- else if (eq $icon_name "googlescholar") -}} + + + +{{- else if (eq $icon_name "gurushots") -}} + + + + + + + + + + + + +{{- else if (eq $icon_name "hackerone") -}} + + + +{{- else if (eq $icon_name "hackerrank") -}} + + + + + + +{{- else if (eq $icon_name "hackthebox") -}} + + + + + + +{{- else if (eq $icon_name "imdb") -}} + + + +{{- else if (eq $icon_name "instagram") -}} + + + + + +{{- else if (eq $icon_name "intigriti") -}} + + + +{{- else if (eq $icon_name "itchio") -}} + + + +{{- else if (eq $icon_name "juejin") -}} + + + +{{- else if (eq $icon_name "kaggle") -}} + + + +{{- else if (eq $icon_name "kakaotalk") -}} + + + + + + + +{{- else if (eq $icon_name "keybase") -}} + + + +{{- else if (eq $icon_name "keyoxide") -}} + + + + +{{- else if (eq $icon_name "kofi") -}} + + + +{{- else if (eq $icon_name "komoot") -}} + + + +{{- else if (eq $icon_name "lastfm") -}} + + + +{{- else if (eq $icon_name "leetcode") -}} + + + +{{- else if (eq $icon_name "letterboxd") -}} + + + +{{- else if (eq $icon_name "liberapay") -}} + + + + + + +{{- else if (eq $icon_name "lichess" ) -}} + + + +{{- else if (eq $icon_name "linkedin") -}} + + + + + +{{- else if (eq $icon_name "linktree") -}} + + + +{{- else if (eq $icon_name "mastodon") -}} + + + + +{{- else if (eq $icon_name "matrix") -}} + + + +{{- else if (eq $icon_name "medium") -}} + + + + + +{{- else if (eq $icon_name "microblog") -}} + + + + + + +{{- else if (eq $icon_name "mixcloud") -}} + + + +{{- else if (eq $icon_name "monero") -}} + + + +{{- else if (eq $icon_name "neteasecloudmusic") -}} + + + +{{- else if (eq $icon_name "nextcloud") -}} + + + +{{- else if (eq $icon_name "nostr") -}} + + + +{{- else if (eq $icon_name "nuget") -}} + + + + + + + + +{{- else if (eq $icon_name "orcid") -}} + + + +{{- else if (eq $icon_name "osu!") -}} + + + + + + +{{- else if (eq $icon_name "overcast") -}} + + + +{{- else if (eq $icon_name "patreon") -}} + + + + + + +{{- else if (eq $icon_name "paypal") -}} + + + +{{- else if (eq $icon_name "peertube") -}} + + + +{{- else if or (eq $icon_name "pgpkey") (eq $icon_name "key") -}} + + + + +{{- else if (eq $icon_name "phone") -}} + + + + + +{{- else if (eq $icon_name "pinterest") -}} + + + +{{- else if (eq $icon_name "pixelfed") -}} + + + +{{- else if (eq $icon_name "pleroma") -}} + + + +{{- else if (eq $icon_name "pocketcasts") -}} + + + +{{- else if (eq $icon_name "printables") -}} + + + +{{- else if (eq $icon_name "qq") -}} + + + + +{{- else if (eq $icon_name "reddit") -}} + + + +{{- else if (eq $icon_name "raycast") -}} + + + +{{- else if (eq $icon_name "researchgate") -}} + + + +{{- else if (eq $icon_name "rootme") -}} + + + + + + + + +{{- else if (eq $icon_name "rss") -}} + + + + + +{{- else if (eq $icon_name "serverfault") -}} + + + +{{- else if (eq $icon_name "sessionmessenger") -}} + + + + +{{- else if (eq $icon_name "shutterstock") -}} + + + + +{{- else if (eq $icon_name "signal") -}} + + + +{{- else if (eq $icon_name "sketchfab") -}} + + + +{{- else if (eq $icon_name "slack") -}} + + + + + + + +{{- else if (eq $icon_name "snapchat") -}} + + + +{{- else if (eq $icon_name "soundcloud") -}} + + + +{{- else if (eq $icon_name "sourcehut") -}} + + + + +{{- else if (eq $icon_name "spacehey") -}} + + + + + +{{- else if (eq $icon_name "spotify") -}} + + + +{{- else if (eq $icon_name "stackoverflow") -}} + + + +{{- else if (eq $icon_name "steam") -}} + + + + + + + + + +{{- else if (eq $icon_name "strava") -}} + + + +{{- else if (eq $icon_name "substack") -}} + + + +{{- else if (eq $icon_name "tableau") -}} + + + + + + + + + + +{{- else if (eq $icon_name "telegram") -}} + + + +{{- else if (eq $icon_name "thingiverse") -}} + + + +{{- else if (eq $icon_name "threads") -}} + + + + +{{- else if (eq $icon_name "threema") -}} + + + + +{{- else if (eq $icon_name "tidal") -}} + + + +{{- else if (eq $icon_name "tiktok") -}} + + + +{{- else if (eq $icon_name "tryhackme") -}} + + + +{{- else if (eq $icon_name "tumblr") -}} + + + +{{- else if (eq $icon_name "twitch") -}} + + + +{{- else if (eq $icon_name "twitter") -}} + + + + +{{- else if (eq $icon_name "unity") -}} + + + +{{- else if (eq $icon_name "unsplash") -}} + + + + +{{- else if (eq $icon_name "vimeo") -}} + + + +{{- else if or (eq $icon_name "vk") (eq $icon_name "vkontakte") -}} + + + +{{- else if (eq $icon_name "wantedly") -}} + + + +{{- else if (eq $icon_name "wechat") -}} + + + + +{{- else if (eq $icon_name "whatsapp") -}} + + + + +{{- else if or (eq $icon_name "wikipedia") (eq $icon_name "wiki") -}} + + + + +{{- else if (eq $icon_name "wordpress") -}} + + + +{{- else if (eq $icon_name "x") -}} + + + + +{{- else if (eq $icon_name "xda") -}} + + + +{{- else if (eq $icon_name "xing") -}} + + + + +{{- else if (eq $icon_name "xmpp") -}} + + + + +{{- else if (eq $icon_name "ycombinator") -}} + + + +{{- else if (eq $icon_name "yeswehack") -}} + + + + +{{- else if (eq $icon_name "youtube") -}} + + + + + +{{- else if (eq $icon_name "zcal") -}} + + + +{{- else if (eq $icon_name "zhihu") -}} + + + +{{- else if (eq $icon_name "jamendo") -}} + + + + + + + +{{- else if $icon_name -}} + + + + +{{- end -}} diff --git a/themes/PaperMod/layouts/_partials/templates/_funcs/get-page-images.html b/themes/PaperMod/layouts/_partials/templates/_funcs/get-page-images.html new file mode 100644 index 0000000..268ceb4 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/templates/_funcs/get-page-images.html @@ -0,0 +1,47 @@ +{{- $imgs := slice }} +{{- $imgParams := .Params.images }} +{{- $resources := .Resources.ByType "image" -}} +{{/* Find featured image resources if the images parameter is empty. */}} +{{- if not $imgParams }} + {{- $featured := $resources.GetMatch "*feature*" -}} + {{- if not $featured }}{{ $featured = $resources.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}} + {{- with $featured }} + {{- $imgs = $imgs | append (dict + "Image" . + "RelPermalink" .RelPermalink + "Permalink" .Permalink) }} + {{- end }} +{{- end }} +{{/* Use the first one of site images as the fallback. */}} +{{- if and (not $imgParams) (not $imgs) }} + {{- with site.Params.images }} + {{- $imgParams = first 1 . }} + {{- end }} +{{- end }} +{{/* Parse page's images parameter. */}} +{{- range $imgParams }} + {{- $img := . }} + {{- $url := urls.Parse $img }} + {{- if eq $url.Scheme "" }} + {{/* Internal image. */}} + {{- with $resources.GetMatch $img -}} + {{/* Image resource. */}} + {{- $imgs = $imgs | append (dict + "Image" . + "RelPermalink" .RelPermalink + "Permalink" .Permalink) }} + {{- else }} + {{- $imgs = $imgs | append (dict + "RelPermalink" (relURL $img) + "Permalink" (absURL $img) + ) }} + {{- end }} + {{- else }} + {{/* External image */}} + {{- $imgs = $imgs | append (dict + "RelPermalink" $img + "Permalink" $img + ) }} + {{- end }} +{{- end }} +{{- return $imgs }} diff --git a/themes/PaperMod/layouts/_partials/templates/opengraph.html b/themes/PaperMod/layouts/_partials/templates/opengraph.html new file mode 100644 index 0000000..8c765d1 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/templates/opengraph.html @@ -0,0 +1,86 @@ + + +{{- with or site.Title site.Params.title | plainify }} + +{{- end }} + +{{- with or .Title site.Title site.Params.title | plainify }} + +{{- end }} + +{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape }} + +{{- end }} + +{{- with or .Params.locale site.Language.LanguageCode }} + +{{- end }} + +{{- if .IsPage }} + + {{- with .Section }} + + {{- end }} + {{- $ISO8601 := "2006-01-02T15:04:05-07:00" }} + {{- with .PublishDate }} + + {{- end }} + {{- with .Lastmod }} + + {{- end }} + {{- range .GetTerms "tags" | first 6 }} + + {{- end }} +{{- else }} + +{{- end }} + +{{- if .Params.cover.image -}} + {{- if (ne .Params.cover.relative true) }} + + {{- else}} + + {{- end}} +{{- else }} + {{- with partial "_funcs/get-page-images" . }} + {{- range . | first 6 }} + + {{- end }} + {{- end }} +{{- end }} + +{{- with .Params.audio }} + {{- range . | first 6 }} + + {{- end }} +{{- end }} + +{{- with .Params.videos }} + {{- range . | first 6 }} + + {{- end }} +{{- end }} + +{{- range .GetTerms "series" }} + {{- range .Pages | first 7 }} + {{- if ne $ . }} + + {{- end }} + {{- end }} +{{- end }} + +{{- with site.Params.social }} + {{- if reflect.IsMap . }} + {{- with .facebook_app_id }} + + {{- else }} + {{- with .facebook_admin }} + + {{- end }} + {{- end }} + {{- end }} +{{- end }} + +{{- with (.Param "social.fediverse_creator") }} + +{{- end }} diff --git a/themes/PaperMod/layouts/_partials/templates/schema_json.html b/themes/PaperMod/layouts/_partials/templates/schema_json.html new file mode 100644 index 0000000..8a4efb4 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/templates/schema_json.html @@ -0,0 +1,128 @@ +{{ if .IsHome }} + +{{- else if (or .IsPage .IsSection) }} +{{/* BreadcrumbList */}} +{{- $url := replace .Parent.Permalink ( printf "%s" site.Home.Permalink) "" }} +{{- $lang_url := strings.TrimPrefix ( printf "%s/" .Lang) $url }} +{{- $bc_list := (split $lang_url "/")}} + +{{- $scratch := newScratch }} + +{{- if .IsPage }} + +{{- end }}{{/* .IsPage end */}} + +{{- end -}} diff --git a/themes/PaperMod/layouts/_partials/templates/twitter_cards.html b/themes/PaperMod/layouts/_partials/templates/twitter_cards.html new file mode 100644 index 0000000..bcbc435 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/templates/twitter_cards.html @@ -0,0 +1,37 @@ +{{- if .Params.cover.image -}} + +{{- if (ne $.Params.cover.relative true) }} + +{{- else }} + +{{- end}} +{{- else }} +{{- $images := partial "templates/_funcs/get-page-images" . }} +{{- with index $images 0 }} + + +{{- else }} + +{{- end }} +{{- end }} + +{{- with or .Title site.Title site.Params.title | plainify }} + +{{- end }} + +{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape }} + +{{- end }} + +{{- $twitterSite := "" }} +{{- with site.Params.social }} + {{- if reflect.IsMap . }} + {{- with .twitter }} + {{- $content := . }} + {{- if not (strings.HasPrefix . "@") }} + {{- $content = printf "@%v" . }} + {{- end }} + + {{- end }} + {{- end }} +{{- end }} diff --git a/themes/PaperMod/layouts/_partials/toc.html b/themes/PaperMod/layouts/_partials/toc.html new file mode 100644 index 0000000..a4decf7 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/toc.html @@ -0,0 +1,95 @@ +{{- $headers := findRE "(.|\n])+?
" .Content -}} +{{- $has_headers := ge (len $headers) 1 -}} +{{- if $has_headers -}} +
+ + {{- i18n "toc" | default "Table of Contents" }} + + +
+ {{- if (.Param "UseHugoToc") }} + {{- .TableOfContents -}} + {{- else }} + {{- $largest := 6 -}} + {{- range $headers -}} + {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} + {{- $headerLevel := len (seq $headerLevel) -}} + {{- if lt $headerLevel $largest -}} + {{- $largest = $headerLevel -}} + {{- end -}} + {{- end -}} + + {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} + + {{- $.Scratch.Set "bareul" slice -}} +
    + {{- range seq (sub $firstHeaderLevel $largest) -}} +
      + {{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}} + {{- end -}} + {{- range $i, $header := $headers -}} + {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} + {{- $headerLevel := len (seq $headerLevel) -}} + + {{/* get id="xyz" */}} + {{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }} + + {{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}} + {{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }} + {{- $header := replaceRE "((.|\n])+?)" "$1" $header -}} + + {{- if ne $i 0 -}} + {{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}} + {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}} + {{- if gt $headerLevel $prevHeaderLevel -}} + {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}} +
        + {{/* the first should not be recorded */}} + {{- if ne $prevHeaderLevel . -}} + {{- $.Scratch.Add "bareul" . -}} + {{- end -}} + {{- end -}} + {{- else -}} + + {{- if lt $headerLevel $prevHeaderLevel -}} + {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}} + {{- if in ($.Scratch.Get "bareul") . -}} +
      + {{/* manually do pop item */}} + {{- $tmp := $.Scratch.Get "bareul" -}} + {{- $.Scratch.Delete "bareul" -}} + {{- $.Scratch.Set "bareul" slice}} + {{- range seq (sub (len $tmp) 1) -}} + {{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}} + {{- end -}} + {{- else -}} +
    + + {{- end -}} + {{- end -}} + {{- end -}} + {{- end }} +
  • + {{- $header | plainify | safeHTML -}} + {{- else }} +
  • + {{- $header | plainify | safeHTML -}} + {{- end -}} + {{- end -}} + + {{- $firstHeaderLevel := $largest }} + {{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }} +
  • + {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}} + {{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }} +
+ {{- else }} + + + {{- end -}} + {{- end }} + + {{- end }} +
+
+{{- end }} diff --git a/themes/PaperMod/layouts/_partials/translation_list.html b/themes/PaperMod/layouts/_partials/translation_list.html new file mode 100644 index 0000000..bccdbe9 --- /dev/null +++ b/themes/PaperMod/layouts/_partials/translation_list.html @@ -0,0 +1,21 @@ +{{- if .IsTranslated -}} + {{- if (ne .Layout "search") }} + {{- if or (.Param "author") (.Param "ShowReadingTime") (not .Date.IsZero) }} + {{- printf " | " | safeHTML -}} + {{- end -}} + {{- end -}} + {{- i18n "translations" | default "Translations" }}: + +{{- end -}} diff --git a/themes/PaperMod/layouts/_shortcodes/audio.html b/themes/PaperMod/layouts/_shortcodes/audio.html new file mode 100644 index 0000000..c98b5f3 --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/audio.html @@ -0,0 +1,2 @@ +{{ $src := (.Get "src") }} + diff --git a/themes/PaperMod/layouts/_shortcodes/collapse.html b/themes/PaperMod/layouts/_shortcodes/collapse.html new file mode 100644 index 0000000..17d8d3b --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/collapse.html @@ -0,0 +1,8 @@ +{{ if .Get "summary" }} +{{ else }} +{{ warnf "missing value for param 'summary': %s" .Position }} +{{ end }} +

+ {{ .Get "summary" | markdownify }} + {{ .Inner | markdownify }} +

diff --git a/themes/PaperMod/layouts/_shortcodes/figure.html b/themes/PaperMod/layouts/_shortcodes/figure.html new file mode 100644 index 0000000..8c93eff --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/figure.html @@ -0,0 +1,31 @@ + + {{- if .Get "link" -}} + + {{- end }} + {{ with .Get + {{- if .Get "link" }}{{ end -}} + {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}} +
+ {{ with (.Get "title") -}} + {{ . }} + {{- end -}} + {{- if or (.Get "caption") (.Get "attr") -}}

+ {{- .Get "caption" | markdownify -}} + {{- with .Get "attrlink" }} + + {{- end -}} + {{- .Get "attr" | markdownify -}} + {{- if .Get "attrlink" }}{{ end }}

+ {{- end }} +
+ {{- end }} + diff --git a/themes/PaperMod/layouts/_shortcodes/inTextImg.html b/themes/PaperMod/layouts/_shortcodes/inTextImg.html new file mode 100644 index 0000000..0239fd6 --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/inTextImg.html @@ -0,0 +1,5 @@ +{{- $Img := (.Get "url") }} +{{- $height := (.Get "height") }} +{{- $alt := (.Get "alt") }} + +{{$alt}} diff --git a/themes/PaperMod/layouts/_shortcodes/ltr.html b/themes/PaperMod/layouts/_shortcodes/ltr.html new file mode 100644 index 0000000..4ad7682 --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/ltr.html @@ -0,0 +1,15 @@ +{{ $.Scratch.Set "md" false }} + +{{ if .IsNamedParams }} +{{ $.Scratch.Set "md" (.Get "md") }} +{{ else }} +{{ $.Scratch.Set "md" (.Get 0) }} +{{ end }} + +
+ {{ if eq ($.Scratch.Get "md") false }} + {{ .Inner }} + {{ else }} + {{ .Inner | markdownify }} + {{ end }} +
diff --git a/themes/PaperMod/layouts/_shortcodes/rawhtml.html b/themes/PaperMod/layouts/_shortcodes/rawhtml.html new file mode 100644 index 0000000..9350c13 --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/rawhtml.html @@ -0,0 +1,2 @@ + +{{- .Inner -}} \ No newline at end of file diff --git a/themes/PaperMod/layouts/_shortcodes/rtl.html b/themes/PaperMod/layouts/_shortcodes/rtl.html new file mode 100644 index 0000000..a69b8ce --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/rtl.html @@ -0,0 +1,15 @@ +{{ $.Scratch.Set "md" false }} + +{{ if .IsNamedParams }} +{{ $.Scratch.Set "md" (.Get "md") }} +{{ else }} +{{ $.Scratch.Set "md" (.Get 0) }} +{{ end }} + +
+ {{ if eq ($.Scratch.Get "md") false }} + {{ .Inner }} + {{ else }} + {{ .Inner | markdownify }} + {{ end }} +
diff --git a/themes/PaperMod/layouts/_shortcodes/video.html b/themes/PaperMod/layouts/_shortcodes/video.html new file mode 100644 index 0000000..adb917b --- /dev/null +++ b/themes/PaperMod/layouts/_shortcodes/video.html @@ -0,0 +1,2 @@ +{{ $src := (.Get "src") }} + diff --git a/themes/PaperMod/layouts/archives.html b/themes/PaperMod/layouts/archives.html new file mode 100644 index 0000000..eea3fc8 --- /dev/null +++ b/themes/PaperMod/layouts/archives.html @@ -0,0 +1,83 @@ +{{- define "main" }} + + + +{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }} + +{{- if site.Params.ShowAllPagesInArchive }} +{{- $pages = site.RegularPages }} +{{- end }} + +{{- range $pages.GroupByPublishDate "2006" }} +{{- if ne .Key "0001" }} +
+ {{- $year := replace .Key "0001" "" }} +

+ + {{- $year -}} + +  {{ len .Pages }} +

+ {{- range .Pages.GroupByDate "January" }} +
+

+ + {{- .Key -}} + +  {{ len .Pages }} +

+
+ {{- range .Pages }} + {{- if eq .Kind "page" }} +
+

+ {{- .Title | markdownify }} + {{- if .Draft }} + + + + + + {{- end }} +

+
+ {{- partial "post_meta.html" . -}} +
+ +
+ {{- end }} + {{- end }} +
+
+ {{- end }} +
+{{- end }} +{{- end }} + +{{- end }}{{/* end main */}} diff --git a/themes/PaperMod/layouts/baseof.html b/themes/PaperMod/layouts/baseof.html new file mode 100644 index 0000000..c577599 --- /dev/null +++ b/themes/PaperMod/layouts/baseof.html @@ -0,0 +1,31 @@ +{{- if lt hugo.Version "0.146.0" }} +{{- errorf "=> hugo v0.146.0 or greater is required for hugo-PaperMod to build " }} +{{- end -}} + + +{{- $theme := site.Params.defaultTheme | default "auto" }} +{{- if eq $theme "dark" }} + +{{- else if eq $theme "light" }} + +{{- else }} + +{{- end }} + + + {{- partial "head.html" . }} + + +{{- if (or (ne .Kind `page` ) (eq .Layout `archives`) (eq .Layout `search`)) }} + +{{- else }} + +{{- end }} + {{ partialCached "header.html" . .Page -}} +
+ {{- block "main" . }}{{ end }} +
+ {{ partialCached "footer.html" . .Layout .Kind (.Param "hideFooter") (.Param "ShowCodeCopyButtons") -}} + + + diff --git a/themes/PaperMod/layouts/index.json b/themes/PaperMod/layouts/index.json new file mode 100644 index 0000000..feeb437 --- /dev/null +++ b/themes/PaperMod/layouts/index.json @@ -0,0 +1,7 @@ +{{- $.Scratch.Add "index" slice -}} +{{- range site.RegularPages -}} + {{- if and (not .Params.searchHidden) (ne .Layout `archives`) (ne .Layout `search`) }} + {{- $.Scratch.Add "index" (dict "title" .Title "content" .Plain "permalink" .Permalink "summary" .Summary) -}} + {{- end }} +{{- end -}} +{{- $.Scratch.Get "index" | jsonify -}} diff --git a/themes/PaperMod/layouts/list.html b/themes/PaperMod/layouts/list.html new file mode 100644 index 0000000..2fe171f --- /dev/null +++ b/themes/PaperMod/layouts/list.html @@ -0,0 +1,121 @@ +{{- define "main" }} + +{{- if (and site.Params.profileMode.enabled .IsHome) }} +{{- partial "index_profile.html" . }} +{{- else }} {{/* if not profileMode */}} + +{{- if not .IsHome | and .Title }} + +{{- end }} + +{{- if .Content }} +
+ {{- if not (.Param "disableAnchoredHeadings") }} + {{- partial "anchored_headings.html" .Content -}} + {{- else }}{{ .Content }}{{ end }} +
+{{- end }} + +{{- $pages := union .RegularPages .Sections }} + +{{- if .IsHome }} +{{- $pages = where site.RegularPages "Type" "in" site.Params.mainSections }} +{{- $pages = where $pages "Params.hiddenInHomeList" "!=" "true" }} +{{- end }} + +{{- $paginator := .Paginate $pages }} + +{{- if and .IsHome site.Params.homeInfoParams (eq $paginator.PageNumber 1) }} +{{- partial "home_info.html" . }} +{{- end }} + +{{- $term := .Data.Term }} +{{- range $index, $page := $paginator.Pages }} + +{{- $class := "post-entry" }} + +{{- $user_preferred := or site.Params.disableSpecial1stPost site.Params.homeInfoParams }} +{{- if (and $.IsHome (eq $paginator.PageNumber 1) (eq $index 0) (not $user_preferred)) }} +{{- $class = "first-entry" }} +{{- else if $term }} +{{- $class = "post-entry tag-entry" }} +{{- end }} + +
+ {{- $isHidden := (.Param "cover.hiddenInList") | default (.Param "cover.hidden") | default false }} + {{- partial "cover.html" (dict "cxt" . "IsSingle" false "isHidden" $isHidden) }} +
+

+ {{- .Title }} + {{- if .Draft }} + + + + + + {{- end }} +

+
+ {{- if (ne (.Param "hideSummary") true) }} +
+

{{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}

+
+ {{- end }} + {{- if not (.Param "hideMeta") }} +
+ {{- partial "post_meta.html" . -}} +
+ {{- end }} + +
+{{- end }} + +{{- if gt $paginator.TotalPages 1 }} + +{{- end }} + +{{- end }}{{/* end profileMode */}} + +{{- end }}{{- /* end main */ -}} diff --git a/themes/PaperMod/layouts/llms.txt b/themes/PaperMod/layouts/llms.txt new file mode 100644 index 0000000..32642e7 --- /dev/null +++ b/themes/PaperMod/layouts/llms.txt @@ -0,0 +1,41 @@ +{{- /* Recursive printer for sections */ -}} +{{- define "llms_print_section" -}} +{{- $section := .section -}} +{{- $depth := .depth -}} +{{- if or (gt (len $section.RegularPages) 0) (gt (len $section.Sections) 0) -}} +{{- $hashes := strings.Repeat (add $depth 1) "#" }} + +{{ printf "%s %s" $hashes $section.Title }} + +{{- /* Pages in this section */ -}} +{{- range $p := $section.RegularPages }} + {{- if and (not $p.Params.searchHidden) (ne $p.Layout `archives`) (ne $p.Layout `search`) }} +- [{{ $p.Title }}]({{ $p.Permalink }}) + {{- end -}} +{{- end -}} + +{{- /* Recurse into subsections */ -}} +{{- range $s := $section.Sections -}} +{{- template "llms_print_section" (dict "section" $s "depth" (add $depth 1)) -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- /* Main template starts here */ -}} +# {{ site.Title }} + +{{- /* Pages not in any section */ -}} +{{- $orphans := where site.RegularPages "Section" "" -}} +{{ if gt (len $orphans) 0 }} + +{{- range $p := $orphans -}} + {{ if and (not $p.Params.searchHidden) (ne $p.Layout `archives`) (ne $p.Layout `search`) (not $p.IsHome) }} +- [{{ $p.Title }}]({{ $p.Permalink }}) + {{- end -}} +{{- end -}} + +{{- end -}} + +{{- range site.Sections -}} +{{- template "llms_print_section" (dict "section" . "depth" 1) -}} +{{- end }} diff --git a/themes/PaperMod/layouts/robots.txt b/themes/PaperMod/layouts/robots.txt new file mode 100644 index 0000000..f26f508 --- /dev/null +++ b/themes/PaperMod/layouts/robots.txt @@ -0,0 +1,7 @@ +User-agent: * +{{- if hugo.IsProduction | or (eq site.Params.env "production") }} +Disallow: +{{- else }} +Disallow: / +{{- end }} +Sitemap: {{ "sitemap.xml" | absURL }} diff --git a/themes/PaperMod/layouts/rss.xml b/themes/PaperMod/layouts/rss.xml new file mode 100644 index 0000000..e48b24f --- /dev/null +++ b/themes/PaperMod/layouts/rss.xml @@ -0,0 +1,72 @@ +{{- $authorEmail := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .email }} + {{- $authorEmail = . }} + {{- end }} + {{- end }} +{{- end }} + +{{- $authorName := "" }} +{{- with site.Params.author }} + {{- if reflect.IsMap . }} + {{- with .name }} + {{- $authorName = . }} + {{- end }} + {{- else }} + {{- $authorName = . }} + {{- end }} +{{- end }} + +{{- $pctx := . }} +{{- if .IsHome }}{{ $pctx = site }}{{ end }} +{{- $pages := slice }} +{{- if or $.IsHome $.IsSection }} +{{- $pages = $pctx.RegularPages }} +{{- else }} +{{- $pages = $pctx.Pages }} +{{- end }} +{{- $pages = where $pages "Params.hiddenInRss" "!=" true -}} +{{- $limit := site.Config.Services.RSS.Limit }} +{{- if ge $limit 1 }} +{{- $pages = $pages | first $limit }} +{{- end }} +{{- printf "" | safeHTML }} + + + {{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ site.Title }}{{ end }} + {{ .Permalink }} + Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ site.Title }} + {{- with site.Params.images }} + + {{ site.Title }} + {{ index . 0 | absURL }} + {{ index . 0 | absURL }} + + {{- end }} + Hugo + {{ site.Language.LanguageCode }}{{ with $authorEmail }} + {{.}}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with $authorEmail }} + {{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }}{{ with site.Copyright }} + {{ . | markdownify | plainify | strings.TrimPrefix "© " }}{{ end }}{{ if not .Date.IsZero }} + {{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} + {{- with .OutputFormats.Get "RSS" }} + {{ printf "" .Permalink .MediaType | safeHTML }} + {{- end }} + {{- range $pages }} + {{- if and (ne .Layout `search`) (ne .Layout `archives`) }} + + {{ .Title }} + {{ .Permalink }} + {{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{- with $authorEmail }}{{ . }}{{ with $authorName }} ({{ . }}){{ end }}{{ end }} + {{ .Permalink }} + {{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}} + {{- if and site.Params.ShowFullTextinRSS .Content }} + {{ (printf "" .Content) | safeHTML }} + {{- end }} + + {{- end }} + {{- end }} + + diff --git a/themes/PaperMod/layouts/search.html b/themes/PaperMod/layouts/search.html new file mode 100644 index 0000000..06af878 --- /dev/null +++ b/themes/PaperMod/layouts/search.html @@ -0,0 +1,29 @@ +{{- define "main" }} + + + + + +{{- end }}{{/* end main */}} diff --git a/themes/PaperMod/layouts/single.html b/themes/PaperMod/layouts/single.html new file mode 100644 index 0000000..19323b2 --- /dev/null +++ b/themes/PaperMod/layouts/single.html @@ -0,0 +1,67 @@ +{{- define "main" }} + +
+
+ {{ partial "breadcrumbs.html" . }} +

+ {{ .Title }} + {{- if .Draft }} + + + + + + {{- end }} +

+ {{- if .Description }} +
+ {{ .Description }} +
+ {{- end }} + {{- if not (.Param "hideMeta") }} + + {{- end }} +
+ {{- $isHidden := (.Param "cover.hiddenInSingle") | default (.Param "cover.hidden") | default false }} + {{- partial "cover.html" (dict "cxt" . "IsSingle" true "isHidden" $isHidden) }} + {{- if (.Param "ShowToc") }} + {{- partial "toc.html" . }} + {{- end }} + + {{- if .Content }} +
+ {{- if not (.Param "disableAnchoredHeadings") }} + {{- partial "anchored_headings.html" .Content -}} + {{- else }}{{ .Content }}{{ end }} +
+ {{- end }} + + {{- partial "extend_post_content.html" . }} + +
+ {{- $tags := .Language.Params.Taxonomies.tag | default "tags" }} + + {{- if (.Param "ShowPostNavLinks") }} + {{- partial "post_nav_links.html" . }} + {{- end }} + {{- if (and site.Params.ShowShareButtons (ne .Params.disableShare true)) }} + {{- partial "share_icons.html" . -}} + {{- end }} +
+ + {{- if (.Param "comments") }} + {{- partial "comments.html" . }} + {{- end }} +
+ +{{- end }}{{/* end main */}} diff --git a/themes/PaperMod/layouts/taxonomy.html b/themes/PaperMod/layouts/taxonomy.html new file mode 100644 index 0000000..84fad52 --- /dev/null +++ b/themes/PaperMod/layouts/taxonomy.html @@ -0,0 +1,27 @@ +{{- define "main" }} + +{{- if .Title }} + +{{- end }} + +
    + {{- $type := .Type }} + {{- range $key, $value := .Data.Terms.Alphabetical }} + {{- $name := .Name }} + {{- $count := .Count }} + {{- with site.GetPage (printf "/%s/%s" $type $name) }} +
  • + {{ .LinkTitle }} {{ $count }} +
  • + {{- end }} + {{- end }} +
+ +{{- end }}{{/* end main */ -}} diff --git a/themes/PaperMod/theme.toml b/themes/PaperMod/theme.toml new file mode 100644 index 0000000..758f828 --- /dev/null +++ b/themes/PaperMod/theme.toml @@ -0,0 +1,68 @@ +# theme.toml template for a Hugo theme +# See https://github.com/gohugoio/hugoThemes#themetoml for an example + +name = "PaperMod" +license = "MIT" +licenselink = "https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE" +description = "A fast, clean, responsive Hugo theme" +homepage = "https://github.com/adityatelange/hugo-PaperMod/" +demosite = "https://adityatelange.github.io/hugo-PaperMod/" +tags = [ + "responsive", + "blog", + "clean", + "minimal", + "light", + "dark", + "fast", + "multilingual", + "search", + "seo", + "chroma", + "personal" +] +features = [ + "responsive", + "single-column", + "blog", + "cover-image", + "table-of-contents", + "opengraph", + "twitter-cards", + "favicon", + "archive", + "share-icons", + "cover", + "multilingual", + "social-icons", + "minified-assets", + "theme-toggle", + "menu-location-indicator", + "scroll-to-top", + "search", + "breadcrumbs", + "reading-time", + "word-count", + "code-copy", + "comments", + "edit-post", + "canonical-link", + "profile-mode", + "home-info-mode", + "related-posts", + "rss", + "multiple-authors", + "post-nav-links" +] +min_version = "0.146.0" + +[author] + name = "Aditya Telange" + homepage = "https://github.com/adityatelange" + +# If porting an existing theme +[original] + name = "Paper" + author = "nanxiaobei" + homepage = "https://github.com/nanxiaobei" + repo = "https://github.com/nanxiaobei/hugo-paper/" diff --git a/themes/hextra/.devcontainer/devcontainer.json b/themes/hextra/.devcontainer/devcontainer.json new file mode 100644 index 0000000..2ae8774 --- /dev/null +++ b/themes/hextra/.devcontainer/devcontainer.json @@ -0,0 +1,24 @@ +{ + "image": "mcr.microsoft.com/devcontainers/go:1", + "features": { + "ghcr.io/devcontainers/features/hugo:1": { + "extended": true, + "version": "0.147.7" + }, + "ghcr.io/devcontainers/features/node:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "mhutchie.git-graph", + "esbenp.prettier-vscode", + "tamasfe.even-better-toml", + "budparr.language-hugo-vscode" + ] + } + }, + "postCreateCommand": "npm install", + "forwardPorts": [ + 1313 + ] +} \ No newline at end of file diff --git a/themes/hextra/.gitattributes b/themes/hextra/.gitattributes new file mode 100644 index 0000000..0820376 --- /dev/null +++ b/themes/hextra/.gitattributes @@ -0,0 +1,3 @@ +# Mark generated files so they are collapsed by default in GitHub diffs +assets/css/compiled/main.css linguist-generated=true +docs/hugo_stats.json linguist-generated=true diff --git a/themes/hextra/.github/CONTRIBUTING.md b/themes/hextra/.github/CONTRIBUTING.md new file mode 100644 index 0000000..825bb06 --- /dev/null +++ b/themes/hextra/.github/CONTRIBUTING.md @@ -0,0 +1,110 @@ +# Contribute to Hextra + +👋 Thank you for being interested in contributing to Hextra! As an open source project, we welcome contributions of many forms including bug reports, feature requests, documentation improvements, and code contributions. + + +## Table of Contents + +- [Guidelines](#guidelines) + - [Contributing Code](#contributing-code) + - [Contributing Documentation](#contributing-documentation) + - [💬 GitHub Discussions](#-github-discussions) + - [GitHub Issues](#github-issues) +- [Development](#development) + - [Local development setup](#local-development-setup) + - [Project structure](#project-structure) + - [Start the development server](#start-the-development-server) + - [Compile the styles](#compile-the-styles) + + +## Guidelines + +### Contributing Code + +To contribute, please follow the ["Fork and Pull Request"][fork and pull] workflow: + +Fork the repository, make your changes, and then submit a pull request. +Please make sure to include a description of the changes you made and why you made them. +Use [Conventional Commits][conventional commits] message to make it easier to understand the changes you made. + +### Contributing Documentation + +Similar to contributing code, you can also contribute to the documentation by submitting a pull request. + +The documentation site is located in the [`docs`](../docs/) folder. +You can make changes to the documentation and create a pull request. A preview of the new documentation will be automatically generated and displayed in the pull request comment via [Netlify][netlify deploy preview]. + +### 💬 GitHub Discussions + +We’re using [Discussions][discussions] as a place to connect with other members using Hextra: + +- Ask questions you’re wondering about. +- Share ideas. +- Engage with other users. + +### GitHub Issues + +If you find a bug or have a feature request, please [open an issue][issues]. + +Please make sure to include a description of the bug or feature you are requesting. If you are reporting a bug, please include steps to reproduce the bug. + +We recommend that you search existing [issues][issues] or discussions before opening a new one to prevent duplicates. + +## Development + +> **Note** +> You can start developing on [GitHub Codespaces][open in codespaces] or use [devcontainer][devcontainer] locally without installing any dependencies. + +### Local development setup + +- [Hugo][hugo] >= v0.124.0 (extended version) +- [Node.js][nodejs] +- [Go][go] + +Install dependencies: + +```bash +npm i +``` + +### Project structure + +- [`assets`](../assets/): CSS styles and JavaScript files. +- [`data`](../data/): The theme data files. Now only contains the `icons.yaml` file. +- [`docs`](../docs/): The documentation site for the theme. +- [`i18n`](../i18n/): The theme translation files. +- [`layouts`](../layouts/): The theme layouts. +- [`static`](../static/): The static files for the theme. For example, the favicon and the site logo. + +Please refer to the [Hugo documentation][hugo] for more information. + +### Start the development server + +```bash +npm run dev:theme +``` + +It starts the Hugo server on `http://localhost:1313/` for the `docs` content. + +### Compile the styles + +For development preview, we compile the Tailwind CSS styles on the fly. But for production, we need to compile the styles first. + +```bash +npm run build:css +``` + +It will compile the Tailwind CSS styles and generate the `assets/css/compiled/main.css` file. + + + +[fork and pull]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects +[conventional commits]: https://www.conventionalcommits.org +[issues]: https://github.com/imfing/hextra/issues +[discussions]: https://github.com/imfing/hextra/discussions +[nodejs]: https://nodejs.org/en/ +[hugo]: https://gohugo.io/ +[go]: https://golang.org/doc/install +[devcontainer]: https://code.visualstudio.com/docs/devcontainers/containers +[open in codespaces]: https://codespaces.new/imfing/hextra +[netlify deploy preview]: https://docs.netlify.com/site-deploys/deploy-previews/ diff --git a/themes/hextra/.github/FUNDING.yml b/themes/hextra/.github/FUNDING.yml new file mode 100644 index 0000000..b1d6700 --- /dev/null +++ b/themes/hextra/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: imfing +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/themes/hextra/.github/ISSUE_TEMPLATE/bug_report.md b/themes/hextra/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..41be0cf --- /dev/null +++ b/themes/hextra/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,42 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Description** + + + +**Steps To Reproduce** + +1. +2. +3. + + + +**Expected Behavior** + + + +**Actual Behavior** + + + +**Screenshots** + + + +**Environment** + +- Hugo Version: [e.g., 0.85.0] +- Browser/OS: [e.g., Chrome, MacOS] +- Theme Version: [e.g., v2.0] + +**Additional Context** + + diff --git a/themes/hextra/.github/ISSUE_TEMPLATE/feature_request.md b/themes/hextra/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..6937c03 --- /dev/null +++ b/themes/hextra/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,24 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Feature Description** + + + +**Problem/Solution** + + + +**Alternatives Considered** + + + +**Additional Context** + + diff --git a/themes/hextra/.github/workflows/pages.yml b/themes/hextra/.github/workflows/pages.yml new file mode 100644 index 0000000..c5e98d9 --- /dev/null +++ b/themes/hextra/.github/workflows/pages.yml @@ -0,0 +1,82 @@ +# Build and deploy Hextra docs site to GitHub Pages +name: Deploy Hextra docs site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +# Default to bash +defaults: + run: + shell: bash + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.156.0 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # fetch all history for .GitInfo and .Lastmod + fetch-tags: true + submodules: recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: "1.26" + + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + + - name: Setup Hugo + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + + - name: Make build script executable + run: chmod +x ./build.sh + + - name: Build all site versions + env: + HUGO_ENVIRONMENT: production + HUGO_ENV: production + run: | + ./build.sh "${{ steps.pages.outputs.base_url }}" + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./public + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/themes/hextra/.github/workflows/test-accessibility.yml b/themes/hextra/.github/workflows/test-accessibility.yml new file mode 100644 index 0000000..1bd09ef --- /dev/null +++ b/themes/hextra/.github/workflows/test-accessibility.yml @@ -0,0 +1,62 @@ +name: Accessibility Tests + +on: + pull_request: + branches: [main] + +concurrency: + group: accessibility-${{ github.head_ref || github.ref_name }} + cancel-in-progress: true + +defaults: + run: + shell: bash + +jobs: + a11y: + runs-on: ubuntu-latest + environment: accessibility + env: + HUGO_VERSION: 0.156.0 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: "1.26" + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: npm + + - name: Setup Hugo + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + + - name: Install dependencies + run: npm ci + + - name: Install Playwright Chromium + run: npx playwright install chromium + + - name: Build site + run: npm run build + + - name: Run accessibility tests + run: npm run test:a11y + + - name: Upload report + if: always() + uses: actions/upload-artifact@v4 + with: + name: accessibility-report + path: playwright-report/ + retention-days: 14 diff --git a/themes/hextra/.github/workflows/test-mobile-menu.yml b/themes/hextra/.github/workflows/test-mobile-menu.yml new file mode 100644 index 0000000..286fb2f --- /dev/null +++ b/themes/hextra/.github/workflows/test-mobile-menu.yml @@ -0,0 +1,61 @@ +name: Mobile Menu Tests + +on: + pull_request: + branches: [main] + +concurrency: + group: mobile-menu-${{ github.head_ref || github.ref_name }} + cancel-in-progress: true + +defaults: + run: + shell: bash + +jobs: + mobile-menu: + runs-on: ubuntu-latest + env: + HUGO_VERSION: 0.156.0 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: "1.26" + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: npm + + - name: Setup Hugo + run: | + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ + && sudo dpkg -i ${{ runner.temp }}/hugo.deb + + - name: Install dependencies + run: npm ci + + - name: Install Playwright Chromium + run: npx playwright install chromium + + - name: Build site + run: npm run build + + - name: Run mobile menu tests + run: npm run test:mobile-menu + + - name: Upload report + if: always() + uses: actions/upload-artifact@v4 + with: + name: mobile-menu-report + path: playwright-report/ + retention-days: 14 diff --git a/themes/hextra/.gitignore b/themes/hextra/.gitignore new file mode 100644 index 0000000..7377a08 --- /dev/null +++ b/themes/hextra/.gitignore @@ -0,0 +1,9 @@ +node_modules/ +public/ +resources/ + +.hugo_build.lock + +# Playwright +playwright-report/ +test-results/ diff --git a/themes/hextra/.prettierrc b/themes/hextra/.prettierrc new file mode 100644 index 0000000..28eaa1e --- /dev/null +++ b/themes/hextra/.prettierrc @@ -0,0 +1,21 @@ +{ + "plugins": [ + "prettier-plugin-go-template" + ], + "goTemplateBracketSpacing": true, + "htmlWhitespaceSensitivity": "css", + "printWidth": 200, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "es5", + "overrides": [ + { + "files": [ + "*.html" + ], + "options": { + "parser": "go-template" + } + } + ] +} diff --git a/themes/hextra/.vscode/settings.json b/themes/hextra/.vscode/settings.json new file mode 100644 index 0000000..d238639 --- /dev/null +++ b/themes/hextra/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.tabSize": 2, + "css.customData": [".vscode/tailwind.json"], + "markdown.extension.toc.levels": "2..6" +} diff --git a/themes/hextra/.vscode/tailwind.json b/themes/hextra/.vscode/tailwind.json new file mode 100644 index 0000000..96a1f57 --- /dev/null +++ b/themes/hextra/.vscode/tailwind.json @@ -0,0 +1,55 @@ +{ + "version": 1.1, + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/themes/hextra/AGENTS.md b/themes/hextra/AGENTS.md new file mode 100644 index 0000000..c0bbe14 --- /dev/null +++ b/themes/hextra/AGENTS.md @@ -0,0 +1,193 @@ +# AGENTS.md + +This file provides guidance to AI coding agents when working with code in this repository. + +## Project Overview + +Hextra is a modern, responsive Hugo theme designed for creating documentation websites, technical blogs, and static sites. Built with Tailwind CSS, it offers features like full-text search, dark mode, multi-language support, and extensive customization options. + +## Development Commands + +### Initial Setup + +When working in a new worktree or fresh clone without `node_modules`, run `npm install` first to install dependencies: + +```bash +npm install +``` + +### Development Server + +```bash +# Start development server with theme reloading (recommended for theme development) +npm run dev:theme +``` + +### Building + +```bash +# Build the example site +npm run build + +# Build CSS assets only +npm run build:css +``` + +## Architecture Overview + +### Hugo Theme Structure + +- **Base Layout**: `layouts/baseof.html` wraps all pages +- **Specialized Layouts**: `layouts/docs/`, `layouts/blog/`, `layouts/hextra-home.html` +- **Partials**: Reusable components in `layouts/_partials/` + - Core UI: `navbar.html`, `sidebar.html`, `footer.html`, `breadcrumb.html`, `toc.html` + - Utilities: `layouts/_partials/utils/` for helper functions + - Custom overrides: `layouts/_partials/custom/` for user customizations +- **Shortcodes**: Custom Markdown extensions in `layouts/_shortcodes/` +- **Render Hooks**: Custom Markdown rendering in `layouts/_markup/` for codeblocks, headings, images, and links + +### Asset Organization + +``` +assets/ +├── css/ +│ ├── styles.css # Main stylesheet (Tailwind entry point) +│ ├── compiled/main.css # Built CSS output (generated) +│ ├── components/ # Component-specific styles +│ ├── chroma/ # Syntax highlighting themes +│ └── custom.css # User customization entry point +└── js/ + ├── core/ # Core JS components + └── flexsearch.js # Search functionality +``` + +### Key Components + +- **Search**: FlexSearch-powered full-text search (`assets/js/flexsearch.js`) +- **Navigation**: Responsive navbar and auto-generated sidebar +- **Theme Toggle**: Dark/light mode switching +- **Internationalization**: 20+ language support in `i18n/` + +### Content Features + +- **Shortcodes**: `callout`, `card`, `cards`, `tabs`, `tab`, `details`, `steps`, `filetree`, `jupyter`, `badge`, `icon`, `pdf`, `include`, `asciinema`, `term` +- **Code Features**: Syntax highlighting (Chroma), copy buttons, line numbers via render hooks +- **SEO**: Open Graph, Twitter Cards, structured data +- **Performance**: Minimal JavaScript, optimized CSS with Tailwind + +## Development Workflow + +### Example Site Development + +The `docs/` directory serves as both documentation and testing ground: + +- Test new features here before releasing +- Configuration examples in `docs/hugo.yaml` showing multi-language setup +- Content examples demonstrate all theme capabilities +- Run from docs with: `hugo server --themesDir=../..` + +### CSS Development Workflow + +- Source: `assets/css/styles.css` (main stylesheet) +- Build process: Tailwind CSS → PostCSS → `assets/css/compiled/main.css` +- Component styles organized in `assets/css/components/` +- Chroma syntax highlighting themes in `assets/css/chroma/` +- CSS compilation requires Node.js dependencies (PostCSS, Tailwind CSS v4+) + +#### Rebuilding CSS after template changes + +Tailwind CSS relies on `docs/hugo_stats.json` to know which HTML tags, classes, and IDs are actually used in the built site, so it can tree-shake unused styles. When you modify layouts, partials, or shortcodes you must **regenerate `hugo_stats.json` first**, then rebuild the CSS: + +1. **Generate `docs/hugo_stats.json`** — Run Hugo with the `dev.toml` config (which sets `build.buildStats.enable = true`): + + ```bash + # Using npm (starts a dev server that writes hugo_stats.json on every rebuild): + npm run dev:theme + + # Or a one-shot build using the raw Hugo command: + hugo --config=hugo.yaml,../dev.toml --themesDir=../.. --source=docs + ``` + +2. **Build the CSS** — With an up-to-date `hugo_stats.json` in place, compile the stylesheet: + + ```bash + npm run build:css + ``` + +> **Why two steps?** `dev.toml` mounts `docs/hugo_stats.json` into the Hugo asset pipeline (`assets/notwatching/hugo_stats.json`) and configures a cache-buster so that changes to the stats file trigger a CSS recompile during `dev:theme`. When running outside the dev server you need to perform these steps manually in order. + +### Customization Points + +- Custom partials: `layouts/_partials/custom/` +- Custom CSS: `assets/css/custom.css` +- Site-specific overrides: Copy any layout to your site's `layouts/` directory + +## Configuration & Requirements + +### Theme Requirements + +- Hugo minimum version: 0.146.0 (extended version required - see `theme.toml`) +- Go 1.20+ (as specified in `go.mod`) +- Node.js for CSS compilation (PostCSS, Tailwind CSS v4+) + +### Key Configuration Files + +- `docs/hugo.yaml` - Example Hugo configuration with multi-language setup +- `postcss.config.mjs` - PostCSS configuration for CSS processing +- `package.json` - Node.js dependencies and build scripts + +### Development Environment + +- Default Hugo development server: Port 1313 +- Development server runs with `--disableFastRender -D` for better development experience +- Theme development uses `--logLevel=debug` for detailed logging + +### Multi-language Support + +- Configure languages in `hugo.yaml` (supports 20+ languages including RTL) +- Translation files in `i18n/` directory (e.g., `en.yaml`, `fa.yaml`, `ja.yaml`, `zh-cn.yaml`) +- Example supports English, Persian (RTL), Japanese, and Simplified Chinese + +## Theme Development Guidelines + +### Hugo Theme Conventions + +- Theme files in this repository override Hugo defaults +- Follow Hugo's theme development guidelines for compatibility +- Maintain backward compatibility with existing configurations + +### JavaScript & Performance + +- All JavaScript components are designed to have minimal footprint +- Core JS components in `assets/js/core/`: `theme.js`, `nav-menu.js`, `code-copy.js`, `sidebar.js`, `tabs.js`, etc. +- FlexSearch powers offline full-text search (`assets/js/flexsearch.js`) + +### CSS Architecture + +- Uses Tailwind CSS v4+ with PostCSS processing +- Component-based CSS organization in `assets/css/components/` +- Compiled output goes to `assets/css/compiled/main.css` +- Prettier formatting for Go templates and code consistency + +### Accessibility (WCAG Compliance) + +All new features and UI changes must follow the [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG22/) at the **AA** conformance level. Key requirements: + +- **Semantic HTML**: Use appropriate elements (`