seqpro 0.9.0__tar.gz → 0.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- seqpro-0.11.0/.claude/skills/zensical-setup/.skillfish.json +10 -0
- seqpro-0.11.0/.claude/skills/zensical-setup/SKILL.md +662 -0
- seqpro-0.11.0/.github/workflows/bump.yaml +49 -0
- seqpro-0.11.0/.github/workflows/docs.yml +59 -0
- seqpro-0.11.0/.github/workflows/lint.yaml +9 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/.github/workflows/merge.yaml +2 -4
- {seqpro-0.9.0 → seqpro-0.11.0}/.github/workflows/publish.yaml +73 -65
- seqpro-0.11.0/.github/workflows/release.yaml +49 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/.github/workflows/test.yaml +4 -4
- {seqpro-0.9.0 → seqpro-0.11.0}/.pre-commit-config.yaml +13 -3
- {seqpro-0.9.0 → seqpro-0.11.0}/CHANGELOG.md +48 -0
- seqpro-0.11.0/CLAUDE.md +74 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/PKG-INFO +6 -4
- seqpro-0.11.0/README.md +82 -0
- seqpro-0.11.0/docs/api/alphabets.md +14 -0
- seqpro-0.11.0/docs/api/bed.md +5 -0
- seqpro-0.11.0/docs/api/gtf.md +8 -0
- seqpro-0.11.0/docs/api/index.md +23 -0
- seqpro-0.11.0/docs/api/ragged.md +9 -0
- seqpro-0.11.0/docs/api/types.md +13 -0
- seqpro-0.11.0/docs/index.md +77 -0
- seqpro-0.11.0/docs/ragged.md +192 -0
- seqpro-0.11.0/docs/superpowers/plans/2026-05-04-ragged-record-array.md +338 -0
- seqpro-0.11.0/docs/superpowers/plans/2026-05-05-documentation-site.md +356 -0
- seqpro-0.11.0/docs/superpowers/plans/2026-05-05-narwhals-coord-schema.md +971 -0
- seqpro-0.11.0/docs/superpowers/plans/2026-05-05-ragged-zip-and-record-introspection.md +597 -0
- seqpro-0.11.0/docs/superpowers/specs/2026-05-04-ragged-record-array-design.md +121 -0
- seqpro-0.11.0/docs/superpowers/specs/2026-05-05-documentation-site-design.md +108 -0
- seqpro-0.11.0/docs/superpowers/specs/2026-05-05-narwhals-coord-schema-design.md +153 -0
- seqpro-0.11.0/docs/superpowers/specs/2026-05-05-ragged-zip-and-record-introspection-design.md +94 -0
- seqpro-0.11.0/pixi.lock +10819 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/pixi.toml +24 -30
- {seqpro-0.9.0 → seqpro-0.11.0}/pyproject.toml +13 -6
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/__init__.py +22 -17
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_analyzers.py +32 -34
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_cleaners.py +11 -13
- seqpro-0.11.0/python/seqpro/_coords.py +141 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_encoders.py +41 -35
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_modifiers.py +54 -48
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_numba.py +61 -22
- seqpro-0.11.0/python/seqpro/_types.py +5 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_utils.py +45 -13
- seqpro-0.11.0/python/seqpro/alphabets/_alphabets.py +468 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/bed.py +73 -37
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/experimental/_experimental.py +5 -8
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/gtf.py +13 -3
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/rag/__init__.py +5 -5
- seqpro-0.11.0/python/seqpro/rag/_array.py +845 -0
- seqpro-0.11.0/python/seqpro/rag/_types.py +5 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/rag/_utils.py +4 -6
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/transforms/__init__.py +1 -1
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/transforms/augmentation.py +9 -7
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/transforms/tmm.py +16 -16
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/xr/__init__.py +23 -25
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_pyranges.py +17 -1
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_read.py +29 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_sort.py +14 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_with_length.py +9 -0
- seqpro-0.11.0/tests/test_coords.py +288 -0
- seqpro-0.11.0/tests/test_ragged.py +287 -0
- seqpro-0.11.0/tests/test_translate.py +167 -0
- seqpro-0.11.0/zensical.toml +71 -0
- seqpro-0.9.0/.github/workflows/bump.yaml +0 -27
- seqpro-0.9.0/README.md +0 -61
- seqpro-0.9.0/pixi.lock +0 -8182
- seqpro-0.9.0/python/seqpro/_types.py +0 -4
- seqpro-0.9.0/python/seqpro/alphabets/_alphabets.py +0 -384
- seqpro-0.9.0/python/seqpro/rag/_array.py +0 -493
- seqpro-0.9.0/python/seqpro/rag/_types.py +0 -7
- seqpro-0.9.0/tests/test_ragged.py +0 -72
- seqpro-0.9.0/tests/test_translate.py +0 -74
- {seqpro-0.9.0 → seqpro-0.11.0}/.gitattributes +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/.gitignore +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/Cargo.lock +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/Cargo.toml +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/LICENSE +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/meta.yaml +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/alphabets/__init__.py +3 -3
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/experimental/_visualizers.py +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/py.typed +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/rag/_gufuncs.py +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/src/kshuffle.rs +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/src/lib.rs +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_analyzers.py +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_modifiers.py +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_ohe.py +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_tokenize.py +0 -0
- {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_transforms.py +0 -0
|
@@ -0,0 +1,662 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zensical-setup
|
|
3
|
+
description: >
|
|
4
|
+
Guide for setting up and configuring Zensical documentation sites.
|
|
5
|
+
Use when: create documentation site, configure zensical.toml, set up
|
|
6
|
+
navigation, change theme colors, configure fonts, add analytics,
|
|
7
|
+
deploy docs site, GitHub Pages, GitLab Pages, mkdocs.yml migration,
|
|
8
|
+
customize Zensical theme, template overrides, add CSS or JavaScript.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Zensical Site Setup & Configuration
|
|
12
|
+
|
|
13
|
+
Zensical is a modern static site generator for project documentation, built by
|
|
14
|
+
the creators of Material for MkDocs. It uses TOML configuration (`zensical.toml`)
|
|
15
|
+
and supports `mkdocs.yml` for migration. This skill covers installation,
|
|
16
|
+
configuration, theming, navigation, deployment, and customization.
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Install
|
|
22
|
+
python3 -m venv .venv && source .venv/bin/activate && pip install zensical
|
|
23
|
+
# Or with uv:
|
|
24
|
+
uv init && uv add --dev zensical
|
|
25
|
+
|
|
26
|
+
# Create project
|
|
27
|
+
zensical new .
|
|
28
|
+
|
|
29
|
+
# Preview
|
|
30
|
+
zensical serve
|
|
31
|
+
|
|
32
|
+
# Build
|
|
33
|
+
zensical build
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Generated structure:
|
|
37
|
+
```
|
|
38
|
+
.
|
|
39
|
+
├─ .github/ # GitHub Actions workflow
|
|
40
|
+
├─ docs/
|
|
41
|
+
│ ├─ index.md
|
|
42
|
+
│ └─ markdown.md
|
|
43
|
+
└─ zensical.toml
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Configuration File
|
|
47
|
+
|
|
48
|
+
Zensical uses `zensical.toml` (recommended) or `mkdocs.yml` (for migration).
|
|
49
|
+
All settings live under the `[project]` scope.
|
|
50
|
+
|
|
51
|
+
### Essential Settings
|
|
52
|
+
|
|
53
|
+
```toml
|
|
54
|
+
[project]
|
|
55
|
+
site_name = "My Site" # Required
|
|
56
|
+
site_url = "https://example.com" # Strongly recommended
|
|
57
|
+
site_description = "Project docs" # For HTML meta
|
|
58
|
+
site_author = "Jane Doe" # For HTML meta
|
|
59
|
+
copyright = "© 2025 Jane Doe" # Footer copyright
|
|
60
|
+
docs_dir = "docs" # Source directory (default)
|
|
61
|
+
site_dir = "site" # Output directory (default)
|
|
62
|
+
use_directory_urls = true # Pretty URLs (default)
|
|
63
|
+
dev_addr = "localhost:7860" # Dev server address (default)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Theme Variant
|
|
67
|
+
|
|
68
|
+
Two variants: `modern` (default, fresh design) and `classic` (matches Material for MkDocs).
|
|
69
|
+
|
|
70
|
+
```toml
|
|
71
|
+
[project.theme]
|
|
72
|
+
variant = "classic" # Use "classic" for Material for MkDocs look
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Navigation
|
|
76
|
+
|
|
77
|
+
### Automatic Navigation
|
|
78
|
+
|
|
79
|
+
By default, Zensical generates navigation from the folder structure.
|
|
80
|
+
|
|
81
|
+
### Explicit Navigation
|
|
82
|
+
|
|
83
|
+
```toml
|
|
84
|
+
[project]
|
|
85
|
+
nav = [
|
|
86
|
+
{ "Home" = "index.md" },
|
|
87
|
+
{ "About" = [
|
|
88
|
+
"about/index.md",
|
|
89
|
+
"about/vision.md",
|
|
90
|
+
"about/team.md"
|
|
91
|
+
]},
|
|
92
|
+
{ "GitHub Repo" = "https://github.com/org/repo" } # External links
|
|
93
|
+
]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Navigation Features
|
|
97
|
+
|
|
98
|
+
Enable features under `[project.theme]`:
|
|
99
|
+
|
|
100
|
+
```toml
|
|
101
|
+
[project.theme]
|
|
102
|
+
features = [
|
|
103
|
+
# Instant navigation (SPA-like behavior, requires site_url)
|
|
104
|
+
"navigation.instant",
|
|
105
|
+
"navigation.instant.prefetch", # Prefetch on hover
|
|
106
|
+
"navigation.instant.progress", # Progress bar on slow connections
|
|
107
|
+
|
|
108
|
+
# Navigation structure
|
|
109
|
+
"navigation.tabs", # Top-level sections as tabs
|
|
110
|
+
"navigation.tabs.sticky", # Sticky tabs on scroll
|
|
111
|
+
"navigation.sections", # Render top-level as groups
|
|
112
|
+
"navigation.expand", # Expand all subsections by default
|
|
113
|
+
"navigation.indexes", # Section index pages
|
|
114
|
+
"navigation.path", # Breadcrumb navigation
|
|
115
|
+
"navigation.prune", # Reduce HTML size ~33%
|
|
116
|
+
"navigation.top", # Back-to-top button
|
|
117
|
+
"navigation.footer", # Previous/next page links in footer
|
|
118
|
+
"navigation.tracking", # Update URL with active anchor
|
|
119
|
+
|
|
120
|
+
# Table of contents
|
|
121
|
+
"toc.follow", # Auto-scroll TOC to active anchor
|
|
122
|
+
"toc.integrate", # TOC in left sidebar (incompatible with navigation.indexes)
|
|
123
|
+
|
|
124
|
+
# Instant previews (experimental, headerlinks only)
|
|
125
|
+
# Configured via markdown extension, see below
|
|
126
|
+
]
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Incompatibilities:**
|
|
130
|
+
- `navigation.prune` ↔ `navigation.expand`
|
|
131
|
+
- `navigation.indexes` ↔ `toc.integrate`
|
|
132
|
+
|
|
133
|
+
### Instant Previews
|
|
134
|
+
|
|
135
|
+
```toml
|
|
136
|
+
[project.markdown_extensions.zensical.extensions.preview]
|
|
137
|
+
configurations = [
|
|
138
|
+
{ targets.include = ["setup/extensions/*", "customization.md"] }
|
|
139
|
+
]
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Hiding Sidebars (per page, via front matter)
|
|
143
|
+
|
|
144
|
+
```yaml
|
|
145
|
+
---
|
|
146
|
+
hide:
|
|
147
|
+
- navigation
|
|
148
|
+
- toc
|
|
149
|
+
- path
|
|
150
|
+
- footer
|
|
151
|
+
- tags
|
|
152
|
+
- feedback
|
|
153
|
+
---
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Colors
|
|
157
|
+
|
|
158
|
+
### Color Scheme
|
|
159
|
+
|
|
160
|
+
```toml
|
|
161
|
+
[project.theme.palette]
|
|
162
|
+
scheme = "default" # Light mode
|
|
163
|
+
# scheme = "slate" # Dark mode
|
|
164
|
+
primary = "indigo" # Header/sidebar/links color
|
|
165
|
+
accent = "indigo" # Interactive elements color
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Available primary colors:** red, pink, purple, deep-purple, indigo, blue,
|
|
169
|
+
light-blue, cyan, teal, green, light-green, lime, yellow, amber, orange,
|
|
170
|
+
deep-orange, brown, grey, blue-grey, black, white, custom.
|
|
171
|
+
|
|
172
|
+
**Available accent colors:** red, pink, purple, deep-purple, indigo, blue,
|
|
173
|
+
light-blue, cyan, teal, green, light-green, lime, yellow, amber, orange,
|
|
174
|
+
deep-orange.
|
|
175
|
+
|
|
176
|
+
### Color Palette Toggle (light/dark switch)
|
|
177
|
+
|
|
178
|
+
```toml
|
|
179
|
+
[[project.theme.palette]]
|
|
180
|
+
scheme = "default"
|
|
181
|
+
toggle.icon = "lucide/sun"
|
|
182
|
+
toggle.name = "Switch to dark mode"
|
|
183
|
+
|
|
184
|
+
[[project.theme.palette]]
|
|
185
|
+
scheme = "slate"
|
|
186
|
+
toggle.icon = "lucide/moon"
|
|
187
|
+
toggle.name = "Switch to light mode"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### System Preference + Automatic Mode
|
|
191
|
+
|
|
192
|
+
```toml
|
|
193
|
+
[[project.theme.palette]]
|
|
194
|
+
media = "(prefers-color-scheme)"
|
|
195
|
+
toggle.icon = "lucide/sun-moon"
|
|
196
|
+
toggle.name = "Switch to light mode"
|
|
197
|
+
|
|
198
|
+
[[project.theme.palette]]
|
|
199
|
+
media = "(prefers-color-scheme: light)"
|
|
200
|
+
scheme = "default"
|
|
201
|
+
toggle.icon = "lucide/sun"
|
|
202
|
+
toggle.name = "Switch to dark mode"
|
|
203
|
+
|
|
204
|
+
[[project.theme.palette]]
|
|
205
|
+
media = "(prefers-color-scheme: dark)"
|
|
206
|
+
scheme = "slate"
|
|
207
|
+
toggle.icon = "lucide/moon"
|
|
208
|
+
toggle.name = "Switch to system preference"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Custom Colors via CSS
|
|
212
|
+
|
|
213
|
+
Set `primary = "custom"` then define CSS variables:
|
|
214
|
+
|
|
215
|
+
```css
|
|
216
|
+
/* docs/stylesheets/extra.css */
|
|
217
|
+
:root > * {
|
|
218
|
+
--md-primary-fg-color: #EE0F0F;
|
|
219
|
+
--md-primary-fg-color--light: #ECB7B7;
|
|
220
|
+
--md-primary-fg-color--dark: #90030C;
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Custom Color Scheme
|
|
225
|
+
|
|
226
|
+
```css
|
|
227
|
+
[data-md-color-scheme="my-scheme"] {
|
|
228
|
+
--md-primary-fg-color: #EE0F0F;
|
|
229
|
+
/* ... */
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* Tune dark scheme hue */
|
|
233
|
+
[data-md-color-scheme="slate"] {
|
|
234
|
+
--md-hue: 210; /* 0-360 */
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Fonts
|
|
239
|
+
|
|
240
|
+
```toml
|
|
241
|
+
[project.theme]
|
|
242
|
+
font.text = "Inter" # Body text (any Google Font)
|
|
243
|
+
font.code = "JetBrains Mono" # Code blocks (any Google Font)
|
|
244
|
+
# font = false # Disable Google Fonts, use system fonts
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Custom fonts via CSS:
|
|
248
|
+
```css
|
|
249
|
+
:root {
|
|
250
|
+
--md-text-font: "My Custom Font";
|
|
251
|
+
--md-code-font: "My Mono Font";
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Logo & Icons
|
|
256
|
+
|
|
257
|
+
```toml
|
|
258
|
+
[project.theme]
|
|
259
|
+
logo = "images/logo.png" # Image file in docs/
|
|
260
|
+
favicon = "images/favicon.png"
|
|
261
|
+
|
|
262
|
+
[project.theme.icon]
|
|
263
|
+
logo = "lucide/smile" # Or use a bundled icon
|
|
264
|
+
repo = "fontawesome/brands/github" # Repository icon
|
|
265
|
+
edit = "material/pencil" # Edit page button
|
|
266
|
+
view = "material/eye" # View source button
|
|
267
|
+
previous = "fontawesome/solid/angle-left"
|
|
268
|
+
next = "fontawesome/solid/angle-right"
|
|
269
|
+
|
|
270
|
+
[project.extra]
|
|
271
|
+
homepage = "https://example.com" # Override logo link target
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Bundled Icon Sets
|
|
275
|
+
|
|
276
|
+
- Lucide, Material Design, FontAwesome, Octicons, Simple Icons
|
|
277
|
+
- Over 10,000 icons available
|
|
278
|
+
|
|
279
|
+
### Adding Custom Icons
|
|
280
|
+
|
|
281
|
+
Place SVGs in `overrides/.icons/<set-name>/`:
|
|
282
|
+
```toml
|
|
283
|
+
[project.theme]
|
|
284
|
+
custom_dir = "overrides"
|
|
285
|
+
|
|
286
|
+
[project.markdown_extensions.pymdownx.emoji]
|
|
287
|
+
emoji_index = "zensical.extensions.emoji.twemoji"
|
|
288
|
+
emoji_generator = "zensical.extensions.emoji.to_svg"
|
|
289
|
+
options.custom_icons = ["overrides/.icons"]
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Language
|
|
293
|
+
|
|
294
|
+
```toml
|
|
295
|
+
[project.theme]
|
|
296
|
+
language = "en" # 60+ languages supported
|
|
297
|
+
direction = "ltr" # or "rtl"
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Language Selector
|
|
301
|
+
|
|
302
|
+
```toml
|
|
303
|
+
[project.extra]
|
|
304
|
+
alternate = [
|
|
305
|
+
{ name = "English", link = "/en/", lang = "en" },
|
|
306
|
+
{ name = "Deutsch", link = "/de/", lang = "de" }
|
|
307
|
+
]
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## Repository Integration
|
|
311
|
+
|
|
312
|
+
```toml
|
|
313
|
+
[project]
|
|
314
|
+
repo_url = "https://github.com/org/repo"
|
|
315
|
+
repo_name = "org/repo"
|
|
316
|
+
edit_uri = "edit/main/docs/"
|
|
317
|
+
|
|
318
|
+
[project.theme]
|
|
319
|
+
features = [
|
|
320
|
+
"content.action.edit", # Edit this page button
|
|
321
|
+
"content.action.view" # View source button
|
|
322
|
+
]
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Footer
|
|
326
|
+
|
|
327
|
+
```toml
|
|
328
|
+
[project]
|
|
329
|
+
copyright = "Copyright © 2025 My Company"
|
|
330
|
+
|
|
331
|
+
[project.theme]
|
|
332
|
+
features = ["navigation.footer"]
|
|
333
|
+
|
|
334
|
+
[[project.extra.social]]
|
|
335
|
+
icon = "fontawesome/brands/github"
|
|
336
|
+
link = "https://github.com/org"
|
|
337
|
+
|
|
338
|
+
[[project.extra.social]]
|
|
339
|
+
icon = "fontawesome/brands/x-twitter"
|
|
340
|
+
link = "https://x.com/handle"
|
|
341
|
+
name = "Company on X"
|
|
342
|
+
|
|
343
|
+
[project.extra]
|
|
344
|
+
generator = false # Remove "Made with Zensical" (consider keeping it!)
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## Search
|
|
348
|
+
|
|
349
|
+
Built-in, enabled by default. English only currently.
|
|
350
|
+
|
|
351
|
+
```toml
|
|
352
|
+
[project.theme]
|
|
353
|
+
features = ["search.highlight"] # Highlight search terms on result pages
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Header
|
|
357
|
+
|
|
358
|
+
```toml
|
|
359
|
+
[project.theme]
|
|
360
|
+
features = [
|
|
361
|
+
"header.autohide", # Hide header on scroll down
|
|
362
|
+
"announce.dismiss" # Dismissable announcement bar
|
|
363
|
+
]
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
Announcement bar via template override:
|
|
367
|
+
```html
|
|
368
|
+
<!-- overrides/main.html -->
|
|
369
|
+
{% extends "base.html" %}
|
|
370
|
+
{% block announce %}
|
|
371
|
+
Your announcement here!
|
|
372
|
+
{% endblock %}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## Analytics
|
|
376
|
+
|
|
377
|
+
```toml
|
|
378
|
+
[project.extra.analytics]
|
|
379
|
+
provider = "google"
|
|
380
|
+
property = "G-XXXXXXXXXX"
|
|
381
|
+
|
|
382
|
+
[project.extra.analytics.feedback]
|
|
383
|
+
title = "Was this page helpful?"
|
|
384
|
+
|
|
385
|
+
[[project.extra.analytics.feedback.ratings]]
|
|
386
|
+
icon = "material/emoticon-happy-outline"
|
|
387
|
+
name = "This page was helpful"
|
|
388
|
+
data = 1
|
|
389
|
+
note = "Thanks for your feedback!"
|
|
390
|
+
|
|
391
|
+
[[project.extra.analytics.feedback.ratings]]
|
|
392
|
+
icon = "material/emoticon-sad-outline"
|
|
393
|
+
name = "This page could be improved"
|
|
394
|
+
data = 0
|
|
395
|
+
note = "Thanks for your feedback!"
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
## Data Privacy / Cookie Consent
|
|
399
|
+
|
|
400
|
+
```toml
|
|
401
|
+
[project.extra.consent]
|
|
402
|
+
title = "Cookie consent"
|
|
403
|
+
description = "We use cookies to measure our docs effectiveness."
|
|
404
|
+
actions = ["accept", "manage"]
|
|
405
|
+
|
|
406
|
+
[project.extra.consent.cookies]
|
|
407
|
+
analytics = "Google Analytics"
|
|
408
|
+
custom = "Custom cookie"
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
Change cookie settings link in footer:
|
|
412
|
+
```toml
|
|
413
|
+
[project]
|
|
414
|
+
copyright = """
|
|
415
|
+
Copyright © 2025 –
|
|
416
|
+
<a href="#__consent">Change cookie settings</a>
|
|
417
|
+
"""
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
## Tags
|
|
421
|
+
|
|
422
|
+
Tags work by default. Add to pages via front matter:
|
|
423
|
+
```yaml
|
|
424
|
+
---
|
|
425
|
+
tags:
|
|
426
|
+
- Setup
|
|
427
|
+
- Getting started
|
|
428
|
+
---
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
Tag icons:
|
|
432
|
+
```toml
|
|
433
|
+
[project.extra.tags]
|
|
434
|
+
HTML5 = "html"
|
|
435
|
+
|
|
436
|
+
[project.theme.icon.tag]
|
|
437
|
+
default = "lucide/hash"
|
|
438
|
+
html = "fontawesome/brands/html5"
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## Offline Usage
|
|
442
|
+
|
|
443
|
+
```toml
|
|
444
|
+
[project.plugins.offline]
|
|
445
|
+
# enabled = false # To disable
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Limitations: disable instant navigation, analytics, repo info, comments.
|
|
449
|
+
|
|
450
|
+
## Custom CSS & JavaScript
|
|
451
|
+
|
|
452
|
+
```toml
|
|
453
|
+
[project]
|
|
454
|
+
extra_css = ["stylesheets/extra.css"]
|
|
455
|
+
extra_javascript = ["javascripts/extra.js"]
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
JavaScript modules:
|
|
459
|
+
```toml
|
|
460
|
+
[[project.extra_javascript]]
|
|
461
|
+
path = "javascripts/extra.js"
|
|
462
|
+
type = "module"
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
Async scripts:
|
|
466
|
+
```toml
|
|
467
|
+
[[project.extra_javascript]]
|
|
468
|
+
path = "javascripts/extra.js"
|
|
469
|
+
async = true
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
Important: use `document$` observable for instant navigation compatibility:
|
|
473
|
+
```javascript
|
|
474
|
+
document$.subscribe(function() {
|
|
475
|
+
console.log("Initialize third-party libraries here")
|
|
476
|
+
})
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
## Template Overrides
|
|
480
|
+
|
|
481
|
+
```toml
|
|
482
|
+
[project.theme]
|
|
483
|
+
custom_dir = "overrides"
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Override Blocks (recommended)
|
|
487
|
+
|
|
488
|
+
```html
|
|
489
|
+
<!-- overrides/main.html -->
|
|
490
|
+
{% extends "base.html" %}
|
|
491
|
+
|
|
492
|
+
{% block htmltitle %}
|
|
493
|
+
<title>Custom Title</title>
|
|
494
|
+
{% endblock %}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
Available blocks: `analytics`, `announce`, `config`, `container`, `content`,
|
|
498
|
+
`extrahead`, `fonts`, `footer`, `header`, `hero`, `htmltitle`, `libs`,
|
|
499
|
+
`outdated`, `scripts`, `site_meta`, `site_nav`, `styles`, `tabs`.
|
|
500
|
+
|
|
501
|
+
### Override Partials
|
|
502
|
+
|
|
503
|
+
Place files in `overrides/partials/` matching the theme's partial structure.
|
|
504
|
+
|
|
505
|
+
### Custom Templates (per page)
|
|
506
|
+
|
|
507
|
+
```yaml
|
|
508
|
+
---
|
|
509
|
+
template: my_template.html
|
|
510
|
+
---
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### Custom 404 Page
|
|
514
|
+
|
|
515
|
+
Place `404.html` in the overrides directory.
|
|
516
|
+
|
|
517
|
+
## Markdown Extensions (Default Configuration)
|
|
518
|
+
|
|
519
|
+
Zensical has sensible defaults. If you need to customize, here is the full
|
|
520
|
+
default expansion you can use as a starting point:
|
|
521
|
+
|
|
522
|
+
```toml
|
|
523
|
+
[project.markdown_extensions.abbr]
|
|
524
|
+
[project.markdown_extensions.admonition]
|
|
525
|
+
[project.markdown_extensions.attr_list]
|
|
526
|
+
[project.markdown_extensions.def_list]
|
|
527
|
+
[project.markdown_extensions.footnotes]
|
|
528
|
+
[project.markdown_extensions.md_in_html]
|
|
529
|
+
[project.markdown_extensions.toc]
|
|
530
|
+
permalink = true
|
|
531
|
+
[project.markdown_extensions.pymdownx.arithmatex]
|
|
532
|
+
generic = true
|
|
533
|
+
[project.markdown_extensions.pymdownx.betterem]
|
|
534
|
+
smart_enable = "all"
|
|
535
|
+
[project.markdown_extensions.pymdownx.caret]
|
|
536
|
+
[project.markdown_extensions.pymdownx.details]
|
|
537
|
+
[project.markdown_extensions.pymdownx.emoji]
|
|
538
|
+
emoji_generator = "zensical.extensions.emoji.to_svg"
|
|
539
|
+
emoji_index = "zensical.extensions.emoji.twemoji"
|
|
540
|
+
[project.markdown_extensions.pymdownx.highlight]
|
|
541
|
+
[project.markdown_extensions.pymdownx.inlinehilite]
|
|
542
|
+
[project.markdown_extensions.pymdownx.keys]
|
|
543
|
+
[project.markdown_extensions.pymdownx.mark]
|
|
544
|
+
[project.markdown_extensions.pymdownx.smartsymbols]
|
|
545
|
+
[project.markdown_extensions.pymdownx.superfences]
|
|
546
|
+
[project.markdown_extensions.pymdownx.tabbed]
|
|
547
|
+
alternate_style = true
|
|
548
|
+
[project.markdown_extensions.pymdownx.tasklist]
|
|
549
|
+
custom_checkbox = true
|
|
550
|
+
[project.markdown_extensions.pymdownx.tilde]
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
To reset to MkDocs defaults (no extensions):
|
|
554
|
+
```toml
|
|
555
|
+
[project]
|
|
556
|
+
markdown_extensions = {}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
## Deployment
|
|
560
|
+
|
|
561
|
+
### GitHub Pages (GitHub Actions)
|
|
562
|
+
|
|
563
|
+
```yaml
|
|
564
|
+
# .github/workflows/docs.yml
|
|
565
|
+
name: Documentation
|
|
566
|
+
on:
|
|
567
|
+
push:
|
|
568
|
+
branches: [master, main]
|
|
569
|
+
permissions:
|
|
570
|
+
contents: read
|
|
571
|
+
pages: write
|
|
572
|
+
id-token: write
|
|
573
|
+
jobs:
|
|
574
|
+
deploy:
|
|
575
|
+
environment:
|
|
576
|
+
name: github-pages
|
|
577
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
578
|
+
runs-on: ubuntu-latest
|
|
579
|
+
steps:
|
|
580
|
+
- uses: actions/configure-pages@v5
|
|
581
|
+
- uses: actions/checkout@v5
|
|
582
|
+
- uses: actions/setup-python@v5
|
|
583
|
+
with:
|
|
584
|
+
python-version: 3.x
|
|
585
|
+
- run: pip install zensical
|
|
586
|
+
- run: zensical build --clean
|
|
587
|
+
- uses: actions/upload-pages-artifact@v4
|
|
588
|
+
with:
|
|
589
|
+
path: site
|
|
590
|
+
- uses: actions/deploy-pages@v4
|
|
591
|
+
id: deployment
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
Site appears at `<username>.github.io/<repository>`.
|
|
595
|
+
|
|
596
|
+
### GitLab Pages
|
|
597
|
+
|
|
598
|
+
```yaml
|
|
599
|
+
# .gitlab-ci.yml
|
|
600
|
+
pages:
|
|
601
|
+
stage: deploy
|
|
602
|
+
image: python:latest
|
|
603
|
+
script:
|
|
604
|
+
- pip install zensical
|
|
605
|
+
- zensical build --clean
|
|
606
|
+
pages:
|
|
607
|
+
publish: public
|
|
608
|
+
rules:
|
|
609
|
+
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
**Important:** Set `site_dir = "public"` for GitLab Pages.
|
|
613
|
+
|
|
614
|
+
Site appears at `<username>.gitlab.io/<repository>`.
|
|
615
|
+
|
|
616
|
+
## Content Area Width
|
|
617
|
+
|
|
618
|
+
```css
|
|
619
|
+
/* docs/stylesheets/extra.css */
|
|
620
|
+
.md-grid {
|
|
621
|
+
max-width: 1440px;
|
|
622
|
+
/* Or: max-width: initial; for full width */
|
|
623
|
+
}
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
## mkdocstrings (API docs)
|
|
627
|
+
|
|
628
|
+
```bash
|
|
629
|
+
pip install mkdocstrings-python
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
```toml
|
|
633
|
+
[project.plugins.mkdocstrings.handlers.python]
|
|
634
|
+
paths = ["src"]
|
|
635
|
+
inventories = ["https://docs.python.org/3/objects.inv"]
|
|
636
|
+
|
|
637
|
+
[project.plugins.mkdocstrings.handlers.python.options]
|
|
638
|
+
docstring_style = "google"
|
|
639
|
+
inherited_members = true
|
|
640
|
+
show_source = false
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
## Comment System (Giscus example)
|
|
644
|
+
|
|
645
|
+
Override `partials/comments.html` with the Giscus script, then enable per page:
|
|
646
|
+
```yaml
|
|
647
|
+
---
|
|
648
|
+
comments: true
|
|
649
|
+
---
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
## CLI Reference
|
|
653
|
+
|
|
654
|
+
| Command | Purpose |
|
|
655
|
+
|---------|---------|
|
|
656
|
+
| `zensical new <dir>` | Create new project |
|
|
657
|
+
| `zensical serve` | Preview with live reload |
|
|
658
|
+
| `zensical serve -o` | Preview and open browser |
|
|
659
|
+
| `zensical serve -a localhost:3000` | Custom address |
|
|
660
|
+
| `zensical build` | Build static site |
|
|
661
|
+
| `zensical build --clean` | Build with cache cleaning |
|
|
662
|
+
| `zensical build -f path/to/config` | Use specific config file |
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: Bump version
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
|
|
6
|
+
jobs:
|
|
7
|
+
bump:
|
|
8
|
+
runs-on: ubuntu-latest
|
|
9
|
+
steps:
|
|
10
|
+
- uses: actions/checkout@v4
|
|
11
|
+
with:
|
|
12
|
+
fetch-depth: 0
|
|
13
|
+
token: "${{ secrets.GH_TOKEN }}"
|
|
14
|
+
|
|
15
|
+
- name: Install commitizen
|
|
16
|
+
run: pip install commitizen --quiet
|
|
17
|
+
|
|
18
|
+
- name: Detect partial bump
|
|
19
|
+
id: detect
|
|
20
|
+
run: |
|
|
21
|
+
PROJECT_VERSION=$(cz version --project)
|
|
22
|
+
# Only match tags in the current format (no 'v' prefix) to avoid false
|
|
23
|
+
# positives from legacy v-prefixed tags.
|
|
24
|
+
LATEST_TAG=$(git tag --sort=-version:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | head -1)
|
|
25
|
+
if [ -n "$LATEST_TAG" ] && [ "$LATEST_TAG" != "$PROJECT_VERSION" ]; then
|
|
26
|
+
echo "partial=true" >> $GITHUB_OUTPUT
|
|
27
|
+
echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT
|
|
28
|
+
else
|
|
29
|
+
echo "partial=false" >> $GITHUB_OUTPUT
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
- name: Bump version
|
|
33
|
+
if: steps.detect.outputs.partial != 'true'
|
|
34
|
+
uses: commitizen-tools/commitizen-action@master
|
|
35
|
+
with:
|
|
36
|
+
github_token: ${{ secrets.GH_TOKEN }}
|
|
37
|
+
|
|
38
|
+
- name: Fix partial bump (tag exists on remote, update files only)
|
|
39
|
+
if: steps.detect.outputs.partial == 'true'
|
|
40
|
+
run: |
|
|
41
|
+
git config user.name "github-actions[bot]"
|
|
42
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
43
|
+
NEW_VERSION="${{ steps.detect.outputs.tag }}"
|
|
44
|
+
cz bump --files-only --yes
|
|
45
|
+
BUMPED_VERSION=$(cz version --project)
|
|
46
|
+
git add pyproject.toml CHANGELOG.md
|
|
47
|
+
git commit -m "bump: version $NEW_VERSION"
|
|
48
|
+
git push origin main
|
|
49
|
+
git push origin "$BUMPED_VERSION"
|