yakmesh 2.8.2 → 3.0.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 (232) hide show
  1. package/CHANGELOG.md +637 -0
  2. package/CONTRIBUTING.md +42 -0
  3. package/Caddyfile +77 -0
  4. package/README.md +119 -29
  5. package/adapters/adapter-mlv-bible/README.md +124 -0
  6. package/adapters/adapter-mlv-bible/index.js +400 -0
  7. package/adapters/chat-mod-adapter.js +532 -0
  8. package/adapters/content-adapter.js +273 -0
  9. package/content/api.js +50 -41
  10. package/content/index.js +2 -2
  11. package/content/store.js +355 -173
  12. package/dashboard/index.html +19 -3
  13. package/database/replication.js +117 -37
  14. package/docs/CRYPTO-AGILITY.md +204 -0
  15. package/docs/MTLS-RESEARCH.md +367 -0
  16. package/docs/NAMCHE-SPEC.md +681 -0
  17. package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
  18. package/docs/PRECISION-DISCLOSURE.md +96 -0
  19. package/docs/README.md +76 -0
  20. package/docs/ROADMAP-2.4.0.md +447 -0
  21. package/docs/ROADMAP-2.5.0.md +244 -0
  22. package/docs/SECURITY-AUDIT-REPORT.md +306 -0
  23. package/docs/SST-INTEGRATION.md +712 -0
  24. package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
  25. package/docs/TERNARY-AUDIT-REPORT.md +247 -0
  26. package/docs/TME-FAQ.md +221 -0
  27. package/docs/WHITEPAPER.md +623 -0
  28. package/docs/adapters.html +1001 -0
  29. package/docs/advanced-systems.html +1045 -0
  30. package/docs/annex.html +1046 -0
  31. package/docs/api.html +970 -0
  32. package/docs/business/response-templates.md +160 -0
  33. package/docs/c2c.html +1225 -0
  34. package/docs/cli.html +1332 -0
  35. package/docs/configuration.html +1248 -0
  36. package/docs/darshan.html +1085 -0
  37. package/docs/dharma.html +966 -0
  38. package/docs/docs-bundle.html +1075 -0
  39. package/docs/docs.css +3120 -0
  40. package/docs/docs.js +556 -0
  41. package/docs/doko.html +969 -0
  42. package/docs/geo-proof.html +858 -0
  43. package/docs/getting-started.html +840 -0
  44. package/docs/gumba-tutorial.html +1144 -0
  45. package/docs/gumba.html +1098 -0
  46. package/docs/index.html +914 -0
  47. package/docs/jhilke.html +1312 -0
  48. package/docs/karma.html +1100 -0
  49. package/docs/katha.html +1037 -0
  50. package/docs/lama.html +978 -0
  51. package/docs/mandala.html +1067 -0
  52. package/docs/mani.html +964 -0
  53. package/docs/mantra.html +967 -0
  54. package/docs/mesh.html +1409 -0
  55. package/docs/nakpak.html +869 -0
  56. package/docs/namche.html +928 -0
  57. package/docs/nav-order.json +53 -0
  58. package/docs/prahari.html +1043 -0
  59. package/docs/prism-bash.min.js +1 -0
  60. package/docs/prism-javascript.min.js +1 -0
  61. package/docs/prism-json.min.js +1 -0
  62. package/docs/prism-tomorrow.min.css +1 -0
  63. package/docs/prism.min.js +1 -0
  64. package/docs/privacy.html +699 -0
  65. package/docs/quick-reference.html +1181 -0
  66. package/docs/sakshi.html +1402 -0
  67. package/docs/sandboxing.md +386 -0
  68. package/docs/seva.html +911 -0
  69. package/docs/sherpa.html +871 -0
  70. package/docs/studio.html +860 -0
  71. package/docs/stupa.html +995 -0
  72. package/docs/tailwind.min.css +2 -0
  73. package/docs/tattva.html +1332 -0
  74. package/docs/terms.html +686 -0
  75. package/docs/time-server-deployment.md +166 -0
  76. package/docs/time-sources.html +1392 -0
  77. package/docs/tivra.html +1127 -0
  78. package/docs/trademark-policy.html +686 -0
  79. package/docs/tribhuj.html +1183 -0
  80. package/docs/trust-security.html +1029 -0
  81. package/docs/tutorials/backup-recovery.html +654 -0
  82. package/docs/tutorials/dashboard.html +604 -0
  83. package/docs/tutorials/domain-setup.html +605 -0
  84. package/docs/tutorials/host-website.html +456 -0
  85. package/docs/tutorials/mesh-network.html +505 -0
  86. package/docs/tutorials/mobile-access.html +445 -0
  87. package/docs/tutorials/privacy.html +467 -0
  88. package/docs/tutorials/raspberry-pi.html +600 -0
  89. package/docs/tutorials/security-basics.html +539 -0
  90. package/docs/tutorials/share-files.html +431 -0
  91. package/docs/tutorials/troubleshooting.html +637 -0
  92. package/docs/tutorials/trust-karma.html +419 -0
  93. package/docs/tutorials/yak-protocol.html +456 -0
  94. package/docs/tutorials.html +1034 -0
  95. package/docs/vani.html +1270 -0
  96. package/docs/webserver.html +809 -0
  97. package/docs/yak-protocol.html +940 -0
  98. package/docs/yak-timeserver-design.md +475 -0
  99. package/docs/yakapp.html +1015 -0
  100. package/docs/ypc27.html +1069 -0
  101. package/docs/yurt.html +1344 -0
  102. package/embedded-docs/bundle.js +334 -74
  103. package/gossip/protocol.js +247 -27
  104. package/identity/key-resolver.js +262 -0
  105. package/identity/machine-seed.js +632 -0
  106. package/identity/node-key.js +669 -368
  107. package/identity/tribhuj-ratchet.js +506 -0
  108. package/knowledge-base.js +37 -8
  109. package/launcher/yakmesh.bat +62 -0
  110. package/launcher/yakmesh.sh +70 -0
  111. package/mesh/annex.js +462 -108
  112. package/mesh/beacon-broadcast.js +113 -1
  113. package/mesh/darshan.js +1718 -0
  114. package/mesh/gumba.js +1567 -0
  115. package/mesh/jhilke.js +651 -0
  116. package/mesh/katha.js +1012 -0
  117. package/mesh/nakpak-routing.js +8 -5
  118. package/mesh/network.js +724 -34
  119. package/mesh/pulse-sync.js +4 -1
  120. package/mesh/rate-limiter.js +127 -15
  121. package/mesh/seva.js +526 -0
  122. package/mesh/sherpa-discovery.js +89 -8
  123. package/mesh/sybil-defense.js +19 -5
  124. package/mesh/temporal-encoder.js +4 -3
  125. package/mesh/vani.js +1364 -0
  126. package/mesh/yurt.js +1340 -0
  127. package/models/entropy-sentinel.onnx +0 -0
  128. package/models/karma-trust.onnx +0 -0
  129. package/models/manifest.json +43 -0
  130. package/models/sakshi-anomaly.onnx +0 -0
  131. package/oracle/code-proof-protocol.js +7 -6
  132. package/oracle/codebase-lock.js +257 -28
  133. package/oracle/index.js +74 -15
  134. package/oracle/ma902-snmp.js +678 -0
  135. package/oracle/module-sealer.js +5 -3
  136. package/oracle/network-identity.js +16 -0
  137. package/oracle/packet-checksum.js +201 -0
  138. package/oracle/sst.js +579 -0
  139. package/oracle/ternary-144t.js +714 -0
  140. package/oracle/ternary-ml.js +481 -0
  141. package/oracle/time-api.js +239 -0
  142. package/oracle/time-source.js +137 -47
  143. package/oracle/validation-oracle-hardened.js +1111 -1071
  144. package/oracle/validation-oracle.js +4 -2
  145. package/oracle/ypc27.js +211 -0
  146. package/package.json +20 -3
  147. package/protocol/yak-handler.js +35 -9
  148. package/protocol/yak-protocol.js +28 -13
  149. package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
  150. package/reference/cpp/yakmesh_ypc27.cpp +179 -0
  151. package/sbom.json +87 -0
  152. package/scripts/security-audit.mjs +264 -0
  153. package/scripts/update-docs-nav.js +194 -0
  154. package/scripts/update-docs-sidebar.cjs +164 -0
  155. package/security/crypto-config.js +4 -3
  156. package/security/dharma-moderation.js +517 -0
  157. package/security/doko-identity.js +193 -143
  158. package/security/domain-consensus.js +86 -85
  159. package/security/fs-hardening.js +620 -0
  160. package/security/hardware-attestation.js +5 -3
  161. package/security/hybrid-trust.js +227 -87
  162. package/security/karma-rate-limiter.js +692 -0
  163. package/security/khata-protocol.js +22 -21
  164. package/security/khata-trust-integration.js +277 -150
  165. package/security/memory-safety.js +635 -0
  166. package/security/mesh-auth.js +11 -10
  167. package/security/mesh-revocation.js +373 -5
  168. package/security/namche-gateway.js +298 -69
  169. package/security/sakshi.js +460 -3
  170. package/security/sangha.js +770 -0
  171. package/security/secure-config.js +473 -0
  172. package/security/silicon-parity.js +13 -10
  173. package/security/steadywatch.js +1142 -0
  174. package/security/strike-system.js +32 -3
  175. package/security/temporal-signing.js +488 -0
  176. package/security/trit-commitment.js +464 -0
  177. package/server/crypto/annex.js +247 -0
  178. package/server/darshan-api.js +343 -0
  179. package/server/index.js +3259 -362
  180. package/server/komm-api.js +668 -0
  181. package/utils/accel.js +2273 -0
  182. package/utils/ternary-id.js +79 -0
  183. package/utils/verify-worker.js +57 -0
  184. package/webserver/index.js +95 -5
  185. package/assets/yakmesh-logo.png +0 -0
  186. package/assets/yakmesh-logo.svg +0 -80
  187. package/assets/yakmesh-logo2.png +0 -0
  188. package/assets/yakmesh-logo2sm.png +0 -0
  189. package/assets/ymsm.png +0 -0
  190. package/website/assets/silhouettes/adapters.svg +0 -107
  191. package/website/assets/silhouettes/api-endpoints.svg +0 -115
  192. package/website/assets/silhouettes/atomic-clock.svg +0 -83
  193. package/website/assets/silhouettes/base-camp.svg +0 -81
  194. package/website/assets/silhouettes/bridge.svg +0 -69
  195. package/website/assets/silhouettes/docs-bundle.svg +0 -113
  196. package/website/assets/silhouettes/doko-basket.svg +0 -70
  197. package/website/assets/silhouettes/fortress.svg +0 -93
  198. package/website/assets/silhouettes/gateway.svg +0 -54
  199. package/website/assets/silhouettes/gears.svg +0 -93
  200. package/website/assets/silhouettes/globe-satellite.svg +0 -67
  201. package/website/assets/silhouettes/karma-wheel.svg +0 -137
  202. package/website/assets/silhouettes/lama-council.svg +0 -141
  203. package/website/assets/silhouettes/mandala-network.svg +0 -169
  204. package/website/assets/silhouettes/mani-stones.svg +0 -149
  205. package/website/assets/silhouettes/mantra-wheel.svg +0 -116
  206. package/website/assets/silhouettes/mesh-nodes.svg +0 -113
  207. package/website/assets/silhouettes/nakpak.svg +0 -56
  208. package/website/assets/silhouettes/peak-lightning.svg +0 -73
  209. package/website/assets/silhouettes/sherpa.svg +0 -69
  210. package/website/assets/silhouettes/stupa-tower.svg +0 -119
  211. package/website/assets/silhouettes/tattva-eye.svg +0 -78
  212. package/website/assets/silhouettes/terminal.svg +0 -74
  213. package/website/assets/silhouettes/webserver.svg +0 -145
  214. package/website/assets/silhouettes/yak.svg +0 -78
  215. package/website/assets/yakmesh-logo.png +0 -0
  216. package/website/assets/yakmesh-logo.webp +0 -0
  217. package/website/assets/yakmesh-logo128x140.webp +0 -0
  218. package/website/assets/yakmesh-logo2.png +0 -0
  219. package/website/assets/yakmesh-logo2.svg +0 -51
  220. package/website/assets/yakmesh-logo40x44.webp +0 -0
  221. package/website/assets/yakmesh.gif +0 -0
  222. package/website/assets/yakmesh.ico +0 -0
  223. package/website/assets/yakmesh.jpg +0 -0
  224. package/website/assets/yakmesh.pdf +0 -0
  225. package/website/assets/yakmesh.png +0 -0
  226. package/website/assets/yakmesh.svg +0 -70
  227. package/website/assets/yakmesh128.webp +0 -0
  228. package/website/assets/yakmesh32.png +0 -0
  229. package/website/assets/yakmesh32.svg +0 -65
  230. package/website/assets/yakmesh32o.ico +0 -2
  231. package/website/assets/yakmesh32o.svg +0 -65
  232. package/website/assets/yakmesh32o.svgz +0 -0
