@pagenary/publisher 2026.5.0

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 (147) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +337 -0
  3. package/bin/pagenary.mjs +116 -0
  4. package/build.config.json +5 -0
  5. package/package.json +66 -0
  6. package/scripts/build-site.js +87 -0
  7. package/scripts/build-tenants.js +3569 -0
  8. package/scripts/build.js +99 -0
  9. package/scripts/generate-sections.js +41 -0
  10. package/scripts/lib/seo-generator.js +558 -0
  11. package/scripts/lint-content.js +62 -0
  12. package/scripts/seo-smoke.js +94 -0
  13. package/scripts/serve.js +142 -0
  14. package/site/app.js +1 -0
  15. package/site/index.html +57 -0
  16. package/site/lib/categories.js +1 -0
  17. package/site/lib/export.js +1 -0
  18. package/site/lib/manifest-utils.js +1 -0
  19. package/site/lib/router.js +1 -0
  20. package/site/lib/search.js +1 -0
  21. package/site/llms.txt +22 -0
  22. package/site/manifest.js +132 -0
  23. package/site/mermaid-init.js +1 -0
  24. package/site/pages/api.html +339 -0
  25. package/site/pages/architecture.html +303 -0
  26. package/site/pages/deployment.html +282 -0
  27. package/site/pages/developer-guide.html +157 -0
  28. package/site/pages/extending.html +135 -0
  29. package/site/pages/quickstart.html +318 -0
  30. package/site/pages/seo-strategy.html +121 -0
  31. package/site/pages/tenant-config.html +519 -0
  32. package/site/pages/welcome.html +116 -0
  33. package/site/robots.txt +10 -0
  34. package/site/sections/api.js +3 -0
  35. package/site/sections/architecture.js +3 -0
  36. package/site/sections/deployment.js +3 -0
  37. package/site/sections/developer-guide.js +3 -0
  38. package/site/sections/extending.js +3 -0
  39. package/site/sections/quickstart.js +3 -0
  40. package/site/sections/section-templates.js +1 -0
  41. package/site/sections/seo-strategy.js +3 -0
  42. package/site/sections/tenant-config.js +3 -0
  43. package/site/sections/welcome.js +3 -0
  44. package/site/seo.js +1 -0
  45. package/site/sitemap.xml +63 -0
  46. package/site/styles.css +1982 -0
  47. package/site/syntax-highlight.js +1 -0
  48. package/src/app.js +988 -0
  49. package/src/index.html +56 -0
  50. package/src/lib/categories.js +55 -0
  51. package/src/lib/export.js +195 -0
  52. package/src/lib/manifest-utils.js +69 -0
  53. package/src/lib/router.js +44 -0
  54. package/src/lib/search.js +151 -0
  55. package/src/manifest.js +246 -0
  56. package/src/mermaid-init.js +207 -0
  57. package/src/sections/archive-future-roadmap.js +7 -0
  58. package/src/sections/archive-initiative-alpha.js +7 -0
  59. package/src/sections/archive-milestone-records.js +7 -0
  60. package/src/sections/archive-timeline-overview.js +7 -0
  61. package/src/sections/core-technology-compliance-frameworks.js +7 -0
  62. package/src/sections/core-technology-coordination-model.js +7 -0
  63. package/src/sections/core-technology-data-definitions.js +7 -0
  64. package/src/sections/core-technology-hardware-integration.js +7 -0
  65. package/src/sections/core-technology-integrity-controls.js +7 -0
  66. package/src/sections/core-technology-network-topology.js +7 -0
  67. package/src/sections/core-technology-operator-requirements.js +7 -0
  68. package/src/sections/core-technology-overview.js +7 -0
  69. package/src/sections/core-technology-service-interfaces.js +7 -0
  70. package/src/sections/core-technology-synchronization-strategy.js +7 -0
  71. package/src/sections/core-technology-system-foundation.js +7 -0
  72. package/src/sections/developers-api-credentials.js +7 -0
  73. package/src/sections/developers-api-operations.js +7 -0
  74. package/src/sections/developers-api-reference.js +7 -0
  75. package/src/sections/developers-api-websocket.js +7 -0
  76. package/src/sections/developers-automation-blueprints.js +7 -0
  77. package/src/sections/developers-automation-modules.js +7 -0
  78. package/src/sections/developers-automation-patterns.js +7 -0
  79. package/src/sections/developers-deployment-playbook.js +7 -0
  80. package/src/sections/developers-overview.js +7 -0
  81. package/src/sections/developers-scheduling-patterns.js +7 -0
  82. package/src/sections/developers-sdk-go.js +7 -0
  83. package/src/sections/developers-sdk-javascript.js +7 -0
  84. package/src/sections/developers-sdk-python.js +7 -0
  85. package/src/sections/developers-sdk-rust.js +7 -0
  86. package/src/sections/developers-sdks.js +7 -0
  87. package/src/sections/developers-solution-examples.js +7 -0
  88. package/src/sections/developers-testing-framework.js +7 -0
  89. package/src/sections/getting-started-architecture-basics.js +7 -0
  90. package/src/sections/getting-started-introduction.js +7 -0
  91. package/src/sections/getting-started-performance-overview.js +7 -0
  92. package/src/sections/governance-community-initiatives.js +7 -0
  93. package/src/sections/governance-dao-overview.js +7 -0
  94. package/src/sections/governance-multi-token.js +7 -0
  95. package/src/sections/governance-overview.js +7 -0
  96. package/src/sections/governance-proposal-process.js +7 -0
  97. package/src/sections/governance-proposals.js +7 -0
  98. package/src/sections/governance-structure.js +7 -0
  99. package/src/sections/governance-token-distribution.js +7 -0
  100. package/src/sections/governance-treasury.js +7 -0
  101. package/src/sections/operations-environment-prep.js +7 -0
  102. package/src/sections/operations-getting-started.js +7 -0
  103. package/src/sections/operations-incentives-guide.js +7 -0
  104. package/src/sections/operations-incentives-strategies.js +7 -0
  105. package/src/sections/operations-incentives.js +7 -0
  106. package/src/sections/operations-infrastructure.js +7 -0
  107. package/src/sections/operations-monitoring.js +7 -0
  108. package/src/sections/operations-overview.js +7 -0
  109. package/src/sections/operations-performance.js +7 -0
  110. package/src/sections/operations-power-infrastructure.js +7 -0
  111. package/src/sections/operations-setup-guide.js +7 -0
  112. package/src/sections/operations-sync-setup.js +7 -0
  113. package/src/sections/products-flagship-solution.js +7 -0
  114. package/src/sections/products-solution-library.js +7 -0
  115. package/src/sections/resources-brand-assets.js +7 -0
  116. package/src/sections/resources-faq.js +7 -0
  117. package/src/sections/resources-glossary.js +7 -0
  118. package/src/sections/resources-research-papers.js +7 -0
  119. package/src/sections/section-templates.js +873 -0
  120. package/src/sections/security-audits.js +7 -0
  121. package/src/sections/security-best-practices.js +7 -0
  122. package/src/sections/security-bug-bounty.js +7 -0
  123. package/src/sections/security-incident-response.js +7 -0
  124. package/src/sections/security-overview.js +7 -0
  125. package/src/sections/technical-architecture.js +7 -0
  126. package/src/sections/technical-whitepaper.js +7 -0
  127. package/src/sections/tutorial-automation-bot.js +7 -0
  128. package/src/sections/tutorial-build-first-integration.js +7 -0
  129. package/src/sections/tutorial-deploy-automation.js +7 -0
  130. package/src/sections/tutorial-event-driven-experience.js +7 -0
  131. package/src/sections/tutorial-operations-onboarding.js +7 -0
  132. package/src/sections/tutorial-systems-integration.js +7 -0
  133. package/src/sections/tutorials-overview.js +7 -0
  134. package/src/sections/use-case-connected-devices.js +7 -0
  135. package/src/sections/use-case-digital-auctions.js +7 -0
  136. package/src/sections/use-case-financial-automation.js +7 -0
  137. package/src/sections/use-case-interactive-media.js +7 -0
  138. package/src/sections/use-case-realtime-execution.js +7 -0
  139. package/src/sections/use-case-research-analytics.js +7 -0
  140. package/src/sections/use-case-supply-operations.js +7 -0
  141. package/src/sections/use-cases-overview.js +7 -0
  142. package/src/sections/welcome-overview.js +7 -0
  143. package/src/seo.js +90 -0
  144. package/src/styles.css +1982 -0
  145. package/src/syntax-highlight.js +90 -0
  146. package/tenants.json.example +68 -0
  147. package/tenants.schema.json +231 -0
