mirror of
https://github.com/hugo-fixit/FixIt.git
synced 2026-08-26 00:08:55 +00:00
Compare commits
32 Commits
encrypt-v0.3.1
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 57f98b48c5 | |||
| 1d07b40d08 | |||
| 47b7c969f1 | |||
| 152e7fa5a2 | |||
| df90a0eb96 | |||
| 5f1e79f49c | |||
| 8b6806bbf3 | |||
| c65852d882 | |||
| 224621b114 | |||
| e0940bd4d3 | |||
| 8782b46f53 | |||
| 9f378691f1 | |||
| 9f4d33a670 | |||
| 3c449a9017 | |||
| 65e9f2ff92 | |||
| 54fe7bdc83 | |||
| 0bc1862853 | |||
| b680d609a1 | |||
| a9c29b1641 | |||
| 7bdd0c5869 | |||
| 8d7703a418 | |||
| da2f085969 | |||
| e3acdb9732 | |||
| ece55d0d36 | |||
| a73416e2be | |||
| 9e2f388022 | |||
| 610fa1d561 | |||
| a5a7b98c95 | |||
| a5d24f395e | |||
| f5509e5b82 | |||
| d35dd6a120 | |||
| 5322a15ceb |
@@ -43,7 +43,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v4
|
||||
uses: github/codeql-action/init@v4.37.3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
config-file: ./.github/configs/codeql.yml
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v4
|
||||
uses: github/codeql-action/autobuild@v4.37.3
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@@ -69,4 +69,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v4
|
||||
uses: github/codeql-action/analyze@v4.37.3
|
||||
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
uses: actions/checkout@v7
|
||||
- uses: pnpm/action-setup@v6
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version-file: .nvmrc
|
||||
cache: pnpm
|
||||
@@ -23,6 +23,8 @@ jobs:
|
||||
run: pnpm install --frozen-lockfile
|
||||
- name: Generate lexer map
|
||||
run: pnpm gen:lexers
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v8
|
||||
with:
|
||||
|
||||
@@ -23,7 +23,7 @@ jobs:
|
||||
|
||||
- uses: pnpm/action-setup@v6
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version-file: .nvmrc
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
|
||||
- uses: pnpm/action-setup@v6
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version-file: .nvmrc
|
||||
cache: pnpm
|
||||
|
||||
Vendored
+1
-9
@@ -1,13 +1,5 @@
|
||||
{
|
||||
"todo-tree.tree.scanMode": "workspace only",
|
||||
"explorer.fileNesting.enabled": true,
|
||||
"explorer.fileNesting.patterns": {
|
||||
"tsconfig.json": "tsconfig.*.json, env.d.ts",
|
||||
"package.json": "package-lock.json, pnpm*, .npmrc, .nvmrc, .eslint*, eslint*, .editorconfig, librarybot.yml",
|
||||
"README.md": "README.*.md, CODE_OF_CONDUCT.md, CONTRIBUTING.md, LICENSE, SECURITY.md, CHANGELOG.md",
|
||||
"hugo.toml": "theme.toml, .hugo_build.lock",
|
||||
"vercel.json": "build.sh"
|
||||
},
|
||||
"files.associations": {
|
||||
"*.template.ts": "gots",
|
||||
"*.template.js": "gojs",
|
||||
@@ -18,7 +10,7 @@
|
||||
"**/layouts/**/*.xml": "gohtml",
|
||||
"**/layouts/**/*.md": "gotemplate"
|
||||
},
|
||||
// Disable the default formatter, use eslint instead
|
||||
// Disable the default formatter, use ESLint instead
|
||||
"prettier.enable": false,
|
||||
"editor.formatOnSave": false,
|
||||
// Auto fix
|
||||
|
||||
@@ -106,6 +106,7 @@ Hugo Pipes processes all assets. The key orchestration is in `_partials/base/ass
|
||||
- CSS classes: BEM or semantic naming (`header-desktop`, `menu-item`)
|
||||
- SCSS variables: hyphen-separated, semantic (`$global-font-family`)
|
||||
- CSS custom properties: prefixed with `fi-` / `--fi-`
|
||||
- Use `fi-var()` function to reference CSS custom properties (auto-adds `--fi-` prefix), never use `var(--fi-...)` directly
|
||||
- Use CSS variables for theme switching; SCSS variables for colors (no hardcoded values)
|
||||
- Prefer relative units (rem, em, %) over absolute units
|
||||
- Keep selector nesting shallow
|
||||
|
||||
@@ -32,9 +32,8 @@
|
||||
[](https://gitee.com/lruihao/FixIt/stargazers)
|
||||
|
||||
> [!WARNING]
|
||||
> **Version v0.x only accepts bug fixes. For new feature submissions, please develop on the [v1](https://github.com/hugo-fixit/FixIt/tree/v1) branch.**
|
||||
>
|
||||
> Version 1.0 is planned for release in **the first half of 2027**. Welcome to join the development and discussion! See [v1 Milestone](https://github.com/hugo-fixit/FixIt/milestone/8) for details.
|
||||
> **The `main` branch contains the v1 code. For upgrade instructions, see the [v1 migration guide](https://fixit.lruihao.cn/guides/upgrade-to-v1/).**\
|
||||
> Version 1.0.0 is planned for release in **the first half of 2027**. Welcome to join the development and [discussion](https://github.com/orgs/hugo-fixit/discussions/723)!
|
||||
|
||||
## Live Preview
|
||||
|
||||
@@ -106,6 +105,7 @@ Click the following links to generate a new repository with template:
|
||||
|
||||
- **Responsive** layout
|
||||
- **Light/Dark** mode
|
||||
- **RTL (Right-to-Left)** layout supported
|
||||
- Globally consistent **design language**
|
||||
- **Pagination** supported
|
||||
- Easy-to-use and self-expanding **table of contents**
|
||||
@@ -191,6 +191,9 @@ FixIt supports multilingual and i18n. For more information, see the [Content Man
|
||||
- Hindi
|
||||
- Japanese
|
||||
- Korean
|
||||
- Arabic
|
||||
- Persian
|
||||
- Urdu
|
||||
|
||||
</details>
|
||||
|
||||
@@ -261,6 +264,10 @@ All feedback is welcome! Head over to the [discussions][discussions], [Pull requ
|
||||
[qq-group]: https://qm.qq.com/q/Mn1I7ljqsS
|
||||
[dev-group]: https://qm.qq.com/q/ky3uru0mbu
|
||||
|
||||
## China Mirror
|
||||
|
||||
A mirror is available on Gitee for users in mainland China: [gitee.com/lruihao/FixIt](https://gitee.com/lruihao/FixIt)
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome you to join the development of FixIt. Please see [contributing document](/CONTRIBUTING.md). 🤗
|
||||
|
||||
+10
-3
@@ -32,9 +32,8 @@
|
||||
[](https://gitee.com/lruihao/FixIt/stargazers)
|
||||
|
||||
> [!WARNING]
|
||||
> **v0.x 版本仅接受 bug 修复,如需提交新功能,请基于 [v1](https://github.com/hugo-fixit/FixIt/tree/v1) 分支开发。**
|
||||
>
|
||||
> 1.0 版本计划在 **2027 年上半年** 发布,欢迎加入开发和讨论!详见 [v1 里程碑](https://github.com/hugo-fixit/FixIt/milestone/8)。
|
||||
> **当前 `main` 分支包含 v1 代码,升级详见 [v1 升级指南](https://fixit.lruihao.cn/guides/upgrade-to-v1/)**。\
|
||||
> 1.0 版本计划在 **2027 年上半年** 发布,欢迎加入开发和 [讨论](https://github.com/orgs/hugo-fixit/discussions/723)!
|
||||
|
||||
## 即时预览
|
||||
|
||||
@@ -106,6 +105,7 @@ pnpx fixit-cli create my-blog
|
||||
|
||||
- **响应式** 布局
|
||||
- **浅色/深色** 主题模式
|
||||
- 支持 **RTL(从右到左)** 布局
|
||||
- 全局一致的 **设计语言**
|
||||
- 支持 **分页**
|
||||
- 易用和自动展开的 **文章目录**
|
||||
@@ -191,6 +191,9 @@ FixIt 主题多语言基本配置及自动翻译等详见 [内容管理](https:/
|
||||
- 印地语
|
||||
- 日语
|
||||
- 韩语
|
||||
- 阿拉伯语
|
||||
- 波斯语
|
||||
- 乌尔都语
|
||||
|
||||
</details>
|
||||
|
||||
@@ -261,6 +264,10 @@ FixIt 主题支持所有主流浏览器的最近两个版本。
|
||||
[qq-group]: https://qm.qq.com/q/Mn1I7ljqsS
|
||||
[dev-group]: https://qm.qq.com/q/ky3uru0mbu
|
||||
|
||||
## 中国区镜像
|
||||
|
||||
为方便中国大陆用户访问,FixIt 在 Gitee 上提供了镜像仓库:[gitee.com/lruihao/FixIt](https://gitee.com/lruihao/FixIt)
|
||||
|
||||
## 参与贡献
|
||||
|
||||
我们欢迎你加入 FixIt 的开发,贡献出你的一份力量。请看开源 [贡献指南](/CONTRIBUTING.md)。 🤗
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# Apps
|
||||
|
||||
This directory contains the Hugo sites used for development, testing, and demonstration of the [FixIt](https://fixit.lruihao.cn) theme.
|
||||
|
||||
## Overview
|
||||
|
||||
| App | Description | Live |
|
||||
| -------------- | ----------------------------------------------------- | ----------------------------------------------------------------- |
|
||||
| [demo](./demo) | Demo site showcasing FixIt theme features | [demo.fixit.lruihao.cn](https://demo.fixit.lruihao.cn) |
|
||||
| [test](./test) | Test site for exercising and verifying theme features | [demo.fixit.lruihao.cn/test](https://demo.fixit.lruihao.cn/test/) |
|
||||
|
||||
> [!NOTE]
|
||||
> The documentation site (`fixit-docs`) lives in a separate repository: [hugo-fixit/fixit-docs](https://github.com/hugo-fixit/fixit-docs).
|
||||
|
||||
## Development
|
||||
|
||||
From the repository root:
|
||||
|
||||
```bash
|
||||
pnpm dev:demo # Start demo site dev server
|
||||
pnpm dev:test # Start test site dev server
|
||||
pnpm build:demo # Build demo site
|
||||
pnpm build:test # Build test site
|
||||
pnpm build # Build all sites (merged into public/)
|
||||
```
|
||||
@@ -26,6 +26,17 @@ $$ \ce{CO2 + C -> 2 CO} $$
|
||||
|
||||
$$ \ce{Hg^2+ ->[I-] HgI2 ->[I-] [Hg^{II}I4]^2-} $$
|
||||
|
||||
## JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "fixit",
|
||||
"version": "1.0.0",
|
||||
"description": "A Hugo theme for creating encrypted content.",
|
||||
"author": "Lruihao"
|
||||
}
|
||||
```
|
||||
|
||||
## style
|
||||
|
||||
{{< style "text-align:right; strong{color:#00b1ff;}" >}}
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
---
|
||||
title: اختبار دعم اللغة العربية والكتابة من اليمين إلى اليسار
|
||||
date: 2026-08-23T10:00:00+08:00
|
||||
collections:
|
||||
- اختبارات
|
||||
categories:
|
||||
- ميزات
|
||||
tags:
|
||||
- RTL
|
||||
- عربي
|
||||
- اختبار
|
||||
---
|
||||
|
||||
هذا مقال اختباري شامل لدعم اللغة العربية والكتابة من اليمين إلى اليسار في سمة [FixIt](https://github.com/hugo-fixit/FixIt/). يهدف هذا المقال إلى اختبار جميع عناصر الويب المختلفة مع المحتوى العربي.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## المقدمة
|
||||
|
||||
مرحباً بكم في هذا المقال الاختباري الشامل. اللغة العربية هي واحدة من أكثر اللغات انتشاراً في العالم، وتتميز بكتابتها من اليمين إلى اليسار. يتطلب دعم هذه اللغة في تصميمات الويب اهتماماً خاصاً بالعديد من الجوانب التقنية.
|
||||
|
||||
### لماذا RTL مهم؟
|
||||
|
||||
عندما نصمم مواقع ويب تدعم اللغات التي تُكتب من اليمين إلى اليسار، يجب علينا مراعاة عدة عوامل:
|
||||
|
||||
- **اتجاه النص**: يجب أن يتدفق النص بشكل طبيعي من اليمين إلى اليسار
|
||||
- **تخطيط الصفحة**: يجب أن تكون العناصر مرتبة بشكل منطقي
|
||||
- **الرموز والأيقونات**: قد تحتاج بعضها إلى انعكاس
|
||||
- **التباعد بين الأسطر**: يحتاج النص العربي إلى مساحة أكبر للتشكيل
|
||||
|
||||
## النص المختلط
|
||||
|
||||
هذا نص يحتوي على كلمات إنجليزية مثل JavaScript و HTML و CSS مع نص عربي. يجب أن يظهر كل شيء بشكل صحيح.
|
||||
|
||||
## الروابط
|
||||
|
||||
- [موقع Hugo](https://gohugo.io)
|
||||
- [سمة FixIt](https://fixit.lruihao.cn)
|
||||
- [وثائق RTL](https://rtlstyling.com)
|
||||
|
||||
## القوائم
|
||||
|
||||
القوائم غير المرتبة:
|
||||
|
||||
- عنصر القائمة الأول
|
||||
- عنصر القائمة الثاني
|
||||
- عنصر القائمة الثالث
|
||||
- عنصر فرعي
|
||||
- عنصر فرعي آخر
|
||||
|
||||
القوائم المرتبة:
|
||||
|
||||
1. الخطوة الأولى في العملية
|
||||
2. الخطوة الثانية
|
||||
3. الخطوة الثالثة والأخيرة
|
||||
|
||||
قوائم المهام:
|
||||
|
||||
- [x] إعداد بيئة التطوير
|
||||
- [x] كتابة المحتوى الأساسي
|
||||
- [ ] اختبار التوافق مع المتصفحات
|
||||
- [ ] مراجعة التصميم النهائي
|
||||
- [ ] نشر الموقع
|
||||
|
||||
## الجداول
|
||||
|
||||
| اللغة | الاتجاه | الحروف المتصلة |
|
||||
| ---------: | ------: | -------------: |
|
||||
| العربية | RTL | نعم |
|
||||
| الفارسية | RTL | نعم |
|
||||
| العبرية | RTL | لا |
|
||||
| الإنجليزية | LTR | لا |
|
||||
|
||||
## الاقتباسات
|
||||
|
||||
> العلم نور والجهل ظلام
|
||||
> — مثل عربي
|
||||
|
||||
اقتباس طويل:
|
||||
|
||||
> إن الله لا يغير ما بقوم حتى يغيروا ما بأنفسهم وإذا أراد الله بقوم سوءاً فلا مرد له وما لهم من دونه من وال
|
||||
|
||||
## الأيقونات
|
||||
|
||||
أيقونات يتم قلبها في RTL:
|
||||
|
||||
- :(fa-solid fa-tag): وسم
|
||||
- :(fa-solid fa-tags): وسوم
|
||||
- :(fa-solid fa-folder): مجلد
|
||||
- :(fa-solid fa-folder-open): مجلد مفتوح
|
||||
- :(fa-solid fa-pen-to-square): قلم تعديل
|
||||
|
||||
أيقونات لا يتم قلبها في RTL:
|
||||
|
||||
- :(fa-solid fa-share): مشاركة
|
||||
- :(fa-solid fa-search): بحث
|
||||
|
||||
## التبويبات
|
||||
|
||||
{{< tabs >}}
|
||||
{{% tab title="العلامة الأولى" %}}
|
||||
محتوى التبويب الأول.
|
||||
{{% /tab %}}
|
||||
{{% tab title="العلامة الثانية" %}}
|
||||
محتوى التبويب الثاني.
|
||||
{{% /tab %}}
|
||||
{{< /tabs >}}
|
||||
|
||||
## التفاصيل القابلة للطي
|
||||
|
||||
<details>
|
||||
<summary>انقر لعرض التفاصيل</summary>
|
||||
|
||||
هذا محتوى مخفي يمكنBOOLE توسيعه بالنقر.
|
||||
|
||||
المحتوى يمكن أن يكون نصاً أو كوداً أو أي عنصر آخر.
|
||||
|
||||
</details>
|
||||
|
||||
## التنبيهات
|
||||
|
||||
{{< admonition >}}
|
||||
هذا تنبيه عادي يحتوي على معلومات مفيدة للمستخدم.
|
||||
{{< /admonition >}}
|
||||
|
||||
> [!IMPORTANT]
|
||||
> تأكد من اختبار جميع التغييرات قبل النشر.
|
||||
|
||||
## المحتوى المشفر
|
||||
|
||||
{{< fixit-encryptor password="1212" message="أدخل كلمة المرور (1212) لعرض المحتوى" >}}
|
||||
هذا محتوى مشفر. يجب إدخال كلمة المرور لعرضه.
|
||||
{{< /fixit-encryptor >}}
|
||||
|
||||
## أمثلة على المحتوى LTR
|
||||
|
||||
في صفحة RTL، بعض العناصر تبقى باتجاه LTR لأن محتاها لغوي بحت أو برمجي. فيما يلي أمثلة:
|
||||
|
||||
### كتلة الكود
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf("Hello, World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### عارض JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "FixIt",
|
||||
"version": "1.0.0",
|
||||
"features": ["RTL", "i18n", "shortcodes"]
|
||||
}
|
||||
```
|
||||
|
||||
### تبويبات الكود
|
||||
|
||||
```python {group=tab1}
|
||||
print("Python")
|
||||
```
|
||||
|
||||
```go {group=tab1}
|
||||
fmt.Println("Go")
|
||||
```
|
||||
|
||||
### الصيغ الرياضية
|
||||
|
||||
معادلة بسيطة: $E = mc^2$
|
||||
|
||||
معادلة معقدة:
|
||||
|
||||
$$\sum_{i=1}^{n} i = \frac{n(n+1)}{2}$$
|
||||
|
||||
### مخططات Mermaid
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[بداية] --> B[عملية]
|
||||
B --> C[نهاية]
|
||||
```
|
||||
|
||||
---
|
||||
{.awesome-hr}
|
||||
|
||||
_تم إنشاء هذا المقال لاختبار دعم اللغة العربية في سمة FixIt._
|
||||
@@ -0,0 +1,187 @@
|
||||
---
|
||||
title: Arabic RTL Test
|
||||
date: 2026-08-23T10:00:00+08:00
|
||||
collections:
|
||||
- Tests
|
||||
categories:
|
||||
- Features
|
||||
tags:
|
||||
- RTL
|
||||
- Arabic
|
||||
---
|
||||
|
||||
A comprehensive test article for Arabic language and Right-to-Left layout support in the [FixIt](https://github.com/hugo-fixit/FixIt/) theme. This article tests various web elements with Arabic content.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Introduction
|
||||
|
||||
Welcome to this comprehensive test article. Arabic is one of the most widely spoken languages in the world, characterized by its Right-to-Left writing direction. Supporting this language in web designs requires special attention to many technical aspects.
|
||||
|
||||
### Why RTL Matters
|
||||
|
||||
When designing websites that support Right-to-Left languages, we need to consider several factors:
|
||||
|
||||
- **Text direction**: Text should flow naturally from right to left
|
||||
- **Page layout**: Elements should be arranged in a logical order
|
||||
- **Symbols and icons**: Some may need to be mirrored
|
||||
- **Line spacing**: Arabic text needs more space for diacritics
|
||||
|
||||
## Mixed Text
|
||||
|
||||
This text contains English words like JavaScript, HTML, and CSS alongside Arabic text. Everything should display correctly.
|
||||
|
||||
## Links
|
||||
|
||||
- [Hugo Website](https://gohugo.io)
|
||||
- [FixIt Theme](https://fixit.lruihao.cn)
|
||||
- [RTL Styling](https://rtlstyling.com)
|
||||
|
||||
## Lists
|
||||
|
||||
Unordered lists:
|
||||
|
||||
- First list item
|
||||
- Second list item
|
||||
- Third list item
|
||||
- Sub item
|
||||
- Another sub item
|
||||
|
||||
Ordered lists:
|
||||
|
||||
1. First step in the process
|
||||
2. Second step
|
||||
3. Third and final step
|
||||
|
||||
Task lists:
|
||||
|
||||
- [x] Set up development environment
|
||||
- [x] Write basic content
|
||||
- [ ] Test browser compatibility
|
||||
- [ ] Review final design
|
||||
- [ ] Deploy website
|
||||
|
||||
## Tables
|
||||
|
||||
| Language | Direction | Connected Letters |
|
||||
| ---------- | --------- | ----------------- |
|
||||
| Arabic | RTL | Yes |
|
||||
| Persian | RTL | Yes |
|
||||
| Hebrew | RTL | No |
|
||||
| English | LTR | No |
|
||||
|
||||
## Blockquotes
|
||||
|
||||
> Knowledge is light and ignorance is darkness
|
||||
> — Arabic proverb
|
||||
|
||||
Long quote:
|
||||
|
||||
> Indeed, Allah does not change the condition of a people until they change what is in themselves
|
||||
|
||||
## Icons
|
||||
|
||||
Icons that are flipped in RTL:
|
||||
|
||||
- :(fa-solid fa-tag): Tag
|
||||
- :(fa-solid fa-tags): Tags
|
||||
- :(fa-solid fa-folder): Folder
|
||||
- :(fa-solid fa-folder-open): Folder Open
|
||||
- :(fa-solid fa-pen-to-square): Edit
|
||||
|
||||
Icons that are NOT flipped in RTL:
|
||||
|
||||
- :(fa-solid fa-share): Share
|
||||
- :(fa-solid fa-search): Search
|
||||
|
||||
## Tabs
|
||||
|
||||
{{< tabs >}}
|
||||
{{% tab title="First Tab" %}}
|
||||
Content of the first tab.
|
||||
{{% /tab %}}
|
||||
{{% tab title="Second Tab" %}}
|
||||
Content of the second tab.
|
||||
{{% /tab %}}
|
||||
{{< /tabs >}}
|
||||
|
||||
## Collapsible Details
|
||||
|
||||
<details>
|
||||
<summary>Click to show details</summary>
|
||||
|
||||
This is hidden content that can be expanded by clicking.
|
||||
|
||||
Content can be text, code, or any other element.
|
||||
|
||||
</details>
|
||||
|
||||
## Alerts
|
||||
|
||||
{{< admonition >}}
|
||||
This is a regular admonition with useful information for the user.
|
||||
{{< /admonition >}}
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Make sure to test all changes before deploying.
|
||||
|
||||
## Encrypted Content
|
||||
|
||||
{{< fixit-encryptor password="1212" message="Enter password (1212) to view content" >}}
|
||||
This is encrypted content. You must enter the password to view it.
|
||||
{{< /fixit-encryptor >}}
|
||||
|
||||
## LTR Content Examples
|
||||
|
||||
In an RTL page, some elements remain in LTR direction because their content is purely linguistic or programmatic. Here are examples:
|
||||
|
||||
### Code Block
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
printf("Hello, World!\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### JSON Viewer
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "FixIt",
|
||||
"version": "1.0.0",
|
||||
"features": ["RTL", "i18n", "shortcodes"]
|
||||
}
|
||||
```
|
||||
|
||||
### Code Tabs
|
||||
|
||||
```python {group=tab1}
|
||||
print("Python")
|
||||
```
|
||||
|
||||
```go {group=tab1}
|
||||
fmt.Println("Go")
|
||||
```
|
||||
|
||||
### Math
|
||||
|
||||
Simple equation: $E = mc^2$
|
||||
|
||||
Complex equation:
|
||||
|
||||
$$\sum_{i=1}^{n} i = \frac{n(n+1)}{2}$$
|
||||
|
||||
### Mermaid Diagram
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[Start] --> B[Process]
|
||||
B --> C[End]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
_Created to test Arabic language support in the FixIt theme._
|
||||
@@ -34,7 +34,7 @@ See Types section for various test cases.
|
||||
|
||||
### Underline (Default)
|
||||
|
||||
<!-- placement: top, bottom, left, right -->
|
||||
<!-- placement: top, bottom, start, end -->
|
||||
|
||||
{{< tabs placement="top" >}}
|
||||
{{% tab title="Tab 1" %}}Content for underline style tab 1{{% /tab %}}
|
||||
@@ -44,7 +44,7 @@ See Types section for various test cases.
|
||||
|
||||
### Pill
|
||||
|
||||
<!-- placement: top, bottom, left, right -->
|
||||
<!-- placement: top, bottom, start, end -->
|
||||
|
||||
{{< tabs type="pill" placement="top" >}}
|
||||
{{% tab title="Tab 1" %}}Content for pill style tab 1{{% /tab %}}
|
||||
@@ -54,7 +54,7 @@ See Types section for various test cases.
|
||||
|
||||
### Card
|
||||
|
||||
<!-- placement: top, bottom, left, right -->
|
||||
<!-- placement: top, bottom, start, end -->
|
||||
|
||||
{{< tabs type="card" placement="top" >}}
|
||||
{{% tab title="Tab 1" %}}Content for card style tab 1{{% /tab %}}
|
||||
@@ -126,7 +126,7 @@ Nested tab C with a table:
|
||||
{{% tab title="Outer Tab 3" %}}
|
||||
This tab contains vertical nested tabs:
|
||||
|
||||
{{< tabs type="card" placement="left" >}}
|
||||
{{< tabs type="card" placement="end" >}}
|
||||
|
||||
{{% tab title="Vertical A" %}}
|
||||
Content for vertical nested tab A.
|
||||
|
||||
+14
-5
@@ -5,20 +5,29 @@
|
||||
|
||||
title = "FixIt TEST"
|
||||
baseURL = "https://demo.fixit.lruihao.cn/test/"
|
||||
ignoreLogs = [ "warning-file-tree" ]
|
||||
ignoreLogs = [
|
||||
"warning-file-tree",
|
||||
"warning-encryption"
|
||||
]
|
||||
defaultContentLanguage = "en"
|
||||
|
||||
# test for multilingual support
|
||||
# [languages]
|
||||
[languages]
|
||||
|
||||
# [languages.en]
|
||||
# locale = "en"
|
||||
# label = "English"
|
||||
[languages.en]
|
||||
locale = "en"
|
||||
label = "English"
|
||||
|
||||
# [todo] 优化中文排版
|
||||
# [languages.zh-cn]
|
||||
# locale = "zh-CN"
|
||||
# label = "简体中文"
|
||||
|
||||
[languages.ar]
|
||||
direction = "rtl"
|
||||
locale = "ar"
|
||||
label = "العربية"
|
||||
|
||||
[permalinks]
|
||||
|
||||
[permalinks.page]
|
||||
|
||||
+13
-12
@@ -58,11 +58,11 @@
|
||||
.whitespace-nowrap{white-space:nowrap;}
|
||||
.b,
|
||||
.border{border-width:1px;}
|
||||
.bg-danger{background-color:var(--fi-danger) /* var(--fi-danger) */;}
|
||||
.bg-info{background-color:var(--fi-info) /* var(--fi-info) */;}
|
||||
.bg-primary{background-color:var(--fi-primary) /* var(--fi-primary) */;}
|
||||
.bg-success{background-color:var(--fi-success) /* var(--fi-success) */;}
|
||||
.bg-warning{background-color:var(--fi-warning) /* var(--fi-warning) */;}
|
||||
.bg-danger{background-color:var(--fi-danger);}
|
||||
.bg-info{background-color:var(--fi-info);}
|
||||
.bg-primary{background-color:var(--fi-primary);}
|
||||
.bg-success{background-color:var(--fi-success);}
|
||||
.bg-warning{background-color:var(--fi-warning);}
|
||||
.px{padding-left:1rem;padding-right:1rem;}
|
||||
.pl{padding-left:1rem;}
|
||||
.pt{padding-top:1rem;}
|
||||
@@ -73,13 +73,13 @@
|
||||
.text-5xl{font-size:3rem;line-height:1;}
|
||||
.text-base{font-size:1rem;line-height:1.5rem;}
|
||||
.text-lg{font-size:1.125rem;line-height:1.75rem;}
|
||||
.text-danger{color:var(--fi-danger) /* var(--fi-danger) */;}
|
||||
.text-info{color:var(--fi-info) /* var(--fi-info) */;}
|
||||
.text-primary{color:var(--fi-primary) /* var(--fi-primary) */;}
|
||||
.text-secondary{color:var(--fi-secondary) /* var(--fi-secondary) */;}
|
||||
.text-success{color:var(--fi-success) /* var(--fi-success) */;}
|
||||
.text-warning{color:var(--fi-warning) /* var(--fi-warning) */;}
|
||||
.text-white{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity)) /* #fff */;}
|
||||
.text-danger{color:var(--fi-danger);}
|
||||
.text-info{color:var(--fi-info);}
|
||||
.text-primary{color:var(--fi-primary);}
|
||||
.text-secondary{color:var(--fi-secondary);}
|
||||
.text-success{color:var(--fi-success);}
|
||||
.text-warning{color:var(--fi-warning);}
|
||||
.text-white{--un-text-opacity:1;color:rgb(255 255 255 / var(--un-text-opacity));}
|
||||
.font-bold{font-weight:700;}
|
||||
.capitalize{text-transform:capitalize;}
|
||||
.lining-nums{--un-numeric-figure:lining-nums;font-variant-numeric:var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction);}
|
||||
@@ -91,6 +91,7 @@
|
||||
.opacity-50{opacity:0.5;}
|
||||
.shadow{--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color, rgb(0 0 0 / 0.1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow);}
|
||||
.blur{--un-blur:blur(8px);filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia);}
|
||||
.ease-out{transition-timing-function:cubic-bezier(0, 0, 0.2, 1);}
|
||||
@media print{
|
||||
.print\:hidden{display:none;}
|
||||
}
|
||||
|
||||
@@ -34,8 +34,8 @@ libFiles:
|
||||
gitalkJS: gitalk@1.8.0/dist/gitalk.min.js
|
||||
# instant.page@5.2.0 https://github.com/instantpage/instant.page
|
||||
instantPage: instant.page@5.2.0/instantpage.min.js
|
||||
# json-viewer-element@1.0.4 https://github.com/Lruihao/json-viewer-element
|
||||
jsonViewerElementJS: json-viewer-element@1.0.4/dist/json-viewer-element.umd.js
|
||||
# json-viewer-element@1.0.6 https://github.com/Lruihao/json-viewer-element
|
||||
jsonViewerElementJS: json-viewer-element@1.0.6/dist/json-viewer-element.umd.js
|
||||
# katex@0.17.0 https://github.com/KaTeX/KaTeX
|
||||
katexCopyTexJS: katex@0.17.0/dist/contrib/copy-tex.min.js
|
||||
katexCSS: katex@0.17.0/dist/katex.min.css
|
||||
|
||||
@@ -34,8 +34,8 @@ libFiles:
|
||||
gitalkJS: gitalk@1.8.0/dist/gitalk.min.js
|
||||
# instant.page@5.2.0 https://github.com/instantpage/instant.page
|
||||
instantPage: instant.page@5.2.0/instantpage.js
|
||||
# json-viewer-element@1.0.4 https://github.com/Lruihao/json-viewer-element
|
||||
jsonViewerElementJS: json-viewer-element@1.0.4/dist/json-viewer-element.umd.js
|
||||
# json-viewer-element@1.0.6 https://github.com/Lruihao/json-viewer-element
|
||||
jsonViewerElementJS: json-viewer-element@1.0.6/dist/json-viewer-element.umd.js
|
||||
# katex@0.17.0 https://github.com/KaTeX/KaTeX
|
||||
katexCopyTexJS: katex@0.17.0/dist/contrib/copy-tex.min.js
|
||||
katexCSS: katex@0.17.0/dist/katex.min.css
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg height="200" viewBox="0 0 1024 1024" width="200" xmlns="http://www.w3.org/2000/svg"><path d="m165.092285 116.164732c-25.344127 4.565483-52.891625 20.150029-71.782258 40.613251-7.39749 8.184825-12.434949 15.741121-18.575209 28.491493-14.638385 29.753014-13.537836 3.462746-13.065796 326.63738l.471998 284.136138 3.621509 11.804231c14.797126 47.856269 52.734987 81.226502 100.432514 88.15414 15.269124 2.203371 164.184377 2.046753 172.841242-.158763 17.472495-4.406741 29.278872-24.556749 24.715513-41.872626-2.205516-8.341486-10.390385-19.04725-17.47464-23.297374-5.352882-2.990749-8.500248-3.147366-88.939372-3.934744l-83.429872-.787378-10.547002-5.194119c-11.962994-5.82488-20.150051-14.325128-25.974888-26.603503l-3.775981-8.184868-.158784-275.949125c-.156596-151.747239.31538-278.467876 1.102779-281.46077 4.565505-20.93524 23.138612-38.407734 45.178756-42.50122 4.87876-.944016 108.302002-1.574777 267.605493-1.574777 259.105246 0 259.577244 0 269.33897 3.306129 11.963037 4.093485 22.351276 11.490997 29.120108 20.937386 11.019043 15.269123 10.390428 7.869488 11.334423 140.412859l.787378 119.636382 4.247978 6.453495c12.909136 19.521393 37.15265 23.456094 53.522386 8.659075 12.909136-11.649867 12.278375-3.304048 12.278375-137.737555 0-131.129524 0-131.601522-9.759624-154.898896-16.056501-38.881834-55.410376-69.104787-98.855613-76.030279-6.768875-.943953-101.533127-1.574713-276.264505-1.41595-218.335377.156617-268.236254.471997-277.995878 2.359988z"/><path d="m250.725528 303.805245c-13.694367 5.663972-22.353378 18.257727-22.509996 32.739472 0 11.021145 6.453495 23.29952 15.584504 29.753014l6.768875 4.722122h317.034309l6.612386-4.406741c10.231557-6.768875 15.110296-15.269124 15.741057-27.862879.471998-8.343631 0-11.806377-2.675368-16.841733-4.09355-8.030396-14.009748-16.687262-22.037999-19.049396-4.408887-1.415993-46.753511-1.88799-156.943504-1.731373-138.527014 0-151.434004.31538-157.574264 2.675369z"/><path d="m246.947402 467.515521c-23.769372 12.437095-25.028747 47.066703-2.359988 60.919791l7.71287 4.7221 104.680493.472126 104.526021.31538 8.341486-3.776002c23.140756-10.54919 27.706218-42.188135 8.500248-58.244551-10.705765-9.130944-7.08417-8.817774-119.479764-8.817774h-103.577735z"/><path d="m634.191337 520.565867c-10.705743 3.46281-22.040058 11.649759-27.547412 19.832482-2.677428 3.936932-9.289772 17.79002-14.640509 30.69701-5.509499 12.909135-20.778623 48.956881-34.003138 80.123743-13.22237 31.169093-29.435489 69.420039-35.88907 85.004628-33.844289 81.069884-45.178583 107.830005-49.113413 116.489016-8.028251 17.944492-6.927638 32.739472 3.462703 44.704612 7.240916 8.500248 16.056545 12.593755 26.916781 12.750372 10.390384 0 18.262018-3.303983 25.816125-10.547001 5.82488-5.666117 10.075004-14.797126 30.225012-63.438628l5.350737-13.378987 83.273255-.471998 83.114492-.31538 12.437138 30.222867c15.584503 38.0945 20.150008 46.753511 26.76012 51.319015 24.715512 16.841734 58.08789-.158763 58.08789-29.594251 0-7.712871-3.306129-16.528499-30.381629-81.069885-16.687262-39.825873-36.206509-86.577238-43.445237-103.893115-17.173505-41.437466-34.437226-82.837515-51.791013-124.19974-7.556253-17.79002-10.705764-23.29952-16.843879-29.596397-13.53775-13.853131-35.103751-19.991246-51.790927-14.638363zm27.388821 131.755993c6.453495 15.897739 18.259937 44.389232 26.131505 63.28201 7.871634 19.04725 14.166366 34.788371 13.853217 35.101606-.315402.31538-24.715598.31538-53.99447.158763l-53.520305-.471998 18.575317-43.290765c10.072794-23.769371 22.194616-52.262946 26.76012-63.279864 4.565505-11.018999 8.815629-20.150008 9.287626-20.150008.471912 0 6.296921 12.909178 12.90699 28.650256z"/><path d="m915.806665 519.937252c-7.712871 2.201225-18.418635 11.647614-21.881382 19.360549-2.831985 6.13805-2.990748 14.638363-2.990748 174.887931 0 159.621017.158763 168.74988 2.990748 174.731378 3.462747 7.871633 13.537751 17.159259 21.409384 19.67801 15.112506 5.035357 33.687758-2.205516 42.501241-16.371881l4.724267-7.712871v-169.380641c0-162.29424-.158762-169.535113-2.992894-174.887995-8.813483-16.685203-26.916737-25.028748-43.760616-20.306626z"/></svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
@@ -0,0 +1 @@
|
||||
<svg height="200" viewBox="0 0 1024 1024" width="200" xmlns="http://www.w3.org/2000/svg"><path d="m148.657996 137.18126c-21.954134 5.753981-36.643845 13.627683-51.784116 27.708051-16.504717 15.597267-26.498097 32.556836-32.252122 54.965778-3.029315 11.810553-3.181662 15.747404-3.181662 289.818747 0 273.916872.152347 278.003903 3.181662 289.816601 10.448189 40.730854 38.45883 69.803481 80.25169 82.978523l11.355724 3.482021h261.956139l6.208854-3.331842c21.349104-11.508048 26.498183-36.493644 11.053219-54.056076-11.508049-13.022717-2.272046-12.265383-144.453471-12.567887l-125.678897-.45483-9.843178-4.844365c-10.900894-5.603844-19.531931-15.29472-22.561268-25.742929-1.514669-4.694186-1.817173-69.803481-1.664827-276.49138.150158-267.557839.150158-270.434851 3.179474-277.248714 4.089198-9.238191 12.567909-17.869227 21.803955-22.258763l7.573386-3.634346h260.439282c249.995406 0 260.746121.150179 266.650325 2.874867 14.38506 6.513504 22.561267 17.716902 25.135775 34.828795 3.331927 21.196779 13.930231 32.704827 32.101855 34.522001 21.804041 2.274148 40.730962-18.622271 38.156454-42.093198-5.449374-47.999547-39.218331-86.160185-87.065553-98.423422-10.903039-2.724687-20.746154-2.87491-275.583865-2.724687-251.96276 0-264.831006.150179-274.978835 2.874866z"/><path d="m237.99553 314.493985c-12.567887 3.632201-21.954112 17.564578-21.954112 32.402323 0 16.202234 9.386225 28.770121 24.831124 33.311981 11.508049 3.484167 291.938425 3.331842 303.598756-.150179 14.382958-4.239356 24.376338-17.716903 24.376338-33.009477-.15018-13.627727-7.266547-24.833271-19.986824-31.344629-5.449396-2.724687-11.20548-2.874867-155.961456-2.724687-82.676017 0-152.329318.757334-154.903826 1.512523z"/><path d="m787.496268 359.011511c-20.289265 4.389535-39.518755 15.14025-55.115829 30.887654-7.721463 7.723458-19.986846 24.076022-37.853992 50.12137-48.301988 70.71314-72.832754 106.294979-104.932507 152.932183-55.115979 79.799048-68.443347 100.240595-70.865486 108.266622-3.331885 11.658228-2.424328 34.369675 3.784483 87.065553 9.238191 79.494356 9.388371 80.55634 18.626562 90.094891 7.116368 7.268693 16.047763 11.355723 25.133629 11.355723 4.089177 0 39.823341-7.116368 79.496502-15.897584 80.25169-17.869227 87.368143-20.139085 101.148109-33.768957 4.089176-4.08703 14.232735-16.957422 22.561267-28.770121 8.328532-11.808408 28.012787-39.368511 43.610012-61.172444 15.747404-21.95407 29.677635-41.488188 31.039979-43.607866 1.362344-2.119614 8.328532-11.962836 15.597225-21.956258 17.714757-24.680946 50.119225-70.25831 52.843912-74.497666 1.212164-1.817173 7.723522-11.053219 14.537385-20.44159 19.229426-26.802768 21.803934-30.889863 26.345794-41.943018 12.720213-31.042124 12.115203-64.201824-1.817173-94.486571-9.841055-21.198924-24.680946-37.248833-56.478259-61.324769-23.621106-17.716902-45.577364-29.375131-62.384608-32.859297-12.567887-2.724688-32.859297-2.724688-45.27486 0zm37.553483 71.013499c8.176207 3.484167 42.095343 27.710282 51.483714 36.948473 15.597225 15.14025 20.744094 34.522001 13.627726 50.724235-2.724687 6.056529-10.750714 18.019342-23.470927 34.979039-1.967352 2.724623-4.08703 1.36228-36.036668-22.108647-18.624417-13.627727-42.550173-31.192304-53.300888-38.913595-10.598389-7.723609-19.53193-14.537472-19.98676-15.142481-.605009-1.212164 19.98676-31.797313 25.43828-37.703663 8.631037-9.538593 29.82996-13.930231 42.245523-8.783361zm-81.766359 123.559197c11.962879 8.783361 33.614487 24.680945 48.151873 35.281523 9.976559 7.27352 19.919951 14.592308 29.82996 21.956215l3.482021 2.574465-15.597224 21.347001c-8.478712 11.660373-36.944183 51.181209-63.139797 87.977358l-47.546863 66.623963-15.292575 3.331842c-8.328531 1.967353-31.344629 7.116368-51.331388 11.658228-19.836581 4.544006-36.341362 8.178352-36.493644 7.873702-.30036-.300359-1.664849-12.113057-3.027192-26.195614-1.362344-14.232735-3.481957-34.069316-4.541861-44.212875l-2.121887-18.626562 10.298137-14.687565c5.601656-8.174062 17.564535-25.43828 26.345751-38.308672 21.351249-31.192304 68.593462-100.08827 75.257145-109.626821 2.874867-4.239356 8.326387-11.962878 11.810468-17.262137 6.056614-8.631058 6.813949-9.388306 9.388392-7.573279 1.512587 1.061985 12.565849 9.088012 24.528684 17.87133z"/><path d="m234.058679 474.542536c-24.680945 12.872537-24.226115 47.849367.90966 61.324854 6.056529 3.331756 6.964042 3.331756 104.479951 3.786586 67.683802.302505 100.540954-.15018 105.082815-1.212164 15.14454-3.784612 25.590604-16.047764 27.105273-31.797227 1.362343-14.082642-9.841055-30.43497-23.771286-34.524232-4.089176-1.362344-34.221641-1.817173-105.84444-1.817173h-99.9338l-8.023882 4.239356z"/></svg>
|
||||
|
After Width: | Height: | Size: 4.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg height="200" viewBox="0 0 1024 1024" width="200" xmlns="http://www.w3.org/2000/svg"><path d="m152.811049 118.849443c-15.812621 4.297514-25.94171 8.595029-37.761527 16.269621-27.475706 17.807973-46.508803 47.276949-51.881211 80.58644-2.30433 13.967458-2.30433 541.697068 0 557.968835 5.67922 41.595562 29.471101 74.136949 66.61896 91.483631 22.410154 10.438047 25.939565 11.049525 85.956724 11.665295 36.379756.461291 56.180935.154479 61.555509-.922582 28.241728-6.292865 34.227782-42.824955 9.360986-57.099225-6.447344-3.683891-6.599677-3.683891-63.241903-4.451994l-56.792413-.768102-10.285714-5.063472c-12.585731-6.140532-22.871444-17.03987-27.321334-29.166455l-3.224702-8.595029-.152291-274.148373v-273.993894l3.529369-9.210799c4.297514-11.512961 15.655997-23.791901 27.323394-29.471121l8.595072-4.297515 263.864805-.46129 264.017224-.306791 9.515379 4.451972c12.894689 5.986053 21.182948 13.967436 27.016626 25.939564l5.063471 10.285714.768103 63.701048c.768103 69.687102.615813 67.84623 10.285714 77.057028 9.976755 9.515465 22.716965 11.204004 35.457175 4.913284 6.292865-3.072411 9.056319-5.835865 12.740209-11.974252l4.451994-7.829071-.461291-67.539418c-.459146-65.850879-.459146-67.84623-3.990703-78.284276-12.740209-38.527441-40.370459-66.310003-79.204669-79.357046l-10.744902-3.531557-270.15767-.306855c-258.797043-.306769-270.616816-.154414-280.900384 2.456685z"/><path d="m236.467754 301.818851c-6.754156 2.763454-13.81727 9.05632-17.192202 15.655997-7.829072 15.351331-1.843018 33.157158 13.967458 41.290896l8.290362 4.299659 154.418722-.306812 154.418723-.46129 5.833613-3.531557c7.520221-4.75666 12.740317-11.817628 15.040334-20.414803 3.686036-13.508312-4.295368-29.164309-17.803681-35.304842-5.833656-2.761308-14.428706-2.915787-159.638819-2.761308-97.162872 0-154.880013.613624-157.33451 1.53406z"/><path d="m696.194511 427.380076c-6.908635 3.224681-13.660603 9.363132-17.344536 16.271767-2.304309 3.990702-2.763454 11.972107-3.377078 54.337831l-.768103 49.733677-21.182863 4.297514c-75.061719 14.735561-137.074229 47.890573-188.496273 100.848908-45.436162 46.663325-77.209447 101.614866-98.08554 169.154284-7.213302 23.794026-7.520114 30.239225-2.147685 41.138562 4.297515 8.442695 11.972107 14.428749 21.642051 16.4241 7.522259 1.53406 20.10799-2.763454 28.705164-9.976756 16.117288-13.355979 60.632928-38.222774 92.251735-51.42213 47.738325-20.110135 110.67333-36.379756 157.643467-40.984083l4.297514-.461291.306898 53.724293c.461291 52.95619.461291 53.878772 3.990552 59.403535 10.59259 17.192203 30.852913 22.871444 46.665535 13.047021 3.06812-1.840872 23.330632-20.721614 45.279452-41.752186 26.169137-25.408973 52.41766-50.735686 78.745567-75.979967 124.179498-118.807069 118.193445-112.207434 118.193445-129.860885-.154479-16.576433.306812-16.117245-70.762017-79.663858-108.67798-97.165018-138.301435-123.720352-149.968918-134.465211-6.140533-5.679241-14.121894-11.819774-17.651392-13.508313-8.290276-3.990702-19.648759-4.143035-27.936975-.306812zm97.778642 144.748779c55.412832 49.581258 79.050234 70.455119 88.415511 78.284276 2.761308 2.302164 4.911138 4.604327 4.911138 5.372516 0 .613581-18.880742 19.341947-41.904519 41.290809-22.871444 22.103341-57.25585 55.106063-76.288925 73.373138-19.033075 18.264972-34.843551 33.155012-35.304842 33.155012s-.768103-15.810476-.768103-34.99803v-35.150363l-4.604326-7.367781c-6.599678-10.744772-17.192246-16.117287-31.775431-16.117287-11.972107 0-54.797062 5.831574-84.883954 11.665294-49.73359 9.669944-96.703727 24.098693-139.528683 42.979435-8.442695 3.838369-15.503663 6.447344-15.812621 6.140532-1.072769-.922582 18.880742-32.541302 29.166455-46.049701 5.063472-6.908635 17.958161-21.028426 28.550686-31.620908 38.988732-38.527484 79.51367-61.398929 133.697108-75.214053 16.117245-4.145181 26.862147-5.986097 57.101371-10.59038 13.660646-1.995351 22.564632-7.981405 27.93483-18.880742 3.840601-7.674593 3.990789-8.903922 3.990789-36.838902 0-15.812707.308957-28.857498.770248-28.857498.459145 0 25.787231 22.255675 56.333268 49.424633z"/><path d="m234.165591 463.453021c-22.719111 10.283568-23.794026 44.820307-1.688539 56.642226 6.292866 3.374932 6.445199 3.374932 110.671186 3.374932h104.380465l7.520114-3.683782c8.442781-4.145332 15.503663-13.660754 17.037724-23.178364 2.14983-12.278919-5.524763-26.094044-17.805827-32.389055-5.679242-2.761308-9.824423-2.915873-110.671186-2.915873-84.270329.154565-105.760047.461377-109.443937 2.149916z"/></svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
@@ -22,14 +22,14 @@ export type Handler<T> = T extends void
|
||||
|
||||
/** Typed event bus — wraps DOM CustomEvents with type-safe emit/on/off. */
|
||||
export class TypedEventBus {
|
||||
private target = document
|
||||
#target = document
|
||||
|
||||
on<K extends keyof FixItEventMap>(event: K, handler: Handler<FixItEventMap[K]>): void {
|
||||
this.target.addEventListener(event as string, handler as EventListener)
|
||||
this.#target.addEventListener(event as string, handler as EventListener)
|
||||
}
|
||||
|
||||
off<K extends keyof FixItEventMap>(event: K, handler: Handler<FixItEventMap[K]>): void {
|
||||
this.target.removeEventListener(event as string, handler as EventListener)
|
||||
this.#target.removeEventListener(event as string, handler as EventListener)
|
||||
}
|
||||
|
||||
emit<K extends keyof FixItEventMap>(
|
||||
@@ -37,7 +37,7 @@ export class TypedEventBus {
|
||||
...args: FixItEventMap[K] extends void ? [] : [FixItEventMap[K]]
|
||||
): void {
|
||||
const detail = args[0]
|
||||
this.target.dispatchEvent(
|
||||
this.#target.dispatchEvent(
|
||||
detail !== undefined
|
||||
? new CustomEvent(event as string, { detail })
|
||||
: new CustomEvent(event as string),
|
||||
|
||||
@@ -50,6 +50,7 @@ export class PublicAPI implements FixItPublicAPI {
|
||||
get version() { return this.core.version }
|
||||
get themeMode() { return this.core.themeMode }
|
||||
get isDark() { return this.core.isDark }
|
||||
get isRTL() { return this.core.isRTL }
|
||||
|
||||
setThemeMode(mode: string, persist?: boolean) {
|
||||
this.theme.setThemeMode(mode, persist)
|
||||
|
||||
@@ -7,6 +7,7 @@ export interface CoreService {
|
||||
readonly config: FixItConfig
|
||||
readonly version: string
|
||||
isDark: boolean
|
||||
isRTL: boolean
|
||||
themeMode: string
|
||||
registerMaskOverlay: (name: string, handlers: MaskOverlayHandler) => void
|
||||
openMaskOverlay: (name: string) => void
|
||||
@@ -94,6 +95,7 @@ export interface FixItPublicAPI {
|
||||
readonly version: string
|
||||
readonly themeMode: string
|
||||
readonly isDark: boolean
|
||||
readonly isRTL: boolean
|
||||
// Modules
|
||||
readonly core: CoreService
|
||||
readonly theme: ThemeService
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
import { eventBus } from '../core/event-bus'
|
||||
import { isDarkMode } from '../utils'
|
||||
|
||||
function applyJsonViewerTheme(isDark: boolean) {
|
||||
document.querySelectorAll('json-viewer').forEach(($el: Element) => {
|
||||
function applyJsonViewerTheme(isDark: boolean, scope: Element | Document = document) {
|
||||
scope.querySelectorAll('json-viewer').forEach(($el: Element) => {
|
||||
$el.setAttribute('theme', isDark ? 'dark' : 'light')
|
||||
})
|
||||
}
|
||||
@@ -25,4 +25,8 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
return
|
||||
applyJsonViewerTheme(detail.isDark)
|
||||
})
|
||||
|
||||
eventBus.on('fixit:content-decrypted', ({ detail }) => {
|
||||
applyJsonViewerTheme(isDarkMode(), detail.target)
|
||||
})
|
||||
}, false)
|
||||
|
||||
@@ -16,10 +16,13 @@ const copyText = createCopyText()
|
||||
* - Re-initialize components after encrypted content is decrypted.
|
||||
*/
|
||||
export class ContentModule implements ContentService {
|
||||
constructor(
|
||||
private readonly core: CoreService,
|
||||
private readonly code: CodeService,
|
||||
) {}
|
||||
#core: CoreService
|
||||
#code: CodeService
|
||||
|
||||
constructor(core: CoreService, code: CodeService) {
|
||||
this.#core = core
|
||||
this.#code = code
|
||||
}
|
||||
|
||||
/** Fetch and inline SVG icons referenced by `data-svg-src` attributes. */
|
||||
initSVGIcon() {
|
||||
@@ -131,7 +134,7 @@ export class ContentModule implements ContentService {
|
||||
return
|
||||
const footnoteMap = new Map<HTMLElement, HTMLElement>()
|
||||
$footnoteRefs.forEach(($ref) => {
|
||||
if (this.core.config.tooltip) {
|
||||
if (this.#core.config.tooltip) {
|
||||
const $link = $ref.querySelector<HTMLAnchorElement>('a.footnote-ref')
|
||||
if ($link) {
|
||||
$link.addEventListener('click', (e) => {
|
||||
@@ -153,7 +156,7 @@ export class ContentModule implements ContentService {
|
||||
if ($ref.hasAttribute('title'))
|
||||
return
|
||||
$ref.setAttribute('title', $content.textContent!.trim())
|
||||
if (this.core.config.tooltip) {
|
||||
if (this.#core.config.tooltip) {
|
||||
CellTooltip.getOrCreateInstance($ref)
|
||||
}
|
||||
})
|
||||
@@ -161,9 +164,10 @@ export class ContentModule implements ContentService {
|
||||
|
||||
/** Initialize CellTooltip on action buttons, copy buttons, and footnotes. */
|
||||
initTooltip() {
|
||||
if (!this.core.config.tooltip)
|
||||
if (!this.#core.config.tooltip)
|
||||
return
|
||||
CellTooltip.initAll('li[data-task] > span[title]', { placement: 'right' })
|
||||
const inlineEnd = this.#core.isRTL ? 'left' : 'right'
|
||||
CellTooltip.initAll('li[data-task] > span[title]', { placement: inlineEnd })
|
||||
CellTooltip.initAll('.action-btn[title]', { placement: 'bottom' })
|
||||
CellTooltip.initAll('.copy-icon-btn[title]', { placement: 'top' })
|
||||
CellTooltip.initAll('.fixit-encryptor-btn[title]')
|
||||
@@ -177,9 +181,9 @@ export class ContentModule implements ContentService {
|
||||
*/
|
||||
initContent(target: Element | Document = document) {
|
||||
this.initDetails(target)
|
||||
this.code.initCodeWrapper()
|
||||
this.code.initCodeTabs()
|
||||
this.code.initDiagramCopyBtn()
|
||||
this.#code.initCodeWrapper()
|
||||
this.#code.initCodeTabs()
|
||||
this.#code.initDiagramCopyBtn()
|
||||
this.initTooltip()
|
||||
this.initLinkGuardDialog(target)
|
||||
}
|
||||
|
||||
+19
-17
@@ -1,6 +1,6 @@
|
||||
import type { CoreService } from '../core/tokens'
|
||||
import type { FixItConfig, MaskOverlayHandler } from '../types'
|
||||
import { getThemeMode, isDarkMode } from '../utils'
|
||||
import { getThemeMode, isDarkMode, isRTL } from '../utils'
|
||||
|
||||
/**
|
||||
* Core module — shared state initialization and mask overlay management.
|
||||
@@ -13,15 +13,17 @@ import { getThemeMode, isDarkMode } from '../utils'
|
||||
export class CoreModule implements CoreService {
|
||||
readonly config: FixItConfig
|
||||
readonly version: string
|
||||
readonly isRTL: boolean
|
||||
themeMode: string
|
||||
isDark: boolean
|
||||
|
||||
private activeMaskOverlay: string | null = null
|
||||
private readonly maskOverlays = new Map<string, MaskOverlayHandler>()
|
||||
#activeMaskOverlay: string | null = null
|
||||
#maskOverlays = new Map<string, MaskOverlayHandler>()
|
||||
|
||||
constructor() {
|
||||
this.config = window.config
|
||||
this.version = this.config.version
|
||||
this.isRTL = isRTL()
|
||||
this.themeMode = getThemeMode()
|
||||
this.isDark = isDarkMode()
|
||||
|
||||
@@ -30,46 +32,46 @@ export class CoreModule implements CoreService {
|
||||
|
||||
/** Register a named mask overlay with open/close/isActive handlers. */
|
||||
registerMaskOverlay(name: string, handlers: MaskOverlayHandler) {
|
||||
this.maskOverlays.set(name, handlers)
|
||||
this.#maskOverlays.set(name, handlers)
|
||||
}
|
||||
|
||||
/** Toggle the mask element's blur class based on active overlay state. */
|
||||
syncMaskState() {
|
||||
document.getElementById('mask')?.classList.toggle('is-blur', Boolean(this.activeMaskOverlay))
|
||||
document.getElementById('mask')?.classList.toggle('is-blur', Boolean(this.#activeMaskOverlay))
|
||||
}
|
||||
|
||||
/** Open a named mask overlay, closing any previously active one. */
|
||||
openMaskOverlay(name: string) {
|
||||
const overlay = this.maskOverlays.get(name)
|
||||
const overlay = this.#maskOverlays.get(name)
|
||||
if (!overlay)
|
||||
return
|
||||
if (this.activeMaskOverlay && this.activeMaskOverlay !== name) {
|
||||
this.closeMaskOverlay(this.activeMaskOverlay, true)
|
||||
if (this.#activeMaskOverlay && this.#activeMaskOverlay !== name) {
|
||||
this.closeMaskOverlay(this.#activeMaskOverlay, true)
|
||||
}
|
||||
overlay.onOpen?.()
|
||||
this.activeMaskOverlay = name
|
||||
this.#activeMaskOverlay = name
|
||||
this.syncMaskState()
|
||||
}
|
||||
|
||||
/** Close a named mask overlay and optionally skip mask state sync. */
|
||||
closeMaskOverlay(name: string, skipSync = false) {
|
||||
const overlay = this.maskOverlays.get(name)
|
||||
const overlay = this.#maskOverlays.get(name)
|
||||
if (!overlay)
|
||||
return
|
||||
overlay.onClose?.()
|
||||
if (this.activeMaskOverlay === name) {
|
||||
this.activeMaskOverlay = null
|
||||
if (this.#activeMaskOverlay === name) {
|
||||
this.#activeMaskOverlay = null
|
||||
}
|
||||
!skipSync && this.syncMaskState()
|
||||
}
|
||||
|
||||
/** Toggle a named mask overlay open/closed. */
|
||||
toggleMaskOverlay(name: string) {
|
||||
const overlay = this.maskOverlays.get(name)
|
||||
const overlay = this.#maskOverlays.get(name)
|
||||
if (!overlay)
|
||||
return
|
||||
const isActive = overlay.isActive?.() ?? this.activeMaskOverlay === name
|
||||
if (this.activeMaskOverlay === name && isActive) {
|
||||
const isActive = overlay.isActive?.() ?? this.#activeMaskOverlay === name
|
||||
if (this.#activeMaskOverlay === name && isActive) {
|
||||
this.closeMaskOverlay(name)
|
||||
return
|
||||
}
|
||||
@@ -78,10 +80,10 @@ export class CoreModule implements CoreService {
|
||||
|
||||
/** Close whichever mask overlay is currently active. */
|
||||
closeActiveMaskOverlay() {
|
||||
if (!this.activeMaskOverlay) {
|
||||
if (!this.#activeMaskOverlay) {
|
||||
this.syncMaskState()
|
||||
return
|
||||
}
|
||||
this.closeMaskOverlay(this.activeMaskOverlay)
|
||||
this.closeMaskOverlay(this.#activeMaskOverlay)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,14 +7,18 @@ import type { CoreService, EncryptionService } from '../core/tokens'
|
||||
* - Initialize FixItDecryptor for full-page and shortcode-scoped decryption.
|
||||
*/
|
||||
export class EncryptionModule implements EncryptionService {
|
||||
constructor(private readonly core: CoreService) {}
|
||||
#core: CoreService
|
||||
|
||||
constructor(core: CoreService) {
|
||||
this.#core = core
|
||||
}
|
||||
|
||||
/** Initialize FixItDecryptor with encryption config. */
|
||||
setup() {
|
||||
if (!this.core.config.encryption || !window.FixItDecryptor)
|
||||
if (!this.#core.config.encryption || !window.FixItDecryptor)
|
||||
return
|
||||
const decryptor = new window.FixItDecryptor()
|
||||
|
||||
decryptor.init(this.core.config.encryption)
|
||||
decryptor.init(this.#core.config.encryption)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,11 +15,13 @@ export class EventsModule implements EventsService {
|
||||
#resizeTimeout: number | null = null
|
||||
#newScrollTop = 0
|
||||
#oldScrollTop = 0
|
||||
#core: CoreService
|
||||
#code: CodeService
|
||||
|
||||
constructor(
|
||||
private readonly core: CoreService,
|
||||
private readonly code: CodeService,
|
||||
) {}
|
||||
constructor(core: CoreService, code: CodeService) {
|
||||
this.#core = core
|
||||
this.#code = code
|
||||
}
|
||||
|
||||
/** Bind scroll listener: auto-hide headers, reading progress, back-to-top, and TOC sync. */
|
||||
onScroll() {
|
||||
@@ -40,7 +42,7 @@ export class EventsModule implements EventsService {
|
||||
this.#newScrollTop = getScrollTop()
|
||||
const scroll = this.#newScrollTop - this.#oldScrollTop
|
||||
if (Math.abs(scroll) > ACCURACY) {
|
||||
this.core.closeActiveMaskOverlay()
|
||||
this.#core.closeActiveMaskOverlay()
|
||||
const isScrollingDown = scroll > 0
|
||||
$autoHeaders.forEach(($header) => {
|
||||
if (isScrollingDown) {
|
||||
@@ -97,7 +99,7 @@ export class EventsModule implements EventsService {
|
||||
|
||||
const _isMobile = isMobile()
|
||||
if (_isMobile !== resizeBefore) {
|
||||
this.core.closeActiveMaskOverlay()
|
||||
this.#core.closeActiveMaskOverlay()
|
||||
resizeBefore = _isMobile
|
||||
}
|
||||
}, 100)
|
||||
@@ -110,7 +112,7 @@ export class EventsModule implements EventsService {
|
||||
document.getElementById('mask')!.addEventListener('click', (e) => {
|
||||
if (!(e.target as HTMLElement).classList.contains('is-blur'))
|
||||
return
|
||||
this.core.closeActiveMaskOverlay()
|
||||
this.#core.closeActiveMaskOverlay()
|
||||
}, false)
|
||||
}
|
||||
|
||||
@@ -118,7 +120,7 @@ export class EventsModule implements EventsService {
|
||||
initPrint() {
|
||||
window.addEventListener('beforeprint', () => {
|
||||
const $content = document.getElementById('content')!
|
||||
const printConfig = this.core.config.print || {}
|
||||
const printConfig = this.#core.config.print || {}
|
||||
|
||||
if (printConfig.expandAdmonition) {
|
||||
$content.querySelectorAll('.admonition').forEach(($el: Element) => $el.classList.add('open'))
|
||||
@@ -156,7 +158,7 @@ export class EventsModule implements EventsService {
|
||||
}, false)
|
||||
|
||||
window.addEventListener('afterprint', () => {
|
||||
this.code.initCodeTabs()
|
||||
this.#code.initCodeTabs()
|
||||
}, false)
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,11 @@ import type { CoreService, MenuService } from '../core/tokens'
|
||||
* - Sync menu state with mask overlay.
|
||||
*/
|
||||
export class MenuModule implements MenuService {
|
||||
constructor(private readonly core: CoreService) {}
|
||||
#core: CoreService
|
||||
|
||||
constructor(core: CoreService) {
|
||||
this.#core = core
|
||||
}
|
||||
|
||||
/** Set min-width on desktop sub-menus to match parent item width. */
|
||||
initDesktop() {
|
||||
@@ -24,7 +28,7 @@ export class MenuModule implements MenuService {
|
||||
const $menuMobile = document.getElementById('menu-mobile')
|
||||
if (!$menuToggleMobile || !$menuMobile)
|
||||
return
|
||||
this.core.registerMaskOverlay('menu-mobile', {
|
||||
this.#core.registerMaskOverlay('menu-mobile', {
|
||||
isActive: () => $menuMobile.classList.contains('active'),
|
||||
onOpen: () => {
|
||||
$menuToggleMobile.classList.add('active')
|
||||
@@ -38,7 +42,7 @@ export class MenuModule implements MenuService {
|
||||
},
|
||||
})
|
||||
$menuToggleMobile.addEventListener('click', () => {
|
||||
this.core.toggleMaskOverlay('menu-mobile')
|
||||
this.#core.toggleMaskOverlay('menu-mobile')
|
||||
}, false)
|
||||
// add nested menu toggler
|
||||
document.querySelectorAll<HTMLElement>('.menu-item>.nested-item').forEach(($nestedItem) => {
|
||||
|
||||
+17
-14
@@ -13,17 +13,20 @@ import { getScrollTop, isMobile, isValidDate, scrollIntoView } from '../utils'
|
||||
* - Initialize comment section UI and scroll-into-view.
|
||||
*/
|
||||
export class MiscModule implements MiscService {
|
||||
private siteTime: ReturnType<typeof setInterval> | undefined
|
||||
#siteTime: ReturnType<typeof setInterval> | undefined
|
||||
#core: CoreService
|
||||
|
||||
constructor(private readonly core: CoreService) {}
|
||||
constructor(core: CoreService) {
|
||||
this.#core = core
|
||||
}
|
||||
|
||||
/** Calculate and display the elapsed time since site launch. */
|
||||
getSiteTime() {
|
||||
const now = new Date()
|
||||
const run = new Date(this.core.config.siteTime!)
|
||||
const run = new Date(this.#core.config.siteTime!)
|
||||
const $runTimes = document.querySelector<HTMLElement>('.run-times')
|
||||
if (!isValidDate(run) || !$runTimes) {
|
||||
clearInterval(this.siteTime)
|
||||
clearInterval(this.#siteTime)
|
||||
$runTimes && $runTimes.parentNode!.removeChild($runTimes)
|
||||
return
|
||||
}
|
||||
@@ -38,20 +41,20 @@ export class MiscModule implements MiscService {
|
||||
|
||||
/** Start the site-time counter with visibility-change pausing. */
|
||||
initSiteTime() {
|
||||
if (this.core.config.siteTime) {
|
||||
this.siteTime = setInterval(() => this.getSiteTime(), 500)
|
||||
if (this.#core.config.siteTime) {
|
||||
this.#siteTime = setInterval(() => this.getSiteTime(), 500)
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
if (document.hidden) {
|
||||
return clearInterval(this.siteTime)
|
||||
return clearInterval(this.#siteTime)
|
||||
}
|
||||
this.siteTime = setInterval(() => this.getSiteTime(), 500)
|
||||
this.#siteTime = setInterval(() => this.getSiteTime(), 500)
|
||||
}, false)
|
||||
}
|
||||
}
|
||||
|
||||
/** Save and restore scroll position as an automatic bookmark. */
|
||||
initAutoMark() {
|
||||
if (!this.core.config.autoBookmark)
|
||||
if (!this.#core.config.autoBookmark)
|
||||
return
|
||||
window.addEventListener('beforeunload', () => {
|
||||
window.sessionStorage?.setItem(`fixit-bookmark/#${location.pathname}`, String(getScrollTop()))
|
||||
@@ -89,7 +92,7 @@ export class MiscModule implements MiscService {
|
||||
|
||||
/** Initialize the comment section UI. */
|
||||
initComment() {
|
||||
if (!this.core.config.comment?.enable)
|
||||
if (!this.#core.config.comment?.enable)
|
||||
return
|
||||
|
||||
if (document.querySelector('#comments')) {
|
||||
@@ -100,7 +103,7 @@ export class MiscModule implements MiscService {
|
||||
}, false)
|
||||
}
|
||||
|
||||
if (this.core.config.comment.expired)
|
||||
if (this.#core.config.comment.expired)
|
||||
document.querySelector('#comments')!.remove()
|
||||
}
|
||||
|
||||
@@ -109,8 +112,8 @@ export class MiscModule implements MiscService {
|
||||
*/
|
||||
initPostChat() {
|
||||
const initThemeCompatibility = () => {
|
||||
if (this.core.config.postChat) {
|
||||
document.body.classList.toggle('dark', this.core.isDark)
|
||||
if (this.#core.config.postChat) {
|
||||
document.body.classList.toggle('dark', this.#core.isDark)
|
||||
eventBus.on('fixit:switch-theme', ({ detail }) => {
|
||||
if (!detail.isChanged)
|
||||
return
|
||||
@@ -122,7 +125,7 @@ export class MiscModule implements MiscService {
|
||||
const initPostChatUser = () => {
|
||||
if (!window.postChatUser || !window.postChatConfig || window.postChatConfig.userMode === 'magic')
|
||||
return
|
||||
window.postChat_theme = this.core.isDark ? 'dark' : 'light'
|
||||
window.postChat_theme = this.#core.isDark ? 'dark' : 'light'
|
||||
eventBus.on('fixit:switch-theme', ({ detail }) => {
|
||||
if (!detail.isChanged)
|
||||
return
|
||||
|
||||
@@ -10,11 +10,15 @@ import { eventBus } from '../core/event-bus'
|
||||
* - Show update notification toast and handle refresh.
|
||||
*/
|
||||
export class PWAModule implements PWAService {
|
||||
constructor(private readonly core: CoreService) {}
|
||||
#core: CoreService
|
||||
|
||||
constructor(core: CoreService) {
|
||||
this.#core = core
|
||||
}
|
||||
|
||||
/** Register the service worker with update detection and notification binding. */
|
||||
async setup() {
|
||||
const pwa = this.core.config.PWA
|
||||
const pwa = this.#core.config.PWA
|
||||
if (!pwa?.enable || !('serviceWorker' in navigator))
|
||||
return
|
||||
|
||||
@@ -49,14 +53,14 @@ export class PWAModule implements PWAService {
|
||||
window.location.reload()
|
||||
})
|
||||
|
||||
this.bindUpdateNotification(registration)
|
||||
this.#bindUpdateNotification(registration)
|
||||
}
|
||||
|
||||
/**
|
||||
* Bind the template-rendered update notification toast.
|
||||
* Shows the toast on `fixit:sw-update` and wires the refresh button to skip waiting.
|
||||
*/
|
||||
private bindUpdateNotification(registration: ServiceWorkerRegistration) {
|
||||
#bindUpdateNotification(registration: ServiceWorkerRegistration) {
|
||||
const toast = document.querySelector<HTMLElement>('.sw-update-notification')
|
||||
if (!toast)
|
||||
return
|
||||
|
||||
@@ -19,8 +19,11 @@ export class SearchModule implements SearchService {
|
||||
#openDialog: (() => void) | undefined
|
||||
#closeDialog: (() => void) | undefined
|
||||
#initialized = false
|
||||
#core: CoreService
|
||||
|
||||
constructor(private readonly core: CoreService) {}
|
||||
constructor(core: CoreService) {
|
||||
this.#core = core
|
||||
}
|
||||
|
||||
/** Create the appropriate search engine based on type. */
|
||||
#createEngine(type: string, searchConfig: SearchConfig): SearchEngine {
|
||||
@@ -30,9 +33,9 @@ export class SearchModule implements SearchService {
|
||||
case 'fuse':
|
||||
return createFuseEngine(searchConfig)
|
||||
case 'cse':
|
||||
return createCSEEngine(this.core.config.cse)
|
||||
return createCSEEngine(this.#core.config.cse)
|
||||
case 'pagefind':
|
||||
return createPagefindEngine(searchConfig, this.core.config.pagefind!)
|
||||
return createPagefindEngine(searchConfig, this.#core.config.pagefind!)
|
||||
default:
|
||||
console.warn(`[FixIt] Unknown search type: "${type}". Supported types: algolia, fuse, cse, pagefind.`)
|
||||
return {
|
||||
@@ -45,7 +48,7 @@ export class SearchModule implements SearchService {
|
||||
|
||||
/** Initialize @algolia/autocomplete-js instance. */
|
||||
#initAutosearch() {
|
||||
const searchConfig = this.core.config.search
|
||||
const searchConfig = this.#core.config.search
|
||||
if (!searchConfig || !this.#engine)
|
||||
return
|
||||
|
||||
@@ -218,7 +221,7 @@ export class SearchModule implements SearchService {
|
||||
|
||||
document.querySelector('.search-trigger.desktop')?.addEventListener('click', open)
|
||||
document.querySelector('.search-trigger.mobile')?.addEventListener('click', () => {
|
||||
this.core.closeMaskOverlay('menu-mobile')
|
||||
this.#core.closeMaskOverlay('menu-mobile')
|
||||
open()
|
||||
})
|
||||
|
||||
@@ -247,7 +250,7 @@ export class SearchModule implements SearchService {
|
||||
|
||||
/** Initialize the search overlay, autocomplete, and engine-specific logic. */
|
||||
setup() {
|
||||
const searchConfig = this.core.config.search
|
||||
const searchConfig = this.#core.config.search
|
||||
if (!searchConfig || !searchConfig.type)
|
||||
return
|
||||
|
||||
|
||||
+18
-15
@@ -10,9 +10,12 @@ import { eventBus } from '../core/event-bus'
|
||||
* - Persist user preference to localStorage.
|
||||
*/
|
||||
export class ThemeModule implements ThemeService {
|
||||
private readonly mql = window.matchMedia('(prefers-color-scheme: dark)')
|
||||
#mql = window.matchMedia('(prefers-color-scheme: dark)')
|
||||
#core: CoreService
|
||||
|
||||
constructor(private readonly core: CoreService) {}
|
||||
constructor(core: CoreService) {
|
||||
this.#core = core
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply a theme mode and emit the `fixit:switch-theme` event.
|
||||
@@ -20,19 +23,19 @@ export class ThemeModule implements ThemeService {
|
||||
* @param persist - Whether to save the choice to localStorage (default: `true`).
|
||||
*/
|
||||
setThemeMode(mode: string, persist = true) {
|
||||
const prevIsDark = this.core.isDark
|
||||
this.core.themeMode = mode
|
||||
const prevIsDark = this.#core.isDark
|
||||
this.#core.themeMode = mode
|
||||
document.documentElement.dataset.themeMode = mode
|
||||
this.core.isDark = mode === 'auto' ? this.mql.matches : mode === 'dark'
|
||||
this.#core.isDark = mode === 'auto' ? this.#mql.matches : mode === 'dark'
|
||||
|
||||
if (persist) {
|
||||
window.localStorage?.setItem('theme-mode', mode)
|
||||
}
|
||||
|
||||
eventBus.emit('fixit:switch-theme', {
|
||||
isDark: this.core.isDark,
|
||||
isDark: this.#core.isDark,
|
||||
mode,
|
||||
isChanged: prevIsDark !== this.core.isDark,
|
||||
isChanged: prevIsDark !== this.#core.isDark,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -49,7 +52,7 @@ export class ThemeModule implements ThemeService {
|
||||
return
|
||||
applyThemeColor(detail.isDark)
|
||||
})
|
||||
applyThemeColor(this.core.isDark)
|
||||
applyThemeColor(this.#core.isDark)
|
||||
}
|
||||
|
||||
/** Initialize the theme switch button cycle and system preference listener. */
|
||||
@@ -58,21 +61,21 @@ export class ThemeModule implements ThemeService {
|
||||
|
||||
document.querySelectorAll('.theme-switch').forEach(($themeSwitch: Element) => {
|
||||
$themeSwitch.addEventListener('click', () => {
|
||||
const currentIndex = modes.indexOf(this.core.themeMode as typeof modes[number])
|
||||
const currentIndex = modes.indexOf(this.#core.themeMode as typeof modes[number])
|
||||
const nextMode = modes[(currentIndex + 1) % modes.length]
|
||||
this.setThemeMode(nextMode)
|
||||
}, false)
|
||||
})
|
||||
|
||||
this.mql.addEventListener('change', (e: MediaQueryListEvent) => {
|
||||
if (this.core.themeMode !== 'auto')
|
||||
this.#mql.addEventListener('change', (e: MediaQueryListEvent) => {
|
||||
if (this.#core.themeMode !== 'auto')
|
||||
return
|
||||
const prevIsDark = this.core.isDark
|
||||
this.core.isDark = e.matches
|
||||
const prevIsDark = this.#core.isDark
|
||||
this.#core.isDark = e.matches
|
||||
eventBus.emit('fixit:switch-theme', {
|
||||
isDark: this.core.isDark,
|
||||
isDark: this.#core.isDark,
|
||||
mode: 'auto',
|
||||
isChanged: prevIsDark !== this.core.isDark,
|
||||
isChanged: prevIsDark !== this.#core.isDark,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ const TOC_CONTAINER_IDS = ['toc-content-auto', 'toc-content-static', 'toc-conten
|
||||
* - Clone TOC nodes to detach APlayer event listeners.
|
||||
*/
|
||||
export class TocModule implements TocService {
|
||||
private activeTocId: string | null = null
|
||||
#activeTocId: string | null = null
|
||||
|
||||
/** Get all TOC content containers (auto, static, and drawer). */
|
||||
#getTocContainers(): HTMLElement[] {
|
||||
@@ -141,8 +141,8 @@ export class TocModule implements TocService {
|
||||
$tocRoots.forEach(($tocRoot) => {
|
||||
this.#applyTocActiveState($tocRoot, activeId)
|
||||
})
|
||||
if (this.activeTocId !== activeId) {
|
||||
this.activeTocId = activeId
|
||||
if (this.#activeTocId !== activeId) {
|
||||
this.#activeTocId = activeId
|
||||
if (!isTocStatic()) {
|
||||
const $autoTocRoot = document.querySelector<HTMLElement>('#toc-content-auto > nav')
|
||||
const $autoTocContainer = document.getElementById('toc-content-auto')
|
||||
@@ -160,7 +160,7 @@ export class TocModule implements TocService {
|
||||
/** Sync TOC layout state: drawer button visibility, height, and active heading. */
|
||||
#syncTocLayout() {
|
||||
document.querySelector<HTMLElement>('#toc-drawer-button')?.classList.toggle('hidden', !isTocStatic())
|
||||
this.activeTocId = null
|
||||
this.#activeTocId = null
|
||||
this.syncTocHeight()
|
||||
this.syncTocActiveState()
|
||||
}
|
||||
@@ -229,7 +229,7 @@ export class TocModule implements TocService {
|
||||
this.syncTocHeight()
|
||||
this.syncTocActiveState()
|
||||
const $dialogTocRoot = document.querySelector<HTMLElement>('#toc-content-drawer > nav')!
|
||||
this.#scrollActiveTocLinkIntoView($dialogTocRoot, this.activeTocId!, $dialogTocRoot)
|
||||
this.#scrollActiveTocLinkIntoView($dialogTocRoot, this.#activeTocId!, $dialogTocRoot)
|
||||
;(document.activeElement as HTMLElement)?.blur()
|
||||
})
|
||||
dialog.addEventListener('close', () => {
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
/**
|
||||
* Check whether the document direction is right-to-left.
|
||||
* @returns `true` if the document is RTL.
|
||||
*/
|
||||
export function isRTL(): boolean {
|
||||
return document.documentElement.dir === 'rtl'
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current vertical scroll position.
|
||||
* @returns The scroll offset in pixels.
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -7,7 +7,7 @@
|
||||
padding: 0.5rem 1rem;
|
||||
margin-block: 1rem;
|
||||
color: inherit;
|
||||
border-left: 0.25em solid fi-var(alert-border-color);
|
||||
border-inline-start: 0.25em solid fi-var(alert-border-color);
|
||||
|
||||
> :first-child {
|
||||
margin-top: 0;
|
||||
|
||||
@@ -22,13 +22,13 @@
|
||||
display: inline-block;
|
||||
width: fi-var(color-code-size);
|
||||
height: fi-var(color-code-size);
|
||||
@include border-radius(full);
|
||||
margin-right: 0.25em;
|
||||
margin-inline-end: 0.25em;
|
||||
vertical-align: middle;
|
||||
border: 1px solid;
|
||||
pointer-events: none;
|
||||
translate: 0 -1px;
|
||||
border-color: light-dark(#d1d9e0b3, #3d444db3);
|
||||
@include border-radius(full);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
font-family: fi-var(code-font-family);
|
||||
background-color: fi-var(code-block-background-color);
|
||||
tab-size: 4;
|
||||
direction: ltr;
|
||||
@include border-radius;
|
||||
|
||||
+ pre {
|
||||
@@ -91,6 +92,7 @@
|
||||
.highlight {
|
||||
margin: 0.5rem 0;
|
||||
position: relative;
|
||||
direction: ltr;
|
||||
@include border-radius;
|
||||
|
||||
// lineNumbersInTable=true
|
||||
@@ -161,7 +163,7 @@
|
||||
|
||||
&:not(.code-block) {
|
||||
.lntd:last-child pre.chroma {
|
||||
padding-left: 0;
|
||||
padding-inline-start: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,6 +226,10 @@
|
||||
@include border-radius(top);
|
||||
@include sticky-top-offset;
|
||||
|
||||
[dir="rtl"] & {
|
||||
direction: rtl;
|
||||
}
|
||||
|
||||
+ .code-wrapper {
|
||||
@include border-radius(bottom);
|
||||
|
||||
@@ -237,7 +243,7 @@
|
||||
padding: 0.4rem;
|
||||
|
||||
&::after {
|
||||
padding-left: 0.2rem;
|
||||
padding-inline-start: 0.2rem;
|
||||
content: attr(data-name, fi-var(code-type, 'Code'));
|
||||
}
|
||||
|
||||
@@ -366,7 +372,7 @@
|
||||
.copy-icon-btn {
|
||||
position: absolute;
|
||||
top: 0.5rem;
|
||||
right: 0.5rem;
|
||||
inset-inline-end: 0.5rem;
|
||||
}
|
||||
|
||||
// classic mode code block collapsed
|
||||
@@ -483,7 +489,7 @@
|
||||
counter-increment: codeNos;
|
||||
content: counter(codeNos);
|
||||
white-space: nowrap;
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
width: calc(#{fi-var(line-digit)} * 1ch);
|
||||
min-width: 0.75rem;
|
||||
padding-inline: 0.75rem;
|
||||
@@ -509,7 +515,7 @@
|
||||
&:not(.line-nos-hidden) {
|
||||
.lntd:last-child pre.chroma:not([contenteditable='true']),
|
||||
.code-wrapper > pre.chroma:not(:has(.ln)) {
|
||||
padding-left: 0;
|
||||
padding-inline-start: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -616,7 +622,7 @@
|
||||
&:not(:last-child)::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
top: 50%;
|
||||
translate: 0 -50%;
|
||||
width: 1px;
|
||||
@@ -653,6 +659,10 @@
|
||||
pointer-events: none;
|
||||
transition: 0.3s ease-in-out;
|
||||
@include border-radius;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: -2px 2px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
display: inline-block;
|
||||
width: max-content;
|
||||
rotate: 30deg;
|
||||
margin-right: 0.25em;
|
||||
margin-inline-end: 0.25em;
|
||||
color: fi-var(danger);
|
||||
}
|
||||
|
||||
.icon-repost {
|
||||
display: inline-block;
|
||||
width: max-content;
|
||||
margin-right: 0.25em;
|
||||
margin-inline-end: 0.25em;
|
||||
color: fi-var(success);
|
||||
}
|
||||
|
||||
@@ -116,21 +116,25 @@
|
||||
text-rendering: auto;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
position: absolute;
|
||||
left: 5%;
|
||||
inset-inline-start: 5%;
|
||||
top: 50%;
|
||||
translate: 0 -50%;
|
||||
color: fi-var(hr-active-color);
|
||||
font-size: 20px;
|
||||
line-height: 1;
|
||||
transition: left 1s ease-in-out, color 0.3s ease, border-color 0.3s ease;
|
||||
transition: inset-inline-start 1s ease-in-out, color 0.3s ease, border-color 0.3s ease;
|
||||
font-family: var(--fa-family-classic);
|
||||
font-weight: 600;
|
||||
content: '\f0c4';
|
||||
@include z-index(base);
|
||||
|
||||
[dir="rtl"] & {
|
||||
scale: -1 1;
|
||||
}
|
||||
}
|
||||
|
||||
&:hover::before {
|
||||
left: calc(95% - 20px);
|
||||
inset-inline-start: calc(95% - 20px);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -217,7 +221,7 @@
|
||||
}
|
||||
|
||||
:is(ol, ul) :is(ol, ul) {
|
||||
padding-left: 20px;
|
||||
padding-inline-start: 20px;
|
||||
}
|
||||
|
||||
li::marker {
|
||||
@@ -232,7 +236,8 @@
|
||||
&[data-task] {
|
||||
list-style: none;
|
||||
@include task-icon {
|
||||
margin: 0 0.25em 0 -1.5em;
|
||||
margin-block: 0;
|
||||
margin-inline: -1.5em 0.25em;
|
||||
color: fi-var(task-icon-color, fi-var(secondary));
|
||||
};
|
||||
@include task-text {
|
||||
@@ -343,12 +348,12 @@
|
||||
th,
|
||||
td {
|
||||
padding: 0.3rem 1rem;
|
||||
border-right: 1px solid fi-var(table-border-color);
|
||||
border-inline-end: 1px solid fi-var(table-border-color);
|
||||
border-bottom: 1px solid fi-var(table-border-color);
|
||||
}
|
||||
|
||||
tr > :last-child {
|
||||
border-right: none;
|
||||
border-inline-end: none;
|
||||
}
|
||||
|
||||
> :last-child > tr:last-child > * {
|
||||
@@ -392,14 +397,14 @@
|
||||
|
||||
blockquote {
|
||||
display: block;
|
||||
border-left: 0.25em solid fi-var(global-border-color);
|
||||
border-inline-start: 0.25em solid fi-var(global-border-color);
|
||||
color: fi-var(blockquote-color);
|
||||
padding: 0 1em;
|
||||
margin: 1rem 0;
|
||||
|
||||
ul,
|
||||
ol {
|
||||
padding-left: 1.5em;
|
||||
padding-inline-start: 1.5em;
|
||||
}
|
||||
|
||||
dl dd {
|
||||
@@ -427,7 +432,7 @@
|
||||
|
||||
ol {
|
||||
margin-block: 1em;
|
||||
padding-left: 1rem;
|
||||
padding-inline-start: 1rem;
|
||||
}
|
||||
|
||||
hr {
|
||||
@@ -465,6 +470,7 @@
|
||||
.diagram-container {
|
||||
position: relative;
|
||||
margin-block: 0.5rem;
|
||||
direction: ltr;
|
||||
|
||||
> .copy-icon-btn {
|
||||
position: absolute;
|
||||
@@ -480,12 +486,17 @@
|
||||
overflow-y: hidden;
|
||||
// neutralize the margin-right setting of .katex .vlist-t2
|
||||
// to prevent scrollbars from appearing when the width is not full
|
||||
padding-right: 2px;
|
||||
padding-inline-end: 2px;
|
||||
}
|
||||
.katex {
|
||||
display: inline-block;
|
||||
direction: ltr;
|
||||
}
|
||||
.katex-error {
|
||||
padding: 0.14em 0.28em;
|
||||
background-color: mark;
|
||||
cursor: help;
|
||||
direction: ltr;
|
||||
@include border-radius;
|
||||
}
|
||||
|
||||
@@ -526,7 +537,7 @@
|
||||
&.special {
|
||||
.single-title,
|
||||
.single-subtitle {
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,8 +165,9 @@ article fixit-encryptor {
|
||||
.fixit-decryptor-field {
|
||||
flex: 1;
|
||||
height: 2.5rem;
|
||||
border-right: none;
|
||||
border-radius: fi-var(global-border-radius) 0 0 fi-var(global-border-radius);
|
||||
border-inline-end: none;
|
||||
@include border-radius(start);
|
||||
@include border-radius(end, 0);
|
||||
|
||||
&:focus-within + .fixit-decryptor-btn {
|
||||
border-color: var(--fi-primary);
|
||||
@@ -177,8 +178,9 @@ article fixit-encryptor {
|
||||
.fixit-decryptor-btn {
|
||||
width: auto;
|
||||
padding: 0 0.85rem;
|
||||
border-radius: 0 fi-var(global-border-radius) fi-var(global-border-radius) 0;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
@include border-radius(start, 0);
|
||||
@include border-radius(end);
|
||||
}
|
||||
|
||||
&.decrypted > .fixit-decryptor-container {
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
position: relative;
|
||||
margin: 1rem 0;
|
||||
padding: 0 0.75rem;
|
||||
border-left: .25rem solid;
|
||||
border-inline-start: .25rem solid;
|
||||
overflow: hidden;
|
||||
background-color: fi-var(admonition-bg-color);
|
||||
border-left-color: fi-var(admonition-color);
|
||||
border-inline-start-color: fi-var(admonition-color);
|
||||
@include border-radius;
|
||||
|
||||
.admonition-title {
|
||||
@@ -30,11 +30,12 @@
|
||||
// title-only admonition without content
|
||||
&:not(:has(+ .details-content)) {
|
||||
@include set-fi-var(admonition-title-font-weight, normal);
|
||||
padding: 0.75rem 1rem 0.75rem 2.2rem;
|
||||
padding-inline: 2.2rem 1rem;
|
||||
padding-block: 0.75rem;
|
||||
border: 0;
|
||||
|
||||
i.icon {
|
||||
left: 1.1rem;
|
||||
inset-inline-start: 1.1rem;
|
||||
font-size: 1rem;
|
||||
}
|
||||
}
|
||||
@@ -73,15 +74,23 @@
|
||||
font-size: 0.85rem;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0.9rem;
|
||||
inset-inline-start: 0.9rem;
|
||||
translate: -50% -50%;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: 50% -50%;
|
||||
}
|
||||
}
|
||||
|
||||
i.details-icon {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 0.9rem;
|
||||
inset-inline-end: 0.9rem;
|
||||
translate: 50% -50%;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: -50% -50%;
|
||||
}
|
||||
}
|
||||
|
||||
// set color for each admonition type
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
position: absolute;
|
||||
top: 0.75rem;
|
||||
bottom: 0.75rem;
|
||||
left: 0;
|
||||
right: 0;
|
||||
inset-inline-start: 0;
|
||||
inset-inline-end: 0;
|
||||
background-image: fi-var(logo-img);
|
||||
background-repeat: no-repeat;
|
||||
filter: blur(0.5rem);
|
||||
@@ -67,20 +67,22 @@
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
flex-shrink: 0;
|
||||
margin-right: 0.25rem;
|
||||
margin-inline-end: 0.25rem;
|
||||
}
|
||||
|
||||
&url {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
// URL direction should stay LTR
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
&shortcut-icon {
|
||||
width: 4rem;
|
||||
height: 4rem;
|
||||
flex-shrink: 0;
|
||||
margin-left: 0.25rem;
|
||||
margin-inline-start: 0.25rem;
|
||||
|
||||
&:is(i) {
|
||||
text-align: center;
|
||||
@@ -95,7 +97,7 @@
|
||||
width: 4rem;
|
||||
height: 4rem !important;
|
||||
flex-shrink: 0;
|
||||
margin-left: 0.25rem;
|
||||
margin-inline-start: 0.25rem;
|
||||
object-fit: cover;
|
||||
@include border-radius(full);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
@use "core/functions" as *;
|
||||
|
||||
.single blockquote.blockquote-center {
|
||||
border-left: none;
|
||||
border-inline-start: none;
|
||||
margin: 40px 0;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
&::after,
|
||||
&::before {
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
line-height: 1;
|
||||
opacity: 0.6;
|
||||
position: absolute;
|
||||
@@ -19,19 +19,27 @@
|
||||
|
||||
&::before {
|
||||
border-top: 1px solid fi-var(global-border-color);
|
||||
text-align: left;
|
||||
text-align: start;
|
||||
top: -20px;
|
||||
font-family: var(--fa-family-classic);
|
||||
font-weight: 900;
|
||||
content: '\f10d';
|
||||
|
||||
[dir="rtl"] & {
|
||||
content: '\f10e';
|
||||
}
|
||||
}
|
||||
|
||||
&::after {
|
||||
border-bottom: 1px solid fi-var(global-border-color);
|
||||
bottom: -20px;
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
font-family: var(--fa-family-classic);
|
||||
font-weight: 900;
|
||||
content: '\f10e';
|
||||
|
||||
[dir="rtl"] & {
|
||||
content: '\f10d';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
line-height: 1;
|
||||
margin-block: 0.5rem;
|
||||
transition: box-shadow 0.2s ease;
|
||||
direction: ltr;
|
||||
@include border-radius;
|
||||
|
||||
&:hover {
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
svg {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,12 +60,16 @@
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
top: 50%;
|
||||
width: 1px;
|
||||
translate: -2px -50%;
|
||||
height: fi-var(code-block-font-size);
|
||||
background-color: fi-var(global-border-color-weight);
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: 2px -50%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -73,8 +73,8 @@ tab-container {
|
||||
}
|
||||
}
|
||||
|
||||
&[placement='left'],
|
||||
&[placement='right'] {
|
||||
&[placement='start'],
|
||||
&[placement='end'] {
|
||||
max-width: 100%;
|
||||
|
||||
&::part(tablist-wrapper) {
|
||||
@@ -103,7 +103,7 @@ tab-container {
|
||||
flex-direction: column-reverse;
|
||||
}
|
||||
|
||||
&[placement='right'] {
|
||||
&[placement='end'] {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
@@ -166,8 +166,8 @@ tab-container {
|
||||
}
|
||||
}
|
||||
|
||||
&[placement='left'],
|
||||
&[placement='right'] {
|
||||
&[placement='start'],
|
||||
&[placement='end'] {
|
||||
> .tab-button {
|
||||
@include tab-button-size(1rem, 0);
|
||||
}
|
||||
@@ -202,34 +202,44 @@ tab-container {
|
||||
}
|
||||
|
||||
// Left placement
|
||||
&[placement='left'] {
|
||||
&[placement='start'] {
|
||||
&::part(tablist-tab-wrapper) {
|
||||
border-right: 2px solid fi-var(global-border-color);
|
||||
border-inline-end: 2px solid fi-var(global-border-color);
|
||||
}
|
||||
|
||||
&::part(tablist-wrapper)::before {
|
||||
box-shadow: inset -2px 0 0 fi-var(primary);
|
||||
translate: 2px 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
box-shadow: inset 2px 0 0 fi-var(primary);
|
||||
translate: -2px 0;
|
||||
}
|
||||
}
|
||||
|
||||
> .tab-button {
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
}
|
||||
}
|
||||
|
||||
// Right placement
|
||||
&[placement='right'] {
|
||||
&[placement='end'] {
|
||||
&::part(tablist-tab-wrapper) {
|
||||
border-left: 2px solid fi-var(global-border-color);
|
||||
border-inline-start: 2px solid fi-var(global-border-color);
|
||||
}
|
||||
|
||||
&::part(tablist-wrapper)::before {
|
||||
box-shadow: inset 2px 0 0 fi-var(primary);
|
||||
translate: -2px 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
box-shadow: inset -2px 0 0 fi-var(primary);
|
||||
translate: 2px 0;
|
||||
}
|
||||
}
|
||||
|
||||
> .tab-button {
|
||||
text-align: left;
|
||||
text-align: start;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -268,8 +278,8 @@ tab-container {
|
||||
}
|
||||
}
|
||||
|
||||
&[placement='left'],
|
||||
&[placement='right'] {
|
||||
&[placement='start'],
|
||||
&[placement='end'] {
|
||||
padding-bottom: 0.5rem;
|
||||
|
||||
&::part(tablist) {
|
||||
@@ -296,27 +306,35 @@ tab-container {
|
||||
}
|
||||
|
||||
// Left placement
|
||||
&[placement='left'] {
|
||||
&[placement='start'] {
|
||||
&::part(tablist) {
|
||||
margin-left: 0.5rem;
|
||||
margin-inline-end: 0.5rem;
|
||||
}
|
||||
|
||||
> .tab-button {
|
||||
&:hover {
|
||||
translate: 2px 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: -2px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Right placement
|
||||
&[placement='right'] {
|
||||
&[placement='end'] {
|
||||
&::part(tablist) {
|
||||
margin-right: 0.5rem;
|
||||
margin-inline-start: 0.5rem;
|
||||
}
|
||||
|
||||
> .tab-button {
|
||||
&:hover {
|
||||
translate: -2px 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: 2px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -362,13 +380,13 @@ tab-container {
|
||||
> .tab-button {
|
||||
&:first-of-type {
|
||||
position: sticky;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
@include z-index(base, 1);
|
||||
}
|
||||
|
||||
&:last-of-type {
|
||||
position: sticky;
|
||||
right: 0;
|
||||
inset-inline-end: 0;
|
||||
@include z-index(base, 1);
|
||||
}
|
||||
}
|
||||
@@ -417,44 +435,52 @@ tab-container {
|
||||
}
|
||||
|
||||
// Left placement
|
||||
&[placement='left'] {
|
||||
&[placement='start'] {
|
||||
&::part(tablist-tab-wrapper) {
|
||||
border-right: 1px solid fi-var(global-border-color);
|
||||
border-inline-end: 1px solid fi-var(global-border-color);
|
||||
}
|
||||
|
||||
> .tab-button {
|
||||
translate: 1px 0;
|
||||
@include border-radius(left);
|
||||
@include border-radius(start);
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: -1px 0;
|
||||
}
|
||||
|
||||
&[aria-selected='true'] {
|
||||
border-right-color: fi-var(global-background-color);
|
||||
border-inline-end-color: fi-var(global-background-color);
|
||||
}
|
||||
}
|
||||
|
||||
> .tab-panel {
|
||||
border-left: none;
|
||||
@include border-radius(right);
|
||||
border-inline-start: none;
|
||||
@include border-radius(end);
|
||||
}
|
||||
}
|
||||
|
||||
// Right placement
|
||||
&[placement='right'] {
|
||||
&[placement='end'] {
|
||||
&::part(tablist-tab-wrapper) {
|
||||
border-left: 1px solid fi-var(global-border-color);
|
||||
border-inline-start: 1px solid fi-var(global-border-color);
|
||||
}
|
||||
|
||||
> .tab-button {
|
||||
translate: -1px 0;
|
||||
@include border-radius(right);
|
||||
@include border-radius(end);
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: 1px 0;
|
||||
}
|
||||
|
||||
&[aria-selected='true'] {
|
||||
border-left-color: fi-var(global-background-color);
|
||||
border-inline-start-color: fi-var(global-background-color);
|
||||
}
|
||||
}
|
||||
|
||||
> .tab-panel {
|
||||
border-right: none;
|
||||
@include border-radius(left);
|
||||
border-inline-end: none;
|
||||
@include border-radius(start);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -608,14 +634,22 @@ tab-container .tab-panel:not([hidden]) {
|
||||
border-top: 2px solid fi-var(tab-button-border-color);
|
||||
}
|
||||
|
||||
&[placement='left'] > .tab-button {
|
||||
&[placement='start'] > .tab-button {
|
||||
translate: 2px 0;
|
||||
border-right: 2px solid fi-var(tab-button-border-color);
|
||||
border-inline-end: 2px solid fi-var(tab-button-border-color);
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: -2px 0;
|
||||
}
|
||||
}
|
||||
|
||||
&[placement='right'] > .tab-button {
|
||||
&[placement='end'] > .tab-button {
|
||||
translate: -2px 0;
|
||||
border-left: 2px solid fi-var(tab-button-border-color);
|
||||
border-inline-start: 2px solid fi-var(tab-button-border-color);
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: 2px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
position: absolute;
|
||||
top: 1.25rem;
|
||||
translate: 0 -50%;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
text-align: center;
|
||||
border-style: solid;
|
||||
color: transparent;
|
||||
@@ -99,7 +99,7 @@
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: calc(#{fi-var(timeline-circle-size)} / 2 + #{fi-var(timeline-width)} / 2);
|
||||
inset-inline-start: calc(#{fi-var(timeline-circle-size)} / 2 + #{fi-var(timeline-width)} / 2);
|
||||
width: fi-var(timeline-width);
|
||||
height: 100%;
|
||||
background-color: fi-var(timeline-color);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
@use "common";
|
||||
@use "reboot";
|
||||
@use "root";
|
||||
@use "rtl";
|
||||
@use "layouts";
|
||||
|
||||
@@ -219,7 +219,7 @@ fieldset {
|
||||
// 2. Fix wrapping bug.
|
||||
|
||||
legend {
|
||||
float: left; // 1
|
||||
float: inline-start; // 1
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
@@ -228,7 +228,7 @@ legend {
|
||||
font-size: 1.5rem;
|
||||
|
||||
+ * {
|
||||
clear: left; // 2
|
||||
clear: inline-start; // 2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,20 +276,6 @@ textarea {
|
||||
}
|
||||
}
|
||||
|
||||
// 1. A few input types should stay LTR
|
||||
// See https://rtlstyling.com/posts/rtl-styling#form-inputs
|
||||
// 2. RTL only output
|
||||
// See https://rtlcss.com/learn/usage-guide/control-directives/#raw
|
||||
|
||||
/* rtl:raw:
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
*/
|
||||
|
||||
// Remove the inner padding in Chrome and Safari on macOS.
|
||||
|
||||
::-webkit-search-decoration {
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
// ==================================================================================
|
||||
// Right-to-Left (RTL) Support
|
||||
//
|
||||
// See https://rtlstyling.com/posts/rtl-styling/
|
||||
// See https://developer.apple.com/design/human-interface-guidelines/right-to-left/
|
||||
// ==================================================================================
|
||||
|
||||
[dir="rtl"] {
|
||||
// A few input types should stay LTR
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
// Flip directional icons in RTL
|
||||
.fa-tags,
|
||||
.fa-tag,
|
||||
.fa-folder,
|
||||
.fa-folder-tree,
|
||||
.fa-folder-open,
|
||||
.fa-folder-closed,
|
||||
.fa-pencil,
|
||||
.fa-pen-to-square,
|
||||
.fa-pen-clip,
|
||||
.fa-square-pen,
|
||||
.fa-list-ul,
|
||||
.fa-list-check,
|
||||
.fa-clipboard-list,
|
||||
.fa-rectangle-list,
|
||||
.fa-comments,
|
||||
.fa-comment,
|
||||
.fa-comment-dots,
|
||||
.fa-message,
|
||||
.fa-retweet,
|
||||
.octicon-report-16 {
|
||||
scale: -1 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Arabic-script languages (Arabic, Persian, Urdu) typography corrections
|
||||
// Hebrew and other non-connected RTL scripts don't need these adjustments
|
||||
|
||||
// Letter-spacing breaks connected letter forms
|
||||
:lang(ar),
|
||||
:lang(fa),
|
||||
:lang(ur) {
|
||||
letter-spacing: 0;
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
@forward "rgba" as fi-*;
|
||||
@forward "var" as fi-*;
|
||||
@forward "rgba";
|
||||
@forward "var";
|
||||
|
||||
@@ -5,6 +5,6 @@
|
||||
/// @param {Number} $alpha [1] - Alpha channel value in range 0..1.
|
||||
/// @example
|
||||
/// color: fi-rgba(fi-var(secondary), 0.2);
|
||||
@function rgba($color, $alpha: 1) {
|
||||
@return string.unquote("rgb(from #{$color} r g b / #{$alpha})");
|
||||
@function fi-rgba($color, $alpha: 1) {
|
||||
@return rgb(from $color r g b / $alpha);
|
||||
}
|
||||
|
||||
@@ -9,13 +9,10 @@
|
||||
/// @example
|
||||
/// color: fi-var(global-font-color);
|
||||
/// background: fi-var(custom-bg, #fff);
|
||||
@function var($name, $fallback: null) {
|
||||
@function fi-var($name, $fallback: null) {
|
||||
@if $fallback != null {
|
||||
@if meta.type-of($fallback) == string {
|
||||
@return string.unquote('var(#{$rootPrefix}#{$name}, "#{$fallback}")');
|
||||
}
|
||||
@return string.unquote("var(#{$rootPrefix}#{$name}, #{$fallback})");
|
||||
@return var(#{$rootPrefix}#{$name}, $fallback);
|
||||
}
|
||||
|
||||
@return string.unquote("var(#{$rootPrefix}#{$name})");
|
||||
@return var(#{$rootPrefix}#{$name});
|
||||
}
|
||||
|
||||
@@ -17,8 +17,7 @@ footer {
|
||||
|
||||
.footer-divider:not(:first-child)::before {
|
||||
content: '|';
|
||||
margin-left: 0.25rem;
|
||||
margin-right: 0.25rem;
|
||||
margin-inline: 0.25rem;
|
||||
}
|
||||
|
||||
.hugo-icon,
|
||||
|
||||
@@ -119,7 +119,7 @@ header {
|
||||
list-style: none;
|
||||
|
||||
.dropdown-icon {
|
||||
margin-left: 0.25rem;
|
||||
margin-inline-start: 0.25rem;
|
||||
font-size: .875em;
|
||||
color: fi-var(global-font-color);
|
||||
|
||||
@@ -155,6 +155,10 @@ header {
|
||||
position: relative;
|
||||
@include focus-visible-ring;
|
||||
|
||||
[dir="rtl"] & {
|
||||
scale: -1 1;
|
||||
}
|
||||
|
||||
i {
|
||||
display: inline-block;
|
||||
rotate: 225deg;
|
||||
@@ -195,10 +199,10 @@ header {
|
||||
padding: 0 2rem;
|
||||
height: 100%;
|
||||
|
||||
&[data-github-corner='left'] {
|
||||
&[data-github-corner='start'] {
|
||||
padding-inline-start: fi-var(header-height);
|
||||
}
|
||||
&[data-github-corner='right'] {
|
||||
&[data-github-corner='end'] {
|
||||
padding-inline-end: fi-var(header-height);
|
||||
}
|
||||
|
||||
@@ -211,9 +215,17 @@ header {
|
||||
&:hover .sub-menu {
|
||||
display: block;
|
||||
translate: -0.5rem 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: 0.5rem 0;
|
||||
}
|
||||
}
|
||||
&.language-switch:hover .sub-menu {
|
||||
translate: calc(1.75rem - 100%) 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: calc(100% - 1.75rem) 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,7 +241,7 @@ header {
|
||||
width: 0;
|
||||
margin: 18.5px 0.5rem;
|
||||
padding: 0;
|
||||
border-left: 1.5px solid fi-var(global-border-color);
|
||||
border-inline-start: 1.5px solid fi-var(global-border-color);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -406,7 +418,7 @@ header {
|
||||
padding: 0 1rem;
|
||||
|
||||
&:not(.menu-system):hover {
|
||||
background-color: light-dark(#f2f2f3, #535355);
|
||||
background-color: light-dark(#f2f2f3, #3e444c);
|
||||
}
|
||||
|
||||
.menu-link {
|
||||
@@ -448,7 +460,7 @@ header {
|
||||
.language-select {
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@@ -457,7 +469,7 @@ header {
|
||||
}
|
||||
|
||||
.sub-menu {
|
||||
padding-left: 0;
|
||||
padding-inline-start: 0;
|
||||
display: none;
|
||||
|
||||
&.open {
|
||||
@@ -465,7 +477,7 @@ header {
|
||||
}
|
||||
|
||||
.menu-item:hover {
|
||||
background-color: light-dark(#e7e7ea, #5d5d5f);
|
||||
background-color: light-dark(#e7e7ea, #464c54);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
@use "core/functions" as *;
|
||||
|
||||
/// Mixin to set border-radius
|
||||
/// @param {String|Number|List} $value - The value of the border-radius, position (top, bottom, left, right) or keyword (full)
|
||||
/// @param {String|Number|List} $value - The value of the border-radius, position (top, bottom, start, end) or keyword (full)
|
||||
/// @param {Number} $radius - The radius of the border (only for position)
|
||||
/// @example
|
||||
/// @include border-radius;
|
||||
/// @include border-radius(full);
|
||||
/// @include border-radius(top);
|
||||
/// @include border-radius(start);
|
||||
/// @include border-radius(top, 10px);
|
||||
/// @include border-radius(10px 20px 10px 20px);
|
||||
@mixin border-radius($value: fi-var(global-border-radius), $radius: fi-var(global-border-radius)) {
|
||||
@@ -16,10 +17,12 @@
|
||||
border-radius: $radius $radius 0 0;
|
||||
} @else if $value == bottom {
|
||||
border-radius: 0 0 $radius $radius;
|
||||
} @else if $value == left {
|
||||
border-radius: $radius 0 0 $radius;
|
||||
} @else if $value == right {
|
||||
border-radius: 0 $radius $radius 0;
|
||||
} @else if $value == start {
|
||||
border-start-start-radius: $radius;
|
||||
border-end-start-radius: $radius;
|
||||
} @else if $value == end {
|
||||
border-start-end-radius: $radius;
|
||||
border-end-end-radius: $radius;
|
||||
} @else {
|
||||
border-radius: $value;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
font-size: 1.6rem;
|
||||
font-weight: bold;
|
||||
line-height: 140%;
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
.single-subtitle {
|
||||
@@ -16,7 +16,7 @@
|
||||
font-size: 1.2rem;
|
||||
font-weight: normal;
|
||||
line-height: 100%;
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
.group-title {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
.card-item {
|
||||
font-size: 0.875rem;
|
||||
text-align: left;
|
||||
text-align: start;
|
||||
width: 45%;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
@@ -37,8 +37,8 @@
|
||||
}
|
||||
|
||||
.more-post {
|
||||
text-align: right;
|
||||
padding-right: 1rem;
|
||||
text-align: end;
|
||||
padding-inline-end: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,8 @@
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
box-sizing: border-box;
|
||||
margin: 0.25rem 0 0.25rem 1.5rem;
|
||||
margin-block: 0.25rem;
|
||||
margin-inline: 1.5rem 0;
|
||||
}
|
||||
|
||||
.archive-item-link {
|
||||
@@ -65,7 +66,7 @@
|
||||
}
|
||||
|
||||
.archive-item-date {
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
color: fi-var(global-font-secondary-color);
|
||||
white-space: nowrap;
|
||||
font-variant-numeric: tabular-nums lining-nums;
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
top: 0;
|
||||
object-fit: cover;
|
||||
}
|
||||
@@ -152,7 +152,11 @@
|
||||
|
||||
.post-tag:not(:last-child)::after {
|
||||
content: ',';
|
||||
margin-right: 0.25rem;
|
||||
margin-inline-end: 0.25rem;
|
||||
|
||||
[dir="rtl"] & {
|
||||
scale: -1 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
&:has(.collection-nav-item:nth-child(2))::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
inset-inline-start: 50%;
|
||||
bottom: 0.75rem;
|
||||
width: 1px;
|
||||
height: 2rem;
|
||||
@@ -55,6 +55,10 @@
|
||||
|
||||
i {
|
||||
flex-shrink: 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
scale: -1 1;
|
||||
}
|
||||
}
|
||||
|
||||
span {
|
||||
@@ -65,7 +69,7 @@
|
||||
}
|
||||
|
||||
&[rel='next'] {
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
&[rel='prev']:hover {
|
||||
@@ -158,7 +162,7 @@
|
||||
.collection-item > span::before {
|
||||
content: '|';
|
||||
font-weight: 600;
|
||||
margin-right: 0.5em;
|
||||
margin-inline-end: 0.5em;
|
||||
position: relative;
|
||||
bottom: 2px;
|
||||
color: fi-var(single-link-color);
|
||||
@@ -181,6 +185,10 @@
|
||||
gap: 0.5em;
|
||||
background-color: light-dark(color.adjust($global-background-color, $lightness: -5%), color.adjust($global-background-color-dark, $lightness: 5%));
|
||||
|
||||
[dir="rtl"] & i {
|
||||
scale: -1 1;
|
||||
}
|
||||
|
||||
a.collection-nav-item {
|
||||
padding-inline: 2px;
|
||||
@include border-radius(full);
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
@use "core/functions" as *;
|
||||
@use "core/mixins" as *;
|
||||
|
||||
@keyframes disclaimer-shimmer {
|
||||
0% {
|
||||
background-position: 100% 0;
|
||||
}
|
||||
100% {
|
||||
background-position: -100% 0;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes disclaimer-shimmer-rtl {
|
||||
0% {
|
||||
background-position: -100% 0;
|
||||
}
|
||||
100% {
|
||||
background-position: 100% 0;
|
||||
}
|
||||
}
|
||||
|
||||
.post-disclaimer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.25em;
|
||||
padding: 0.25rem 0;
|
||||
font-size: 0.8em;
|
||||
color: fi-var(global-font-tertiary-color);
|
||||
|
||||
.post-disclaimer__content {
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
fi-var(global-font-tertiary-color) 0%,
|
||||
fi-var(global-font-tertiary-color) 40%,
|
||||
fi-var(global-font-color) 50%,
|
||||
fi-var(global-font-tertiary-color) 60%,
|
||||
fi-var(global-font-tertiary-color) 100%
|
||||
);
|
||||
background-size: 200% 100%;
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
animation: disclaimer-shimmer 3s linear infinite;
|
||||
@include media('reduce-motion') {
|
||||
animation: none;
|
||||
}
|
||||
|
||||
[dir="rtl"] & {
|
||||
animation-name: disclaimer-shimmer-rtl;
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
flex-shrink: 0;
|
||||
padding-inline: 0.125em;
|
||||
color: fi-var(global-font-secondary-color);
|
||||
}
|
||||
|
||||
svg.icon {
|
||||
width: 1.25em;
|
||||
height: 1.25em;
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
.post-info-mod {
|
||||
font-size: 0.8em;
|
||||
color: fi-var(global-font-secondary-color);
|
||||
color: fi-var(global-font-secondary-color);
|
||||
|
||||
@include link(false, false);
|
||||
}
|
||||
@@ -38,8 +38,7 @@
|
||||
|
||||
>span:not(:first-child)::before {
|
||||
content: '|';
|
||||
margin-left: 0.25rem;
|
||||
margin-right: 0.25rem;
|
||||
margin-inline: 0.25rem;
|
||||
color: fi-var(global-font-secondary-color);
|
||||
}
|
||||
}
|
||||
@@ -71,16 +70,15 @@
|
||||
|
||||
.post-tags {
|
||||
max-width: 65%;
|
||||
|
||||
* {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
@include link(true, true);
|
||||
|
||||
.post-tag:not(:last-child)::after {
|
||||
content: ',';
|
||||
margin-right: 0.25rem;
|
||||
margin-inline-end: 0.25rem;
|
||||
|
||||
[dir="rtl"] & {
|
||||
scale: -1 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,8 +94,12 @@
|
||||
font-weight: 600;
|
||||
transition: all 0.3s ease-out;
|
||||
|
||||
[dir="rtl"] & i {
|
||||
scale: -1 1;
|
||||
}
|
||||
|
||||
&[rel='next'] {
|
||||
text-align: right;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
&[rel='prev']:hover {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
@use "collections";
|
||||
@use "disclaimer";
|
||||
@use "footer";
|
||||
@use "related";
|
||||
@use "toc";
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
.related-item > span::before {
|
||||
content: '|';
|
||||
font-weight: 600;
|
||||
margin-right: 0.5em;
|
||||
margin-inline-end: 0.5em;
|
||||
position: relative;
|
||||
bottom: 2px;
|
||||
color: fi-var(single-link-color);
|
||||
|
||||
@@ -21,29 +21,29 @@
|
||||
ul {
|
||||
margin: 0;
|
||||
text-indent: -0.8em;
|
||||
padding-left: 0.8em;
|
||||
padding-inline-start: 0.8em;
|
||||
list-style: none;
|
||||
|
||||
a:first-child::before {
|
||||
content: '|';
|
||||
font-weight: bolder;
|
||||
margin-right: 0.5em;
|
||||
margin-inline-end: 0.5em;
|
||||
position: relative;
|
||||
bottom: 2px;
|
||||
color: fi-var(single-link-color);
|
||||
}
|
||||
|
||||
ul {
|
||||
padding-left: 1em;
|
||||
padding-inline-start: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
ol {
|
||||
margin: 0;
|
||||
padding-left: 2.25em;
|
||||
padding-inline-start: 2.25em;
|
||||
|
||||
ol {
|
||||
padding-left: 1.25em;
|
||||
padding-inline-start: 1.25em;
|
||||
}
|
||||
|
||||
li:has(> a:hover)::marker {
|
||||
@@ -107,7 +107,7 @@
|
||||
&::before {
|
||||
content: '|';
|
||||
font-weight: bolder;
|
||||
margin-right: 0.5em;
|
||||
margin-inline-end: 0.5em;
|
||||
position: relative;
|
||||
bottom: 2px;
|
||||
color: fi-var(global-border-color);
|
||||
@@ -121,6 +121,10 @@
|
||||
&.toc-hidden i.toc-icon {
|
||||
rotate: -90deg;
|
||||
transition: rotate 0.2s ease;
|
||||
|
||||
[dir="rtl"] & {
|
||||
rotate: 90deg;
|
||||
}
|
||||
}
|
||||
|
||||
.toc-content {
|
||||
@@ -225,9 +229,9 @@
|
||||
height: 100dvh;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
margin-right: 0;
|
||||
margin-inline-end: 0;
|
||||
border: none;
|
||||
border-left: 1px solid fi-var(global-border-color-light);
|
||||
border-inline-start: 1px solid fi-var(global-border-color-light);
|
||||
background-color: fi-var(global-background-color);
|
||||
transition:
|
||||
display 0.2s allow-discrete,
|
||||
@@ -235,10 +239,14 @@
|
||||
translate 0.2s,
|
||||
opacity 0.2s 0.4s;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: -100vw 0;
|
||||
}
|
||||
|
||||
.toc-close-btn {
|
||||
position: absolute;
|
||||
top: 1.25rem;
|
||||
right: 1rem;
|
||||
inset-inline-end: 1rem;
|
||||
padding: 0.25rem;
|
||||
color: fi-var(global-font-secondary-color);
|
||||
transition: color 0.2s ease;
|
||||
@@ -302,6 +310,10 @@
|
||||
|
||||
&[open] {
|
||||
translate: 100vw 0;
|
||||
|
||||
[dir="rtl"] & {
|
||||
translate: -100vw 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
color: fi-var(global-font-secondary-color);
|
||||
transition: all 0.2s ease;
|
||||
|
||||
[dir="rtl"] & {
|
||||
scale: -1 1;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: fi-var(global-font-color);
|
||||
}
|
||||
@@ -33,6 +37,10 @@
|
||||
|
||||
i.details-icon {
|
||||
rotate: 90deg;
|
||||
|
||||
[dir="rtl"] & {
|
||||
rotate: -90deg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
.fixed-buttons {
|
||||
position: fixed;
|
||||
right: 1.5rem;
|
||||
inset-inline-end: 1.5rem;
|
||||
bottom: 1.5rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -49,7 +49,7 @@
|
||||
svg {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
// Rotate to start from top
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
background-position: center;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
inset-inline-start: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@include z-index(hide);
|
||||
|
||||
@@ -12,8 +12,7 @@ dialog.search-dialog {
|
||||
// Anchor to top and center horizontally with fixed dimensions
|
||||
// to prevent position jumps when results appear/disappear.
|
||||
top: 15vh;
|
||||
left: 50%;
|
||||
margin: 0;
|
||||
margin: 0 auto;
|
||||
|
||||
&::backdrop {
|
||||
background-color: rgba(0, 0, 0, 0.25);
|
||||
@@ -219,7 +218,7 @@ dialog.search-dialog {
|
||||
|
||||
.suggestion-heading-mark {
|
||||
color: fi-var(global-font-tertiary-color);
|
||||
margin-right: 0.125rem;
|
||||
margin-inline-end: 0.125rem;
|
||||
}
|
||||
|
||||
em {
|
||||
@@ -255,7 +254,7 @@ dialog.search-dialog {
|
||||
color: fi-var(global-font-tertiary-color);
|
||||
|
||||
i {
|
||||
margin-right: 0.125rem;
|
||||
margin-inline-end: 0.125rem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,6 +345,7 @@ dialog.search-dialog {
|
||||
&:modal {
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100dvh;
|
||||
max-width: 100%;
|
||||
max-height: 100dvh;
|
||||
translate: 0 0;
|
||||
@@ -369,7 +369,7 @@ dialog.search-dialog {
|
||||
|
||||
@include media('sm', 'up') {
|
||||
opacity: 0;
|
||||
translate: -50% 12px;
|
||||
translate: 0 12px;
|
||||
scale: 0.98;
|
||||
transition:
|
||||
display 0.2s allow-discrete,
|
||||
@@ -380,7 +380,7 @@ dialog.search-dialog {
|
||||
|
||||
&[open] {
|
||||
opacity: 1;
|
||||
translate: -50% 0;
|
||||
translate: 0 0;
|
||||
scale: 1;
|
||||
}
|
||||
|
||||
@@ -403,7 +403,7 @@ dialog.search-dialog {
|
||||
}
|
||||
|
||||
&[open] {
|
||||
translate: -50% 12px;
|
||||
translate: 0 12px;
|
||||
scale: 0.98;
|
||||
}
|
||||
}
|
||||
|
||||
+9
-8
@@ -33,16 +33,17 @@
|
||||
fill: fi-var(github-corner-fill);
|
||||
}
|
||||
|
||||
&.left {
|
||||
left: 0;
|
||||
|
||||
svg {
|
||||
scale: -1 1;
|
||||
}
|
||||
&.start {
|
||||
inset-inline-start: 0;
|
||||
}
|
||||
|
||||
&.right {
|
||||
right: 0;
|
||||
&.end {
|
||||
inset-inline-end: 0;
|
||||
}
|
||||
|
||||
// Flip octocat to face the start side
|
||||
:is([dir="ltr"] &.start, [dir="rtl"] &.end) svg {
|
||||
scale: -1 1;
|
||||
}
|
||||
|
||||
@include media('print') {
|
||||
|
||||
@@ -90,7 +90,7 @@ pre = ""
|
||||
# You can add extra information after the name (HTML format is supported), such as icons.
|
||||
post = ""
|
||||
name = "Archives"
|
||||
url = "/archives/"
|
||||
url = "archives/"
|
||||
# Title will be shown when you hover on this menu link.
|
||||
title = ""
|
||||
weight = 1
|
||||
@@ -99,7 +99,8 @@ weight = 1
|
||||
[menus.main.params]
|
||||
# Add CSS class to a specific menu item.
|
||||
class = ""
|
||||
# Whether set as a draft menu item whose function is similar to a draft post/page.
|
||||
# Whether set as a draft menu item, hidden by default.
|
||||
# Visible when env var is set: HUGO_PARAMS_MENU_DRAFT=true hugo server
|
||||
draft = false
|
||||
# Add FontAwesome icon to a specific menu item.
|
||||
icon = "fa-solid fa-archive"
|
||||
@@ -115,7 +116,7 @@ parent = ""
|
||||
pre = ""
|
||||
post = ""
|
||||
name = "Categories"
|
||||
url = "/categories/"
|
||||
url = "categories/"
|
||||
title = ""
|
||||
weight = 2
|
||||
|
||||
@@ -128,7 +129,7 @@ parent = ""
|
||||
pre = ""
|
||||
post = ""
|
||||
name = "Tags"
|
||||
url = "/tags/"
|
||||
url = "tags/"
|
||||
title = ""
|
||||
weight = 3
|
||||
|
||||
@@ -401,6 +402,15 @@ rel = "manifest"
|
||||
isPlainText = true
|
||||
isHTML = false
|
||||
|
||||
# Options to make output llms.txt file (AI-friendly site map).
|
||||
# Add "llms" to home outputs to enable.
|
||||
[outputFormats.llms]
|
||||
baseName = "llms"
|
||||
mediaType = "text/plain"
|
||||
isPlainText = true
|
||||
isHTML = false
|
||||
notAlternative = true
|
||||
|
||||
# -------------------------------------------------------------------------------------
|
||||
# Output Configuration
|
||||
# See: https://gohugo.io/configuration/outputs/
|
||||
@@ -709,8 +719,8 @@ keep_static = false
|
||||
# Whether to make the table of the contents in the sidebar automatically collapsed.
|
||||
auto = true
|
||||
# Position of TOC.
|
||||
# available values: ["left", "right"]
|
||||
position = "right"
|
||||
# available values: ["start", "end"]
|
||||
position = "end"
|
||||
# Supersede `markup.tableOfContents` settings.
|
||||
ordered = false
|
||||
start_level = 2
|
||||
@@ -718,6 +728,16 @@ end_level = 6
|
||||
# Whether to decrease the H1 heading level in content.
|
||||
decrease_h1 = false
|
||||
|
||||
# Post disclaimer/declaration.
|
||||
[params.disclaimer]
|
||||
# Whether to enable the disclaimer.
|
||||
enable = false
|
||||
# Disclaimer type.
|
||||
# available values: ["ai", "repost", "original", "custom"]
|
||||
type = "ai"
|
||||
# Custom disclaimer content (optional, uses i18n default if empty).
|
||||
content = ""
|
||||
|
||||
# Display a message at the beginning of an article to warn the reader that its content might be expired.
|
||||
[params.expiration_reminder]
|
||||
enable = false
|
||||
@@ -1157,6 +1177,18 @@ light_theme = "light"
|
||||
dark_theme = "dark"
|
||||
lazy_load = true
|
||||
|
||||
# robots.txt configuration (requires enableRobotsTXT = true).
|
||||
[params.robots]
|
||||
# Allow AI crawlers (unblock GPTBot/ClaudeBot etc.) + Content-Signal comment + AI hidden hint.
|
||||
allow_crawlers = false
|
||||
# Custom rules appended to robots.txt (optional).
|
||||
# [[params.robots.rules]]
|
||||
# user_agent = "SomeBot"
|
||||
# disallow = "/"
|
||||
# [[params.robots.rules]]
|
||||
# user_agent = "GoodBot"
|
||||
# allow = "/"
|
||||
|
||||
# Third-party library configuration for some custom CSS and JS files.
|
||||
# Files can be loaded from local assets (relative to /assets/) or remote CDN URLs.
|
||||
# The key is a unique identifier, the value is the file path or URL.
|
||||
@@ -1744,13 +1776,13 @@ polyfill = false
|
||||
# Whether to use object-fit-images to be compatible with older browsers.
|
||||
object_fit = false
|
||||
|
||||
# GitHub banner in the top-right or top-left corner.
|
||||
# GitHub banner in the header corner.
|
||||
[params.github_corner]
|
||||
enable = false
|
||||
permalink = "https://github.com/hugo-fixit/FixIt"
|
||||
title = "View source on GitHub"
|
||||
# available values: ["left", "right"]
|
||||
position = "right"
|
||||
# available values: ["start", "end"]
|
||||
position = "end"
|
||||
|
||||
# Gravatar configuration.
|
||||
[params.gravatar]
|
||||
@@ -1771,8 +1803,8 @@ scrollpercent = false
|
||||
# Reading progress bar.
|
||||
[params.reading_progress]
|
||||
enable = false
|
||||
# available values: ["left", "right"]
|
||||
start = "left"
|
||||
# available values: ["start", "end"]
|
||||
start = "start"
|
||||
# available values: ["top", "bottom"]
|
||||
position = "top"
|
||||
reversed = false
|
||||
|
||||
+270
@@ -0,0 +1,270 @@
|
||||
# Translations for Arabic
|
||||
# الترجمة إلى العربية
|
||||
# https://gohugo.io/content-management/multilingual/#translation-of-strings
|
||||
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "إصدار Hugo منخفض جداً.\n\nالإصدار الحالي هو {{ .Current }}، والإصدار الأدنى المطلوب لـ FixIt هو {{ .Minimal }}.\n\nإذا كنت تستخدم Hugo على جهازك الشخصي، راجع https://gohugo.io/getting-started/installing/#upgrade-hugo لدليل الترقية.\n\nإذا كنت تستخدم Hugo على منصة طرف ثالث، يرجى تكوين إصدار Hugo وفقاً لذلك."
|
||||
configurationError = "خطأ في التكوين\nلم تقم بتكوين معامل إصدار FixIt بشكل صحيح بعد. راجع https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "خطأ في التوافق ({{ .From }} -> {{ .To }}):\nلديك تحديث غير متوافق. راجع https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "أنت تستخدم إصدار تطوير من FixIt. يُرجى التفكير في استخدام إصدار مستقر.\nراجع https://github.com/hugo-fixit/FixIt/releases"
|
||||
devEnvWarn = "البيئة الحالية هي \"development\". سيتم تعطيل \"نظام التعليقات\"، \"PWA\"، \"CDN\"، \"البصمة الرقمية\" و\"التحليلات\"."
|
||||
quicklyUpgrade = "للترقية السريعة استخدم الأمر: "
|
||||
# === Init ===
|
||||
|
||||
# === Base Layout ===
|
||||
[baseof]
|
||||
backToTop = "العودة للأعلى"
|
||||
viewComments = "عرض التعليقات"
|
||||
noscript = "يعمل هذا الموقع بشكل أفضل مع تمكين JavaScript."
|
||||
# === Base Layout ===
|
||||
|
||||
# === Taxonomy ===
|
||||
[archives]
|
||||
other = "الأرشيف"
|
||||
|
||||
[allSome]
|
||||
other = "جميع {{ .Some }}"
|
||||
|
||||
[category]
|
||||
other = "التصنيف"
|
||||
|
||||
[categories]
|
||||
other = "التصنيفات"
|
||||
|
||||
[collection]
|
||||
other = "المجموعة"
|
||||
|
||||
[collections]
|
||||
other = "المجموعات"
|
||||
|
||||
[tag]
|
||||
other = "الوسم"
|
||||
|
||||
[tags]
|
||||
other = "الوسوم"
|
||||
|
||||
[posts]
|
||||
other = "المقالات"
|
||||
|
||||
# === Taxonomy ===
|
||||
|
||||
# === Section ===
|
||||
[section]
|
||||
recentlyUpdated = "تم التحديث مؤخراً"
|
||||
|
||||
[section.totalWordCount]
|
||||
one = "كلمة واحدة"
|
||||
other = "{{ .Count }} كلمة"
|
||||
|
||||
[section.archiveCounter]
|
||||
one = "مقال واحد فقط"
|
||||
other = "{{ .Count }} مقالة"
|
||||
# === Section ===
|
||||
|
||||
# === Pagination ===
|
||||
[pagination]
|
||||
more = "المزيد"
|
||||
# === Pagination ===
|
||||
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "اختر اللغة"
|
||||
noTranslations = "لا توجد ترجمات"
|
||||
switchTheme = "تغيير السمة"
|
||||
# === Header ===
|
||||
|
||||
# === Footer ===
|
||||
[footer]
|
||||
poweredBySome = "بدعم من {{ .Hugo }} | السمة - {{ .Theme }}"
|
||||
siteUV = "إجمالي الزوار"
|
||||
sitePV = "إجمالي الزيارات"
|
||||
siteRunning = "الموقع يعمل منذ ..."
|
||||
# === Footer ===
|
||||
|
||||
# === Comment ===
|
||||
[comment]
|
||||
valinePlaceholder = "تعليقك ..."
|
||||
# === Comment ===
|
||||
|
||||
# === Assets ===
|
||||
[assets]
|
||||
search = "بحث"
|
||||
searchPlaceholder = "ابحث في العناوين أو المحتوى ..."
|
||||
searchIn = "ابحث في {{ . }}"
|
||||
searchBy = "بحث بواسطة"
|
||||
gotoResultsPage = "الذهاب إلى صفحة نتائج البحث ..."
|
||||
clear = "مسح"
|
||||
cancel = "إلغاء"
|
||||
navigate = "تنقل"
|
||||
select = "تحديد"
|
||||
close = "إغلاق"
|
||||
refresh = "تحديث"
|
||||
noResultsFound = "لم يتم العثور على نتائج"
|
||||
copyToClipboard = "نسخ إلى الحافظة"
|
||||
copyText = "نسخ"
|
||||
copiedText = "تم النسخ"
|
||||
toggleLineNumbers = "إظهار/إخفاء أرقام الأسطر"
|
||||
toggleLineWrap = "إظهار/إخفاء التفاف الأسطر"
|
||||
toggleCodeEditable = "إظهار/إخفاء تحرير كتلة الكود"
|
||||
downloadCode = "تحميل الكود"
|
||||
expandCode = "توسيع أو طي كتلة الكود"
|
||||
fullscreen = "ملء الشاشة"
|
||||
exitFullscreen = "الخروج من ملء الشاشة"
|
||||
cookieconsentMessage = "يستخدم هذا الموقع ملفات تعريف الارتباط لتحسين تجربتك."
|
||||
cookieconsentDismiss = "فهمت!"
|
||||
cookieconsentLink = "اعرف المزيد"
|
||||
# === Assets ===
|
||||
|
||||
# === Share ===
|
||||
[shareOn]
|
||||
other = "مشاركة على"
|
||||
# === Share ===
|
||||
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "المحتويات"
|
||||
disclaimer = "تنبيه: "
|
||||
pin = "تثبيت في الأعلى"
|
||||
repost = "إعادة النشر"
|
||||
publishedOnDate = "نُشر في {{ .Date }}"
|
||||
views = "مشاهدات"
|
||||
comments = "تعليقات"
|
||||
author = "المؤلف"
|
||||
updatedOnDate = "تم التحديث في {{ .Date }}"
|
||||
readMarkdown = "قراءة Markdown"
|
||||
viewSource = "عرض المصدر"
|
||||
editThisPage = "تعديل هذه الصفحة"
|
||||
reportIssue = "الإبلاغ عن مشكلة"
|
||||
openInEditor = "فتح في المحرر"
|
||||
back = "رجوع"
|
||||
home = "الرئيسية"
|
||||
readMore = "اقرأ المزيد"
|
||||
expirationReminder = "تم تحديث هذا المقال آخر مرة في {{ .Date }}، وقد يكون المحتوى قديماً."
|
||||
encryptedAbstract = "تم تشفير هذا المقال، لذا المحتوى الأصلي غير مرئي!"
|
||||
encryptedMessage = "يرجى إدخال كلمة المرور"
|
||||
password = "كلمة المرور"
|
||||
enterBtn = "دخول"
|
||||
encryptyAgain = "تشفير مرة أخرى"
|
||||
encryptionWarning = "تم اكتشاف تشفير المحتوى، لكنه لا يزال بنص عادي!"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "تم إنشاء هذا المقال بواسطة الذكاء الاصطناعي. يرجى التحقق من المعلومات بشكل مستقل."
|
||||
repost = "هذا المقال هو إعادة نشر. يرجى زيارة المصدر الأصلي لمزيد من المعلومات."
|
||||
original = "هذا هو المحتوى الأصلي للمؤلف."
|
||||
encryptionCommand = "قم بتشغيل `npx @hugo-fixit/encrypt` بعد البناء لتشفيره فعلياً."
|
||||
relatedContent = "محتوى ذي صلة"
|
||||
|
||||
[single.includedIn]
|
||||
categories = "مدرجة في {{ .Categories }}"
|
||||
collections = "مدرجة في {{ .Collections }}"
|
||||
both = "مدرجة في {{ .Categories }} و {{ .Collections }}"
|
||||
|
||||
[single.wordCount]
|
||||
one = "كلمة واحدة"
|
||||
other = "{{ .Count }} كلمة"
|
||||
|
||||
[single.fuzzyWordCount]
|
||||
other = "حوالي {{ .Count }} كلمة"
|
||||
|
||||
[single.readingTime]
|
||||
one = "دقيقة واحدة"
|
||||
other = "{{ .Count }} دقائق"
|
||||
|
||||
[single.reward]
|
||||
donate = "تبرع"
|
||||
wechatpay = "WeChat Pay"
|
||||
alipay = "Alipay"
|
||||
paypal = "PayPal"
|
||||
bitcoin = "Bitcoin"
|
||||
# === Single Post ===
|
||||
|
||||
# === Error Pages ===
|
||||
[pageNotFound]
|
||||
other = "الصفحة غير موجودة"
|
||||
|
||||
[pageNotFoundText]
|
||||
other = "الصفحة التي تبحث عنها غير موجودة. نعتذر عن ذلك."
|
||||
# === Error Pages ===
|
||||
|
||||
# === Offline ===
|
||||
[offlineTitle]
|
||||
other = "غير متصل"
|
||||
|
||||
[offlineText]
|
||||
other = "أنت غير متصل بالإنترنت، ستكون فقط الصفحات المخزنة مؤقتاً متاحة."
|
||||
# === Offline ===
|
||||
|
||||
# === Service Worker ===
|
||||
[serviceWorker]
|
||||
updateTitle = "تحديث متاح"
|
||||
updateText = "يتوفر إصدار جديد من هذا الموقع."
|
||||
# === Service Worker ===
|
||||
|
||||
# === Link Redirection ===
|
||||
[linkRedirection]
|
||||
title = "إشعار إعادة التوجيه"
|
||||
message = "أنت على وشك مغادرة {{ .Title }}، يرجى الانتباه إلى أمان حسابك وممتلكاتك."
|
||||
confirm = "متابعة الزيارة"
|
||||
# === Link Redirection ===
|
||||
|
||||
# === Alert ===
|
||||
[alert]
|
||||
note = "ملاحظة"
|
||||
tip = "نصيحة"
|
||||
important = "مهم"
|
||||
warning = "تحذير"
|
||||
caution = "انتبه"
|
||||
# === Alert ===
|
||||
|
||||
# === Task List ===
|
||||
[taskList]
|
||||
x = "تم التحقق"
|
||||
" " = "لم يتم التحقق"
|
||||
"/" = "قيد التنفيذ"
|
||||
"-" = "ملغى"
|
||||
"<" = "مجدول"
|
||||
">" = "أُعيد جدولته"
|
||||
"!" = "مهم"
|
||||
"!x" = "مهم - تم التحقق"
|
||||
"?" = "سؤال"
|
||||
# === Task List ===
|
||||
|
||||
# === Admonition ===
|
||||
[admonition]
|
||||
note = "ملاحظة"
|
||||
abstract = "ملخص"
|
||||
info = "معلومات"
|
||||
todo = "المهام"
|
||||
tip = "نصيحة"
|
||||
success = "نجاح"
|
||||
question = "سؤال"
|
||||
warning = "تحذير"
|
||||
failure = "فشل"
|
||||
danger = "خطر"
|
||||
bug = "خلل"
|
||||
example = "مثال"
|
||||
quote = "اقتباس"
|
||||
# === Admonition ===
|
||||
|
||||
# === Version ===
|
||||
[version]
|
||||
new = "جديد"
|
||||
changed = "تم التغيير"
|
||||
deleted = "تم الحذف"
|
||||
deprecated = "متقادم"
|
||||
# === Version ===
|
||||
|
||||
# === Diagram ===
|
||||
[diagram]
|
||||
zoomIn = "تكبير"
|
||||
zoomOut = "تصغير"
|
||||
reset = "إعادة تعيين"
|
||||
download = "تحميل SVG"
|
||||
# === Diagram ===
|
||||
|
||||
# === Tabs ===
|
||||
[tabs]
|
||||
diagram = "مخطط"
|
||||
code = "الكود"
|
||||
# === Tabs ===
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo-Version ist zu niedrig.\n\nAktuelle Hugo-Version ist {{ .Current }}, die minimal unterstützte Version für FixIt ist {{ .Minimal }}.\n\nWenn Sie Hugo auf Ihrem eigenen Computer ausführen, schauen Sie sich https://gohugo.io/getting-started/installing/#upgrade-hugo für eine Upgrade-Anleitung an.\n\nWenn Sie auf einer Drittanbieterplattform bereitstellen, konfigurieren Sie bitte die Hugo-Version entsprechend."
|
||||
hugoExtendedWarn = "Die Hugo Extended-Version ist für die Unterstützung von SCSS erforderlich."
|
||||
configurationError = "Konfigurationsfehler\nSie haben den FixIt-Versionsparameter noch nicht korrekt konfiguriert. Siehe https://fixit.lruihao.cn/docs/getting-started/configuration/params/?lang=deutsch"
|
||||
compatibilityError = "Kompatibilitätsfehler ({{ .From }} -> {{ .To }}):\nSie haben ein inkompatibles Update. Siehe https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Sie verwenden eine Entwicklungsversion von FixIt. Bitte erwägen Sie die Verwendung einer stabilen Version.\nSiehe https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Mehr"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Sprache wählen"
|
||||
noMoretTranslations = "Keine weiteren Übersetzungen"
|
||||
noTranslations = "Keine Übersetzungen"
|
||||
switchTheme = "Darstellung ändern"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Teilen auf"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Inhalt"
|
||||
disclaimer = "Autorenhinweis: "
|
||||
pin = "Oben anheften"
|
||||
repost = "Erneut posten"
|
||||
publishedOnDate = "veröffentlicht an {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Eintreten"
|
||||
encryptyAgain = "Erneut verschlüsseln"
|
||||
encryptionWarning = "Inhaltsverschlüsselung erkannt, aber sie sind noch im Klartext!"
|
||||
encryptionCommand = "Führen Sie `npx @hugo-fixit/encrypt` nach dem Build aus, um sie tatsächlich zu verschlüsseln."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Dieser Artikel wurde von einer KI generiert. Bitte überprüfen Sie die Informationen unabhängig."
|
||||
repost = "Dieser Artikel ist ein Repost. Bitte besuchen Sie die Originalquelle für weitere Informationen."
|
||||
original = "Dies ist der Originalinhalt des Autors."
|
||||
relatedContent = "Ähnliche Inhalte"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+7
-2
@@ -4,7 +4,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo version is too low.\n\nCurrent Hugo version is {{ .Current }}, the minimum supported version for FixIt is {{ .Minimal }}.\n\nIf you are running Hugo on your own computer, check out https://gohugo.io/getting-started/installing/#upgrade-hugo for upgrading guide.\n\nIf you are deploying on a third-party platform, please configure Hugo version accordingly."
|
||||
hugoExtendedWarn = "The Hugo Extended version is necessary for SCSS support."
|
||||
configurationError = "Configuration Error\nYou haven't configured the FixIt version param correctly yet. See https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "Compatibility Error ({{ .From }} -> {{ .To }}):\nYou have an incompatible update. See https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "You are using a development version of FixIt. Please consider using a stable version.\nSee https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "More"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Select Language"
|
||||
noMoretTranslations = "No more translations"
|
||||
noTranslations = "No translations"
|
||||
switchTheme = "Switch Theme"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Share on"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Contents"
|
||||
disclaimer = "Disclaimer: "
|
||||
pin = "Pin to top"
|
||||
repost = "Repost"
|
||||
publishedOnDate = "published on {{ .Date }}"
|
||||
@@ -149,6 +149,11 @@ encryptionWarning = "Content encryption detected, but they are still in plaintex
|
||||
encryptionCommand = "Run `npx @hugo-fixit/encrypt` after building to actually encrypt them."
|
||||
relatedContent = "Related Content"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "This article was generated by AI. Please verify the information independently."
|
||||
repost = "This article is a repost. Please visit the original source for more information."
|
||||
original = "This is original content by the author."
|
||||
|
||||
[single.includedIn]
|
||||
categories = "included in {{ .Categories }}"
|
||||
collections = "included in {{ .Collections }}"
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo versión es demasiado baja.\n\nLa versión actual de Hugo es {{ .Current }}, la versión mínima compatible para FixIt es {{ .Minimal }}.\n\nSi estás ejecutando Hugo en tu propia computadora, consulta https://gohugo.io/getting-started/installing/#upgrade-hugo para obtener una guía de actualización.\n\nSi estás desplegando en una plataforma de terceros, por favor configura la versión de Hugo en consecuencia."
|
||||
hugoExtendedWarn = "La versión extendida de Hugo es necesaria para el soporte de SCSS."
|
||||
configurationError = "Error de configuración\nAún no ha configurado correctamente el parámetro de versión de FixIt. Consulte https://fixit.lruihao.cn/docs/getting-started/configuration/params/?lang=spanish"
|
||||
compatibilityError = "Error de compatibilidad ({{ .From }} -> {{ .To }}):\nTiene una actualización incompatible. Consulte https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Está utilizando una versión de desarrollo de FixIt. Considere usar una versión estable.\nConsulte https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Más"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Selecciona el lenguage"
|
||||
noMoretTranslations = "No hay más traducciones"
|
||||
noTranslations = "Sin traducciones"
|
||||
switchTheme = "Cambia el tema"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Compartir en"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Contenido"
|
||||
disclaimer = "Aviso: "
|
||||
pin = "Fijar en la parte superior"
|
||||
repost = "Repostear"
|
||||
publishedOnDate = "publicado el {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Entrar"
|
||||
encryptyAgain = "Encriptar de nuevo"
|
||||
encryptionWarning = "¡Se detectó cifrado de contenido, pero aún están en texto plano!"
|
||||
encryptionCommand = "Ejecute `npx @hugo-fixit/encrypt` después de la compilación para cifrarlos realmente."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Este artículo fue generado por IA. Por favor, verifique la información de forma independiente."
|
||||
repost = "Este artículo es un repost. Por favor, visite la fuente original para más información."
|
||||
original = "Este es el contenido original del autor."
|
||||
relatedContent = "Contenido relacionado"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+270
@@ -0,0 +1,270 @@
|
||||
# Translations for Persian
|
||||
# ترجمه به فارسی
|
||||
# https://gohugo.io/content-management/multilingual/#translation-of-strings
|
||||
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "نسخه Hugo بسیار پایین است.\n\nنسخه فعلی Hugo {{ .Current }} است و حداقل نسخه پشتیبانیشده برای FixIt {{ .Minimal }} میباشد.\n\nاگر Hugo را روی رایانه شخصی خود اجرا میکنید، برای راهنمای ارتقا به https://gohugo.io/getting-started/installing/#upgrade-hugo مراجعه کنید.\n\nاگر از پلتفرم شخص ثالث استفاده میکنید، لطفاً نسخه Hugo را مطابق با آن پیکربندی کنید."
|
||||
configurationError = "خطای پیکربندی\nشما هنوز پارامتر نسخه FixIt را به درستی پیکربندی نکردهاید. به https://fixit.lruihao.cn/docs/getting-started/configuration/params/ مراجعه کنید"
|
||||
compatibilityError = "خطای سازگاری ({{ .From }} -> {{ .To }}):\nشما یک بهروزرسانی ناسازگار دارید. به https://github.com/hugo-fixit/FixIt/releases مراجعه کنید"
|
||||
devVersionWarn = "شما از نسخه توسعه FixIt استفاده میکنید. لطفاً از نسخه پایدار استفاده کنید.\nبه https://github.com/hugo-fixit/FixIt/releases مراجعه کنید"
|
||||
devEnvWarn = "محیط فعلی «development» است. «سیستم نظرات»، «PWA»، «CDN»، «اثر انگشت» و «تحلیلها» غیرفعال خواهند شد."
|
||||
quicklyUpgrade = "ارتقاء سریع با دستور: "
|
||||
# === Init ===
|
||||
|
||||
# === Base Layout ===
|
||||
[baseof]
|
||||
backToTop = "بازگشت به بالا"
|
||||
viewComments = "مشاهده نظرات"
|
||||
noscript = "این وبسایت با فعال بودن JavaScript بهتر عمل میکند."
|
||||
# === Base Layout ===
|
||||
|
||||
# === Taxonomy ===
|
||||
[archives]
|
||||
other = "بایگانی"
|
||||
|
||||
[allSome]
|
||||
other = "همه {{ .Some }}"
|
||||
|
||||
[category]
|
||||
other = "دستهبندی"
|
||||
|
||||
[categories]
|
||||
other = "دستهبندیها"
|
||||
|
||||
[collection]
|
||||
other = "مجموعه"
|
||||
|
||||
[collections]
|
||||
other = "مجموعهها"
|
||||
|
||||
[tag]
|
||||
other = "برچسب"
|
||||
|
||||
[tags]
|
||||
other = "برچسبها"
|
||||
|
||||
[posts]
|
||||
other = "نوشتهها"
|
||||
|
||||
# === Taxonomy ===
|
||||
|
||||
# === Section ===
|
||||
[section]
|
||||
recentlyUpdated = "بهروزرسانیهای اخیر"
|
||||
|
||||
[section.totalWordCount]
|
||||
one = "مجموع یک کلمه"
|
||||
other = "مجموع {{ .Count }} کلمه"
|
||||
|
||||
[section.archiveCounter]
|
||||
one = "فقط یک مقاله"
|
||||
other = "مجموعاً {{ .Count }} مقاله"
|
||||
# === Section ===
|
||||
|
||||
# === Pagination ===
|
||||
[pagination]
|
||||
more = "بیشتر"
|
||||
# === Pagination ===
|
||||
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "انتخاب زبان"
|
||||
noTranslations = "ترجمهای موجود نیست"
|
||||
switchTheme = "تغییر پوسته"
|
||||
# === Header ===
|
||||
|
||||
# === Footer ===
|
||||
[footer]
|
||||
poweredBySome = "قدرتگرفته از {{ .Hugo }} | پوسته - {{ .Theme }}"
|
||||
siteUV = "مجموع بازدیدکنندگان"
|
||||
sitePV = "مجموع بازدیدها"
|
||||
siteRunning = "وبسایت در حال اجرا ..."
|
||||
# === Footer ===
|
||||
|
||||
# === Comment ===
|
||||
[comment]
|
||||
valinePlaceholder = "نظر شما ..."
|
||||
# === Comment ===
|
||||
|
||||
# === Assets ===
|
||||
[assets]
|
||||
search = "جستجو"
|
||||
searchPlaceholder = "جستجوی عناوین یا محتوا ..."
|
||||
searchIn = "جستجو در {{ . }}"
|
||||
searchBy = "جستجو بر اساس"
|
||||
gotoResultsPage = "رفتن به صفحه نتایج جستجو ..."
|
||||
clear = "پاک کردن"
|
||||
cancel = "لغو"
|
||||
navigate = "پیمایش"
|
||||
select = "انتخاب"
|
||||
close = "بستن"
|
||||
refresh = "بازخوانی"
|
||||
noResultsFound = "نتیجهای یافت نشد"
|
||||
copyToClipboard = "کپی در کلیپبورد"
|
||||
copyText = "کپی"
|
||||
copiedText = "کپی شد"
|
||||
toggleLineNumbers = "نمایش/مخفی کردن شماره خطوط"
|
||||
toggleLineWrap = "نمایش/مخفی کردن پیچش کد"
|
||||
toggleCodeEditable = "قابل ویرایش کردن بلوک کد"
|
||||
downloadCode = "دانلود کد"
|
||||
expandCode = "باز کردن یا بستن بلوک کد"
|
||||
fullscreen = "تمامصفحه"
|
||||
exitFullscreen = "خروج از تمامصفحه"
|
||||
cookieconsentMessage = "این وبسایت از کوکیها برای بهبود تجربه شما استفاده میکند."
|
||||
cookieconsentDismiss = "متوجه شدم!"
|
||||
cookieconsentLink = "اطلاعات بیشتر"
|
||||
# === Assets ===
|
||||
|
||||
# === Share ===
|
||||
[shareOn]
|
||||
other = "اشتراکگذاری در"
|
||||
# === Share ===
|
||||
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "فهرست مطالب"
|
||||
disclaimer = "بیانیه نویسنده: "
|
||||
pin = "سنجاق کردن به بالا"
|
||||
repost = "بازنشر"
|
||||
publishedOnDate = "منتشر شده در {{ .Date }}"
|
||||
views = "بازدید"
|
||||
comments = "نظرات"
|
||||
author = "نویسنده"
|
||||
updatedOnDate = "بهروزرسانی شده در {{ .Date }}"
|
||||
readMarkdown = "خواندن Markdown"
|
||||
viewSource = "مشاهده سورس"
|
||||
editThisPage = "ویرایش این صفحه"
|
||||
reportIssue = "گزارش مشکل"
|
||||
openInEditor = "باز کردن در ویرایشگر"
|
||||
back = "بازگشت"
|
||||
home = "خانه"
|
||||
readMore = "ادامه مطلب"
|
||||
expirationReminder = "این مقاله آخرین بار در {{ .Date }} بهروزرسانی شده است و ممکن است محتوای آن قدیمی باشد."
|
||||
encryptedAbstract = "این مقاله رمزنگاری شده است، بنابراین محتوای خام آن قابل مشاهده نیست!"
|
||||
encryptedMessage = "لطفاً رمز عبور را وارد کنید"
|
||||
password = "رمز عبور"
|
||||
enterBtn = "ورود"
|
||||
encryptyAgain = "رمزنگاری مجدد"
|
||||
encryptionWarning = "رمزنگاری محتوا شناسایی شد، اما هنوز به صورت متن ساده هستند!"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "این مقاله توسط هوش مصنوعی تولید شده است. لطفاً اطلاعات را به طور مستقل تأیید کنید."
|
||||
repost = "این مقاله یک بازنشر است. لطفاً برای اطلاعات بیشتر به منبع اصلی مراجعه کنید."
|
||||
original = "این محتوای اصلی نویسنده است."
|
||||
encryptionCommand = "پس از ساخت، دستور `npx @hugo-fixit/encrypt` را اجرا کنید تا واقعاً رمزنگاری شوند."
|
||||
relatedContent = "مطالب مرتبط"
|
||||
|
||||
[single.includedIn]
|
||||
categories = "قرار گرفته در {{ .Categories }}"
|
||||
collections = "قرار گرفته در {{ .Collections }}"
|
||||
both = "قرار گرفته در {{ .Categories }} و {{ .Collections }}"
|
||||
|
||||
[single.wordCount]
|
||||
one = "یک کلمه"
|
||||
other = "{{ .Count }} کلمه"
|
||||
|
||||
[single.fuzzyWordCount]
|
||||
other = "حدود {{ .Count }} کلمه"
|
||||
|
||||
[single.readingTime]
|
||||
one = "یک دقیقه"
|
||||
other = "{{ .Count }} دقیقه"
|
||||
|
||||
[single.reward]
|
||||
donate = "حمایت مالی"
|
||||
wechatpay = "WeChat Pay"
|
||||
alipay = "Alipay"
|
||||
paypal = "PayPal"
|
||||
bitcoin = "Bitcoin"
|
||||
# === Single Post ===
|
||||
|
||||
# === Error Pages ===
|
||||
[pageNotFound]
|
||||
other = "صفحه یافت نشد"
|
||||
|
||||
[pageNotFoundText]
|
||||
other = "صفحهای که به دنبال آن هستید وجود ندارد. متأسفیم."
|
||||
# === Error Pages ===
|
||||
|
||||
# === Offline ===
|
||||
[offlineTitle]
|
||||
other = "آفلاین"
|
||||
|
||||
[offlineText]
|
||||
other = "شما به اینترنت متصل نیستید، فقط صفحات ذخیرهشده در دسترس خواهند بود."
|
||||
# === Offline ===
|
||||
|
||||
# === Service Worker ===
|
||||
[serviceWorker]
|
||||
updateTitle = "بهروزرسانی موجود است"
|
||||
updateText = "نسخه جدیدی از این سایت موجود است."
|
||||
# === Service Worker ===
|
||||
|
||||
# === Link Redirection ===
|
||||
[linkRedirection]
|
||||
title = "اعلامیه تغییر مسیر"
|
||||
message = "شما در حال ترک {{ .Title }} هستید، لطفاً از امنیت حساب و دارایی خود اطمینان حاصل کنید."
|
||||
confirm = "ادامه بازدید"
|
||||
# === Link Redirection ===
|
||||
|
||||
# === Alert ===
|
||||
[alert]
|
||||
note = "توجه"
|
||||
tip = "نکته"
|
||||
important = "مهم"
|
||||
warning = "هشدار"
|
||||
caution = "احتیاط"
|
||||
# === Alert ===
|
||||
|
||||
# === Task List ===
|
||||
[taskList]
|
||||
x = "تیکخورده"
|
||||
" " = "بدون تیک"
|
||||
"/" = "در حال انجام"
|
||||
"-" = "لغو شده"
|
||||
"<" = "برنامهریزی شده"
|
||||
">" = "برنامهریزی مجدد شده"
|
||||
"!" = "مهم"
|
||||
"!x" = "مهم تیکخورده"
|
||||
"?" = "سوال"
|
||||
# === Task List ===
|
||||
|
||||
# === Admonition ===
|
||||
[admonition]
|
||||
note = "توجه"
|
||||
abstract = "چکیده"
|
||||
info = "اطلاعات"
|
||||
todo = "انجام دادنی"
|
||||
tip = "نکته"
|
||||
success = "موفقیت"
|
||||
question = "سوال"
|
||||
warning = "هشدار"
|
||||
failure = "شکست"
|
||||
danger = "خطر"
|
||||
bug = "خطا"
|
||||
example = "مثال"
|
||||
quote = "نقلقول"
|
||||
# === Admonition ===
|
||||
|
||||
# === Version ===
|
||||
[version]
|
||||
new = "جدید"
|
||||
changed = "تغییر یافته"
|
||||
deleted = "حذف شده"
|
||||
deprecated = "منسوخ شده"
|
||||
# === Version ===
|
||||
|
||||
# === Diagram ===
|
||||
[diagram]
|
||||
zoomIn = "بزرگنمایی"
|
||||
zoomOut = "کوچکنمایی"
|
||||
reset = "بازنشانی"
|
||||
download = "دانلود SVG"
|
||||
# === Diagram ===
|
||||
|
||||
# === Tabs ===
|
||||
[tabs]
|
||||
diagram = "نمودار"
|
||||
code = "کد"
|
||||
# === Tabs ===
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "La version de Hugo est trop ancienne.\n\nLa version actuelle de Hugo est {{ .Current }}, la version minimale requise pour FixIt est {{ .Minimal }}.\n\nSi vous utilisez Hugo sur votre ordinateur, consultez le guide de mise à niveau à l'adresse https://gohugo.io/getting-started/installing/#upgrade-hugo.\n\nSi vous déployez sur une plateforme tierce, veuillez configurer la version de Hugo en conséquence."
|
||||
hugoExtendedWarn = "La version étendue de Hugo est nécessaire pour la prise en charge de SCSS."
|
||||
configurationError = "Erreur de configuration\nVous n'avez pas configuré la version de FixIt correctement. Voir https://fixit.lruihao.cn/docs/getting-started/configuration/params/?lang=french"
|
||||
compatibilityError = "Erreur de compatibilité ({{ .From }} -> {{ .To }}):\nVous avez une mise à jour incompatible. Voir https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Vous utilisez une version de développement de FixIt. Veuillez considérer l'utilisation d'une version stable.\nVoir https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Plus"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Choisir la langue"
|
||||
noMoretTranslations = "Plus de traductions"
|
||||
noTranslations = "Aucune traduction"
|
||||
switchTheme = "Changer de Thème"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Partager via"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Contenus"
|
||||
disclaimer = "Avertissement : "
|
||||
pin = "Épingler en haut"
|
||||
repost = "Reposter"
|
||||
publishedOnDate = "publié le {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Entrer"
|
||||
encryptyAgain = "Chiffrer à nouveau"
|
||||
encryptionWarning = "Chiffrement de contenu détecté, mais ils sont toujours en texte clair !"
|
||||
encryptionCommand = "Exécutez `npx @hugo-fixit/encrypt` après la compilation pour les chiffrer réellement."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Cet article a été généré par une IA. Veuillez vérifier les informations de manière indépendante."
|
||||
repost = "Cet article est un repost. Veuillez visiter la source originale pour plus d'informations."
|
||||
original = "Ceci est le contenu original de l'auteur."
|
||||
relatedContent = "Contenu lié"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo संस्करण बहुत पुराना है।\n\nवर्तमान में उपयोग किया जा रहा Hugo संस्करण {{ .Current }} है, जबकि FixIt के लिए न्यूनतम आवश्यक संस्करण {{ .Minimal }} है।\n\nयदि आप अपने कंप्यूटर पर Hugo का उपयोग कर रहे हैं, तो कृपया अपग्रेड गाइड देखें: https://gohugo.io/getting-started/installing/#upgrade-hugo\n\nयदि आप किसी तृतीय-पक्ष प्लेटफ़ॉर्म पर तैनात कर रहे हैं, तो कृपया Hugo संस्करण को तदनुसार कॉन्फ़िगर करें। "
|
||||
hugoExtendedWarn = "SCSS समर्थन के लिए Hugo Extended संस्करण आवश्यक है।"
|
||||
configurationError = "कन्फ़िग्यरेशन त्रुटि \nआपने फिक्सइट संस्करण पैरामीटर को सही ढंग से कॉन्फ़िगर नहीं किया है।. यह देखें: https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "संगतता त्रुटि ({{ .From }} -> {{ .To }}):\nआपके पास एक असंगत अपडेट है. यह देखें: https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "आप फिक्सइट के डिवेलपर संस्करण का उपयोग कर रहे हैं। कृपया एक स्थिर संस्करण का उपयोग करने पर विचार करें।\nयह देखें: https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -71,7 +70,7 @@ more = "और देखें"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "भाषा चुने"
|
||||
noMoretTranslations = "कोई और अनुवाद नहीं"
|
||||
noTranslations = "कोई अनुवाद नहीं"
|
||||
switchTheme = "थीम बदलें"
|
||||
# === Header ===
|
||||
|
||||
@@ -125,6 +124,7 @@ other = " शेयर करें"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "सामग्री"
|
||||
disclaimer = "लेखक का बयान: "
|
||||
pin = "शीर्ष पर पिन करें"
|
||||
repost = "दोबारा पोस्ट करें"
|
||||
publishedOnDate = "{{ .Date }} पर प्रकाशित"
|
||||
@@ -150,6 +150,11 @@ encryptionWarning = "सामग्री एन्क्रिप्शन क
|
||||
encryptionCommand = "उन्हें वास्तव में एन्क्रिप्ट करने के लिए बिल्ड के बाद `npx @hugo-fixit/encrypt` चलाएं।"
|
||||
relatedContent = "संबंधित सामग्री"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "यह लेख AI द्वारा उत्पन्न किया गया था। कृपया जानकारी को स्वतंत्र रूप से सत्यापित करें।"
|
||||
repost = "यह लेख एक पुनर्प्रकाशन है। कृपया अधिक जानकारी के लिए मूल स्रोत पर जाएं।"
|
||||
original = "यह लेखक की मूल सामग्री है।"
|
||||
|
||||
[single.includedIn]
|
||||
categories = "{{ .Categories }} में शामिल"
|
||||
collections = "{{ .Collections }} में शामिल"
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "La versione di Hugo è troppo bassa.\n\nLa versione attuale di Hugo è {{ .Current }}, la versione minima supportata per FixIt è {{ .Minimal }}.\n\nSe stai eseguendo Hugo sul tuo computer, consulta https://gohugo.io/getting-started/installing/#upgrade-hugo per la guida all'aggiornamento.\n\nSe stai distribuendo su una piattaforma di terze parti, configura la versione di Hugo di conseguenza."
|
||||
hugoExtendedWarn = "La versione Hugo Extended è necessaria per il supporto SCSS."
|
||||
configurationError = "Errore di configurazione\nNon hai ancora configurato correttamente il parametro della versione di FixIt. Vedi https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "Errore di compatibilità ({{ .From }} -> {{ .To }}):\nHai un aggiornamento incompatibile. Vedi https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Stai utilizzando una versione di sviluppo di FixIt. Si prega di considerare l'utilizzo di una versione stabile.\nVedi https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Più"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Scegliere la lingua"
|
||||
noMoretTranslations = "Non ci sono altre traduzioni"
|
||||
noTranslations = "Nessuna traduzione"
|
||||
switchTheme = "Cambiare il tema"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Condividi su"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Contenuti"
|
||||
disclaimer = "Avvertenza: "
|
||||
pin = "Fissa in alto"
|
||||
repost = "Ripubblica"
|
||||
publishedOnDate = "pubblicato su {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Entra"
|
||||
encryptyAgain = "Crittografa di nuovo"
|
||||
encryptionWarning = "Rilevata crittografia dei contenuti, ma sono ancora in testo in chiaro!"
|
||||
encryptionCommand = "Eseguire `npx @hugo-fixit/encrypt` dopo la compilazione per crittograffarli effettivamente."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Questo articolo è stato generato da un'IA. Si prega di verificare le informazioni in modo indipendente."
|
||||
repost = "Questo articolo è un repost. Si prega di visitare la fonte originale per maggiori informazioni."
|
||||
original = "Questo è il contenuto originale dell'autore."
|
||||
relatedContent = "Contenuti correlati"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo のバージョンが低すぎます。\n\n現在の Hugo バージョンは {{ .Current }} ですが、FixIt がサポートする最小バージョンは {{ .Minimal }} です。\n\n自分のコンピューターで Hugo を実行している場合は、https://gohugo.io/getting-started/installing/#upgrade-hugo でアップグレードガイドを参照してください。\n\nサードパーティプラットフォームにデプロイしている場合は、Hugo バージョンを適切に設定してください。"
|
||||
hugoExtendedWarn = "SCSS サポートには Hugo Extended バージョンが必要です。"
|
||||
configurationError = "設定ファイルエラー\nまだ FixIt のバージョンパラメータを正しく設定していません。 https://fixit.lruihao.cn/docs/getting-started/configuration/params/?lang=japanese を参照してください"
|
||||
compatibilityError = "互換性エラー ({{ .From }} -> {{ .To }}):\n互換性のない更新が行われました。 https://github.com/hugo-fixit/FixIt/releases を参照してください"
|
||||
devVersionWarn = "開発版の FixIt を使用しています。安定版の使用を検討してください。\n https://github.com/hugo-fixit/FixIt/releases を参照"
|
||||
@@ -68,7 +67,7 @@ more = "もっと見る"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "言語を選択"
|
||||
noMoretTranslations = "これ以上の翻訳はありません"
|
||||
noTranslations = "翻訳なし"
|
||||
switchTheme = "テーマを切り替え"
|
||||
# === Header ===
|
||||
|
||||
@@ -122,6 +121,7 @@ other = "共有先"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "目次"
|
||||
disclaimer = "著者声明:"
|
||||
pin = "ピン留め"
|
||||
repost = "再投稿"
|
||||
publishedOnDate = "公開日 {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ encryptionWarning = "コンテンツの暗号化が検出されましたが、
|
||||
encryptionCommand = "実際に暗号化するには、ビルド後に `npx @hugo-fixit/encrypt` を実行してください。"
|
||||
relatedContent = "関連コンテンツ"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "この記事はAIによって生成されました。情報を独自に確認してください。"
|
||||
repost = "この記事は転載です。詳細は元のソースをご覧ください。"
|
||||
original = "この記事は作者のオリジナルコンテンツです。"
|
||||
|
||||
[single.includedIn]
|
||||
categories = "カテゴリに収録:{{ .Categories }}"
|
||||
collections = "コレクションに収録:{{ .Collections }}"
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo 버전이 너무 낮습니다.\n\n현재 Hugo 버전은 {{ .Current }}이며, FixIt의 최소 지원 버전은 {{ .Minimal }}입니다.\n\n자신의 컴퓨터에서 Hugo를 실행 중이라면 https://gohugo.io/getting-started/installing/#upgrade-hugo 에서 업그레이드 가이드를 확인하세요.\n\n타사 플랫폼에 배포 중이라면 Hugo 버전을 적절히 설정해 주세요."
|
||||
hugoExtendedWarn = "SCSS 지원을 위해 Hugo Extended 버전이 필요합니다."
|
||||
configurationError = "구성 파일 오류\n아직 FixIt의 버전 매개변수를 올바르게 구성하지 않았습니다. https://fixit.lruihao.cn/docs/getting-started/configuration/params/?lang=korean 을 참조하세요."
|
||||
compatibilityError = "호환성 오류 ({{ .From }} -> {{ .To }}):\n비호환 업데이트를 수행했습니다. https://github.com/hugo-fixit/FixIt/releases 를 참조하세요."
|
||||
devVersionWarn = "현재 개발 버전의 FixIt을 사용 중입니다. 안정적인 버전을 사용하는 것이 좋습니다.\n자세한 내용은 https://github.com/hugo-fixit/FixIt/releases 를 참조하세요."
|
||||
@@ -68,7 +67,7 @@ more = "더 보기"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "언어 선택"
|
||||
noMoretTranslations = "더 이상 번역이 없습니다"
|
||||
noTranslations = "번역 없음"
|
||||
switchTheme = "테마 전환"
|
||||
# === Header ===
|
||||
|
||||
@@ -122,6 +121,7 @@ other = "공유하기"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "목차"
|
||||
disclaimer = "작성자 성명: "
|
||||
pin = "고정"
|
||||
repost = "재게시"
|
||||
publishedOnDate = "발행일: {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ encryptionWarning = "콘텐츠 암호화가 감지되었지만 여전히 평문
|
||||
encryptionCommand = "실제로 암호화하려면 빌드 후 `npx @hugo-fixit/encrypt`를 실행하세요."
|
||||
relatedContent = "관련 콘텐츠"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "이 글은 AI에 의해 생성되었습니다. 정보를 독립적으로 확인하시기 바랍니다."
|
||||
repost = "이 글은 전재 콘텐츠입니다. 자세한 내용은 원문을 방문하시기 바랍니다."
|
||||
original = "이 글은 저자의 오리지널 콘텐츠입니다."
|
||||
|
||||
[single.includedIn]
|
||||
categories = "{{ .Categories }}에 포함"
|
||||
collections = "{{ .Collections }}에 포함"
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Wersja Hugo jest zbyt niska.\n\nAktualna wersja Hugo to {{ .Current }}, minimalna obsługiwana wersja dla FixIt to {{ .Minimal }}.\n\nJeśli uruchamiasz Hugo na własnym komputerze, zapoznaj się z przewodnikiem aktualizacji na stronie https://gohugo.io/getting-started/installing/#upgrade-hugo.\n\nJeśli wdrażasz na platformie zewnętrznej, skonfiguruj odpowiednio wersję Hugo."
|
||||
hugoExtendedWarn = "Wersja Hugo Extended jest wymagana do obsługi SCSS."
|
||||
configurationError = "Błąd konfiguracji\nNie skonfigurowałeś jeszcze poprawnie parametru wersji FixIt. Zobacz https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "Błąd zgodności ({{ .From }} -> {{ .To }}):\nMasz niekompatybilną aktualizację. Zobacz https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Używasz wersji deweloperskiej FixIt. Proszę rozważyć użycie stabilnej wersji.\nZobacz https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Więcej"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Wybierz język"
|
||||
noMoretTranslations = "Brak dalszych tłumaczeń"
|
||||
noTranslations = "Brak tłumaczeń"
|
||||
switchTheme = "Przełącz schemat"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Udostępnij na"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Spis treści"
|
||||
disclaimer = "Ostrzeżenie: "
|
||||
pin = "Przypnij na górze"
|
||||
repost = "Prześlij ponownie"
|
||||
publishedOnDate = "opublikowano {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Wejdź"
|
||||
encryptyAgain = "Zaszyfruj ponownie"
|
||||
encryptionWarning = "Wykryto szyfrowanie treści, ale nadal są w postaci zwykłego tekstu!"
|
||||
encryptionCommand = "Uruchom `npx @hugo-fixit/encrypt` po kompilacji, aby je faktycznie zaszyfrować."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Ten artykuł został wygenerowany przez AI. Proszę samodzielnie zweryfikować informacje."
|
||||
repost = "Ten artykuł jest repostem. Proszę odwiedzić oryginalne źródło, aby uzyskać więcej informacji."
|
||||
original = "To jest oryginalna treść autora."
|
||||
relatedContent = "Powiązane treści"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "A versão do Hugo é muito baixa.\n\nA versão atual do Hugo é {{ .Current }}, a versão mínima suportada pelo FixIt é {{ .Minimal }}.\n\nSe você está executando o Hugo em seu computador, consulte https://gohugo.io/getting-started/installing/#upgrade-hugo para obter um guia de atualização.\n\nSe você está implantando em uma plataforma de terceiros, configure a versão do Hugo adequadamente."
|
||||
hugoExtendedWarn = "A versão Hugo Extended é necessária para o suporte a SCSS."
|
||||
configurationError = "Erro de configuração\nVocê ainda não configurou o parâmetro da versão do FixIt corretamente. Consulte https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "Erro de compatibilidade ({{ .From }} -> {{ .To }}):\nVocê tem uma atualização incompatível. Consulte https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Você está usando a versão de desenvolvedor do FixIt. Por favor, use uma versão estável. \nConsulte https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -71,7 +70,7 @@ more = "Mais"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Selecione o idioma"
|
||||
noMoretTranslations = "Não há mais traduções"
|
||||
noTranslations = "Sem traduções"
|
||||
switchTheme = "Trocar tema"
|
||||
# === Header ===
|
||||
|
||||
@@ -125,6 +124,7 @@ other = "Compartilhar em"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Conteúdos"
|
||||
disclaimer = "Aviso: "
|
||||
pin = "Fixar no topo"
|
||||
repost = "Repostar"
|
||||
publishedOnDate = "publicado em {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ password = "Senha"
|
||||
enterBtn = "Entrar"
|
||||
encryptyAgain = "Encripte novamente"
|
||||
encryptionWarning = "Criptografia de conteúdo detectada, mas ainda estão em texto plano!"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Este artigo foi gerado por IA. Por favor, verifique as informações de forma independente."
|
||||
repost = "Este artigo é um repost. Por favor, visite a fonte original para mais informações."
|
||||
original = "Este é o conteúdo original do autor."
|
||||
encryptionCommand = "Execute `npx @hugo-fixit/encrypt` após a compilação para realmente criptografá-los."
|
||||
relatedContent = "Conteúdo relacionado"
|
||||
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Versiunea Hugo este prea veche.\n\nVersiunea curentă Hugo este {{ .Current }}, versiunea minimă compatibilă cu FixIt este {{ .Minimal }}.\n\nDacă rulați Hugo pe propriul computer, consultați https://gohugo.io/getting-started/installing/#upgrade-hugo pentru ghidul de actualizare.\n\nDacă implementați pe o platformă terță, configurați versiunea Hugo corespunzător."
|
||||
hugoExtendedWarn = "Versiunea Hugo Extended este necesară pentru suportul SCSS."
|
||||
configurationError = "Eroare de configurare\nNu ați configurat corect parametrul versiunii FixIt. Consultați https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "Eroare de compatibilitate ({{ .From }} -> {{ .To }}):\nAveți o actualizare incompatibilă. Consultați https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Utilizați o versiune de dezvoltare a FixIt. Vă rugăm să luați în considerare utilizarea unei versiuni stabile.\nConsultați https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Mai mult"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Selectare Limbă"
|
||||
noMoretTranslations = "Nu mai sunt traduceri disponibile"
|
||||
noTranslations = "Fără traduceri"
|
||||
switchTheme = "Schimbare Temă"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Distribuie pe"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Cuprins"
|
||||
disclaimer = "Notificare: "
|
||||
pin = "Fixează în partea de sus"
|
||||
repost = "Repostează"
|
||||
publishedOnDate = "publicat la {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Intră"
|
||||
encryptyAgain = "Criptează din nou"
|
||||
encryptionWarning = "Criptarea conținutului a fost detectată, dar sunt încă în text clar!"
|
||||
encryptionCommand = "Rulați `npx @hugo-fixit/encrypt` după compilare pentru a le cripta efectiv."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Acest articol a fost generat de AI. Vă rugăm să verificați informațiile în mod independent."
|
||||
repost = "Acest articol este o repostare. Vă rugăm să vizitați sursa originală pentru mai multe informații."
|
||||
original = "Acesta este conținutul original al autorului."
|
||||
relatedContent = "Conținut înrudit"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Версия Hugo слишком низкая.\n\nТекущая версия Hugo — {{ .Current }}, минимальная поддерживаемая версия для FixIt — {{ .Minimal }}.\n\nЕсли вы запускаете Hugo на своём компьютере, ознакомьтесь с руководством по обновлению по адресу https://gohugo.io/getting-started/installing/#upgrade-hugo.\n\nЕсли вы развёртываете на сторонней платформе, настройте версию Hugo соответствующим образом."
|
||||
hugoExtendedWarn = "Для поддержки SCSS необходима версия Hugo Extended."
|
||||
configurationError = "Ошибка конфигурации\nВы еще не настроили параметр версии FixIt правильно. См. https://fixit.lruihao.cn/docs/getting-started/configuration/params/?lang=russian"
|
||||
compatibilityError = "Ошибка совместимости ({{ .From }} -> {{ .To }}):\nУ вас есть несовместимое обновление. См. https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Вы используете версию разработки FixIt. Пожалуйста, рассмотрите возможность использования стабильной версии.\nСм. https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Больше"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Выбор Языка"
|
||||
noMoretTranslations = "Нет больше переводов"
|
||||
noTranslations = "Нет переводов"
|
||||
switchTheme = "Сменить Тему"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Поделиться в"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Содержание"
|
||||
disclaimer = "Заявление автора: "
|
||||
pin = "Закрепить наверху"
|
||||
repost = "Перепостить"
|
||||
publishedOnDate = "Опубликовано {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Войти"
|
||||
encryptyAgain = "Зашифровать снова"
|
||||
encryptionWarning = "Обнаружено шифрование контента, но он всё ещё в открытом виде!"
|
||||
encryptionCommand = "Запустите `npx @hugo-fixit/encrypt` после сборки, чтобы фактически зашифровать их."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Эта статья была сгенерирована ИИ. Пожалуйста, проверьте информацию самостоятельно."
|
||||
repost = "Эта статья является репостом. Пожалуйста, посетите оригинальный источник для получения дополнительной информации."
|
||||
original = "Это оригинальный контент автора."
|
||||
relatedContent = "Связанный контент"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Верзија Hugo-а је прениска.\n\nТренутна верзија Hugo-а је {{ .Current }}, а минимална подржана верзија за FixIt је {{ .Minimal }}.\n\nАко покрећете Hugo на свом рачунару, погледајте https://gohugo.io/getting-started/installing/#upgrade-hugo за водич за надоградњу.\n\nАко постављате на платформу треће стране, конфигуришите верзију Hugo-а у складу с тим."
|
||||
hugoExtendedWarn = "Верзија Hugo Extended је неопходна за подршку SCSS-а."
|
||||
configurationError = "Грешка у конфигурацији\nНисте правилно конфигурисали параметар верзије FixIt. Погледајте https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "Грешка у компатибилности ({{ .From }} -> {{ .To }}):\nИмате некомпатибилно ажурирање. Погледајте https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Користите развојну верзију FixIt. Размотрите коришћење стабилне верзије.\nПогледајте https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -70,7 +69,7 @@ more = "Више"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Изабери Језик"
|
||||
noMoretTranslations = "Нема више превода"
|
||||
noTranslations = "Нема превода"
|
||||
switchTheme = "Промени Тему"
|
||||
# === Header ===
|
||||
|
||||
@@ -124,6 +123,7 @@ other = "Подели на"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Садржаји"
|
||||
disclaimer = "Obavetenje: "
|
||||
pin = "Закачи"
|
||||
repost = "Поново објави"
|
||||
publishedOnDate = "објављено {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ enterBtn = "Унеси"
|
||||
encryptyAgain = "Поново шифруј"
|
||||
encryptionWarning = "Детектовано је шифровање садржаја, али су и даље у обичном тексту!"
|
||||
encryptionCommand = "Покрените `npx @hugo-fixit/encrypt` након изградње да бисте их заиста шифровали."
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Овај чланак је генерисан од стране вештачке интелигенције. Молимо вас да независно проверите информације."
|
||||
repost = "Овај чланак је репост. Молимо вас да посетите оригинални извор за више информација."
|
||||
original = "Ово је оригинални садржај аутора."
|
||||
relatedContent = "Повезани садржај"
|
||||
|
||||
[single.includedIn]
|
||||
|
||||
+270
@@ -0,0 +1,270 @@
|
||||
# Translations for Urdu
|
||||
# اردو ترجمے
|
||||
# https://gohugo.io/content-management/multilingual/#translation-of-strings
|
||||
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo ورژن بہت پرانا ہے۔\n\nموجودہ ورژن {{ .Current }} ہے، اور FixIt کے لیے کم از کم ورژن {{ .Minimal }} درکار ہے۔\n\nاگر آپ Hugo کو ذاتی طور پر استعمال کرتے ہیں، تو اپ گریڈ کے لیے https://hugo-hugo.io/getting-started/installing/#upgrade-hugo دیکھیں۔\n\nاگر آپ کسی تیسرے فریق پلیٹ فارم پر Hugo استعمال کرتے ہیں، تو براہ کرم Hugo ورژن کو اس کے مطابق ترتیب دیں۔"
|
||||
configurationError = "ترتیب میں خرابی\nآپ نے ابھی تک FixIt ورژن پیرامیٹر کو صحیح طریقے سے ترتیب نہیں دیا ہے۔ https://fixit.lruihao.cn/docs/getting-started/configuration/params/ دیکھیں"
|
||||
compatibilityError = "مطابقت پذیری کی خرابی ({{ .From }} -> {{ .To }}):\nآپ کے پاس غیر مطابقت پذیر اپ ڈیٹ ہے۔ https://github.com/hugo-fixit/FixIt/releases دیکھیں"
|
||||
devVersionWarn = "آپ FixIt کا ڈیولپمنٹ ورژن استعمال کر رہے ہیں۔ براہ کرم مستقر ورژن استعمال کرنے پر غور کریں۔\nhttps://github.com/hugo-fixit/FixIt/releases دیکھیں"
|
||||
devEnvWarn = "موجودہ ماحول \"development\" ہے۔ \"تبصرہ نظام\"، \"PWA\"، \"CDN\"، \"ڈیجٹل فنگر پرنٹ\" اور \"تجزیات\" غیر فعال ہو جائیں گے۔"
|
||||
quicklyUpgrade = "تیزی سے اپ گریڈ کرنے کے لیے کمانڈ استعمال کریں: "
|
||||
# === Init ===
|
||||
|
||||
# === Base Layout ===
|
||||
[baseof]
|
||||
backToTop = "اوپر واپس جائیں"
|
||||
viewComments = "تبصرے دیکھیں"
|
||||
noscript = "یہ ویب سائٹ JavaScript فعال ہونے پر بہتر کام کرتی ہے۔"
|
||||
# === Base Layout ===
|
||||
|
||||
# === Taxonomy ===
|
||||
[archives]
|
||||
other = "آرکائیو"
|
||||
|
||||
[allSome]
|
||||
other = "تمام {{ .Some }}"
|
||||
|
||||
[category]
|
||||
other = "زمرہ"
|
||||
|
||||
[categories]
|
||||
other = "زمرے"
|
||||
|
||||
[collection]
|
||||
other = "مجموعہ"
|
||||
|
||||
[collections]
|
||||
other = "مجموعے"
|
||||
|
||||
[tag]
|
||||
other = "ٹیگ"
|
||||
|
||||
[tags]
|
||||
other = "ٹیگز"
|
||||
|
||||
[posts]
|
||||
other = "مضامین"
|
||||
|
||||
# === Taxonomy ===
|
||||
|
||||
# === Section ===
|
||||
[section]
|
||||
recentlyUpdated = "حال ہی میں اپ ڈیٹ کیا گیا"
|
||||
|
||||
[section.totalWordCount]
|
||||
one = "ایک لفظ"
|
||||
other = "{{ .Count }} الفاظ"
|
||||
|
||||
[section.archiveCounter]
|
||||
one = "صرف ایک مضمون"
|
||||
other = "{{ .Count }} مضامین"
|
||||
# === Section ===
|
||||
|
||||
# === Pagination ===
|
||||
[pagination]
|
||||
more = "مزید"
|
||||
# === Pagination ===
|
||||
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "زبان منتخب کریں"
|
||||
noTranslations = "ترجمے نہیں"
|
||||
switchTheme = "تھیم تبدیل کریں"
|
||||
# === Header ===
|
||||
|
||||
# === Footer ===
|
||||
[footer]
|
||||
poweredBySome = "{{ .Hugo }} سے چلتا ہے | تھیم - {{ .Theme }}"
|
||||
siteUV = "کل زائرین"
|
||||
sitePV = "کل ملاقاتیں"
|
||||
siteRunning = "سائٹ چل رہی ہے ..."
|
||||
# === Footer ===
|
||||
|
||||
# === Comment ===
|
||||
[comment]
|
||||
valinePlaceholder = "آپ کا تبصرہ ..."
|
||||
# === Comment ===
|
||||
|
||||
# === Assets ===
|
||||
[assets]
|
||||
search = "تلاش"
|
||||
searchPlaceholder = "عنوان یا مواد میں تلاش کریں ..."
|
||||
searchIn = "{{ . }} میں تلاش کریں"
|
||||
searchBy = "تلاش بذریعہ"
|
||||
gotoResultsPage = "تلاش کے نتائج کے صفحے پر جائیں ..."
|
||||
clear = "صاف کریں"
|
||||
cancel = "منسوخ"
|
||||
navigate = "نیویگیٹ"
|
||||
select = "منتخب کریں"
|
||||
close = "بند کریں"
|
||||
refresh = "ریفریش"
|
||||
noResultsFound = "کوئی نتائج نہیں ملے"
|
||||
copyToClipboard = "کلپ بورڈ پر کاپی کریں"
|
||||
copyText = "کاپی"
|
||||
copiedText = "کاپی ہو گیا"
|
||||
toggleLineNumbers = "سطر نمبر دکھائیں/چھپائیں"
|
||||
toggleLineWrap = "سطر ریپ دکھائیں/چھپائیں"
|
||||
toggleCodeEditable = "کوڈ بلاک میں ترمیم دکھائیں/چھپائیں"
|
||||
downloadCode = "کوڈ ڈاؤن لوڈ کریں"
|
||||
expandCode = "کوڈ بلاک کو بڑا کریں یا سکیڑیں"
|
||||
fullscreen = "فل اسکرین"
|
||||
exitFullscreen = "فل اسکرین سے باہر نکلیں"
|
||||
cookieconsentMessage = "یہ ویب سائٹ آپ کے تجربے کو بہتر بنانے کے لیے کوکیز استعمال کرتی ہے۔"
|
||||
cookieconsentDismiss = "سمجھ گیا!"
|
||||
cookieconsentLink = "مزید جانیں"
|
||||
# === Assets ===
|
||||
|
||||
# === Share ===
|
||||
[shareOn]
|
||||
other = "پر شیئر کریں"
|
||||
# === Share ===
|
||||
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "مواد"
|
||||
disclaimer = "Tafheem: "
|
||||
pin = "اوپر پن کریں"
|
||||
repost = "دوبارہ شائع کریں"
|
||||
publishedOnDate = "{{ .Date }} کو شائع ہوا"
|
||||
views = "مناظر"
|
||||
comments = "تبصرے"
|
||||
author = "مصنف"
|
||||
updatedOnDate = "{{ .Date }} کو اپ ڈیٹ کیا گیا"
|
||||
readMarkdown = "مارک ڈاؤن پڑھیں"
|
||||
viewSource = "ذریعہ دیکھیں"
|
||||
editThisPage = "اس صفحے میں ترمیم کریں"
|
||||
reportIssue = "مسئلہ رپورٹ کریں"
|
||||
openInEditor = "ایڈیٹر میں کھولیں"
|
||||
back = "واپس"
|
||||
home = "ہوم"
|
||||
readMore = "مزید پڑھیں"
|
||||
expirationReminder = "اس مضمون کو آخری بار {{ .Date }} کو اپ ڈیٹ کیا گیا تھا، اور مواد پرانا ہو سکتا ہے۔"
|
||||
encryptedAbstract = "اس مضمون کو انکرپٹ کیا گیا ہے، اس لیے اصل مواد نظر نہیں آتا!"
|
||||
encryptedMessage = "براہ کرم پاس ورڈ درج کریں"
|
||||
password = "پاس ورڈ"
|
||||
enterBtn = "داخل ہوں"
|
||||
encryptyAgain = "دوبارہ انکرپٹ کریں"
|
||||
encryptionWarning = "مواد کی انکرپشن کا پتہ چلا، لیکن یہ ابھی بھی سادہ متن میں ہے!"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "یہ مضمون AI کے ذریعے تیار کیا گیا تھا۔ براہ کرم معلومات کو آزادانہ طور پر تصدیق کریں۔"
|
||||
repost = "یہ مضمون ایک دوبارہ شائع کردہ ہے۔ براہ کرم مزید معلومات کے لیے اصل ذریعہ پر جائیں۔"
|
||||
original = "یہ مصنف کا اصل مواد ہے۔"
|
||||
encryptionCommand = "انکرپشن کے لیے بلڈ کے بعد `npx @hugo-fixit/encrypt` چلائیں۔"
|
||||
relatedContent = "متعلقہ مواد"
|
||||
|
||||
[single.includedIn]
|
||||
categories = "{{ .Categories }} میں شامل"
|
||||
collections = "{{ .Collections }} میں شامل"
|
||||
both = "{{ .Categories }} اور {{ .Collections }} میں شامل"
|
||||
|
||||
[single.wordCount]
|
||||
one = "ایک لفظ"
|
||||
other = "{{ .Count }} الفاظ"
|
||||
|
||||
[single.fuzzyWordCount]
|
||||
other = "تقریباً {{ .Count }} الفاظ"
|
||||
|
||||
[single.readingTime]
|
||||
one = "ایک منٹ"
|
||||
other = "{{ .Count }} منٹ"
|
||||
|
||||
[single.reward]
|
||||
donate = "عطیہ دیں"
|
||||
wechatpay = "WeChat Pay"
|
||||
alipay = "Alipay"
|
||||
paypal = "PayPal"
|
||||
bitcoin = "Bitcoin"
|
||||
# === Single Post ===
|
||||
|
||||
# === Error Pages ===
|
||||
[pageNotFound]
|
||||
other = "صفحہ نہیں ملا"
|
||||
|
||||
[pageNotFoundText]
|
||||
other = "آپ جو صفحہ تلاش کر رہے ہیں وہ موجود نہیں ہے۔ ہم معذرت خواہ ہیں۔"
|
||||
# === Error Pages ===
|
||||
|
||||
# === Offline ===
|
||||
[offlineTitle]
|
||||
other = "آف لائن"
|
||||
|
||||
[offlineText]
|
||||
other = "آپ آف لائن ہیں، صرف وہی صفحات دستیاب ہوں گے جو کیشے میں ہیں۔"
|
||||
# === Offline ===
|
||||
|
||||
# === Service Worker ===
|
||||
[serviceWorker]
|
||||
updateTitle = "اپ ڈیٹ دستیاب"
|
||||
updateText = "اس ویب سائٹ کا نیا ورژن دستیاب ہے۔"
|
||||
# === Service Worker ===
|
||||
|
||||
# === Link Redirection ===
|
||||
[linkRedirection]
|
||||
title = "ری ڈائریکشن نوٹس"
|
||||
message = "آپ {{ . Title }} چھوڑنے والے ہیں، براہ کرم اپنے اکاؤنٹ اور اثاثوں کی حفاظت پر توجہ دیں۔"
|
||||
confirm = "دورے کو جاری رکھیں"
|
||||
# === Link Redirection ===
|
||||
|
||||
# === Alert ===
|
||||
[alert]
|
||||
note = "نوٹ"
|
||||
tip = "ٹپ"
|
||||
important = "اہم"
|
||||
warning = "انتباہ"
|
||||
caution = "احتیاط"
|
||||
# === Alert ===
|
||||
|
||||
# === Task List ===
|
||||
[taskList]
|
||||
x = "تصدیق ہو گئی"
|
||||
" " = "تصدیق نہیں ہوئی"
|
||||
"/" = "جاری ہے"
|
||||
"-" = "منسوخ"
|
||||
"<" = "شیڈول کیا گیا"
|
||||
">" = "دوبارہ شیڈول کیا گیا"
|
||||
"!" = "اہم"
|
||||
"!x" = "اہم - تصدیق ہو گئی"
|
||||
"?" = "سوال"
|
||||
# === Task List ===
|
||||
|
||||
# === Admonition ===
|
||||
[admonition]
|
||||
note = "نوٹ"
|
||||
abstract = "خلاصہ"
|
||||
info = "معلومات"
|
||||
todo = "ٹو ڈو"
|
||||
tip = "ٹپ"
|
||||
success = "کامیابی"
|
||||
question = "سوال"
|
||||
warning = "انتباہ"
|
||||
failure = "ناکامی"
|
||||
danger = "خطرہ"
|
||||
bug = "بگ"
|
||||
example = "مثال"
|
||||
quote = "اقتباس"
|
||||
# === Admonition ===
|
||||
|
||||
# === Version ===
|
||||
[version]
|
||||
new = "نیا"
|
||||
changed = "تبدیل"
|
||||
deleted = "حذف"
|
||||
deprecated = "منسوخ"
|
||||
# === Version ===
|
||||
|
||||
# === Diagram ===
|
||||
[diagram]
|
||||
zoomIn = "زوم ان"
|
||||
zoomOut = "زوم آؤٹ"
|
||||
reset = "ری سیٹ"
|
||||
download = "SVG ڈاؤن لوڈ"
|
||||
# === Diagram ===
|
||||
|
||||
# === Tabs ===
|
||||
[tabs]
|
||||
diagram = "ڈائیگرام"
|
||||
code = "کوڈ"
|
||||
# === Tabs ===
|
||||
+7
-2
@@ -4,7 +4,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Phiên bản Hugo quá thấp.\n\nPhiên bản Hugo hiện tại là {{ .Current }}, phiên bản tối thiểu được hỗ trợ cho FixIt là {{ .Minimal }}.\n\nNếu bạn đang chạy Hugo trên máy tính của mình, hãy xem https://gohugo.io/getting-started/installing/#upgrade-hugo để biết hướng dẫn nâng cấp.\n\nNếu bạn đang triển khai trên nền tảng của bên thứ ba, vui lòng cấu hình phiên bản Hugo cho phù hợp."
|
||||
hugoExtendedWarn = "Phiên bản Hugo Extended là cần thiết để hỗ trợ SCSS."
|
||||
configurationError = "Lỗi cấu hình\nBạn chưa cấu hình tham số phiên bản FixIt đúng cách. Xem https://fixit.lruihao.cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "Lỗi tương thích ({{ .From }} -> {{ .To }}):\nBạn có một bản cập nhật không tương thích. Xem https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "Bạn đang sử dụng một phiên bản phát triển của FixIt. Vui lòng xem xét sử dụng một phiên bản ổn định.\nXem https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -69,7 +68,7 @@ more = "Thêm"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "Chọn Ngôn ngữ"
|
||||
noMoretTranslations = "Không có nữa"
|
||||
noTranslations = "Không có bản dịch"
|
||||
switchTheme = "Đổi chủ đề"
|
||||
# === Header ===
|
||||
|
||||
@@ -123,6 +122,7 @@ other = "Chia sẻ trên"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "Nội dung"
|
||||
disclaimer = "Tuyên bố của tác giả: "
|
||||
pin = "Ghim ở đầu trang"
|
||||
repost = "Đăng lại"
|
||||
publishedOnDate = "đăng ngày {{ .Date }}"
|
||||
@@ -148,6 +148,11 @@ encryptionWarning = "Phát hiện mã hóa nội dung, nhưng chúng vẫn ở d
|
||||
encryptionCommand = "Chạy `npx @hugo-fixit/encrypt` sau khi build để thực sự mã hóa chúng."
|
||||
relatedContent = "Nội dung liên quan"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "Bài viết này được tạo bởi AI. Vui lòng xác minh thông tin một cách độc lập."
|
||||
repost = "Bài viết này là nội dung được đăng lại. Vui lòng truy cập nguồn gốc để biết thêm thông tin."
|
||||
original = "Đây là nội dung gốc của tác giả."
|
||||
|
||||
[single.includedIn]
|
||||
categories = "trong {{ .Categories }}"
|
||||
collections = "trong {{ .Collections }}"
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo 版本过低。\n\n目前使用的 Hugo 版本为 {{ .Current }},FixIt 支持的最低的 Hugo 版本为 {{ .Minimal }}。\n\n如果你正在自己的计算机上运行 Hugo,请访问 https://gohugo.io/getting-started/installing/#upgrade-hugo 以查阅升级指南。\n\n如果你正在第三方平台上部署,请按照相应文档配置 Hugo 版本。"
|
||||
hugoExtendedWarn = "需要使用 Hugo Extended 版本来获得 SCSS 支持。"
|
||||
configurationError = "配置文件错误\n你还没有正确配置 FixIt 的版本参数。参考 https://fixit.lruihao.cn/zh-cn/docs/getting-started/configuration/params/"
|
||||
compatibilityError = "兼容性错误 ({{ .From }} -> {{ .To }}):\n你进行了一次不兼容的更新。参考 https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "你正在使用开发版的 FixIt,请考虑使用稳定版。\n见 https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -68,7 +67,7 @@ more = "更多"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "选择语言"
|
||||
noMoretTranslations = "没有更多翻译"
|
||||
noTranslations = "无翻译"
|
||||
switchTheme = "切换主题"
|
||||
# === Header ===
|
||||
|
||||
@@ -122,6 +121,7 @@ other = "分享到"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "目录"
|
||||
disclaimer = "作者声明:"
|
||||
pin = "置顶"
|
||||
repost = "转载"
|
||||
publishedOnDate = "发布于 {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ encryptionWarning = "检测到内容加密,但仍为明文状态!"
|
||||
encryptionCommand = "请在构建后执行 `npx @hugo-fixit/encrypt` 以实际加密内容。"
|
||||
relatedContent = "相关内容"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "本文由 AI 生成,请注意甄别内容真实性。"
|
||||
repost = "本文为转载内容,请访问原文了解更多信息。"
|
||||
original = "本文为作者原创内容。"
|
||||
|
||||
[single.includedIn]
|
||||
categories = "收录于 {{ .Categories }}"
|
||||
collections = "收录于 {{ .Collections }}"
|
||||
|
||||
+7
-2
@@ -5,7 +5,6 @@
|
||||
# === Init ===
|
||||
[init]
|
||||
hugoVersionError = "Hugo 版本過低。\n\n目前使用的 Hugo 版本為 {{ .Current }},FixIt 支持的最老的 Hugo 版本為 {{ .Minimal }}。\n\n如果你正在自己的計算機上運行 Hugo,請訪問 https://gohugo.io/getting-started/installing/#upgrade-hugo 以查閱升級指南。\n\n如果你正在第三方平台上部署,請按照相應文檔配置 Hugo 版本。"
|
||||
hugoExtendedWarn = "需要使用 Hugo Extended 版本來獲得 SCSS 支持。"
|
||||
configurationError = "配置文件錯誤\n你還沒有正確配置 FixIt 的版本參數。參考 https://fixit.lruihao.cn/zh-cn/docs/getting-started/configuration/params/?lang=chinese_traditional"
|
||||
compatibilityError = "兼容性錯誤 ({{ .From }} -> {{ .To }}):\n你進行了一次不兼容的更新。参考 https://github.com/hugo-fixit/FixIt/releases"
|
||||
devVersionWarn = "你正在使用開發版的 FixIt,請考慮使用穩定版。\n見 https://github.com/hugo-fixit/FixIt/releases"
|
||||
@@ -68,7 +67,7 @@ more = "更多"
|
||||
# === Header ===
|
||||
[header]
|
||||
selectLanguage = "選擇語言"
|
||||
noMoretTranslations = "沒有更多翻譯"
|
||||
noTranslations = "無翻譯"
|
||||
switchTheme = "切換主題"
|
||||
# === Header ===
|
||||
|
||||
@@ -122,6 +121,7 @@ other = "分享到"
|
||||
# === Single Post ===
|
||||
[single]
|
||||
contents = "目錄"
|
||||
disclaimer = "作者聲明:"
|
||||
pin = "置頂"
|
||||
repost = "轉貼"
|
||||
publishedOnDate = "發佈於 {{ .Date }}"
|
||||
@@ -147,6 +147,11 @@ encryptionWarning = "偵測到內容加密,但仍為明文狀態!"
|
||||
encryptionCommand = "請在建構後執行 `npx @hugo-fixit/encrypt` 以實際加密內容。"
|
||||
relatedContent = "相關內容"
|
||||
|
||||
[single.disclaimerMessage]
|
||||
ai = "本文由 AI 生成,請注意甄別內容真實性。"
|
||||
repost = "本文為轉載內容,請訪問原文了解更多信息。"
|
||||
original = "本文為作者原創內容。"
|
||||
|
||||
[single.includedIn]
|
||||
categories = "收錄於 {{ .Categories }}"
|
||||
collections = "收錄於 {{ .Collections }}"
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
{{- /*
|
||||
Render breadcrumb navigation for the current page.
|
||||
|
||||
Displays a hierarchical path from the site root to the current page.
|
||||
Supports configurable separator, sticky mode, home visibility, and title capitalization.
|
||||
|
||||
Called from: layouts/baseof.html.
|
||||
*/ -}}
|
||||
|
||||
{{- if (gt (len .Ancestors.Reverse) 1) | and (eq .Site.Params.breadcrumb.enable true) -}}
|
||||
{{- $separator := .Site.Params.breadcrumb.separator | default "/" -}}
|
||||
<nav aria-label="breadcrumb" class="breadcrumb-container{{ if .Site.Params.breadcrumb.sticky }} sticky{{ end }}">
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
{{- /*
|
||||
Comment system integration partial.
|
||||
|
||||
Renders the comment container and injects provider-specific CSS/JS assets.
|
||||
Supported providers: Artalk, Disqus, Gitalk, Valine, Waline, Facebook,
|
||||
Telegram, Commento, Utterances, Twikoo, Giscus, and custom comment systems.
|
||||
|
||||
Called from: layouts/baseof.html.
|
||||
*/ -}}
|
||||
|
||||
{{- $cdn := .Site.Store.Get "cdn" | default dict -}}
|
||||
{{- $fingerprint := .Site.Store.Get "fingerprint" -}}
|
||||
{{- $comment := .Store.Get "comment" | default dict -}}
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
{{- /*
|
||||
Site footer partial.
|
||||
|
||||
Renders the page footer with configurable sections:
|
||||
- Powered by (Hugo and FixIt theme links)
|
||||
- Copyright (year, author, license)
|
||||
- Site running time counter
|
||||
- Visitor statistics (busuanzi)
|
||||
- Gov/ICP filing information (beian)
|
||||
|
||||
Called from: layouts/baseof.html.
|
||||
*/ -}}
|
||||
|
||||
{{- $footerConfig := .Site.Params.footer -}}
|
||||
|
||||
{{- if ne $footerConfig.enable false -}}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
{{- /*
|
||||
Head Partial - Comprehensive head section template
|
||||
|
||||
@@ -20,6 +19,24 @@
|
||||
<meta name="author" content="{{ $author.name }}">
|
||||
<meta name="description" content="{{ with .Description }}{{ . }}{{ else }}{{ if .IsPage | and .Summary }}{{ .Summary | plainify }}{{ else }}{{ with .Site.Params.description }}{{ . }}{{ end }}{{ end }}{{ end }}">
|
||||
|
||||
{{- /* Robots meta tag: respect page-level robots frontmatter; default to index,follow with max-image-preview:large only when cover exists */ -}}
|
||||
{{- if isset .Params "robots" -}}
|
||||
<meta name="robots" content="{{ .Params.robots }}">
|
||||
{{- else -}}
|
||||
{{- $hasCover := false -}}
|
||||
{{- if .IsHome -}}
|
||||
{{- $hasCover = isset .Site.Params.seo "cover" -}}
|
||||
{{- else if .IsPage -}}
|
||||
{{- $cover := dict "Page" . | partial "function/get-cover.html" -}}
|
||||
{{- $hasCover = or $cover.Source $cover.Matches -}}
|
||||
{{- end -}}
|
||||
{{- if $hasCover -}}
|
||||
<meta name="robots" content="index, follow, max-image-preview:large">
|
||||
{{- else -}}
|
||||
<meta name="robots" content="index, follow">
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- $keywords := .Keywords -}}
|
||||
{{- if not $keywords -}}
|
||||
{{- if .IsPage | and .Params.tags -}}
|
||||
@@ -98,7 +115,13 @@
|
||||
|
||||
{{- /* Alternative output formats (Atom, RSS, manifest etc.) */ -}}
|
||||
{{- range .AlternativeOutputFormats -}}
|
||||
{{- if (eq .Name "manifest") | and (not $.Site.Params.app.pwa) -}}
|
||||
{{- if
|
||||
(eq .Name "manifest") | and (
|
||||
hugo.IsServer | or
|
||||
(not hugo.IsProduction) | or
|
||||
(not $.Site.Params.app.pwa)
|
||||
)
|
||||
-}}
|
||||
{{- continue -}}
|
||||
{{- end -}}
|
||||
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink | safeURL }}">
|
||||
|
||||
@@ -1,9 +1,28 @@
|
||||
{{- $buildDrafts := .Page.Draft -}}
|
||||
{{- /*
|
||||
Desktop and mobile site header with navigation.
|
||||
|
||||
Renders two header variants:
|
||||
- Desktop: full navigation menu with submenus, search trigger, theme switch, and language switcher.
|
||||
- Mobile: compact header with hamburger menu, search, theme switch, and language select.
|
||||
|
||||
Both support TypeIt animation for title/subtitle, GitHub corner integration, and custom menu items.
|
||||
|
||||
Called from: layouts/baseof.html.
|
||||
*/ -}}
|
||||
|
||||
{{- /*
|
||||
Whether to show draft menu items in the navigation.
|
||||
Controlled via env var at build time: HUGO_PARAMS_MENU_DRAFT=true hugo server
|
||||
Replaces the deprecated .Site.BuildDrafts (Hugo v0.156.0).
|
||||
See: https://discourse.gohugo.io/t/deprecations-in-v0-156-0/56732/11
|
||||
*/ -}}
|
||||
{{- $menuDraft := getenv "HUGO_PARAMS_MENU_DRAFT" -}}
|
||||
{{- $relLangURL := relLangURL "" -}}
|
||||
{{- $githubCornerPosition := .Site.Params.github_corner.position | default "end" | partial "function/logical-direction.html" -}}
|
||||
|
||||
{{- /* Desktop header */ -}}
|
||||
<header class="desktop animate__faster{{ if .Site.Params.header.blur }} is-blur{{ end }}" id="header-desktop">
|
||||
<div class="header-wrapper"{{ if .Site.Params.github_corner.enable }} data-github-corner="{{ .Site.Params.github_corner.position }}"{{ end }}>
|
||||
<div class="header-wrapper"{{ if .Site.Params.github_corner.enable }} data-github-corner="{{ $githubCornerPosition }}"{{ end }}>
|
||||
<div class="header-title">
|
||||
<a href="{{ $relLangURL }}" title="{{ .Site.Title }}" class="header-title-link">
|
||||
{{- with .Site.Params.header.title -}}
|
||||
@@ -45,51 +64,53 @@
|
||||
{{- with .Page -}}
|
||||
{{- $url = .RelPermalink -}}
|
||||
{{- end -}}
|
||||
{{- if (ne .Params.Draft true) | or $buildDrafts | and (ne .Params.Type "mobile") -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` . | or ($.HasMenuCurrent `main` .) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with .Params.Class }} {{ . }}{{ end }}{{ if .HasChildren }} has-children{{ end }}">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with .Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }} rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with .Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with .Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- .Name }}
|
||||
{{- with .Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
{{- if .HasChildren -}}
|
||||
{{ dict "Class" "dropdown-icon fa-solid fa-chevron-down" | partial "plugin/icon.html" }}
|
||||
<ul class="sub-menu">
|
||||
{{- range $k, $v := .Children -}}
|
||||
{{- $url := $v.URL -}}
|
||||
{{- with $url -}}
|
||||
{{- $url = . | relLangURL -}}
|
||||
{{- end -}}
|
||||
{{- with $v.Page -}}
|
||||
{{- $url = .RelPermalink -}}
|
||||
{{- end -}}
|
||||
{{- if (ne $v.Params.Draft true) | or $buildDrafts | and (ne $v.Params.Type "mobile") -}}
|
||||
{{- if $k | and $v.Params.Divided -}}
|
||||
<li class="menu-item-divider" aria-hidden="true"></li>
|
||||
{{- end -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` $v | or ($.HasMenuCurrent `main` $v) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with $v.Params.Class }} {{ . }}{{ end }}">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with $v.Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }} rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with $v.Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with $v.Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- $v.Name }}
|
||||
{{- with $v.Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
</ul>
|
||||
{{- end -}}
|
||||
</li>
|
||||
{{- if (eq .Params.Type "mobile") | or (and (eq .Params.Draft true) (ne $menuDraft "true")) -}}
|
||||
{{ continue }}
|
||||
{{- end -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` . | or ($.HasMenuCurrent `main` .) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with .Params.Class }} {{ . }}{{ end }}{{ if .HasChildren }} has-children{{ end }}">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with .Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }} rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with .Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with .Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- .Name }}
|
||||
{{- with .Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
{{- if .HasChildren -}}
|
||||
{{ dict "Class" "dropdown-icon fa-solid fa-chevron-down" | partial "plugin/icon.html" }}
|
||||
<ul class="sub-menu">
|
||||
{{- range $k, $v := .Children -}}
|
||||
{{- $url := $v.URL -}}
|
||||
{{- with $url -}}
|
||||
{{- $url = . | relLangURL -}}
|
||||
{{- end -}}
|
||||
{{- with $v.Page -}}
|
||||
{{- $url = .RelPermalink -}}
|
||||
{{- end -}}
|
||||
{{- if (eq $v.Params.Type "mobile") | or (and (eq $v.Params.Draft true) (ne $menuDraft "true")) -}}
|
||||
{{ continue }}
|
||||
{{- end -}}
|
||||
{{- if $k | and $v.Params.Divided -}}
|
||||
<li class="menu-item-divider" aria-hidden="true"></li>
|
||||
{{- end -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` $v | or ($.HasMenuCurrent `main` $v) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with $v.Params.Class }} {{ . }}{{ end }}">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with $v.Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }} rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with $v.Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with $v.Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- $v.Name }}
|
||||
{{- with $v.Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
</li>
|
||||
{{- end -}}
|
||||
</ul>
|
||||
{{- end -}}
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{- if .Site.Menus.main -}}
|
||||
<li class="menu-item delimiter"></li>
|
||||
@@ -137,7 +158,7 @@
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
<li class="menu-item">{{- T "header.noMoretTranslations" -}}</li>
|
||||
<li class="menu-item">{{- T "header.noTranslations" -}}</li>
|
||||
{{- end -}}
|
||||
</ul>
|
||||
</li>
|
||||
@@ -208,51 +229,12 @@
|
||||
{{- with .Page -}}
|
||||
{{- $url = .RelPermalink -}}
|
||||
{{- end -}}
|
||||
{{- if (ne .Params.Draft true) | or $buildDrafts | and (ne .Params.Type "desktop") -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` . | or ($.HasMenuCurrent `main` .) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with .Params.Class }} {{ . }}{{ end }}">
|
||||
{{- if .HasChildren -}}
|
||||
<span class="nested-item">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with .Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }} rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with .Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with .Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- .Name }}
|
||||
{{- with .Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
{{ dict "Class" "dropdown-icon fa-solid fa-chevron-right" | partial "plugin/icon.html" }}
|
||||
</span>
|
||||
<ul class="sub-menu">
|
||||
{{- range $k, $v := .Children -}}
|
||||
{{- $url := $v.URL -}}
|
||||
{{- with $url -}}
|
||||
{{- $url = . | relLangURL -}}
|
||||
{{- end -}}
|
||||
{{- with $v.Page -}}
|
||||
{{- $url = .RelPermalink -}}
|
||||
{{- end -}}
|
||||
{{- if (ne $v.Params.Draft true) | or $buildDrafts | and (ne $v.Params.Type "desktop") -}}
|
||||
{{- if $k | and $v.Params.Divided -}}
|
||||
<li class="menu-item menu-item-divider" aria-hidden="true"></li>
|
||||
{{- end -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` $v | or ($.HasMenuCurrent `main` $v) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with $v.Params.Class }} {{ . }}{{ end }}">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with $v.Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }}rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with $v.Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with $v.Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- $v.Name }}
|
||||
{{- with $v.Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
</ul>
|
||||
{{- else -}}
|
||||
{{- if (eq .Params.Type "desktop") | or (and (eq .Params.Draft true) (ne $menuDraft "true")) -}}
|
||||
{{ continue }}
|
||||
{{- end -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` . | or ($.HasMenuCurrent `main` .) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with .Params.Class }} {{ . }}{{ end }}">
|
||||
{{- if .HasChildren -}}
|
||||
<span class="nested-item">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with .Title }} title="{{ . }}"{{ end }}
|
||||
@@ -263,9 +245,50 @@
|
||||
{{- .Name }}
|
||||
{{- with .Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
{{- end -}}
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{ dict "Class" "dropdown-icon fa-solid fa-chevron-right" | partial "plugin/icon.html" }}
|
||||
</span>
|
||||
<ul class="sub-menu">
|
||||
{{- range $k, $v := .Children -}}
|
||||
{{- $url := $v.URL -}}
|
||||
{{- with $url -}}
|
||||
{{- $url = . | relLangURL -}}
|
||||
{{- end -}}
|
||||
{{- with $v.Page -}}
|
||||
{{- $url = .RelPermalink -}}
|
||||
{{- end -}}
|
||||
{{- if (eq $v.Params.Type "desktop") | or (and (eq $v.Params.Draft true) (ne $menuDraft "true")) -}}
|
||||
{{ continue }}
|
||||
{{- end -}}
|
||||
{{- if $k | and $v.Params.Divided -}}
|
||||
<li class="menu-item menu-item-divider" aria-hidden="true"></li>
|
||||
{{- end -}}
|
||||
<li class="menu-item{{ if $.IsMenuCurrent `main` $v | or ($.HasMenuCurrent `main` $v) | or (eq $.RelPermalink $url) }} active{{ end }}{{ with $v.Params.Class }} {{ . }}{{ end }}">
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with $v.Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }}rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with $v.Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with $v.Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- $v.Name }}
|
||||
{{- with $v.Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
</li>
|
||||
{{- end -}}
|
||||
</ul>
|
||||
{{- else -}}
|
||||
<a class="menu-link"
|
||||
{{- with $url }} href="{{ $url }}"{{ else }} href="javascript:void(0);"{{ end }}
|
||||
{{- with .Title }} title="{{ . }}"{{ end }}
|
||||
{{- if (urls.Parse $url).Host }} rel="noopener noreferrer" target="_blank"{{ end -}}
|
||||
>
|
||||
{{- with .Pre -}}{{- . | safeHTML }} {{ end }}
|
||||
{{- with .Params.Icon -}}{{ dict "Class" (printf "%v fa-sm" .) | partial "plugin/icon.html" }} {{ end }}
|
||||
{{- .Name }}
|
||||
{{- with .Post }} {{ . | safeHTML -}}{{- end -}}
|
||||
</a>
|
||||
{{- end -}}
|
||||
</li>
|
||||
{{- end -}}
|
||||
<li class="menu-item menu-system">
|
||||
{{- if hugo.IsMultilingual -}}
|
||||
@@ -289,7 +312,7 @@
|
||||
</option>
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
<option disabled>{{- T "header.noMoretTranslations" -}}</option>
|
||||
<option disabled>{{- T "header.noTranslations" -}}</option>
|
||||
{{- end -}}
|
||||
</select>
|
||||
</span>
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
{{- /*
|
||||
Pagination component with ellipsis.
|
||||
|
||||
Renders a paginated page list with ellipsis for large page counts.
|
||||
Shows page numbers near the current page and ellipsis markers for distant ranges.
|
||||
*/ -}}
|
||||
|
||||
{{- if gt .Paginator.TotalPages 1 -}}
|
||||
<ul class="pagination">
|
||||
{{- .Site.Store.Set "paginator.ellipsed" false -}}
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
{{- /*
|
||||
Global widget layer partial.
|
||||
|
||||
Renders floating UI elements across all pages:
|
||||
- Fixed action buttons (back-to-top, TOC drawer, view comments)
|
||||
- GitHub corner link
|
||||
- Search dialog modal
|
||||
- Reading progress bar
|
||||
- Link guard confirmation dialog
|
||||
- Service worker update notification
|
||||
- Noscript warning
|
||||
|
||||
Called from: layouts/baseof.html.
|
||||
*/ -}}
|
||||
|
||||
<div class="widgets">
|
||||
{{- $backToTop := .Site.Params.back_to_top -}}
|
||||
{{- $comment := .Store.Get "comment" -}}
|
||||
@@ -34,13 +49,14 @@
|
||||
{{- $githubCorner := .Site.Params.github_corner -}}
|
||||
{{- if $githubCorner.enable -}}
|
||||
{{- with $githubCorner -}}
|
||||
{{- $position := .Position | default "end" | partial "function/logical-direction.html" -}}
|
||||
{{- $githubImage := `<svg viewBox="0 0 250 250" aria-hidden="true" width="56" height="56"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg>` -}}
|
||||
{{- $options := dict "Destination" .Permalink "Title" .Title "Content" $githubImage "ExternalIcon" false "Class" (cond (eq .Position "left") "left" "right" | printf "github-corner %v max-sm:hidden") "Noreferrer" false -}}
|
||||
{{- $options := dict "Destination" .Permalink "Title" .Title "Content" $githubImage "ExternalIcon" false "Class" (printf "github-corner %v max-sm:hidden" $position) "Noreferrer" false -}}
|
||||
{{- partial "plugin/link.html" $options -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- /* Search mask */ -}}
|
||||
{{- /* Header mobile mask */ -}}
|
||||
<div id="mask"></div>
|
||||
|
||||
{{- /* Search dialog */ -}}
|
||||
@@ -90,7 +106,7 @@
|
||||
{{- $readingProgress := .Site.Params.reading_progress -}}
|
||||
{{- if $readingProgress.enable -}}
|
||||
{{- with $readingProgress -}}
|
||||
{{- $style := printf "%v: 0;%v: 0;" (.Start | default "left") (.Position | default "top") -}}
|
||||
{{- $style := printf "inset-inline-%v: 0;%v: 0;" (.Start | default "start" | partial "function/logical-direction.html") (.Position | default "top") -}}
|
||||
{{- if .Height | and (ne .Height "2px") -}}
|
||||
{{- $style = printf "%v--fi-progress-h: %v;" $style .Height -}}
|
||||
{{- end -}}
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
{{- /*
|
||||
Custom partial block definitions.
|
||||
|
||||
Defines named template blocks (custom-head, custom-menu, custom-profile,
|
||||
custom-aside, custom-comment, custom-footer, custom-widgets, custom-assets,
|
||||
custom-post__toc, custom-post__content, custom-post__footer) that users
|
||||
can extend via the custom_partials configuration.
|
||||
*/ -}}
|
||||
|
||||
{{- define "custom-head" -}}
|
||||
{{- $ctx := . -}}
|
||||
{{- range .Site.Params.custom_partials.head -}}
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
{{- /*
|
||||
RSS feed generation partial.
|
||||
|
||||
Renders an RSS 2.0 XML feed for the current section or home page.
|
||||
Supports full-text or summary mode, filters out password-protected and hidden pages,
|
||||
and includes cover images, author info, and follow challenge tags.
|
||||
*/ -}}
|
||||
|
||||
{{- $pages := .Pages -}}
|
||||
{{- /* Front matter: password */ -}}
|
||||
{{- $pages = where $pages "Params.password" "eq" nil -}}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user