package/docs/docs.js ADDED
@@ -0,0 +1,556 @@
1
+ /**
2
+ * YAKMESH Documentation - Interactive JavaScript
3
+ *
4
+ * Handles:
5
+ * - Sidebar toggle (desktop & mobile)
6
+ * - Theme initialization
7
+ * - Active link highlighting
8
+ * - Dashboard button visibility (localhost only)
9
+ */
10
+
11
+ document.addEventListener('DOMContentLoaded', function () {
12
+ initDashboardButton();
13
+ initSidebar();
14
+ initActiveLinks();
15
+ initParticles();
16
+ });
17
+
18
+ /**
19
+ * Dashboard Button - Only show on localhost (self-hosted docs)
20
+ * Hide on production website (yakmesh.dev)
21
+ */
22
+ function initDashboardButton() {
23
+ const dashboardLink = document.querySelector('.sidebar-dashboard-link');
24
+ if (!dashboardLink) return;
25
+
26
+ const isLocalhost = window.location.hostname === 'localhost' ||
27
+ window.location.hostname === '127.0.0.1' ||
28
+ window.location.hostname.startsWith('192.168.') ||
29
+ window.location.hostname.startsWith('10.') ||
30
+ window.location.protocol === 'file:';
31
+
32
+ if (!isLocalhost) {
33
+ dashboardLink.style.display = 'none';
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Sidebar Toggle (works on all screen sizes)
39
+ * Desktop: icon-only collapsed mode
40
+ * Mobile: slide-in overlay mode
41
+ */
42
+ function initSidebar() {
43
+ const sidebar = document.getElementById('sidebar') || document.querySelector('.docs-sidebar');
44
+ const toggle = document.getElementById('sidebarToggle') || document.querySelector('.sidebar-toggle');
45
+ const overlay = document.getElementById('sidebarOverlay') || document.querySelector('.sidebar-overlay');
46
+ const main = document.getElementById('mainContent') || document.querySelector('.docs-main');
47
+
48
+ if (!sidebar || !toggle) return;
49
+
50
+ // Check if we're on mobile
51
+ const isMobile = () => window.innerWidth <= 900;
52
+
53
+ // Desktop: check for saved preference
54
+ if (!isMobile()) {
55
+ const savedState = localStorage.getItem('sidebar-collapsed');
56
+ if (savedState === 'true') {
57
+ sidebar.classList.add('icon-only');
58
+ toggle.classList.add('collapsed');
59
+ if (main) main.classList.add('sidebar-collapsed');
60
+ document.body.classList.add('sidebar-narrow');
61
+ }
62
+ }
63
+
64
+ // Toggle sidebar
65
+ toggle.addEventListener('click', function (e) {
66
+ e.preventDefault();
67
+ e.stopPropagation();
68
+
69
+ if (isMobile()) {
70
+ // Mobile: slide in/out overlay style
71
+ sidebar.classList.toggle('open');
72
+ if (overlay) overlay.classList.toggle('open');
73
+ toggle.classList.toggle('sidebar-open');
74
+ document.body.classList.toggle('sidebar-mobile-open');
75
+ } else {
76
+ // Desktop: icon-only collapse/expand
77
+ sidebar.classList.toggle('icon-only');
78
+ toggle.classList.toggle('collapsed');
79
+ if (main) main.classList.toggle('sidebar-collapsed');
80
+ document.body.classList.toggle('sidebar-narrow', sidebar.classList.contains('icon-only'));
81
+
82
+ // Save preference
83
+ localStorage.setItem('sidebar-collapsed', sidebar.classList.contains('icon-only'));
84
+ }
85
+ });
86
+
87
+ // Close on overlay click (mobile only)
88
+ if (overlay) {
89
+ overlay.addEventListener('click', function () {
90
+ closeMobileSidebar();
91
+ });
92
+ }
93
+
94
+ // Close on escape key
95
+ document.addEventListener('keydown', function (e) {
96
+ if (e.key === 'Escape' && sidebar.classList.contains('open')) {
97
+ closeMobileSidebar();
98
+ }
99
+ });
100
+
101
+ // Close sidebar when clicking a link (mobile only)
102
+ sidebar.querySelectorAll('a').forEach(function (link) {
103
+ link.addEventListener('click', function () {
104
+ if (isMobile() && sidebar.classList.contains('open')) {
105
+ closeMobileSidebar();
106
+ }
107
+ });
108
+ });
109
+
110
+ // Handle resize - close mobile sidebar if resizing to desktop
111
+ window.addEventListener('resize', function () {
112
+ if (!isMobile() && sidebar.classList.contains('open')) {
113
+ closeMobileSidebar();
114
+ }
115
+ });
116
+
117
+ function closeMobileSidebar() {
118
+ sidebar.classList.remove('open');
119
+ if (overlay) overlay.classList.remove('open');
120
+ toggle.classList.remove('sidebar-open');
121
+ document.body.classList.remove('sidebar-mobile-open');
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Highlight current page in sidebar
127
+ */
128
+ function initActiveLinks() {
129
+ const currentPage = window.location.pathname.split('/').pop() || 'index.html';
130
+ const links = document.querySelectorAll('.docs-sidebar a');
131
+
132
+ links.forEach(function (link) {
133
+ const href = link.getAttribute('href');
134
+ if (href === currentPage || (currentPage === '' && href === 'index.html')) {
135
+ link.classList.add('active');
136
+ }
137
+ });
138
+ }
139
+
140
+ /**
141
+ * SVG Icons
142
+ */
143
+ function getMenuIcon() {
144
+ return '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"/></svg>';
145
+ }
146
+
147
+ function getCloseIcon() {
148
+ return '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/></svg>';
149
+ }
150
+
151
+ /**
152
+ * Smooth scroll for anchor links
153
+ */
154
+ document.querySelectorAll('a[href^="#"]').forEach(function (anchor) {
155
+ anchor.addEventListener('click', function (e) {
156
+ e.preventDefault();
157
+ const target = document.querySelector(this.getAttribute('href'));
158
+ if (target) {
159
+ target.scrollIntoView({ behavior: 'smooth', block: 'start' });
160
+ }
161
+ });
162
+ });
163
+
164
+ /* ============================================
165
+ PARTICLE SYSTEM — Themed floating particles
166
+ Reads data-theme and spawns unique particles.
167
+ ============================================ */
168
+
169
+ /**
170
+ * Theme → Particle configuration map.
171
+ * shape: CSS class suffix (dot default, snowflake, ring, ember, smoke, leaf, spark, hex, triangle)
172
+ * count: number of particles (6-12)
173
+ * colors: array of CSS color strings
174
+ * glows: matching glow rgba
175
+ * sizes: [min, max] px
176
+ * pulse: [min, max] seconds
177
+ * drift: 'drift'|'fall'|'rise'|'orbit' — animation family
178
+ * max: max opacity (0-1)
179
+ */
180
+ var PARTICLE_THEMES = {
181
+ // ─── Protocol Stack ────────────────────────────────────
182
+
183
+ 'jhilke': {
184
+ shape: 'ym-leaf', count: 12,
185
+ colors: ['#a3e635', '#4ade80', '#86efac'],
186
+ glows: ['rgba(163,230,53,0.3)', 'rgba(74,222,128,0.3)', 'rgba(134,239,172,0.3)'],
187
+ sizes: [4, 8], pulse: [2.5, 5], drift: 'drift', max: 0.9
188
+ },
189
+ 'annex': {
190
+ shape: 'ym-hex', count: 8,
191
+ colors: ['#60a5fa', '#93c5fd', '#3b82f6'],
192
+ glows: ['rgba(96,165,250,0.3)', 'rgba(147,197,253,0.25)', 'rgba(59,130,246,0.3)'],
193
+ sizes: [5, 8], pulse: [3, 6], drift: 'drift', max: 0.8
194
+ },
195
+ 'nakpak': {
196
+ shape: 'ym-ring', count: 8,
197
+ colors: ['#a78bfa', '#c4b5fd', '#8b5cf6'],
198
+ glows: ['rgba(167,139,250,0.3)', 'rgba(196,181,253,0.25)', 'rgba(139,92,246,0.3)'],
199
+ sizes: [6, 10], pulse: [3, 5], drift: 'drift', max: 0.7
200
+ },
201
+ 'sherpa': {
202
+ shape: 'ym-snowflake', count: 10,
203
+ colors: ['#22d3ee', '#67e8f9', '#a5f3fc'],
204
+ glows: ['rgba(34,211,238,0.3)', 'rgba(103,232,249,0.25)', 'rgba(165,243,252,0.2)'],
205
+ sizes: [6, 10], pulse: [4, 7], drift: 'fall', max: 0.75
206
+ },
207
+ 'doko': {
208
+ shape: 'ym-leaf', count: 7,
209
+ colors: ['#fbbf24', '#a16207', '#d97706'],
210
+ glows: ['rgba(251,191,36,0.25)', 'rgba(161,98,7,0.2)', 'rgba(217,119,6,0.25)'],
211
+ sizes: [5, 9], pulse: [4, 7], drift: 'fall', max: 0.7
212
+ },
213
+ 'mandala': {
214
+ shape: 'ym-ring', count: 10,
215
+ colors: ['#2dd4bf', '#14b8a6', '#5eead4'],
216
+ glows: ['rgba(45,212,191,0.3)', 'rgba(20,184,166,0.25)', 'rgba(94,234,212,0.2)'],
217
+ sizes: [6, 10], pulse: [3, 5], drift: 'orbit', max: 0.8
218
+ },
219
+ 'mantra': {
220
+ shape: 'ym-ember', count: 9,
221
+ colors: ['#fdba74', '#f97316', '#fb923c'],
222
+ glows: ['rgba(253,186,116,0.3)', 'rgba(249,115,22,0.25)', 'rgba(251,146,60,0.3)'],
223
+ sizes: [3, 7], pulse: [1.5, 3], drift: 'rise', max: 0.85
224
+ },
225
+ 'gumba': {
226
+ shape: 'ym-smoke', count: 8,
227
+ colors: ['#fbbf24', '#d97706', '#f59e0b'],
228
+ glows: ['rgba(251,191,36,0.3)', 'rgba(217,119,6,0.25)', 'rgba(245,158,11,0.2)'],
229
+ sizes: [12, 24], pulse: [4, 7], drift: 'rise', max: 0.6
230
+ },
231
+ 'yurt': {
232
+ shape: 'ym-ember', count: 10,
233
+ colors: ['#fb923c', '#ef4444', '#f97316'],
234
+ glows: ['rgba(251,146,60,0.3)', 'rgba(239,68,68,0.25)', 'rgba(249,115,22,0.3)'],
235
+ sizes: [3, 6], pulse: [1, 2.5], drift: 'rise', max: 0.9
236
+ },
237
+ 'katha': {
238
+ shape: 'ym-spark', count: 7,
239
+ colors: ['#facc15', '#fde68a', '#eab308'],
240
+ glows: ['rgba(250,204,21,0.25)', 'rgba(253,230,138,0.2)', 'rgba(234,179,8,0.25)'],
241
+ sizes: [3, 6], pulse: [1, 2.5], drift: 'drift', max: 0.7
242
+ },
243
+ 'vani': {
244
+ shape: 'ym-ring', count: 8,
245
+ colors: ['#f472b6', '#ec4899', '#f9a8d4'],
246
+ glows: ['rgba(244,114,182,0.3)', 'rgba(236,72,153,0.25)', 'rgba(249,168,212,0.2)'],
247
+ sizes: [8, 14], pulse: [2, 4], drift: 'drift', max: 0.5
248
+ },
249
+ 'darshan': {
250
+ shape: 'ym-spark', count: 7,
251
+ colors: ['#c4b5fd', '#a78bfa', '#ddd6fe'],
252
+ glows: ['rgba(196,181,253,0.3)', 'rgba(167,139,250,0.25)', 'rgba(221,214,254,0.2)'],
253
+ sizes: [3, 6], pulse: [1, 2], drift: 'drift', max: 0.85
254
+ },
255
+ 'stupa': {
256
+ shape: 'ym-ember', count: 8,
257
+ colors: ['#fde68a', '#fbbf24', '#f59e0b'],
258
+ glows: ['rgba(253,230,138,0.3)', 'rgba(251,191,36,0.25)', 'rgba(245,158,11,0.3)'],
259
+ sizes: [3, 7], pulse: [2, 4], drift: 'rise', max: 0.8
260
+ },
261
+ 'lama': {
262
+ shape: 'ym-hex', count: 7,
263
+ colors: ['#c084fc', '#a855f7', '#d8b4fe'],
264
+ glows: ['rgba(192,132,252,0.3)', 'rgba(168,85,247,0.25)', 'rgba(216,180,254,0.2)'],
265
+ sizes: [5, 9], pulse: [3, 5], drift: 'drift', max: 0.7
266
+ },
267
+ 'mani': {
268
+ shape: 'ym-spark', count: 8,
269
+ colors: ['#facc15', '#eab308', '#fde047'],
270
+ glows: ['rgba(250,204,21,0.3)', 'rgba(234,179,8,0.25)', 'rgba(253,224,71,0.2)'],
271
+ sizes: [3, 5], pulse: [1, 2.5], drift: 'drift', max: 0.8
272
+ },
273
+ 'karma': {
274
+ shape: 'ym-ember', count: 8,
275
+ colors: ['#fb7185', '#e11d48', '#fda4af'],
276
+ glows: ['rgba(251,113,133,0.3)', 'rgba(225,29,72,0.25)', 'rgba(253,164,175,0.2)'],
277
+ sizes: [4, 7], pulse: [1.5, 3], drift: 'drift', max: 0.7
278
+ },
279
+ 'tattva': {
280
+ shape: 'ym-ring', count: 9,
281
+ colors: ['#c084fc', '#a855f7', '#e9d5ff'],
282
+ glows: ['rgba(192,132,252,0.3)', 'rgba(168,85,247,0.25)', 'rgba(233,213,255,0.2)'],
283
+ sizes: [6, 10], pulse: [2, 4], drift: 'drift', max: 0.7
284
+ },
285
+ 'tribhuj': {
286
+ shape: 'ym-triangle', count: 8,
287
+ colors: ['#2dd4bf', '#14b8a6', '#5eead4'],
288
+ glows: ['rgba(45,212,191,0.3)', 'rgba(20,184,166,0.25)', 'rgba(94,234,212,0.2)'],
289
+ sizes: [6, 10], pulse: [3, 5], drift: 'drift', max: 0.7
290
+ },
291
+ 'ypc27': {
292
+ shape: 'ym-triangle', count: 10,
293
+ colors: ['#4ade80', '#22c55e', '#86efac'],
294
+ glows: ['rgba(74,222,128,0.3)', 'rgba(34,197,94,0.25)', 'rgba(134,239,172,0.2)'],
295
+ sizes: [3, 6], pulse: [0.8, 2], drift: 'fall', max: 0.9
296
+ },
297
+ 'sakshi': {
298
+ shape: 'ym-spark', count: 7,
299
+ colors: ['#cbd5e1', '#94a3b8', '#e2e8f0'],
300
+ glows: ['rgba(203,213,225,0.25)', 'rgba(148,163,184,0.2)', 'rgba(226,232,240,0.15)'],
301
+ sizes: [3, 5], pulse: [1.5, 3], drift: 'drift', max: 0.7
302
+ },
303
+ 'tivra': {
304
+ shape: 'ym-spark', count: 9,
305
+ colors: ['#22d3ee', '#06b6d4', '#67e8f9'],
306
+ glows: ['rgba(34,211,238,0.35)', 'rgba(6,182,212,0.3)', 'rgba(103,232,249,0.25)'],
307
+ sizes: [3, 6], pulse: [0.8, 1.8], drift: 'drift', max: 0.95
308
+ },
309
+ 'prahari': {
310
+ shape: 'ym-hex', count: 6,
311
+ colors: ['#a78bfa', '#7c3aed', '#c4b5fd'],
312
+ glows: ['rgba(167,139,250,0.3)', 'rgba(124,58,237,0.25)', 'rgba(196,181,253,0.2)'],
313
+ sizes: [5, 9], pulse: [3, 6], drift: 'drift', max: 0.65
314
+ },
315
+ 'dharma': {
316
+ shape: 'ym-triangle', count: 7,
317
+ colors: ['#fbbf24', '#d97706', '#fde68a'],
318
+ glows: ['rgba(251,191,36,0.25)', 'rgba(217,119,6,0.2)', 'rgba(253,230,138,0.15)'],
319
+ sizes: [5, 8], pulse: [4, 7], drift: 'drift', max: 0.6
320
+ },
321
+ 'seva': {
322
+ shape: 'ym-leaf', count: 8,
323
+ colors: ['#34d399', '#059669', '#6ee7b7'],
324
+ glows: ['rgba(52,211,153,0.3)', 'rgba(5,150,105,0.25)', 'rgba(110,231,183,0.2)'],
325
+ sizes: [4, 7], pulse: [3, 6], drift: 'rise', max: 0.7
326
+ },
327
+
328
+ // ─── Applications & Reference ──────────────────────────
329
+
330
+ 'yakapp': {
331
+ shape: 'ym-hex', count: 7,
332
+ colors: ['#22d3ee', '#0891b2', '#67e8f9'],
333
+ glows: ['rgba(34,211,238,0.3)', 'rgba(8,145,178,0.25)', 'rgba(103,232,249,0.2)'],
334
+ sizes: [5, 8], pulse: [3, 5], drift: 'drift', max: 0.7
335
+ },
336
+ 'c2c': {
337
+ shape: 'ym-spark', count: 8,
338
+ colors: ['#fb923c', '#ea580c', '#fdba74'],
339
+ glows: ['rgba(251,146,60,0.3)', 'rgba(234,88,12,0.25)', 'rgba(253,186,116,0.2)'],
340
+ sizes: [3, 5], pulse: [1, 2], drift: 'drift', max: 0.85
341
+ },
342
+ 'studio': {
343
+ shape: 'ym-leaf', count: 8,
344
+ colors: ['#f472b6', '#db2777', '#f9a8d4'],
345
+ glows: ['rgba(244,114,182,0.3)', 'rgba(219,39,119,0.25)', 'rgba(249,168,212,0.2)'],
346
+ sizes: [4, 7], pulse: [3, 5], drift: 'fall', max: 0.7
347
+ },
348
+
349
+ // ─── Infrastructure & Utility ──────────────────────────
350
+
351
+ 'index': {
352
+ shape: 'ym-snowflake', count: 10,
353
+ colors: ['#4ade80', '#34d399', '#86efac', '#22d3ee'],
354
+ glows: ['rgba(74,222,128,0.3)', 'rgba(52,211,153,0.25)', 'rgba(134,239,172,0.2)', 'rgba(34,211,238,0.2)'],
355
+ sizes: [6, 12], pulse: [4, 7], drift: 'fall', max: 0.8
356
+ },
357
+ 'namche': {
358
+ shape: 'ym-ring', count: 7,
359
+ colors: ['#fde047', '#eab308', '#facc15'],
360
+ glows: ['rgba(253,224,71,0.3)', 'rgba(234,179,8,0.25)', 'rgba(250,204,21,0.2)'],
361
+ sizes: [6, 10], pulse: [3, 5], drift: 'drift', max: 0.6
362
+ },
363
+ 'getting-started': {
364
+ shape: 'ym-ember', count: 7,
365
+ colors: ['#fbbf24', '#f59e0b', '#fcd34d'],
366
+ glows: ['rgba(251,191,36,0.3)', 'rgba(245,158,11,0.25)', 'rgba(252,211,77,0.2)'],
367
+ sizes: [3, 6], pulse: [2, 4], drift: 'rise', max: 0.7
368
+ },
369
+ 'yak-protocol': {
370
+ shape: 'ym-triangle', count: 6,
371
+ colors: ['#f59e0b', '#b45309', '#fbbf24'],
372
+ glows: ['rgba(245,158,11,0.3)', 'rgba(180,83,9,0.25)', 'rgba(251,191,36,0.2)'],
373
+ sizes: [5, 8], pulse: [4, 7], drift: 'drift', max: 0.6
374
+ },
375
+ 'geo-proof': {
376
+ shape: 'ym-ring', count: 6,
377
+ colors: ['#34d399', '#10b981', '#6ee7b7'],
378
+ glows: ['rgba(52,211,153,0.25)', 'rgba(16,185,129,0.2)', 'rgba(110,231,183,0.15)'],
379
+ sizes: [8, 14], pulse: [3, 5], drift: 'drift', max: 0.5
380
+ },
381
+ 'mesh': {
382
+ shape: 'ym-hex', count: 8,
383
+ colors: ['#2dd4bf', '#14b8a6', '#5eead4'],
384
+ glows: ['rgba(45,212,191,0.3)', 'rgba(20,184,166,0.25)', 'rgba(94,234,212,0.2)'],
385
+ sizes: [4, 7], pulse: [2, 4], drift: 'drift', max: 0.75
386
+ },
387
+ 'trust-security': {
388
+ shape: 'ym-hex', count: 7,
389
+ colors: ['#10b981', '#047857', '#34d399'],
390
+ glows: ['rgba(16,185,129,0.3)', 'rgba(4,120,87,0.25)', 'rgba(52,211,153,0.2)'],
391
+ sizes: [6, 10], pulse: [3, 5], drift: 'drift', max: 0.6
392
+ },
393
+ 'advanced-systems': {
394
+ shape: 'ym-spark', count: 8,
395
+ colors: ['#22d3ee', '#a78bfa', '#67e8f9'],
396
+ glows: ['rgba(34,211,238,0.3)', 'rgba(167,139,250,0.25)', 'rgba(103,232,249,0.2)'],
397
+ sizes: [3, 5], pulse: [1, 2.5], drift: 'drift', max: 0.8
398
+ },
399
+ 'cli': {
400
+ shape: 'ym-spark', count: 6,
401
+ colors: ['#4ade80', '#22c55e', '#86efac'],
402
+ glows: ['rgba(74,222,128,0.3)', 'rgba(34,197,94,0.25)', 'rgba(134,239,172,0.2)'],
403
+ sizes: [3, 5], pulse: [1, 3], drift: 'fall', max: 0.8
404
+ },
405
+ 'time-sources': {
406
+ shape: 'ym-ring', count: 6,
407
+ colors: ['#fcd34d', '#fbbf24', '#fde68a'],
408
+ glows: ['rgba(252,211,77,0.25)', 'rgba(251,191,36,0.2)', 'rgba(253,230,138,0.15)'],
409
+ sizes: [8, 12], pulse: [2, 4], drift: 'drift', max: 0.5
410
+ },
411
+ 'configuration': {
412
+ shape: 'ym-hex', count: 5,
413
+ colors: ['#d4d4d8', '#a1a1aa', '#e4e4e7'],
414
+ glows: ['rgba(212,212,216,0.2)', 'rgba(161,161,170,0.15)', 'rgba(228,228,231,0.1)'],
415
+ sizes: [4, 7], pulse: [4, 8], drift: 'drift', max: 0.45
416
+ },
417
+ 'adapters': {
418
+ shape: 'ym-spark', count: 7,
419
+ colors: ['#fb923c', '#f97316', '#fdba74'],
420
+ glows: ['rgba(251,146,60,0.3)', 'rgba(249,115,22,0.25)', 'rgba(253,186,116,0.2)'],
421
+ sizes: [4, 7], pulse: [1, 2.5], drift: 'drift', max: 0.7
422
+ },
423
+ 'webserver': {
424
+ shape: 'ym-ring', count: 6,
425
+ colors: ['#38bdf8', '#0ea5e9', '#7dd3fc'],
426
+ glows: ['rgba(56,189,248,0.3)', 'rgba(14,165,233,0.25)', 'rgba(125,211,252,0.2)'],
427
+ sizes: [6, 10], pulse: [3, 5], drift: 'drift', max: 0.65
428
+ },
429
+ 'api': {
430
+ shape: 'ym-hex', count: 5,
431
+ colors: ['#94a3b8', '#64748b', '#cbd5e1'],
432
+ glows: ['rgba(148,163,184,0.2)', 'rgba(100,116,139,0.15)', 'rgba(203,213,225,0.1)'],
433
+ sizes: [4, 7], pulse: [4, 8], drift: 'drift', max: 0.4
434
+ },
435
+ 'tutorials': {
436
+ shape: 'ym-leaf', count: 6,
437
+ colors: ['#34d399', '#10b981', '#6ee7b7'],
438
+ glows: ['rgba(52,211,153,0.25)', 'rgba(16,185,129,0.2)', 'rgba(110,231,183,0.15)'],
439
+ sizes: [4, 7], pulse: [3, 6], drift: 'fall', max: 0.6
440
+ },
441
+ 'reference': {
442
+ shape: 'ym-spark', count: 6,
443
+ colors: ['#fbbf24', '#f59e0b', '#fcd34d'],
444
+ glows: ['rgba(251,191,36,0.3)', 'rgba(245,158,11,0.25)', 'rgba(252,211,77,0.2)'],
445
+ sizes: [3, 5], pulse: [1.5, 3], drift: 'drift', max: 0.7
446
+ },
447
+ 'docs-bundle': {
448
+ shape: 'ym-smoke', count: 6,
449
+ colors: ['rgba(251,191,36,0.3)', 'rgba(245,158,11,0.25)', 'rgba(252,211,77,0.2)'],
450
+ glows: ['rgba(251,191,36,0.08)'],
451
+ sizes: [8, 14], pulse: [5, 8], drift: 'rise', max: 0.35
452
+ },
453
+ 'gumba-tutorial': {
454
+ shape: 'ym-smoke', count: 7,
455
+ colors: ['#fbbf24', '#d97706', '#f59e0b'],
456
+ glows: ['rgba(251,191,36,0.3)', 'rgba(217,119,6,0.25)', 'rgba(245,158,11,0.2)'],
457
+ sizes: [10, 20], pulse: [4, 7], drift: 'rise', max: 0.55
458
+ }
459
+ };
460
+
461
+ /**
462
+ * Spawn themed particles based on page data-theme.
463
+ * Reads the <html data-theme="xxx"> attribute.
464
+ */
465
+ function initParticles() {
466
+ // Respect reduced-motion preference
467
+ if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
468
+ return;
469
+ }
470
+
471
+ var theme = document.documentElement.getAttribute('data-theme') || '';
472
+ var config = PARTICLE_THEMES[theme];
473
+ if (!config) return;
474
+
475
+ // Build container
476
+ var container = document.createElement('div');
477
+ container.className = 'ym-particles-container';
478
+ container.setAttribute('aria-hidden', 'true');
479
+
480
+ var driftCount = 8;
481
+ var fallCount = 3;
482
+ var riseCount = 3;
483
+
484
+ for (var i = 0; i < config.count; i++) {
485
+ var el = document.createElement('div');
486
+ var classes = 'ym-particle';
487
+ if (config.shape) classes += ' ' + config.shape;
488
+ el.className = classes;
489
+
490
+ // Randomize from palette
491
+ var ci = i % config.colors.length;
492
+ var color = config.colors[ci];
493
+ var glow = config.glows[ci % config.glows.length];
494
+ var size = randBetween(config.sizes[0], config.sizes[1]);
495
+ var pulse = randBetween(config.pulse[0], config.pulse[1]).toFixed(1);
496
+ var delay = (Math.random() * parseFloat(pulse)).toFixed(1);
497
+ var maxOpacity = (config.max * (0.6 + Math.random() * 0.4)).toFixed(2);
498
+
499
+ // Position
500
+ el.style.left = randBetween(5, 95) + '%';
501
+ el.style.top = randBetween(10, 90) + '%';
502
+
503
+ // CSS custom props
504
+ el.style.setProperty('--p-size', size + 'px');
505
+ el.style.setProperty('--p-color', color);
506
+ el.style.setProperty('--p-glow', glow);
507
+ el.style.setProperty('--p-glow-far', glow.replace(/[\d.]+\)$/, '0.08)'));
508
+ el.style.setProperty('--p-pulse', pulse + 's');
509
+ el.style.setProperty('--p-max', maxOpacity);
510
+
511
+ // Drift animation
512
+ var driftDuration = randBetween(15, 35).toFixed(0);
513
+ var driftDelay = randBetween(0, 10).toFixed(1);
514
+ var animName;
515
+ if (config.drift === 'fall') {
516
+ animName = 'ym-fall-' + ((i % fallCount) + 1);
517
+ el.style.top = '-5%';
518
+ driftDuration = randBetween(12, 25).toFixed(0);
519
+ } else if (config.drift === 'rise') {
520
+ animName = 'ym-rise-' + ((i % riseCount) + 1);
521
+ el.style.top = '100%';
522
+ driftDuration = randBetween(14, 28).toFixed(0);
523
+ } else if (config.drift === 'orbit') {
524
+ animName = 'ym-orbit';
525
+ el.style.left = '50%';
526
+ el.style.top = '50%';
527
+ driftDuration = randBetween(20, 40).toFixed(0);
528
+ } else {
529
+ animName = 'ym-drift-' + ((i % driftCount) + 1);
530
+ }
531
+ el.style.animation = animName + ' ' + driftDuration + 's ease-in-out ' + driftDelay + 's infinite';
532
+
533
+ // Inner dot
534
+ var dot = document.createElement('span');
535
+ dot.className = 'ym-dot';
536
+ dot.style.animationDelay = delay + 's';
537
+ el.appendChild(dot);
538
+
539
+ // Halo (skip for smoke & some shapes)
540
+ if (config.shape !== 'ym-smoke' && config.shape !== 'ym-ring') {
541
+ var halo = document.createElement('span');
542
+ halo.className = 'ym-halo';
543
+ halo.style.animationDelay = delay + 's';
544
+ el.appendChild(halo);
545
+ }
546
+
547
+ container.appendChild(el);
548
+ }
549
+
550
+ document.body.appendChild(container);
551
+ }
552
+
553
+ /** Random float between min and max */
554
+ function randBetween(min, max) {
555
+ return min + Math.random() * (max - min);
556
+ }