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.
Files changed (88) hide show
  1. seqpro-0.11.0/.claude/skills/zensical-setup/.skillfish.json +10 -0
  2. seqpro-0.11.0/.claude/skills/zensical-setup/SKILL.md +662 -0
  3. seqpro-0.11.0/.github/workflows/bump.yaml +49 -0
  4. seqpro-0.11.0/.github/workflows/docs.yml +59 -0
  5. seqpro-0.11.0/.github/workflows/lint.yaml +9 -0
  6. {seqpro-0.9.0 → seqpro-0.11.0}/.github/workflows/merge.yaml +2 -4
  7. {seqpro-0.9.0 → seqpro-0.11.0}/.github/workflows/publish.yaml +73 -65
  8. seqpro-0.11.0/.github/workflows/release.yaml +49 -0
  9. {seqpro-0.9.0 → seqpro-0.11.0}/.github/workflows/test.yaml +4 -4
  10. {seqpro-0.9.0 → seqpro-0.11.0}/.pre-commit-config.yaml +13 -3
  11. {seqpro-0.9.0 → seqpro-0.11.0}/CHANGELOG.md +48 -0
  12. seqpro-0.11.0/CLAUDE.md +74 -0
  13. {seqpro-0.9.0 → seqpro-0.11.0}/PKG-INFO +6 -4
  14. seqpro-0.11.0/README.md +82 -0
  15. seqpro-0.11.0/docs/api/alphabets.md +14 -0
  16. seqpro-0.11.0/docs/api/bed.md +5 -0
  17. seqpro-0.11.0/docs/api/gtf.md +8 -0
  18. seqpro-0.11.0/docs/api/index.md +23 -0
  19. seqpro-0.11.0/docs/api/ragged.md +9 -0
  20. seqpro-0.11.0/docs/api/types.md +13 -0
  21. seqpro-0.11.0/docs/index.md +77 -0
  22. seqpro-0.11.0/docs/ragged.md +192 -0
  23. seqpro-0.11.0/docs/superpowers/plans/2026-05-04-ragged-record-array.md +338 -0
  24. seqpro-0.11.0/docs/superpowers/plans/2026-05-05-documentation-site.md +356 -0
  25. seqpro-0.11.0/docs/superpowers/plans/2026-05-05-narwhals-coord-schema.md +971 -0
  26. seqpro-0.11.0/docs/superpowers/plans/2026-05-05-ragged-zip-and-record-introspection.md +597 -0
  27. seqpro-0.11.0/docs/superpowers/specs/2026-05-04-ragged-record-array-design.md +121 -0
  28. seqpro-0.11.0/docs/superpowers/specs/2026-05-05-documentation-site-design.md +108 -0
  29. seqpro-0.11.0/docs/superpowers/specs/2026-05-05-narwhals-coord-schema-design.md +153 -0
  30. seqpro-0.11.0/docs/superpowers/specs/2026-05-05-ragged-zip-and-record-introspection-design.md +94 -0
  31. seqpro-0.11.0/pixi.lock +10819 -0
  32. {seqpro-0.9.0 → seqpro-0.11.0}/pixi.toml +24 -30
  33. {seqpro-0.9.0 → seqpro-0.11.0}/pyproject.toml +13 -6
  34. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/__init__.py +22 -17
  35. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_analyzers.py +32 -34
  36. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_cleaners.py +11 -13
  37. seqpro-0.11.0/python/seqpro/_coords.py +141 -0
  38. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_encoders.py +41 -35
  39. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_modifiers.py +54 -48
  40. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_numba.py +61 -22
  41. seqpro-0.11.0/python/seqpro/_types.py +5 -0
  42. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/_utils.py +45 -13
  43. seqpro-0.11.0/python/seqpro/alphabets/_alphabets.py +468 -0
  44. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/bed.py +73 -37
  45. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/experimental/_experimental.py +5 -8
  46. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/gtf.py +13 -3
  47. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/rag/__init__.py +5 -5
  48. seqpro-0.11.0/python/seqpro/rag/_array.py +845 -0
  49. seqpro-0.11.0/python/seqpro/rag/_types.py +5 -0
  50. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/rag/_utils.py +4 -6
  51. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/transforms/__init__.py +1 -1
  52. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/transforms/augmentation.py +9 -7
  53. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/transforms/tmm.py +16 -16
  54. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/xr/__init__.py +23 -25
  55. {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_pyranges.py +17 -1
  56. {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_read.py +29 -0
  57. {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_sort.py +14 -0
  58. {seqpro-0.9.0 → seqpro-0.11.0}/tests/bed/test_with_length.py +9 -0
  59. seqpro-0.11.0/tests/test_coords.py +288 -0
  60. seqpro-0.11.0/tests/test_ragged.py +287 -0
  61. seqpro-0.11.0/tests/test_translate.py +167 -0
  62. seqpro-0.11.0/zensical.toml +71 -0
  63. seqpro-0.9.0/.github/workflows/bump.yaml +0 -27
  64. seqpro-0.9.0/README.md +0 -61
  65. seqpro-0.9.0/pixi.lock +0 -8182
  66. seqpro-0.9.0/python/seqpro/_types.py +0 -4
  67. seqpro-0.9.0/python/seqpro/alphabets/_alphabets.py +0 -384
  68. seqpro-0.9.0/python/seqpro/rag/_array.py +0 -493
  69. seqpro-0.9.0/python/seqpro/rag/_types.py +0 -7
  70. seqpro-0.9.0/tests/test_ragged.py +0 -72
  71. seqpro-0.9.0/tests/test_translate.py +0 -74
  72. {seqpro-0.9.0 → seqpro-0.11.0}/.gitattributes +0 -0
  73. {seqpro-0.9.0 → seqpro-0.11.0}/.gitignore +0 -0
  74. {seqpro-0.9.0 → seqpro-0.11.0}/Cargo.lock +0 -0
  75. {seqpro-0.9.0 → seqpro-0.11.0}/Cargo.toml +0 -0
  76. {seqpro-0.9.0 → seqpro-0.11.0}/LICENSE +0 -0
  77. {seqpro-0.9.0 → seqpro-0.11.0}/meta.yaml +0 -0
  78. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/alphabets/__init__.py +3 -3
  79. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/experimental/_visualizers.py +0 -0
  80. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/py.typed +0 -0
  81. {seqpro-0.9.0 → seqpro-0.11.0}/python/seqpro/rag/_gufuncs.py +0 -0
  82. {seqpro-0.9.0 → seqpro-0.11.0}/src/kshuffle.rs +0 -0
  83. {seqpro-0.9.0 → seqpro-0.11.0}/src/lib.rs +0 -0
  84. {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_analyzers.py +0 -0
  85. {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_modifiers.py +0 -0
  86. {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_ohe.py +0 -0
  87. {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_tokenize.py +0 -0
  88. {seqpro-0.9.0 → seqpro-0.11.0}/tests/test_transforms.py +0 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 2,
3
+ "name": "zensical-setup",
4
+ "owner": "ai-riksarkivet",
5
+ "repo": "ra-mcp",
6
+ "path": ".claude/skills/zensical-setup",
7
+ "branch": "main",
8
+ "sha": "68889b450a1c796676d02d4eea7649497964d505",
9
+ "source": "manual"
10
+ }
@@ -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 &copy; 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 &copy; 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"