@mappoh/nova 0.1.16

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 (383) hide show
  1. package/dist/animation/parallax.d.ts +23 -0
  2. package/dist/animation/parallax.d.ts.map +1 -0
  3. package/dist/animation/parallax.js +96 -0
  4. package/dist/animation/parallax.js.map +1 -0
  5. package/dist/animation/scroll-animate.d.ts +30 -0
  6. package/dist/animation/scroll-animate.d.ts.map +1 -0
  7. package/dist/animation/scroll-animate.js +65 -0
  8. package/dist/animation/scroll-animate.js.map +1 -0
  9. package/dist/animation/scroll-observer.d.ts +32 -0
  10. package/dist/animation/scroll-observer.d.ts.map +1 -0
  11. package/dist/animation/scroll-observer.js +63 -0
  12. package/dist/animation/scroll-observer.js.map +1 -0
  13. package/dist/animation/smooth-scroll.d.ts +47 -0
  14. package/dist/animation/smooth-scroll.d.ts.map +1 -0
  15. package/dist/animation/smooth-scroll.js +169 -0
  16. package/dist/animation/smooth-scroll.js.map +1 -0
  17. package/dist/animation/text-reveal.d.ts +30 -0
  18. package/dist/animation/text-reveal.d.ts.map +1 -0
  19. package/dist/animation/text-reveal.js +164 -0
  20. package/dist/animation/text-reveal.js.map +1 -0
  21. package/dist/animation/ticker.d.ts +32 -0
  22. package/dist/animation/ticker.d.ts.map +1 -0
  23. package/dist/animation/ticker.js +62 -0
  24. package/dist/animation/ticker.js.map +1 -0
  25. package/dist/canvas/dot-grid.d.ts +50 -0
  26. package/dist/canvas/dot-grid.d.ts.map +1 -0
  27. package/dist/canvas/dot-grid.js +123 -0
  28. package/dist/canvas/dot-grid.js.map +1 -0
  29. package/dist/canvas/noise.d.ts +33 -0
  30. package/dist/canvas/noise.d.ts.map +1 -0
  31. package/dist/canvas/noise.js +241 -0
  32. package/dist/canvas/noise.js.map +1 -0
  33. package/dist/canvas/particles.d.ts +44 -0
  34. package/dist/canvas/particles.d.ts.map +1 -0
  35. package/dist/canvas/particles.js +138 -0
  36. package/dist/canvas/particles.js.map +1 -0
  37. package/dist/canvas/sequence.d.ts +43 -0
  38. package/dist/canvas/sequence.d.ts.map +1 -0
  39. package/dist/canvas/sequence.js +162 -0
  40. package/dist/canvas/sequence.js.map +1 -0
  41. package/dist/component/bind.d.ts +25 -0
  42. package/dist/component/bind.d.ts.map +1 -0
  43. package/dist/component/bind.js +28 -0
  44. package/dist/component/bind.js.map +1 -0
  45. package/dist/component/component.d.ts +76 -0
  46. package/dist/component/component.d.ts.map +1 -0
  47. package/dist/component/component.js +219 -0
  48. package/dist/component/component.js.map +1 -0
  49. package/dist/component/connect.d.ts +60 -0
  50. package/dist/component/connect.d.ts.map +1 -0
  51. package/dist/component/connect.js +115 -0
  52. package/dist/component/connect.js.map +1 -0
  53. package/dist/component/html.d.ts +35 -0
  54. package/dist/component/html.d.ts.map +1 -0
  55. package/dist/component/html.js +51 -0
  56. package/dist/component/html.js.map +1 -0
  57. package/dist/component/hydrate.d.ts +37 -0
  58. package/dist/component/hydrate.d.ts.map +1 -0
  59. package/dist/component/hydrate.js +242 -0
  60. package/dist/component/hydrate.js.map +1 -0
  61. package/dist/component/index.d.ts +9 -0
  62. package/dist/component/index.d.ts.map +1 -0
  63. package/dist/component/index.js +6 -0
  64. package/dist/component/index.js.map +1 -0
  65. package/dist/component/template.d.ts +30 -0
  66. package/dist/component/template.d.ts.map +1 -0
  67. package/dist/component/template.js +469 -0
  68. package/dist/component/template.js.map +1 -0
  69. package/dist/css/gradient-text.d.ts +40 -0
  70. package/dist/css/gradient-text.d.ts.map +1 -0
  71. package/dist/css/gradient-text.js +90 -0
  72. package/dist/css/gradient-text.js.map +1 -0
  73. package/dist/css/index.d.ts +3 -0
  74. package/dist/css/index.d.ts.map +1 -0
  75. package/dist/css/index.js +2 -0
  76. package/dist/css/index.js.map +1 -0
  77. package/dist/devtools/devtools.d.ts +27 -0
  78. package/dist/devtools/devtools.d.ts.map +1 -0
  79. package/dist/devtools/devtools.js +237 -0
  80. package/dist/devtools/devtools.js.map +1 -0
  81. package/dist/devtools/index.d.ts +3 -0
  82. package/dist/devtools/index.d.ts.map +1 -0
  83. package/dist/devtools/index.js +2 -0
  84. package/dist/devtools/index.js.map +1 -0
  85. package/dist/drag/drag.d.ts +38 -0
  86. package/dist/drag/drag.d.ts.map +1 -0
  87. package/dist/drag/drag.js +181 -0
  88. package/dist/drag/drag.js.map +1 -0
  89. package/dist/drag/index.d.ts +3 -0
  90. package/dist/drag/index.d.ts.map +1 -0
  91. package/dist/drag/index.js +2 -0
  92. package/dist/drag/index.js.map +1 -0
  93. package/dist/dropdown/dropdown.d.ts +55 -0
  94. package/dist/dropdown/dropdown.d.ts.map +1 -0
  95. package/dist/dropdown/dropdown.js +314 -0
  96. package/dist/dropdown/dropdown.js.map +1 -0
  97. package/dist/dropdown/group.d.ts +18 -0
  98. package/dist/dropdown/group.d.ts.map +1 -0
  99. package/dist/dropdown/group.js +119 -0
  100. package/dist/dropdown/group.js.map +1 -0
  101. package/dist/dropdown/index.d.ts +5 -0
  102. package/dist/dropdown/index.d.ts.map +1 -0
  103. package/dist/dropdown/index.js +3 -0
  104. package/dist/dropdown/index.js.map +1 -0
  105. package/dist/forms/form-engine.d.ts +91 -0
  106. package/dist/forms/form-engine.d.ts.map +1 -0
  107. package/dist/forms/form-engine.js +228 -0
  108. package/dist/forms/form-engine.js.map +1 -0
  109. package/dist/forms/index.d.ts +3 -0
  110. package/dist/forms/index.d.ts.map +1 -0
  111. package/dist/forms/index.js +2 -0
  112. package/dist/forms/index.js.map +1 -0
  113. package/dist/forms/validators.d.ts +20 -0
  114. package/dist/forms/validators.d.ts.map +1 -0
  115. package/dist/forms/validators.js +82 -0
  116. package/dist/forms/validators.js.map +1 -0
  117. package/dist/gallery/gallery.d.ts +66 -0
  118. package/dist/gallery/gallery.d.ts.map +1 -0
  119. package/dist/gallery/gallery.js +347 -0
  120. package/dist/gallery/gallery.js.map +1 -0
  121. package/dist/gallery/index.d.ts +3 -0
  122. package/dist/gallery/index.d.ts.map +1 -0
  123. package/dist/gallery/index.js +2 -0
  124. package/dist/gallery/index.js.map +1 -0
  125. package/dist/gesture/gesture.d.ts +44 -0
  126. package/dist/gesture/gesture.d.ts.map +1 -0
  127. package/dist/gesture/gesture.js +152 -0
  128. package/dist/gesture/gesture.js.map +1 -0
  129. package/dist/gesture/index.d.ts +3 -0
  130. package/dist/gesture/index.d.ts.map +1 -0
  131. package/dist/gesture/index.js +2 -0
  132. package/dist/gesture/index.js.map +1 -0
  133. package/dist/http/http.d.ts +44 -0
  134. package/dist/http/http.d.ts.map +1 -0
  135. package/dist/http/http.js +135 -0
  136. package/dist/http/http.js.map +1 -0
  137. package/dist/http/index.d.ts +3 -0
  138. package/dist/http/index.d.ts.map +1 -0
  139. package/dist/http/index.js +2 -0
  140. package/dist/http/index.js.map +1 -0
  141. package/dist/i18n/i18n.d.ts +28 -0
  142. package/dist/i18n/i18n.d.ts.map +1 -0
  143. package/dist/i18n/i18n.js +84 -0
  144. package/dist/i18n/i18n.js.map +1 -0
  145. package/dist/i18n/index.d.ts +3 -0
  146. package/dist/i18n/index.d.ts.map +1 -0
  147. package/dist/i18n/index.js +2 -0
  148. package/dist/i18n/index.js.map +1 -0
  149. package/dist/image/effects.d.ts +33 -0
  150. package/dist/image/effects.d.ts.map +1 -0
  151. package/dist/image/effects.js +236 -0
  152. package/dist/image/effects.js.map +1 -0
  153. package/dist/image/image.d.ts +83 -0
  154. package/dist/image/image.d.ts.map +1 -0
  155. package/dist/image/image.js +236 -0
  156. package/dist/image/image.js.map +1 -0
  157. package/dist/image/index.d.ts +5 -0
  158. package/dist/image/index.d.ts.map +1 -0
  159. package/dist/image/index.js +3 -0
  160. package/dist/image/index.js.map +1 -0
  161. package/dist/interaction/index.d.ts +3 -0
  162. package/dist/interaction/index.d.ts.map +1 -0
  163. package/dist/interaction/index.js +2 -0
  164. package/dist/interaction/index.js.map +1 -0
  165. package/dist/interaction/tilt.d.ts +30 -0
  166. package/dist/interaction/tilt.d.ts.map +1 -0
  167. package/dist/interaction/tilt.js +131 -0
  168. package/dist/interaction/tilt.js.map +1 -0
  169. package/dist/lazy/index.d.ts +3 -0
  170. package/dist/lazy/index.d.ts.map +1 -0
  171. package/dist/lazy/index.js +2 -0
  172. package/dist/lazy/index.js.map +1 -0
  173. package/dist/lazy/lazy.d.ts +42 -0
  174. package/dist/lazy/lazy.d.ts.map +1 -0
  175. package/dist/lazy/lazy.js +80 -0
  176. package/dist/lazy/lazy.js.map +1 -0
  177. package/dist/modal/index.d.ts +3 -0
  178. package/dist/modal/index.d.ts.map +1 -0
  179. package/dist/modal/index.js +2 -0
  180. package/dist/modal/index.js.map +1 -0
  181. package/dist/modal/modal.d.ts +39 -0
  182. package/dist/modal/modal.d.ts.map +1 -0
  183. package/dist/modal/modal.js +174 -0
  184. package/dist/modal/modal.js.map +1 -0
  185. package/dist/router/index.d.ts +3 -0
  186. package/dist/router/index.d.ts.map +1 -0
  187. package/dist/router/index.js +2 -0
  188. package/dist/router/index.js.map +1 -0
  189. package/dist/router/router.d.ts +80 -0
  190. package/dist/router/router.d.ts.map +1 -0
  191. package/dist/router/router.js +256 -0
  192. package/dist/router/router.js.map +1 -0
  193. package/dist/router/speculate.d.ts +28 -0
  194. package/dist/router/speculate.d.ts.map +1 -0
  195. package/dist/router/speculate.js +36 -0
  196. package/dist/router/speculate.js.map +1 -0
  197. package/dist/search/fuzzy.d.ts +16 -0
  198. package/dist/search/fuzzy.d.ts.map +1 -0
  199. package/dist/search/fuzzy.js +77 -0
  200. package/dist/search/fuzzy.js.map +1 -0
  201. package/dist/search/index.d.ts +5 -0
  202. package/dist/search/index.d.ts.map +1 -0
  203. package/dist/search/index.js +3 -0
  204. package/dist/search/index.js.map +1 -0
  205. package/dist/search/search.d.ts +56 -0
  206. package/dist/search/search.d.ts.map +1 -0
  207. package/dist/search/search.js +540 -0
  208. package/dist/search/search.js.map +1 -0
  209. package/dist/search/wasm.d.ts +35 -0
  210. package/dist/search/wasm.d.ts.map +1 -0
  211. package/dist/search/wasm.js +51 -0
  212. package/dist/search/wasm.js.map +1 -0
  213. package/dist/security/cors.d.ts +61 -0
  214. package/dist/security/cors.d.ts.map +1 -0
  215. package/dist/security/cors.js +174 -0
  216. package/dist/security/cors.js.map +1 -0
  217. package/dist/security/csp.d.ts +49 -0
  218. package/dist/security/csp.d.ts.map +1 -0
  219. package/dist/security/csp.js +143 -0
  220. package/dist/security/csp.js.map +1 -0
  221. package/dist/security/csrf.d.ts +47 -0
  222. package/dist/security/csrf.d.ts.map +1 -0
  223. package/dist/security/csrf.js +122 -0
  224. package/dist/security/csrf.js.map +1 -0
  225. package/dist/security/encrypt.d.ts +64 -0
  226. package/dist/security/encrypt.d.ts.map +1 -0
  227. package/dist/security/encrypt.js +129 -0
  228. package/dist/security/encrypt.js.map +1 -0
  229. package/dist/security/index.d.ts +21 -0
  230. package/dist/security/index.d.ts.map +1 -0
  231. package/dist/security/index.js +11 -0
  232. package/dist/security/index.js.map +1 -0
  233. package/dist/security/rate-limit.d.ts +57 -0
  234. package/dist/security/rate-limit.d.ts.map +1 -0
  235. package/dist/security/rate-limit.js +222 -0
  236. package/dist/security/rate-limit.js.map +1 -0
  237. package/dist/security/rbac.d.ts +84 -0
  238. package/dist/security/rbac.d.ts.map +1 -0
  239. package/dist/security/rbac.js +164 -0
  240. package/dist/security/rbac.js.map +1 -0
  241. package/dist/security/sanitize.d.ts +44 -0
  242. package/dist/security/sanitize.d.ts.map +1 -0
  243. package/dist/security/sanitize.js +230 -0
  244. package/dist/security/sanitize.js.map +1 -0
  245. package/dist/security/secure-store.d.ts +44 -0
  246. package/dist/security/secure-store.d.ts.map +1 -0
  247. package/dist/security/secure-store.js +164 -0
  248. package/dist/security/secure-store.js.map +1 -0
  249. package/dist/security/session.d.ts +76 -0
  250. package/dist/security/session.d.ts.map +1 -0
  251. package/dist/security/session.js +251 -0
  252. package/dist/security/session.js.map +1 -0
  253. package/dist/security/sri.d.ts +66 -0
  254. package/dist/security/sri.d.ts.map +1 -0
  255. package/dist/security/sri.js +159 -0
  256. package/dist/security/sri.js.map +1 -0
  257. package/dist/shortcuts/index.d.ts +3 -0
  258. package/dist/shortcuts/index.d.ts.map +1 -0
  259. package/dist/shortcuts/index.js +2 -0
  260. package/dist/shortcuts/index.js.map +1 -0
  261. package/dist/shortcuts/shortcuts.d.ts +43 -0
  262. package/dist/shortcuts/shortcuts.d.ts.map +1 -0
  263. package/dist/shortcuts/shortcuts.js +141 -0
  264. package/dist/shortcuts/shortcuts.js.map +1 -0
  265. package/dist/ssr/index.d.ts +3 -0
  266. package/dist/ssr/index.d.ts.map +1 -0
  267. package/dist/ssr/index.js +2 -0
  268. package/dist/ssr/index.js.map +1 -0
  269. package/dist/ssr/ssr.d.ts +62 -0
  270. package/dist/ssr/ssr.d.ts.map +1 -0
  271. package/dist/ssr/ssr.js +132 -0
  272. package/dist/ssr/ssr.js.map +1 -0
  273. package/dist/state/index.d.ts +5 -0
  274. package/dist/state/index.d.ts.map +1 -0
  275. package/dist/state/index.js +3 -0
  276. package/dist/state/index.js.map +1 -0
  277. package/dist/state/persistent.d.ts +31 -0
  278. package/dist/state/persistent.d.ts.map +1 -0
  279. package/dist/state/persistent.js +132 -0
  280. package/dist/state/persistent.js.map +1 -0
  281. package/dist/state/store.d.ts +31 -0
  282. package/dist/state/store.d.ts.map +1 -0
  283. package/dist/state/store.js +107 -0
  284. package/dist/state/store.js.map +1 -0
  285. package/dist/store/index.d.ts +3 -0
  286. package/dist/store/index.d.ts.map +1 -0
  287. package/dist/store/index.js +2 -0
  288. package/dist/store/index.js.map +1 -0
  289. package/dist/store/store.d.ts +36 -0
  290. package/dist/store/store.d.ts.map +1 -0
  291. package/dist/store/store.js +175 -0
  292. package/dist/store/store.js.map +1 -0
  293. package/dist/supabase/auth.d.ts +28 -0
  294. package/dist/supabase/auth.d.ts.map +1 -0
  295. package/dist/supabase/auth.js +47 -0
  296. package/dist/supabase/auth.js.map +1 -0
  297. package/dist/supabase/client.d.ts +18 -0
  298. package/dist/supabase/client.d.ts.map +1 -0
  299. package/dist/supabase/client.js +36 -0
  300. package/dist/supabase/client.js.map +1 -0
  301. package/dist/supabase/realtime.d.ts +22 -0
  302. package/dist/supabase/realtime.d.ts.map +1 -0
  303. package/dist/supabase/realtime.js +51 -0
  304. package/dist/supabase/realtime.js.map +1 -0
  305. package/dist/sw/index.d.ts +3 -0
  306. package/dist/sw/index.d.ts.map +1 -0
  307. package/dist/sw/index.js +2 -0
  308. package/dist/sw/index.js.map +1 -0
  309. package/dist/sw/sw.d.ts +49 -0
  310. package/dist/sw/sw.d.ts.map +1 -0
  311. package/dist/sw/sw.js +125 -0
  312. package/dist/sw/sw.js.map +1 -0
  313. package/dist/tabs/index.d.ts +3 -0
  314. package/dist/tabs/index.d.ts.map +1 -0
  315. package/dist/tabs/index.js +2 -0
  316. package/dist/tabs/index.js.map +1 -0
  317. package/dist/tabs/tabs.d.ts +34 -0
  318. package/dist/tabs/tabs.d.ts.map +1 -0
  319. package/dist/tabs/tabs.js +173 -0
  320. package/dist/tabs/tabs.js.map +1 -0
  321. package/dist/test/index.d.ts +3 -0
  322. package/dist/test/index.d.ts.map +1 -0
  323. package/dist/test/index.js +2 -0
  324. package/dist/test/index.js.map +1 -0
  325. package/dist/test/test.d.ts +37 -0
  326. package/dist/test/test.d.ts.map +1 -0
  327. package/dist/test/test.js +108 -0
  328. package/dist/test/test.js.map +1 -0
  329. package/dist/theme/index.d.ts +3 -0
  330. package/dist/theme/index.d.ts.map +1 -0
  331. package/dist/theme/index.js +2 -0
  332. package/dist/theme/index.js.map +1 -0
  333. package/dist/theme/theme.d.ts +40 -0
  334. package/dist/theme/theme.d.ts.map +1 -0
  335. package/dist/theme/theme.js +142 -0
  336. package/dist/theme/theme.js.map +1 -0
  337. package/dist/timeline/index.d.ts +3 -0
  338. package/dist/timeline/index.d.ts.map +1 -0
  339. package/dist/timeline/index.js +2 -0
  340. package/dist/timeline/index.js.map +1 -0
  341. package/dist/timeline/timeline.d.ts +44 -0
  342. package/dist/timeline/timeline.d.ts.map +1 -0
  343. package/dist/timeline/timeline.js +196 -0
  344. package/dist/timeline/timeline.js.map +1 -0
  345. package/dist/toast/index.d.ts +3 -0
  346. package/dist/toast/index.d.ts.map +1 -0
  347. package/dist/toast/index.js +2 -0
  348. package/dist/toast/index.js.map +1 -0
  349. package/dist/toast/toast.d.ts +31 -0
  350. package/dist/toast/toast.d.ts.map +1 -0
  351. package/dist/toast/toast.js +198 -0
  352. package/dist/toast/toast.js.map +1 -0
  353. package/dist/tooltip/index.d.ts +3 -0
  354. package/dist/tooltip/index.d.ts.map +1 -0
  355. package/dist/tooltip/index.js +2 -0
  356. package/dist/tooltip/index.js.map +1 -0
  357. package/dist/tooltip/tooltip.d.ts +27 -0
  358. package/dist/tooltip/tooltip.d.ts.map +1 -0
  359. package/dist/tooltip/tooltip.js +229 -0
  360. package/dist/tooltip/tooltip.js.map +1 -0
  361. package/dist/transition/index.d.ts +3 -0
  362. package/dist/transition/index.d.ts.map +1 -0
  363. package/dist/transition/index.js +2 -0
  364. package/dist/transition/index.js.map +1 -0
  365. package/dist/transition/transition.d.ts +31 -0
  366. package/dist/transition/transition.d.ts.map +1 -0
  367. package/dist/transition/transition.js +95 -0
  368. package/dist/transition/transition.js.map +1 -0
  369. package/dist/webgl/index.d.ts +3 -0
  370. package/dist/webgl/index.d.ts.map +1 -0
  371. package/dist/webgl/index.js +2 -0
  372. package/dist/webgl/index.js.map +1 -0
  373. package/dist/webgl/webgl.d.ts +49 -0
  374. package/dist/webgl/webgl.d.ts.map +1 -0
  375. package/dist/webgl/webgl.js +401 -0
  376. package/dist/webgl/webgl.js.map +1 -0
  377. package/package.json +269 -0
  378. package/styles/base/global.css +47 -0
  379. package/styles/base/reset.css +73 -0
  380. package/styles/tokens/colors.css +50 -0
  381. package/styles/tokens/spacing.css +46 -0
  382. package/styles/tokens/typography.css +37 -0
  383. package/styles/utilities/layout.css +46 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Nova Engine — Secure Storage