@@ -0,0 +1,519 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Tenant Configuration | Pagenary Docs</title>
7
+ <meta name="description" content="Every config.json option: branding, theming, SEO, and export." />
8
+ <link rel="canonical" href="/#tenant-config" />
9
+
10
+ <!-- Open Graph -->
11
+ <meta property="og:title" content="Tenant Configuration" />
12
+ <meta property="og:description" content="Every config.json option: branding, theming, SEO, and export." />
13
+ <meta property="og:type" content="article" />
14
+ <meta property="og:url" content="/#tenant-config" />
15
+
16
+ <!-- Twitter Card -->
17
+ <meta name="twitter:card" content="summary" />
18
+ <meta name="twitter:title" content="Tenant Configuration" />
19
+ <meta name="twitter:description" content="Every config.json option: branding, theming, SEO, and export." />
20
+
21
+ <!-- Structured Data -->
22
+ <script type="application/ld+json">
23
+ [
24
+ {
25
+ "@context": "https://schema.org",
26
+ "@type": "TechArticle",
27
+ "headline": "Tenant Configuration",
28
+ "description": "Every config.json option: branding, theming, SEO, and export.",
29
+ "url": "/#tenant-config",
30
+ "dateModified": "2026-05-26",
31
+ "mainEntityOfPage": {
32
+ "@type": "WebPage",
33
+ "@id": "/#tenant-config"
34
+ },
35
+ "isPartOf": {
36
+ "@type": "WebSite",
37
+ "name": "Pagenary Docs",
38
+ "url": "/"
39
+ }
40
+ },
41
+ {
42
+ "@context": "https://schema.org",
43
+ "@type": "BreadcrumbList",
44
+ "itemListElement": [
45
+ {
46
+ "@type": "ListItem",
47
+ "position": 1,
48
+ "name": "Home",
49
+ "item": "/"
50
+ },
51
+ {
52
+ "@type": "ListItem",
53
+ "position": 2,
54
+ "name": "Guides",
55
+ "item": "/#guides"
56
+ },
57
+ {
58
+ "@type": "ListItem",
59
+ "position": 3,
60
+ "name": "Tenant Configuration",
61
+ "item": "/#tenant-config"
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ </script>
67
+
68
+ <!-- Redirect to SPA for JavaScript-enabled browsers -->
69
+ <script>
70
+ if (typeof window !== 'undefined') {
71
+ window.location.replace('/#tenant-config');
72
+ }
73
+ </script>
74
+ <noscript>
75
+ <meta http-equiv="refresh" content="0; url=/#tenant-config" />
76
+ </noscript>
77
+
78
+ <link rel="stylesheet" href="../styles.css" />
79
+ <style>
80
+ .static-content { max-width: 800px; margin: 0 auto; padding: 2rem; }
81
+ .static-footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #eee; font-size: 0.9rem; color: #666; }
82
+ </style>
83
+ </head>
84
+ <body>
85
+ <main class="static-content">
86
+ <article>
87
+ <h1>Tenant Configuration</h1>
88
+ <p class="lead">Every config.json option: branding, theming, SEO, and export.</p>
89
+ <div class="section-body">
90
+ <section class="section doc markdown">
91
+ <div class="doc-content">
92
+ <h1 id="tenant-configuration-reference">Tenant Configuration Reference</h1>
93
+ <p>Complete reference for all tenant configuration options.</p>
94
+ <h2 id="tenant-registry-tenantsjson">Tenant Registry (tenants.json)</h2>
95
+ <p>Located at `apps/publisher/tenants.json`, this file registers all tenants:</p>
96
+ <pre><code class="language-json">{
97
+ &quot;tenant-id&quot;: {
98
+ &quot;source&quot;: &quot;/path/to/content&quot;,
99
+ &quot;domain&quot;: &quot;docs.example.com&quot;
100
+ }
101
+ }</code></pre>
102
+ <h3 id="registry-properties">Registry Properties</h3>
103
+ <table><thead><tr><th style="text-align: left">Property</th><th style="text-align: left">Required</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`source`</td><td style="text-align: left">Yes</td><td style="text-align: left">Path to tenant content directory</td></tr><tr><td style="text-align: left">`domain`</td><td style="text-align: left">No</td><td style="text-align: left">Custom domain for Caddy routing</td></tr></tbody></table>
104
+ <h3 id="source-types">Source Types</h3>
105
+ <p><strong>Local Path:</strong></p>
106
+ <pre><code class="language-json">{
107
+ &quot;my-docs&quot;: {
108
+ &quot;source&quot;: &quot;/home/user/my-docs&quot;
109
+ }
110
+ }</code></pre>
111
+ <p><strong>Git Repository:</strong></p>
112
+ <pre><code class="language-json">{
113
+ &quot;my-docs&quot;: {
114
+ &quot;source&quot;: &quot;git:https://github.com/org/my-docs.git#main&quot;
115
+ }
116
+ }</code></pre>
117
+ <p>Format: `git:&lt;repo-url&gt;#&lt;branch&gt;`</p>
118
+ <p>Git sources are cloned to a cache directory and updated on each build.</p>
119
+ <h2 id="tenant-directory-structure">Tenant Directory Structure</h2>
120
+ <pre><code>my-tenant/
121
+ ├── config.json # Branding and theme (required)
122
+ ├── manifest.json # Navigation structure (optional)
123
+ ├── content/ # Content files
124
+ │ ├── *.md # Markdown files
125
+ │ ├── *.html # HTML files
126
+ │ ├── *.js # JavaScript modules
127
+ │ └── section/ # Nested directories
128
+ │ └── _manifest.json
129
+ ├── .public/ # Static assets (optional)
130
+ │ ├── favicon.ico # Favicons copied to dist root
131
+ │ ├── logo.svg # Assets copied to dist/assets/
132
+ │ └── icons/ # Subdirectories preserved
133
+ └── overrides/ # Post-build replacements (optional)
134
+ └── styles.css # Replace built files</code></pre>
135
+ <h2 id="branding-configuration-configjson">Branding Configuration (config.json)</h2>
136
+ <h3 id="complete-example">Complete Example</h3>
137
+ <pre><code class="language-json">{
138
+ &quot;title&quot;: &quot;ACME Documentation&quot;,
139
+ &quot;description&quot;: &quot;Complete guide to the ACME platform&quot;,
140
+ &quot;brandMark&quot;: &quot;ACME&quot;,
141
+ &quot;brandSub&quot;: &quot;Docs&quot;,
142
+ &quot;tagline&quot;: &quot;Build better, faster&quot;,
143
+ &quot;copyright&quot;: &quot;ACME Corporation&quot;,
144
+ &quot;accentColor&quot;: &quot;#6366F1&quot;,
145
+ &quot;surfaceColor&quot;: &quot;#F7FAFC&quot;
146
+ }</code></pre>
147
+ <h3 id="properties-reference">Properties Reference</h3>
148
+ <h4 id="site-metadata">Site Metadata</h4>
149
+ <table><thead><tr><th style="text-align: left">Property</th><th style="text-align: left">Type</th><th style="text-align: left">Default</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`title`</td><td style="text-align: left">string</td><td style="text-align: left">&quot;Docs Toolkit&quot;</td><td style="text-align: left">Browser tab title and header</td></tr><tr><td style="text-align: left">`description`</td><td style="text-align: left">string</td><td style="text-align: left">-</td><td style="text-align: left">Meta description for SEO</td></tr></tbody></table>
150
+ <h4 id="branding">Branding</h4>
151
+ <table><thead><tr><th style="text-align: left">Property</th><th style="text-align: left">Type</th><th style="text-align: left">Default</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`brandMark`</td><td style="text-align: left">string</td><td style="text-align: left">&quot;DOCS&quot;</td><td style="text-align: left">Primary brand text (bold, uppercase)</td></tr><tr><td style="text-align: left">`brandSub`</td><td style="text-align: left">string</td><td style="text-align: left">&quot;TOOLKIT&quot;</td><td style="text-align: left">Secondary brand text (light weight)</td></tr><tr><td style="text-align: left">`tagline`</td><td style="text-align: left">string</td><td style="text-align: left">-</td><td style="text-align: left">Subtitle displayed under brand</td></tr><tr><td style="text-align: left">`copyright`</td><td style="text-align: left">string</td><td style="text-align: left">&quot;Modular Documentation Toolkit&quot;</td><td style="text-align: left">Footer copyright text</td></tr></tbody></table>
152
+ <h4 id="theme-colors">Theme Colors</h4>
153
+ <table><thead><tr><th style="text-align: left">Property</th><th style="text-align: left">Type</th><th style="text-align: left">Default</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`accentColor`</td><td style="text-align: left">hex string</td><td style="text-align: left">&quot;#111111&quot;</td><td style="text-align: left">Links, buttons, active states</td></tr><tr><td style="text-align: left">`surfaceColor`</td><td style="text-align: left">hex string</td><td style="text-align: left">&quot;#ffffff&quot;</td><td style="text-align: left">Page background color</td></tr></tbody></table>
154
+ <p>Color values must be 6-digit hex codes (e.g., `#6366F1`).</p>
155
+ <h2 id="navigation-manifest-manifestjson">Navigation Manifest (manifest.json)</h2>
156
+ <h3 id="root-manifest">Root Manifest</h3>
157
+ <p>Located at tenant root, defines top-level navigation:</p>
158
+ <pre><code class="language-json">[
159
+ {
160
+ &quot;id&quot;: &quot;welcome&quot;,
161
+ &quot;title&quot;: &quot;Welcome&quot;,
162
+ &quot;summary&quot;: &quot;Introduction to the platform&quot;,
163
+ &quot;file&quot;: &quot;welcome.md&quot;
164
+ },
165
+ {
166
+ &quot;id&quot;: &quot;guides&quot;,
167
+ &quot;title&quot;: &quot;Guides&quot;,
168
+ &quot;summary&quot;: &quot;Step-by-step tutorials&quot;,
169
+ &quot;subsections&quot;: [
170
+ {
171
+ &quot;id&quot;: &quot;guides/getting-started&quot;,
172
+ &quot;title&quot;: &quot;Getting Started&quot;,
173
+ &quot;summary&quot;: &quot;First steps&quot;,
174
+ &quot;file&quot;: &quot;guides/getting-started.md&quot;
175
+ },
176
+ {
177
+ &quot;id&quot;: &quot;guides/advanced&quot;,
178
+ &quot;title&quot;: &quot;Advanced&quot;,
179
+ &quot;file&quot;: &quot;guides/advanced.md&quot;
180
+ }
181
+ ]
182
+ }
183
+ ]</code></pre>
184
+ <h3 id="section-properties">Section Properties</h3>
185
+ <table><thead><tr><th style="text-align: left">Property</th><th style="text-align: left">Required</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`id`</td><td style="text-align: left">Yes*</td><td style="text-align: left">Unique section identifier (used in URLs)</td></tr><tr><td style="text-align: left">`title`</td><td style="text-align: left">Yes</td><td style="text-align: left">Display title in navigation</td></tr><tr><td style="text-align: left">`summary`</td><td style="text-align: left">No</td><td style="text-align: left">Description shown in search results</td></tr><tr><td style="text-align: left">`file`</td><td style="text-align: left">No**</td><td style="text-align: left">Path to content file (relative to `content/`)</td></tr><tr><td style="text-align: left">`url`</td><td style="text-align: left">No**</td><td style="text-align: left">External link URL (opens in new tab)</td></tr><tr><td style="text-align: left">`subsections`</td><td style="text-align: left">No</td><td style="text-align: left">Array of child sections</td></tr><tr><td style="text-align: left">`exclude`</td><td style="text-align: left">No</td><td style="text-align: left">Exclude from build (`true` to skip)</td></tr></tbody></table>
186
+ <p>*Not required for external links</p>
187
+ <p>**Use either `file` OR `url`, not both</p>
188
+ <h3 id="external-links-in-navigation">External Links in Navigation</h3>
189
+ <p>Manifest entries can link to external resources using `url` instead of `id`/`file`:</p>
190
+ <pre><code class="language-json">[
191
+ {
192
+ &quot;id&quot;: &quot;docs&quot;,
193
+ &quot;title&quot;: &quot;Documentation&quot;,
194
+ &quot;file&quot;: &quot;docs.md&quot;
195
+ },
196
+ {
197
+ &quot;title&quot;: &quot;GitHub&quot;,
198
+ &quot;url&quot;: &quot;https://github.com/example/repo&quot;
199
+ },
200
+ {
201
+ &quot;title&quot;: &quot;Support Portal&quot;,
202
+ &quot;url&quot;: &quot;https://support.example.com&quot;
203
+ }
204
+ ]</code></pre>
205
+ <p>External links automatically:</p>
206
+ <ul>
207
+ <li>Open in new tab (`target=&quot;_blank&quot;`)</li>
208
+ <li>Display subtle arrow icon indicator (↗)</li>
209
+ <li>Skip URL hash routing</li>
210
+ </ul>
211
+ <h3 id="section-manifest-manifestjson">Section Manifest (_manifest.json)</h3>
212
+ <p>Located in content subdirectories for nested navigation:</p>
213
+ <pre><code class="language-json">{
214
+ &quot;title&quot;: &quot;API Reference&quot;,
215
+ &quot;summary&quot;: &quot;Complete API documentation&quot;,
216
+ &quot;sections&quot;: [
217
+ {
218
+ &quot;id&quot;: &quot;overview&quot;,
219
+ &quot;title&quot;: &quot;Overview&quot;,
220
+ &quot;file&quot;: &quot;overview.md&quot;
221
+ },
222
+ {
223
+ &quot;id&quot;: &quot;endpoints&quot;,
224
+ &quot;title&quot;: &quot;Endpoints&quot;,
225
+ &quot;file&quot;: &quot;endpoints.md&quot;
226
+ }
227
+ ]
228
+ }</code></pre>
229
+ <h3 id="auto-generated-manifest">Auto-Generated Manifest</h3>
230
+ <p>If no `manifest.json` exists, the build system auto-generates navigation from the `content/` directory structure:</p>
231
+ <ul>
232
+ <li>Files become sections (filename → title)</li>
233
+ <li>Directories become groups</li>
234
+ <li>`_manifest.json` in directories customizes the group</li>
235
+ </ul>
236
+ <h2 id="bottom-navigation">Bottom Navigation</h2>
237
+ <p>Configure bottom navigation bar behavior in root `_manifest.json` or `manifest.json`:</p>
238
+ <pre><code class="language-json">{
239
+ &quot;bottomNav&quot;: &quot;always&quot;,
240
+ &quot;bottomNavSections&quot;: [&quot;getting-started&quot;, &quot;api-reference&quot;, &quot;faq&quot;],
241
+ &quot;sections&quot;: [
242
+ // ... section definitions
243
+ ]
244
+ }</code></pre>
245
+ <h3 id="bottom-navigation-properties">Bottom Navigation Properties</h3>
246
+ <table><thead><tr><th style="text-align: left">Property</th><th style="text-align: left">Type</th><th style="text-align: left">Default</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`bottomNav`</td><td style="text-align: left">string</td><td style="text-align: left">`&quot;mobile&quot;`</td><td style="text-align: left">When to show bottom nav: `&quot;mobile&quot;`, `&quot;always&quot;`, or `&quot;never&quot;`</td></tr><tr><td style="text-align: left">`bottomNavSections`</td><td style="text-align: left">string[]</td><td style="text-align: left">`[]`</td><td style="text-align: left">Section IDs to include (empty array = all sections)</td></tr></tbody></table>
247
+ <p><strong>Behavior:</strong></p>
248
+ <ul>
249
+ <li>`&quot;mobile&quot;` - Show only on small screens (default)</li>
250
+ <li>`&quot;always&quot;` - Show on all screen sizes</li>
251
+ <li>`&quot;never&quot;` - Hide bottom navigation completely</li>
252
+ </ul>
253
+ <p><strong>Examples:</strong></p>
254
+ <p>Show all sections on mobile only (default):</p>
255
+ <pre><code class="language-json">{
256
+ &quot;bottomNav&quot;: &quot;mobile&quot;
257
+ }</code></pre>
258
+ <p>Show specific sections always:</p>
259
+ <pre><code class="language-json">{
260
+ &quot;bottomNav&quot;: &quot;always&quot;,
261
+ &quot;bottomNavSections&quot;: [&quot;home&quot;, &quot;docs&quot;, &quot;api&quot;]
262
+ }</code></pre>
263
+ <p>Hide bottom navigation:</p>
264
+ <pre><code class="language-json">{
265
+ &quot;bottomNav&quot;: &quot;never&quot;
266
+ }</code></pre>
267
+ <h2 id="content-files">Content Files</h2>
268
+ <h3 id="markdown-md">Markdown (.md)</h3>
269
+ <p>Full CommonMark support plus:</p>
270
+ <ul>
271
+ <li>Fenced code blocks with syntax highlighting</li>
272
+ <li>Mermaid diagrams with interactive controls</li>
273
+ <li>Internal links via `#section-id`</li>
274
+ <li>External links auto-open in new tab</li>
275
+ </ul>
276
+ <pre><code class="language-markdown"># Page Title
277
+
278
+ Regular markdown content.
279
+
280
+ ## Code Example
281
+
282
+ \`\`\`javascript
283
+ const x = 1;
284
+ \`\`\`
285
+
286
+ ## Diagram
287
+
288
+ \`\`\`mermaid
289
+ graph LR
290
+ A --&gt; B
291
+ \`\`\`
292
+
293
+ See also: [Getting Started](#guides/getting-started)
294
+
295
+ Learn more: [GitHub](https://github.com/example)</code></pre>
296
+ <h4 id="external-links-in-content">External Links in Content</h4>
297
+ <p>All HTTP/HTTPS links in markdown automatically:</p>
298
+ <ul>
299
+ <li>Open in new tab (`target=&quot;_blank&quot;`)</li>
300
+ <li>Display subtle ↗ indicator via CSS</li>
301
+ <li>Include security attributes (`rel=&quot;noopener noreferrer&quot;`)</li>
302
+ </ul>
303
+ <p><strong>Standard external link:</strong></p>
304
+ <pre><code class="language-markdown">Visit our [GitHub repository](https://github.com/example/repo).</code></pre>
305
+ <p><strong>Prominent call-to-action link:</strong></p>
306
+ <div class="html-block"><a href="https://example.com/signup" class="external-cta">
307
+ Sign Up Now →
308
+ </a></div>
309
+ <p>The `.external-cta` class provides enhanced styling for important external links.</p>
310
+ <h4 id="mermaid-diagrams">Mermaid Diagrams</h4>
311
+ <p>Mermaid diagrams render with interactive controls:</p>
312
+ <p><strong>Features:</strong></p>
313
+ <ul>
314
+ <li><strong>Zoom controls</strong>: +/− buttons for zoom in/out</li>
315
+ <li><strong>Reset button</strong>: ⊙ restores original view</li>
316
+ <li><strong>Pan</strong>: Click and drag to move diagram</li>
317
+ <li><strong>Pinch zoom</strong>: Touch devices support pinch gestures</li>
318
+ <li><strong>Auto-scroll</strong>: Diagrams larger than viewport are scrollable</li>
319
+ </ul>
320
+ <p><strong>Supported diagram types:</strong></p>
321
+ <ul>
322
+ <li>Flowcharts (`graph`, `flowchart`)</li>
323
+ <li>Sequence diagrams (`sequenceDiagram`)</li>
324
+ <li>Class diagrams (`classDiagram`)</li>
325
+ <li>State diagrams (`stateDiagram`)</li>
326
+ <li>ER diagrams (`erDiagram`)</li>
327
+ <li>User journey (`journey`)</li>
328
+ <li>Gantt charts (`gantt`)</li>
329
+ <li>And more (see Mermaid documentation)</li>
330
+ </ul>
331
+ <p><strong>Example:</strong></p>
332
+ <pre><code class="language-markdown">\`\`\`mermaid
333
+ graph TD
334
+ A[Start] --&gt; B{Decision}
335
+ B --&gt;|Yes| C[Action 1]
336
+ B --&gt;|No| D[Action 2]
337
+ C --&gt; E[End]
338
+ D --&gt; E
339
+ \`\`\`</code></pre>
340
+ <h3 id="html-html">HTML (.html)</h3>
341
+ <p>Direct HTML with access to built-in CSS classes:</p>
342
+ <div class="html-block"><section class="section doc markdown">
343
+ <div class="doc-content">
344
+ <h1>Custom Section</h1>
345
+
346
+ <table class="spec-table">
347
+ <thead>
348
+ <tr><th>Feature</th><th>Status</th></tr>
349
+ </thead>
350
+ <tbody>
351
+ <tr><td>Search</td><td>Ready</td></tr>
352
+ </tbody>
353
+ </table>
354
+
355
+ <div class="layer-stack">
356
+ <div class="layer">
357
+ <div class="layer-title">Layer 1</div>
358
+ <div class="layer-desc">Description</div>
359
+ </div>
360
+ </div>
361
+ </div>
362
+ </section></div>
363
+ <h3 id="javascript-js">JavaScript (.js)</h3>
364
+ <p>Dynamic content modules:</p>
365
+ <pre><code class="language-javascript">export async function load() {
366
+ // Fetch data, compute values, etc.
367
+ const data = await fetch(&#39;/api/data.json&#39;).then(r =&gt; r.json());
368
+
369
+ return {
370
+ html: `
371
+ &lt;section class=&quot;section doc&quot;&gt;
372
+ &lt;h1&gt;Dynamic Content&lt;/h1&gt;
373
+ &lt;p&gt;Value: ${data.value}&lt;/p&gt;
374
+ &lt;/section&gt;
375
+ `,
376
+ afterRender(container) {
377
+ // Optional: DOM manipulation after render
378
+ container.querySelector(&#39;button&#39;)?.addEventListener(&#39;click&#39;, () =&gt; {
379
+ // Handle click
380
+ });
381
+ }
382
+ };
383
+ }</code></pre>
384
+ <h2 id="css-classes-reference">CSS Classes Reference</h2>
385
+ <h3 id="layout">Layout</h3>
386
+ <table><thead><tr><th style="text-align: left">Class</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`.section`</td><td style="text-align: left">Section container</td></tr><tr><td style="text-align: left">`.doc`</td><td style="text-align: left">Document-style section</td></tr><tr><td style="text-align: left">`.markdown`</td><td style="text-align: left">Apply markdown typography</td></tr><tr><td style="text-align: left">`.doc-content`</td><td style="text-align: left">Content wrapper</td></tr></tbody></table>
387
+ <h3 id="components">Components</h3>
388
+ <table><thead><tr><th style="text-align: left">Class</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`.spec-table`</td><td style="text-align: left">Styled data table</td></tr><tr><td style="text-align: left">`.layer-stack`</td><td style="text-align: left">Vertical layer diagram</td></tr><tr><td style="text-align: left">`.layer`</td><td style="text-align: left">Individual layer in stack</td></tr><tr><td style="text-align: left">`.layer-title`</td><td style="text-align: left">Layer heading</td></tr><tr><td style="text-align: left">`.layer-desc`</td><td style="text-align: left">Layer description</td></tr><tr><td style="text-align: left">`.card`</td><td style="text-align: left">Card component</td></tr><tr><td style="text-align: left">`.card-grid`</td><td style="text-align: left">Grid of cards</td></tr><tr><td style="text-align: left">`.content-box`</td><td style="text-align: left">Bordered content box</td></tr><tr><td style="text-align: left">`.box-title`</td><td style="text-align: left">Box heading</td></tr><tr><td style="text-align: left">`.html-block`</td><td style="text-align: left">HTML content wrapper</td></tr><tr><td style="text-align: left">`.external-cta`</td><td style="text-align: left">Prominent external link button</td></tr></tbody></table>
389
+ <h3 id="typography">Typography</h3>
390
+ <table><thead><tr><th style="text-align: left">Class</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`.doc-h1` through `.doc-h4`</td><td style="text-align: left">Heading styles</td></tr><tr><td style="text-align: left">`.doc-list`</td><td style="text-align: left">Styled list</td></tr><tr><td style="text-align: left">`.doc-grid`</td><td style="text-align: left">Two-column grid</td></tr></tbody></table>
391
+ <h2 id="overrides-directory">Overrides Directory</h2>
392
+ <p>Files in `overrides/` replace built files after the build completes:</p>
393
+ <pre><code>my-tenant/
394
+ └── overrides/
395
+ ├── styles.css # Replace default styles
396
+ └── favicon.ico # Custom favicon</code></pre>
397
+ <p>Use for:</p>
398
+ <ul>
399
+ <li>Custom stylesheets</li>
400
+ <li>Custom favicons</li>
401
+ <li>Additional assets</li>
402
+ </ul>
403
+ <h2 id="static-assets-public">Static Assets (.public/)</h2>
404
+ <p>The `.public/` directory stores static assets (images, icons, logos) that should be included in the built tenant bundle.</p>
405
+ <h3 id="directory-structure">Directory Structure</h3>
406
+ <pre><code>my-tenant/
407
+ ├── .public/ # Static assets directory
408
+ │ ├── favicon.ico # Copied to dist root
409
+ │ ├── favicon.png # Copied to dist root
410
+ │ ├── logo.svg # Copied to dist/assets/
411
+ │ └── icons/ # Subdirectories preserved
412
+ │ ├── discord.svg
413
+ │ └── github.svg
414
+ ├── config.json
415
+ ├── content/
416
+ └── ...</code></pre>
417
+ <h3 id="build-behavior">Build Behavior</h3>
418
+ <p>During the build process:</p>
419
+ <p>1. <strong>Assets directory creation</strong>: Contents are copied to `dist/&lt;tenant-id&gt;/assets/`</p>
420
+ <p>2. <strong>Favicon handling</strong>: Files matching `favicon.*` (e.g., `favicon.ico`, `favicon.png`, `favicon.svg`) are copied to the dist root (`dist/&lt;tenant-id&gt;/`) for browser auto-detection</p>
421
+ <p>3. <strong>Subdirectory preservation</strong>: Subdirectory structure within `.public/` is maintained in the output</p>
422
+ <h3 id="referencing-assets-in-content">Referencing Assets in Content</h3>
423
+ <p><strong>In Markdown:</strong></p>
424
+ <pre><code class="language-markdown">![Company Logo](./assets/logo.svg)
425
+ ![Product Screenshot](./assets/screenshots/dashboard.png)</code></pre>
426
+ <p><strong>In HTML content:</strong></p>
427
+ <div class="html-block"><img src="./assets/logo.svg" alt="Company Logo">
428
+ <img src="./assets/icons/github.svg" alt="GitHub"></div>
429
+ <p><strong>In CSS (via overrides):</strong></p>
430
+ <pre><code class="language-css">.custom-header {
431
+ background-image: url(./assets/logo.svg);
432
+ }
433
+
434
+ .icon-discord {
435
+ content: url(./assets/icons/discord.svg);
436
+ }</code></pre>
437
+ <h3 id="why-public-instead-of-public">Why .public Instead of public?</h3>
438
+ <p>The dot-prefix (`.public/`) was chosen to:</p>
439
+ <ul>
440
+ <li><strong>Avoid conflicts</strong>: Prevents naming collisions with user&#39;s conventional `public/` directories that might contain user-facing content</li>
441
+ <li><strong>Clear separation</strong>: Distinguishes between tenant assets and potential user content directories</li>
442
+ <li><strong>Build system clarity</strong>: Signals this is a build-time directive, not user-facing content</li>
443
+ </ul>
444
+ <h3 id="supported-file-formats">Supported File Formats</h3>
445
+ <p>The `.public/` directory supports all static file types:</p>
446
+ <p><strong>Images:</strong></p>
447
+ <ul>
448
+ <li>PNG (`.png`)</li>
449
+ <li>JPEG (`.jpg`, `.jpeg`)</li>
450
+ <li>SVG (`.svg`)</li>
451
+ <li>WebP (`.webp`)</li>
452
+ <li>GIF (`.gif`)</li>
453
+ </ul>
454
+ <p><strong>Icons:</strong></p>
455
+ <ul>
456
+ <li>ICO (`.ico`)</li>
457
+ <li>SVG (`.svg`)</li>
458
+ </ul>
459
+ <p><strong>Other static files:</strong></p>
460
+ <ul>
461
+ <li>Any additional static assets needed by your documentation</li>
462
+ </ul>
463
+ <h3 id="example-usage">Example Usage</h3>
464
+ <p><strong>Typical tenant structure with assets:</strong></p>
465
+ <pre><code>acme-docs/
466
+ ├── config.json
467
+ ├── manifest.json
468
+ ├── .public/
469
+ │ ├── favicon.ico # Browser tab icon
470
+ │ ├── favicon.svg # Modern browsers
471
+ │ ├── logo.svg # Company logo
472
+ │ ├── logo-dark.svg # Dark mode variant
473
+ │ ├── screenshots/ # Product screenshots
474
+ │ │ ├── dashboard.png
475
+ │ │ └── settings.png
476
+ │ └── icons/ # Social/external icons
477
+ │ ├── github.svg
478
+ │ ├── discord.svg
479
+ │ └── twitter.svg
480
+ └── content/
481
+ └── welcome.md</code></pre>
482
+ <p><strong>Referenced in welcome.md:</strong></p>
483
+ <pre><code class="language-markdown"># Welcome to ACME Docs
484
+
485
+ ![ACME Logo](./assets/logo.svg)
486
+
487
+ ## Quick Start
488
+
489
+ Check out our dashboard:
490
+
491
+ ![Dashboard Screenshot](./assets/screenshots/dashboard.png)
492
+
493
+ ## Community
494
+
495
+ Join us on:
496
+ - ![GitHub](./assets/icons/github.svg) [GitHub](https://github.com/acme)
497
+ - ![Discord](./assets/icons/discord.svg) [Discord](https://discord.gg/acme)</code></pre>
498
+ <h2 id="environment-variables">Environment Variables</h2>
499
+ <table><thead><tr><th style="text-align: left">Variable</th><th style="text-align: left">Default</th><th style="text-align: left">Description</th></tr></thead><tbody><tr><td style="text-align: left">`BUILD_OUTPUT`</td><td style="text-align: left">`dist/`</td><td style="text-align: left">Output directory</td></tr><tr><td style="text-align: left">`DOCS_TOOLKIT_PORT`</td><td style="text-align: left">`80`</td><td style="text-align: left">Caddy server port</td></tr><tr><td style="text-align: left">`PORT`</td><td style="text-align: left">`5173`</td><td style="text-align: left">Dev server port</td></tr></tbody></table>
500
+ <h2 id="build-modes">Build Modes</h2>
501
+ <h3 id="full-build">Full Build</h3>
502
+ <pre><code class="language-bash">npm run build:tenants my-tenant</code></pre>
503
+ <p>Rebuilds everything from scratch.</p>
504
+ <h3 id="incremental-build">Incremental Build</h3>
505
+ <pre><code class="language-bash">npm run build:incremental my-tenant</code></pre>
506
+ <p>Only rebuilds files changed since last build (git-aware).</p>
507
+ <h3 id="all-tenants">All Tenants</h3>
508
+ <pre><code class="language-bash">npm run build:tenants</code></pre>
509
+ <p>Builds all registered tenants.</p>
510
+ </div>
511
+ </section>
512
+ </div>
513
+ </article>
514
+ <footer class="static-footer">
515
+ <p>View interactive version: <a href="/#tenant-config">Tenant Configuration</a></p>
516
+ </footer>
517
+ </main>
518
+ </body>
519
+ </html>
@@ -0,0 +1,116 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Welcome | Pagenary Docs</title>
7
+ <meta name="description" content="What Pagenary is and how this dogfooded portal is built." />
8
+ <link rel="canonical" href="/#welcome" />
9
+
10
+ <!-- Open Graph -->
11
+ <meta property="og:title" content="Welcome" />
12
+ <meta property="og:description" content="What Pagenary is and how this dogfooded portal is built." />
13
+ <meta property="og:type" content="article" />
14
+ <meta property="og:url" content="/#welcome" />
15
+
16
+ <!-- Twitter Card -->
17
+ <meta name="twitter:card" content="summary" />
18
+ <meta name="twitter:title" content="Welcome" />
19
+ <meta name="twitter:description" content="What Pagenary is and how this dogfooded portal is built." />
20
+
21
+ <!-- Structured Data -->
22
+ <script type="application/ld+json">
23
+ [
24
+ {
25
+ "@context": "https://schema.org",
26
+ "@type": "TechArticle",
27
+ "headline": "Welcome",
28
+ "description": "What Pagenary is and how this dogfooded portal is built.",
29
+ "url": "/#welcome",
30
+ "dateModified": "2026-05-26",
31
+ "mainEntityOfPage": {
32
+ "@type": "WebPage",
33
+ "@id": "/#welcome"
34
+ },
35
+ "isPartOf": {
36
+ "@type": "WebSite",
37
+ "name": "Pagenary Docs",
38
+ "url": "/"
39
+ }
40
+ },
41
+ {
42
+ "@context": "https://schema.org",
43
+ "@type": "BreadcrumbList",
44
+ "itemListElement": [
45
+ {
46
+ "@type": "ListItem",
47
+ "position": 1,
48
+ "name": "Home",
49
+ "item": "/"
50
+ },
51
+ {
52
+ "@type": "ListItem",
53
+ "position": 2,
54
+ "name": "Welcome",
55
+ "item": "/#welcome"
56
+ }
57
+ ]
58
+ }
59
+ ]
60
+ </script>
61
+
62
+ <!-- Redirect to SPA for JavaScript-enabled browsers -->
63
+ <script>
64
+ if (typeof window !== 'undefined') {
65
+ window.location.replace('/#welcome');
66
+ }
67
+ </script>
68
+ <noscript>
69
+ <meta http-equiv="refresh" content="0; url=/#welcome" />
70
+ </noscript>
71
+
72
+ <link rel="stylesheet" href="../styles.css" />
73
+ <style>
74
+ .static-content { max-width: 800px; margin: 0 auto; padding: 2rem; }
75
+ .static-footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #eee; font-size: 0.9rem; color: #666; }
76
+ </style>
77
+ </head>
78
+ <body>
79
+ <main class="static-content">
80
+ <article>
81
+ <h1>Welcome</h1>
82
+ <p class="lead">What Pagenary is and how this dogfooded portal is built.</p>
83
+ <div class="section-body">
84
+ <section class="section doc markdown">
85
+ <div class="doc-content">
86
+ <h1 id="where-documentation-takes-shape">Where documentation takes shape</h1>
87
+ <p>Pagenary is a multi-tenant documentation publishing platform that turns one</p>
88
+ <p>shared set of templates into many branded, tenant-specific static sites. Zero</p>
89
+ <p>runtime dependencies, hash-based routing, and a Git-aware build pipeline make</p>
90
+ <p>it suited to white-label documentation portals — one source of truth, any</p>
91
+ <p>number of published sites.</p>
92
+ <p><strong>This portal is built by Pagenary, from Pagenary&#39;s own documentation.</strong> Every</p>
93
+ <p>page you see here is the same publisher pipeline applied to the developer docs</p>
94
+ <p>in the repository, served as a static single-page app.</p>
95
+ <h2 id="start-here">Start here</h2>
96
+ <ul>
97
+ <li><strong><a href="#quickstart">Quickstart</a></strong> — install, build the default bundle, and serve it locally.</li>
98
+ <li><strong><a href="#architecture">Architecture</a></strong> — the static SPA pattern, build pipeline, and tenant content model.</li>
99
+ <li><strong><a href="#tenant-config">Tenant Configuration</a></strong> — every `config.json` option for branding, theming, and export.</li>
100
+ </ul>
101
+ <h2 id="how-a-tenant-works">How a tenant works</h2>
102
+ <p>A tenant is a thin layer — content, a `config.json`, and a `manifest.json` —</p>
103
+ <p>over the shared template catalog. Branding, theming, and navigation are **data,</p>
104
+ <p>not code**: a tenant changes its look through configuration, never by forking</p>
105
+ <p>the generator. The build produces a self-contained bundle under</p>
106
+ <p>`dist/&lt;tenant-id&gt;/` that you can host anywhere that serves files.</p>
107
+ </div>
108
+ </section>
109
+ </div>
110
+ </article>
111
+ <footer class="static-footer">
112
+ <p>View interactive version: <a href="/#welcome">Welcome</a></p>
113
+ </footer>
114
+ </main>
115
+ </body>
116
+ </html>
@@ -0,0 +1,10 @@
1
+ # Pagenary Docs
2
+ # Generated: 2026-05-26T00:23:59.948Z
3
+
4
+ User-agent: *
5
+ Allow: /
6
+ Allow: /pages/
7
+ Disallow: /sections/
8
+ Disallow: /lib/
9
+
10
+ Sitemap: /sitemap.xml