3
+ *
4
+ * Encrypted localStorage/sessionStorage wrapper using AES-GCM.
5
+ * All values are encrypted at rest with a derived key from a
6
+ * user-provided passphrase or auto-generated key.
7
+ */
8
+ function toBase64(buffer) {
9
+ return btoa(String.fromCharCode(...new Uint8Array(buffer)));
10
+ }
11
+ function fromBase64(base64) {
12
+ const binary = atob(base64);
13
+ const bytes = new Uint8Array(binary.length);
14
+ for (let i = 0; i < binary.length; i++)
15
+ bytes[i] = binary.charCodeAt(i);
16
+ return bytes;
17
+ }
18
+ /** Create an encrypted storage instance. */
19
+ export function createSecureStore(options = {}) {
20
+ const { passphrase, prefix = 'nova_secure', sessionOnly = false, iterations = 100_000, keyLength = 256, defaultTTL = 0, } = options;
21
+ const storage = sessionOnly ? sessionStorage : localStorage;
22
+ const saltKey = `${prefix}__salt`;
23
+ const keyStoreKey = `${prefix}__key`;
24
+ let cryptoKey = null;
25
+ let initialized = false;
26
+ function fullKey(key) {
27
+ return `${prefix}:${key}`;
28
+ }
29
+ function isOurKey(storageKey) {
30
+ return storageKey.startsWith(`${prefix}:`);
31
+ }
32
+ async function deriveKeyFromPassphrase(pass, salt) {
33
+ const baseKey = await crypto.subtle.importKey('raw', new TextEncoder().encode(pass), 'PBKDF2', false, ['deriveKey']);
34
+ return crypto.subtle.deriveKey({ name: 'PBKDF2', salt: salt, iterations, hash: 'SHA-256' }, baseKey, { name: 'AES-GCM', length: keyLength }, false, ['encrypt', 'decrypt']);
35
+ }
36
+ async function generateRandomKey() {
37
+ return crypto.subtle.generateKey({ name: 'AES-GCM', length: keyLength }, true, ['encrypt', 'decrypt']);
38
+ }
39
+ async function encryptValue(data) {
40
+ const iv = crypto.getRandomValues(new Uint8Array(12));
41
+ const encoded = new TextEncoder().encode(data);
42
+ const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: iv }, cryptoKey, encoded);
43
+ return {
44
+ ciphertext: toBase64(ciphertext),
45
+ iv: toBase64(iv.buffer),
46
+ };
47
+ }
48
+ async function decryptValue(ciphertext, iv) {
49
+ const plaintext = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: fromBase64(iv) }, cryptoKey, fromBase64(ciphertext));
50
+ return new TextDecoder().decode(plaintext);
51
+ }
52
+ const instance = {
53
+ async init() {
54
+ if (initialized)
55
+ return;
56
+ if (passphrase) {
57
+ // Derive key from passphrase
58
+ let saltB64 = storage.getItem(saltKey);
59
+ let salt;
60
+ if (saltB64) {
61
+ salt = fromBase64(saltB64);
62
+ }
63
+ else {
64
+ salt = crypto.getRandomValues(new Uint8Array(16));
65
+ storage.setItem(saltKey, toBase64(salt.buffer));
66
+ }
67
+ cryptoKey = await deriveKeyFromPassphrase(passphrase, salt);
68
+ }
69
+ else {
70
+ // Use random key (stored in storage — less secure but automatic)
71
+ const storedKey = storage.getItem(keyStoreKey);
72
+ if (storedKey) {
73
+ const jwk = JSON.parse(storedKey);
74
+ cryptoKey = await crypto.subtle.importKey('jwk', jwk, { name: 'AES-GCM' }, true, ['encrypt', 'decrypt']);
75
+ }
76
+ else {
77
+ cryptoKey = await generateRandomKey();
78
+ const exported = await crypto.subtle.exportKey('jwk', cryptoKey);
79
+ storage.setItem(keyStoreKey, JSON.stringify(exported));
80
+ }
81
+ }
82
+ initialized = true;
83
+ },
84
+ async set(key, value, ttl) {
85
+ if (!initialized)
86
+ throw new Error('SecureStore not initialized. Call init() first.');
87
+ const serialized = JSON.stringify(value);
88
+ const { ciphertext, iv } = await encryptValue(serialized);
89
+ const expiry = (ttl ?? defaultTTL) > 0 ? Date.now() + (ttl ?? defaultTTL) : 0;
90
+ const entry = { c: ciphertext, v: iv, e: expiry };
91
+ storage.setItem(fullKey(key), JSON.stringify(entry));
92
+ },
93
+ async get(key) {
94
+ if (!initialized)
95
+ throw new Error('SecureStore not initialized. Call init() first.');
96
+ const raw = storage.getItem(fullKey(key));
97
+ if (!raw)
98
+ return null;
99
+ try {
100
+ const entry = JSON.parse(raw);
101
+ // Check expiry
102
+ if (entry.e > 0 && Date.now() >= entry.e) {
103
+ storage.removeItem(fullKey(key));
104
+ return null;
105
+ }
106
+ const decrypted = await decryptValue(entry.c, entry.v);
107
+ return JSON.parse(decrypted);
108
+ }
109
+ catch {
110
+ // Corrupted or tampered data
111
+ storage.removeItem(fullKey(key));
112
+ return null;
113
+ }
114
+ },
115
+ has(key) {
116
+ const raw = storage.getItem(fullKey(key));
117
+ if (!raw)
118
+ return false;
119
+ try {
120
+ const entry = JSON.parse(raw);
121
+ if (entry.e > 0 && Date.now() >= entry.e) {
122
+ storage.removeItem(fullKey(key));
123
+ return false;
124
+ }
125
+ return true;
126
+ }
127
+ catch {
128
+ return false;
129
+ }
130
+ },
131
+ remove(key) {
132
+ storage.removeItem(fullKey(key));
133
+ },
134
+ clear() {
135
+ const toRemove = [];
136
+ for (let i = 0; i < storage.length; i++) {
137
+ const k = storage.key(i);
138
+ if (k && isOurKey(k))
139
+ toRemove.push(k);
140
+ }
141
+ for (const k of toRemove)
142
+ storage.removeItem(k);
143
+ },
144
+ keys() {
145
+ const result = [];
146
+ const prefixLen = `${prefix}:`.length;
147
+ for (let i = 0; i < storage.length; i++) {
148
+ const k = storage.key(i);
149
+ if (k && isOurKey(k))
150
+ result.push(k.slice(prefixLen));
151
+ }
152
+ return result;
153
+ },
154
+ size() {
155
+ return instance.keys().length;
156
+ },
157
+ destroy() {
158
+ cryptoKey = null;
159
+ initialized = false;
160
+ },
161
+ };
162
+ return instance;
163
+ }
164
+ //# sourceMappingURL=secure-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-store.js","sourceRoot":"","sources":["../../src/security/secure-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Nova Engine — Session Management
3
+ *
4
+ * Token lifecycle management with automatic rotation,
5
+ * expiry tracking, idle timeout, multi-tab synchronization,
6
+ * and activity monitoring.
7
+ */
8
+ export interface SessionOptions {
9
+ /** Session duration in milliseconds. Default: 30 minutes */
10
+ maxAge?: number;
11
+ /** Idle timeout in milliseconds. Default: 15 minutes */
12
+ idleTimeout?: number;
13
+ /** Auto-rotate token at interval (ms). Default: 0 (disabled) */
14
+ rotateInterval?: number;
15
+ /** Storage key prefix. Default: 'nova_session' */
16
+ storageKey?: string;
17
+ /** Use sessionStorage (true) or localStorage (false). Default: true */
18
+ useSessionStorage?: boolean;
19
+ /** Sync across tabs via storage events. Default: true */
20
+ syncTabs?: boolean;
21
+ /** Called when session expires */
22
+ onExpire?: () => void;
23
+ /** Called when user goes idle */
24
+ onIdle?: () => void;
25
+ /** Called when user returns from idle */
26
+ onResume?: () => void;
27
+ /** Called when token is rotated */
28
+ onRotate?: (newToken: string) => void;
29
+ /** Custom token generator. Default: crypto.randomUUID */
30
+ generateToken?: () => string;
31
+ /** Events that count as user activity. Default: common interaction events */
32
+ activityEvents?: string[];
33
+ }
34
+ export interface SessionData {
35
+ /** Session token */
36
+ token: string;
37
+ /** Creation timestamp */
38
+ createdAt: number;
39
+ /** Last activity timestamp */
40
+ lastActivity: number;
41
+ /** Expiry timestamp */
42
+ expiresAt: number;
43
+ /** Custom metadata */
44
+ meta: Record<string, unknown>;
45
+ }
46
+ export interface SessionInstance {
47
+ /** Start a new session */
48
+ start(meta?: Record<string, unknown>): SessionData;
49
+ /** End the current session */
50
+ end(): void;
51
+ /** Get current session data (null if expired/nonexistent) */
52
+ get(): SessionData | null;
53
+ /** Check if session is active and valid */
54
+ isActive(): boolean;
55
+ /** Check if user is currently idle */
56
+ isIdle(): boolean;
57
+ /** Manually rotate the token */
58
+ rotate(): string;
59
+ /** Touch — update last activity time */
60
+ touch(): void;
61
+ /** Get remaining time before expiry (ms) */
62
+ remainingTime(): number;
63
+ /** Get remaining idle time (ms) */
64
+ remainingIdleTime(): number;
65
+ /** Set metadata on the session */
66
+ setMeta(key: string, value: unknown): void;
67
+ /** Get metadata value */
68
+ getMeta<T = unknown>(key: string): T | undefined;
69
+ /** Subscribe to session events */
70
+ on(event: 'expire' | 'idle' | 'resume' | 'rotate' | 'start' | 'end', handler: (data?: unknown) => void): () => void;
71
+ /** Destroy — cleanup all listeners and timers */
72
+ destroy(): void;
73
+ }
74
+ /** Create a session management instance. */
75
+ export declare function createSession(options?: SessionOptions): SessionInstance;
76
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/security/session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;IACnD,8BAA8B;IAC9B,GAAG,IAAI,IAAI,CAAC;IACZ,6DAA6D;IAC7D,GAAG,IAAI,WAAW,GAAG,IAAI,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,IAAI,OAAO,CAAC;IACpB,sCAAsC;IACtC,MAAM,IAAI,OAAO,CAAC;IAClB,gCAAgC;IAChC,MAAM,IAAI,MAAM,CAAC;IACjB,wCAAwC;IACxC,KAAK,IAAI,IAAI,CAAC;IACd,4CAA4C;IAC5C,aAAa,IAAI,MAAM,CAAC;IACxB,mCAAmC;IACnC,iBAAiB,IAAI,MAAM,CAAC;IAC5B,kCAAkC;IAClC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3C,yBAAyB;IACzB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACjD,kCAAkC;IAClC,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpH,iDAAiD;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,4CAA4C;AAC5C,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,eAAe,CA0Q3E"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Nova Engine — Session Management
3
+ *
4
+ * Token lifecycle management with automatic rotation,
5
+ * expiry tracking, idle timeout, multi-tab synchronization,
6
+ * and activity monitoring.
7
+ */
8
+ /** Create a session management instance. */
9
+ export function createSession(options = {}) {
10
+ const { maxAge = 30 * 60 * 1000, idleTimeout = 15 * 60 * 1000, rotateInterval = 0, storageKey = 'nova_session', useSessionStorage = true, syncTabs = true, onExpire, onIdle, onResume, onRotate, generateToken = () => crypto.randomUUID(), activityEvents = ['mousedown', 'keydown', 'touchstart', 'scroll', 'mousemove'], } = options;
11
+ const storage = useSessionStorage ? sessionStorage : localStorage;
12
+ const listeners = new Map();
13
+ let expiryTimer = null;
14
+ let idleTimer = null;
15
+ let rotateTimer = null;
16
+ let idle = false;
17
+ let destroyed = false;
18
+ function emit(event, data) {
19
+ const handlers = listeners.get(event);
20
+ if (handlers) {
21
+ for (const h of handlers)
22
+ h(data);
23
+ }
24
+ }
25
+ function save(data) {
26
+ try {
27
+ storage.setItem(storageKey, JSON.stringify(data));
28
+ }
29
+ catch { /* quota exceeded — fail silently */ }
30
+ }
31
+ function load() {
32
+ try {
33
+ const raw = storage.getItem(storageKey);
34
+ if (!raw)
35
+ return null;
36
+ return JSON.parse(raw);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ function clear() {
43
+ storage.removeItem(storageKey);
44
+ }
45
+ function clearTimers() {
46
+ if (expiryTimer) {
47
+ clearTimeout(expiryTimer);
48
+ expiryTimer = null;
49
+ }
50
+ if (idleTimer) {
51
+ clearTimeout(idleTimer);
52
+ idleTimer = null;
53
+ }
54
+ if (rotateTimer) {
55
+ clearInterval(rotateTimer);
56
+ rotateTimer = null;
57
+ }
58
+ }
59
+ function startExpiryTimer(data) {
60
+ if (expiryTimer)
61
+ clearTimeout(expiryTimer);
62
+ const remaining = data.expiresAt - Date.now();
63
+ if (remaining <= 0) {
64
+ handleExpiry();
65
+ return;
66
+ }
67
+ expiryTimer = setTimeout(handleExpiry, remaining);
68
+ }
69
+ function startIdleTimer() {
70
+ if (idleTimer)
71
+ clearTimeout(idleTimer);
72
+ idleTimer = setTimeout(handleIdle, idleTimeout);
73
+ }
74
+ function handleExpiry() {
75
+ clear();
76
+ clearTimers();
77
+ removeActivityListeners();
78
+ emit('expire');
79
+ onExpire?.();
80
+ }
81
+ function handleIdle() {
82
+ idle = true;
83
+ emit('idle');
84
+ onIdle?.();
85
+ }
86
+ function onActivity() {
87
+ if (destroyed)
88
+ return;
89
+ const data = load();
90
+ if (!data)
91
+ return;
92
+ // Check if session has expired
93
+ if (Date.now() >= data.expiresAt) {
94
+ handleExpiry();
95
+ return;
96
+ }
97
+ // Update last activity
98
+ data.lastActivity = Date.now();
99
+ save(data);
100
+ // Resume from idle
101
+ if (idle) {
102
+ idle = false;
103
+ emit('resume');
104
+ onResume?.();
105
+ }
106
+ // Reset idle timer
107
+ startIdleTimer();
108
+ }
109
+ function addActivityListeners() {
110
+ for (const event of activityEvents) {
111
+ document.addEventListener(event, onActivity, { passive: true });
112
+ }
113
+ }
114
+ function removeActivityListeners() {
115
+ for (const event of activityEvents) {
116
+ document.removeEventListener(event, onActivity);
117
+ }
118
+ }
119
+ // Cross-tab sync
120
+ function onStorageChange(e) {
121
+ if (e.key !== storageKey)
122
+ return;
123
+ if (e.newValue === null) {
124
+ // Session ended in another tab
125
+ clearTimers();
126
+ removeActivityListeners();
127
+ emit('end');
128
+ }
129
+ else {
130
+ // Session updated in another tab
131
+ const data = load();
132
+ if (data) {
133
+ startExpiryTimer(data);
134
+ }
135
+ }
136
+ }
137
+ if (syncTabs && !useSessionStorage) {
138
+ window.addEventListener('storage', onStorageChange);
139
+ }
140
+ const instance = {
141
+ start(meta) {
142
+ const now = Date.now();
143
+ const token = generateToken();
144
+ const data = {
145
+ token,
146
+ createdAt: now,
147
+ lastActivity: now,
148
+ expiresAt: now + maxAge,
149
+ meta: meta ?? {},
150
+ };
151
+ save(data);
152
+ idle = false;
153
+ startExpiryTimer(data);
154
+ startIdleTimer();
155
+ addActivityListeners();
156
+ if (rotateInterval > 0) {
157
+ rotateTimer = setInterval(() => instance.rotate(), rotateInterval);
158
+ }
159
+ emit('start', data);
160
+ return data;
161
+ },
162
+ end() {
163
+ clear();
164
+ clearTimers();
165
+ removeActivityListeners();
166
+ idle = false;
167
+ emit('end');
168
+ },
169
+ get() {
170
+ const data = load();
171
+ if (!data)
172
+ return null;
173
+ if (Date.now() >= data.expiresAt) {
174
+ handleExpiry();
175
+ return null;
176
+ }
177
+ return data;
178
+ },
179
+ isActive() {
180
+ return instance.get() !== null;
181
+ },
182
+ isIdle() {
183
+ return idle;
184
+ },
185
+ rotate() {
186
+ const data = load();
187
+ if (!data)
188
+ return '';
189
+ const newToken = generateToken();
190
+ data.token = newToken;
191
+ save(data);
192
+ emit('rotate', newToken);
193
+ onRotate?.(newToken);
194
+ return newToken;
195
+ },
196
+ touch() {
197
+ onActivity();
198
+ },
199
+ remainingTime() {
200
+ const data = load();
201
+ if (!data)
202
+ return 0;
203
+ return Math.max(0, data.expiresAt - Date.now());
204
+ },
205
+ remainingIdleTime() {
206
+ const data = load();
207
+ if (!data)
208
+ return 0;
209
+ const elapsed = Date.now() - data.lastActivity;
210
+ return Math.max(0, idleTimeout - elapsed);
211
+ },
212
+ setMeta(key, value) {
213
+ const data = load();
214
+ if (!data)
215
+ return;
216
+ data.meta[key] = value;
217
+ save(data);
218
+ },
219
+ getMeta(key) {
220
+ const data = load();
221
+ return data?.meta[key];
222
+ },
223
+ on(event, handler) {
224
+ if (!listeners.has(event))
225
+ listeners.set(event, new Set());
226
+ listeners.get(event).add(handler);
227
+ return () => listeners.get(event)?.delete(handler);
228
+ },
229
+ destroy() {
230
+ destroyed = true;
231
+ clearTimers();
232
+ removeActivityListeners();
233
+ listeners.clear();
234
+ if (syncTabs && !useSessionStorage) {
235
+ window.removeEventListener('storage', onStorageChange);
236
+ }
237
+ },
238
+ };
239
+ // If there's an existing session, resume it
240
+ const existing = load();
241
+ if (existing && Date.now() < existing.expiresAt) {
242
+ startExpiryTimer(existing);
243
+ startIdleTimer();
244
+ addActivityListeners();
245
+ if (rotateInterval > 0) {
246
+ rotateTimer = setInterval(() => instance.rotate(), rotateInterval);
247
+ }
248
+ }
249
+ return instance;
250
+ }
251
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/security/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Nova Engine — Subresource Integrity (SRI)
3
+ *
4
+ * Generate SRI hashes for scripts and stylesheets, inject integrity
5
+ * attributes, and verify resource integrity at runtime.
6
+ */
7
+ export type SRIAlgorithm = 'sha256' | 'sha384' | 'sha512';
8
+ export interface SRIOptions {
9
+ /** Hash algorithm(s). Default: ['sha384'] */
10
+ algorithms?: SRIAlgorithm[];
11
+ /** Also set crossorigin attribute. Default: 'anonymous' */
12
+ crossorigin?: string | false;
13
+ }
14
+ export interface SRIHash {
15
+ /** The integrity attribute value (e.g. 'sha384-abc123...') */
16
+ integrity: string;
17
+ /** Individual algorithm-hash pairs */
18
+ hashes: Array<{
19
+ algorithm: SRIAlgorithm;
20
+ hash: string;
21
+ }>;
22
+ }
23
+ /** Generate SRI hash(es) for a string of content. */
24
+ export declare function generateSRI(content: string, options?: SRIOptions): Promise<SRIHash>;
25
+ /** Generate SRI hash(es) for an ArrayBuffer. */
26
+ export declare function generateSRIFromBuffer(buffer: ArrayBuffer, options?: SRIOptions): Promise<SRIHash>;
27
+ /** Fetch a resource and generate its SRI hash. */
28
+ export declare function generateSRIFromURL(url: string, options?: SRIOptions): Promise<SRIHash>;
29
+ /**
30
+ * Create a <script> element with SRI integrity attribute.
31
+ * Optionally appends to a target element.
32
+ */
33
+ export declare function createSecureScript(src: string, options?: SRIOptions & {
34
+ /** Append to this element. Default: null (don't append) */
35
+ appendTo?: Element;
36
+ /** Additional script attributes */
37
+ async?: boolean;
38
+ defer?: boolean;
39
+ type?: string;
40
+ }): Promise<HTMLScriptElement>;
41
+ /**
42
+ * Create a <link rel="stylesheet"> element with SRI integrity attribute.
43
+ * Optionally appends to a target element.
44
+ */
45
+ export declare function createSecureStylesheet(href: string, options?: SRIOptions & {
46
+ /** Append to this element. Default: null (don't append) */
47
+ appendTo?: Element;
48
+ /** Media query */
49
+ media?: string;
50
+ }): Promise<HTMLLinkElement>;
51
+ /**
52
+ * Verify that a resource's content matches an expected SRI hash.
53
+ * Useful for runtime integrity checks of dynamically loaded content.
54
+ */
55
+ export declare function verifySRI(content: string | ArrayBuffer, expectedIntegrity: string): Promise<boolean>;
56
+ /**
57
+ * Scan existing <script> and <link> elements and add SRI
58
+ * integrity attributes where missing.
59
+ */
60
+ export declare function enforceAllSRI(options?: SRIOptions & {
61
+ /** Only process elements matching this selector. Default: all scripts and stylesheets */
62
+ selector?: string;
63
+ /** Skip local (same-origin) resources. Default: false */
64
+ skipLocal?: boolean;
65
+ }): Promise<number>;
66
+ //# sourceMappingURL=sri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sri.d.ts","sourceRoot":"","sources":["../../src/security/sri.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,MAAM,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAYD,qDAAqD;AACrD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED,gDAAgD;AAChD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,OAAO,CAAC,CAclB;AAED,kDAAkD;AAClD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,UAAU,GAAG;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,OAAO,CAAC,iBAAiB,CAAC,CAoB5B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,UAAU,GAAG;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,eAAe,CAAC,CAmB1B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,GAAG,WAAW,EAC7B,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,CAAC,EAAE,UAAU,GAAG;IACrB,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,OAAO,CAAC,MAAM,CAAC,CAqCjB"}