@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,347 @@
1
+ /**
2
+ * Nova Engine — Image Gallery
3
+ *
4
+ * Lightbox, zoom, pan, filmstrip navigation, keyboard controls,
5
+ * and touch gestures for image galleries.
6
+ */
7
+ const STYLE_ID = 'nova-gallery-styles';
8
+ function injectStyles() {
9
+ if (document.getElementById(STYLE_ID))
10
+ return;
11
+ const s = document.createElement('style');
12
+ s.id = STYLE_ID;
13
+ s.textContent = `
14
+ .nova-gallery {
15
+ position: fixed; inset: 0; z-index: 999999;
16
+ background: var(--color-bg-overlay, rgba(0,0,0,0.92)); backdrop-filter: blur(8px);
17
+ display: none; flex-direction: column; align-items: center; justify-content: center;
18
+ color: var(--color-text-primary, #fff); font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
19
+ opacity: 0; transition: opacity 0.25s ease-out;
20
+ user-select: none;
21
+ }
22
+ .nova-gallery--open { display: flex; }
23
+ .nova-gallery--visible { opacity: 1; }
24
+ .nova-gallery__viewport {
25
+ flex: 1; display: flex; align-items: center; justify-content: center;
26
+ width: 100%; position: relative; overflow: hidden; cursor: grab;
27
+ }
28
+ .nova-gallery__viewport:active { cursor: grabbing; }
29
+ .nova-gallery__img {
30
+ max-width: 90vw; max-height: 75vh; object-fit: contain;
31
+ transition: transform 0.2s ease-out, opacity 0.2s ease-out;
32
+ touch-action: none;
33
+ }
34
+ .nova-gallery__topbar {
35
+ display: flex; justify-content: space-between; align-items: center;
36
+ width: 100%; padding: 12px 20px;
37
+ }
38
+ .nova-gallery__counter { font-size: 13px; color: var(--color-text-primary-50, rgba(255,255,255,0.6)); }
39
+ .nova-gallery__caption {
40
+ text-align: center; padding: 8px 20px; font-size: 13px; color: var(--color-text-primary-70, rgba(255,255,255,0.7));
41
+ max-width: 600px;
42
+ }
43
+ .nova-gallery__close {
44
+ background: none; border: none; color: var(--color-text-primary-50, rgba(255,255,255,0.6)); cursor: pointer;
45
+ font-size: 28px; padding: 0; line-height: 1;
46
+ }
47
+ .nova-gallery__close:hover { color: var(--color-text-primary, #fff); }
48
+ .nova-gallery__nav {
49
+ position: absolute; top: 50%; transform: translateY(-50%);
50
+ background: var(--color-text-primary-10, rgba(255,255,255,0.08)); border: 1px solid var(--color-border, rgba(255,255,255,0.1));
51
+ border-radius: 50%; width: 44px; height: 44px;
52
+ display: flex; align-items: center; justify-content: center;
53
+ color: var(--color-text-primary, #fff); cursor: pointer; font-size: 20px; transition: background 0.15s;
54
+ z-index: 2;
55
+ }
56
+ .nova-gallery__nav:hover { background: rgba(255,255,255,0.15); }
57
+ .nova-gallery__nav--prev { left: 16px; }
58
+ .nova-gallery__nav--next { right: 16px; }
59
+ .nova-gallery__filmstrip {
60
+ display: flex; gap: 6px; padding: 10px 20px; overflow-x: auto;
61
+ max-width: 100%;
62
+ }
63
+ .nova-gallery__thumb {
64
+ width: 56px; height: 56px; object-fit: cover; border-radius: 6px;
65
+ border: 2px solid transparent; cursor: pointer; opacity: 0.5;
66
+ transition: opacity 0.15s, border-color 0.15s; flex-shrink: 0;
67
+ }
68
+ .nova-gallery__thumb:hover { opacity: 0.8; }
69
+ .nova-gallery__thumb--active { opacity: 1; border-color: var(--color-text-primary, #fff); }
70
+ @media (prefers-reduced-motion: reduce) {
71
+ .nova-gallery, .nova-gallery__img { transition: none; }
72
+ }`;
73
+ document.head.appendChild(s);
74
+ }
75
+ /** Create a gallery / lightbox instance. */
76
+ export function createGallery(options) {
77
+ const { items, startIndex = 0, filmstrip = true, zoom = true, maxZoom = 3, keyboard = true, swipe = true, loop = true, closeOnBackdrop = true, counter = true, animationDuration = 250, onChange, onClose, } = options;
78
+ injectStyles();
79
+ let currentIndex = startIndex;
80
+ let opened = false;
81
+ let currentZoom = 1;
82
+ let panX = 0, panY = 0;
83
+ // Build DOM
84
+ const overlay = document.createElement('div');
85
+ overlay.className = 'nova-gallery';
86
+ // Top bar
87
+ const topbar = document.createElement('div');
88
+ topbar.className = 'nova-gallery__topbar';
89
+ const counterEl = document.createElement('span');
90
+ counterEl.className = 'nova-gallery__counter';
91
+ const closeBtn = document.createElement('button');
92
+ closeBtn.className = 'nova-gallery__close';
93
+ closeBtn.setAttribute('aria-label', 'Close gallery');
94
+ closeBtn.textContent = '\u00d7';
95
+ topbar.appendChild(counterEl);
96
+ topbar.appendChild(closeBtn);
97
+ overlay.appendChild(topbar);
98
+ // Viewport
99
+ const viewport = document.createElement('div');
100
+ viewport.className = 'nova-gallery__viewport';
101
+ const prevBtn = document.createElement('button');
102
+ prevBtn.className = 'nova-gallery__nav nova-gallery__nav--prev';
103
+ prevBtn.setAttribute('aria-label', 'Previous');
104
+ prevBtn.textContent = '\u2039';
105
+ const nextBtn = document.createElement('button');
106
+ nextBtn.className = 'nova-gallery__nav nova-gallery__nav--next';
107
+ nextBtn.setAttribute('aria-label', 'Next');
108
+ nextBtn.textContent = '\u203a';
109
+ const img = document.createElement('img');
110
+ img.className = 'nova-gallery__img';
111
+ img.draggable = false;
112
+ viewport.appendChild(prevBtn);
113
+ viewport.appendChild(img);
114
+ viewport.appendChild(nextBtn);
115
+ overlay.appendChild(viewport);
116
+ // Caption
117
+ const captionEl = document.createElement('div');
118
+ captionEl.className = 'nova-gallery__caption';
119
+ overlay.appendChild(captionEl);
120
+ // Filmstrip
121
+ let filmstripEl = null;
122
+ const thumbEls = [];
123
+ if (filmstrip) {
124
+ filmstripEl = document.createElement('div');
125
+ filmstripEl.className = 'nova-gallery__filmstrip';
126
+ for (let i = 0; i < items.length; i++) {
127
+ const thumb = document.createElement('img');
128
+ thumb.className = 'nova-gallery__thumb';
129
+ thumb.src = items[i].thumb ?? items[i].src;
130
+ thumb.alt = items[i].alt ?? '';
131
+ thumb.addEventListener('click', () => goTo(i));
132
+ filmstripEl.appendChild(thumb);
133
+ thumbEls.push(thumb);
134
+ }
135
+ overlay.appendChild(filmstripEl);
136
+ }
137
+ document.body.appendChild(overlay);
138
+ function update() {
139
+ const item = items[currentIndex];
140
+ img.src = item.src;
141
+ img.alt = item.alt ?? '';
142
+ if (counter)
143
+ counterEl.textContent = `${currentIndex + 1} / ${items.length}`;
144
+ captionEl.textContent = item.caption ?? '';
145
+ captionEl.style.display = item.caption ? '' : 'none';
146
+ // Reset zoom/pan
147
+ currentZoom = 1;
148
+ panX = 0;
149
+ panY = 0;
150
+ img.style.transform = '';
151
+ // Update filmstrip
152
+ for (let i = 0; i < thumbEls.length; i++) {
153
+ thumbEls[i].classList.toggle('nova-gallery__thumb--active', i === currentIndex);
154
+ }
155
+ // Scroll active thumb into view
156
+ thumbEls[currentIndex]?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });
157
+ // Nav visibility
158
+ if (!loop) {
159
+ prevBtn.style.display = currentIndex === 0 ? 'none' : '';
160
+ nextBtn.style.display = currentIndex === items.length - 1 ? 'none' : '';
161
+ }
162
+ onChange?.(currentIndex);
163
+ }
164
+ function goTo(index) {
165
+ if (index < 0)
166
+ index = loop ? items.length - 1 : 0;
167
+ if (index >= items.length)
168
+ index = loop ? 0 : items.length - 1;
169
+ currentIndex = index;
170
+ update();
171
+ }
172
+ // Zoom
173
+ function handleWheel(e) {
174
+ if (!zoom)
175
+ return;
176
+ e.preventDefault();
177
+ const delta = e.deltaY > 0 ? -0.2 : 0.2;
178
+ currentZoom = Math.max(1, Math.min(maxZoom, currentZoom + delta));
179
+ if (currentZoom === 1) {
180
+ panX = 0;
181
+ panY = 0;
182
+ }
183
+ img.style.transform = `scale(${currentZoom}) translate(${panX}px, ${panY}px)`;
184
+ }
185
+ // Pan
186
+ let isPanning = false;
187
+ let panStartX = 0, panStartY = 0;
188
+ function onPointerDown(e) {
189
+ if (currentZoom <= 1)
190
+ return;
191
+ isPanning = true;
192
+ panStartX = e.clientX - panX;
193
+ panStartY = e.clientY - panY;
194
+ viewport.setPointerCapture(e.pointerId);
195
+ }
196
+ function onPointerMove(e) {
197
+ if (!isPanning)
198
+ return;
199
+ panX = e.clientX - panStartX;
200
+ panY = e.clientY - panStartY;
201
+ img.style.transform = `scale(${currentZoom}) translate(${panX}px, ${panY}px)`;
202
+ }
203
+ function onPointerUp() {
204
+ isPanning = false;
205
+ }
206
+ // Swipe detection (when not zoomed)
207
+ let swipeStartX = 0;
208
+ function onTouchStart(e) {
209
+ if (!swipe || currentZoom > 1)
210
+ return;
211
+ swipeStartX = e.touches[0].clientX;
212
+ }
213
+ function onTouchEnd(e) {
214
+ if (!swipe || currentZoom > 1)
215
+ return;
216
+ const dx = e.changedTouches[0].clientX - swipeStartX;
217
+ if (Math.abs(dx) > 50) {
218
+ if (dx > 0)
219
+ goTo(currentIndex - 1);
220
+ else
221
+ goTo(currentIndex + 1);
222
+ }
223
+ }
224
+ // Keyboard
225
+ function onKeydown(e) {
226
+ if (!opened || !keyboard)
227
+ return;
228
+ if (e.key === 'Escape')
229
+ instance.close();
230
+ if (e.key === 'ArrowLeft')
231
+ goTo(currentIndex - 1);
232
+ if (e.key === 'ArrowRight')
233
+ goTo(currentIndex + 1);
234
+ if (e.key === 'Home')
235
+ goTo(0);
236
+ if (e.key === 'End')
237
+ goTo(items.length - 1);
238
+ }
239
+ // Backdrop click
240
+ function onBackdropClick(e) {
241
+ if (!closeOnBackdrop)
242
+ return;
243
+ if (e.target === viewport || e.target === overlay)
244
+ instance.close();
245
+ }
246
+ // Events
247
+ closeBtn.addEventListener('click', () => instance.close());
248
+ prevBtn.addEventListener('click', () => goTo(currentIndex - 1));
249
+ nextBtn.addEventListener('click', () => goTo(currentIndex + 1));
250
+ viewport.addEventListener('wheel', handleWheel, { passive: false });
251
+ viewport.addEventListener('pointerdown', onPointerDown);
252
+ viewport.addEventListener('pointermove', onPointerMove);
253
+ viewport.addEventListener('pointerup', onPointerUp);
254
+ viewport.addEventListener('touchstart', onTouchStart, { passive: true });
255
+ viewport.addEventListener('touchend', onTouchEnd);
256
+ overlay.addEventListener('click', onBackdropClick);
257
+ document.addEventListener('keydown', onKeydown);
258
+ // Double-click to zoom
259
+ img.addEventListener('dblclick', () => {
260
+ if (!zoom)
261
+ return;
262
+ if (currentZoom > 1) {
263
+ currentZoom = 1;
264
+ panX = 0;
265
+ panY = 0;
266
+ }
267
+ else {
268
+ currentZoom = 2;
269
+ }
270
+ img.style.transform = `scale(${currentZoom}) translate(${panX}px, ${panY}px)`;
271
+ });
272
+ const instance = {
273
+ open(index) {
274
+ if (opened)
275
+ return;
276
+ opened = true;
277
+ if (index !== undefined)
278
+ currentIndex = index;
279
+ update();
280
+ overlay.classList.add('nova-gallery--open');
281
+ requestAnimationFrame(() => {
282
+ void overlay.offsetHeight;
283
+ overlay.classList.add('nova-gallery--visible');
284
+ });
285
+ document.body.style.overflow = 'hidden';
286
+ },
287
+ close() {
288
+ if (!opened)
289
+ return;
290
+ opened = false;
291
+ overlay.classList.remove('nova-gallery--visible');
292
+ const finish = () => {
293
+ overlay.classList.remove('nova-gallery--open');
294
+ document.body.style.overflow = '';
295
+ onClose?.();
296
+ };
297
+ if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
298
+ finish();
299
+ }
300
+ else {
301
+ setTimeout(finish, animationDuration);
302
+ }
303
+ },
304
+ next() { goTo(currentIndex + 1); },
305
+ prev() { goTo(currentIndex - 1); },
306
+ goTo,
307
+ isOpen() { return opened; },
308
+ destroy() {
309
+ if (opened)
310
+ instance.close();
311
+ document.removeEventListener('keydown', onKeydown);
312
+ overlay.remove();
313
+ },
314
+ };
315
+ return instance;
316
+ }
317
+ /**
318
+ * Attach a gallery to image elements matching a selector.
319
+ * Automatically builds items from img[src] and img[alt].
320
+ * Returns a cleanup function.
321
+ */
322
+ export function gallery(selector, options) {
323
+ const images = document.querySelectorAll(selector);
324
+ const items = [];
325
+ for (const img of images) {
326
+ items.push({
327
+ src: img.getAttribute('data-full') ?? img.src,
328
+ thumb: img.src,
329
+ alt: img.alt,
330
+ caption: img.getAttribute('data-caption') ?? undefined,
331
+ });
332
+ }
333
+ const instance = createGallery({ items, ...options });
334
+ const handlers = [];
335
+ images.forEach((img, i) => {
336
+ const handler = () => instance.open(i);
337
+ img.style.cursor = 'pointer';
338
+ img.addEventListener('click', handler);
339
+ handlers.push(() => img.removeEventListener('click', handler));
340
+ });
341
+ return () => {
342
+ instance.destroy();
343
+ for (const h of handlers)
344
+ h();
345
+ };
346
+ }
347
+ //# sourceMappingURL=gallery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gallery.js","sourceRoot":"","sources":["../../src/gallery/gallery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createGallery, gallery } from './gallery';
2
+ export type { GalleryItem, GalleryOptions, GalleryInstance } from './gallery';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gallery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createGallery, gallery } from './gallery';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gallery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Nova Engine — Touch Gesture Recognition
3
+ *
4
+ * Swipe, pinch, pan, and long-press detection with velocity and direction data.
5
+ */
6
+ export type GestureType = 'swipe' | 'pinch' | 'pan' | 'longpress' | 'tap';
7
+ export type SwipeDirection = 'up' | 'down' | 'left' | 'right';
8
+ export interface GestureEvent {
9
+ type: GestureType;
10
+ /** Horizontal delta from start */
11
+ deltaX: number;
12
+ /** Vertical delta from start */
13
+ deltaY: number;
14
+ /** Velocity in px/ms */
15
+ velocityX: number;
16
+ velocityY: number;
17
+ /** Swipe direction (for swipe events) */
18
+ direction?: SwipeDirection;
19
+ /** Pinch scale factor (for pinch events) */
20
+ scale?: number;
21
+ /** Distance between two fingers (for pinch events) */
22
+ distance?: number;
23
+ /** Original touch/pointer event */
24
+ originalEvent: Event;
25
+ }
26
+ export interface GestureOptions {
27
+ /** Min distance for swipe detection in px. Default: 50 */
28
+ swipeThreshold?: number;
29
+ /** Min velocity for swipe in px/ms. Default: 0.3 */
30
+ swipeVelocity?: number;
31
+ /** Long press duration in ms. Default: 500 */
32
+ longPressDuration?: number;
33
+ /** Max movement for tap in px. Default: 10 */
34
+ tapTolerance?: number;
35
+ /** Enable specific gesture types. Default: all */
36
+ gestures?: GestureType[];
37
+ }
38
+ export interface GestureInstance {
39
+ on(type: GestureType, handler: (e: GestureEvent) => void): () => void;
40
+ destroy(): void;
41
+ }
42
+ /** Create a gesture recognizer on an element. */
43
+ export declare function gesture(element: string | Element, options?: GestureOptions): GestureInstance;
44
+ //# sourceMappingURL=gesture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/gesture/gesture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,WAAW,GAAG,KAAK,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,aAAa,EAAE,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACtE,OAAO,IAAI,IAAI,CAAC;CACjB;AAUD,iDAAiD;AACjD,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,GAAG,OAAO,EACzB,OAAO,GAAE,cAAmB,GAC3B,eAAe,CAuJjB"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Nova Engine — Touch Gesture Recognition
3
+ *
4
+ * Swipe, pinch, pan, and long-press detection with velocity and direction data.
5
+ */
6
+ function dist(x, y) {
7
+ return Math.sqrt(x * x + y * y);
8
+ }
9
+ function touchDist(a, b) {
10
+ return dist(a.clientX - b.clientX, a.clientY - b.clientY);
11
+ }
12
+ /** Create a gesture recognizer on an element. */
13
+ export function gesture(element, options = {}) {
14
+ const { swipeThreshold = 50, swipeVelocity = 0.3, longPressDuration = 500, tapTolerance = 10, gestures = ['swipe', 'pinch', 'pan', 'longpress', 'tap'], } = options;
15
+ const el = typeof element === 'string'
16
+ ? document.querySelector(element)
17
+ : element;
18
+ const handlers = new Map();
19
+ for (const g of gestures)
20
+ handlers.set(g, new Set());
21
+ function emit(type, data) {
22
+ const set = handlers.get(type);
23
+ if (!set)
24
+ return;
25
+ const event = {
26
+ type,
27
+ deltaX: 0,
28
+ deltaY: 0,
29
+ velocityX: 0,
30
+ velocityY: 0,
31
+ ...data,
32
+ };
33
+ for (const fn of set)
34
+ fn(event);
35
+ }
36
+ let startX = 0, startY = 0, startTime = 0;
37
+ let longPressTimer;
38
+ let initialPinchDist = 0;
39
+ let isPanning = false;
40
+ function onTouchStart(e) {
41
+ if (e.touches.length === 1) {
42
+ startX = e.touches[0].clientX;
43
+ startY = e.touches[0].clientY;
44
+ startTime = Date.now();
45
+ isPanning = false;
46
+ if (gestures.includes('longpress')) {
47
+ longPressTimer = setTimeout(() => {
48
+ emit('longpress', {
49
+ deltaX: 0, deltaY: 0,
50
+ originalEvent: e,
51
+ });
52
+ }, longPressDuration);
53
+ }
54
+ }
55
+ if (e.touches.length === 2 && gestures.includes('pinch')) {
56
+ initialPinchDist = touchDist(e.touches[0], e.touches[1]);
57
+ }
58
+ }
59
+ function onTouchMove(e) {
60
+ if (longPressTimer) {
61
+ const dx = e.touches[0].clientX - startX;
62
+ const dy = e.touches[0].clientY - startY;
63
+ if (dist(dx, dy) > tapTolerance) {
64
+ clearTimeout(longPressTimer);
65
+ longPressTimer = undefined;
66
+ }
67
+ }
68
+ if (e.touches.length === 1 && gestures.includes('pan')) {
69
+ const dx = e.touches[0].clientX - startX;
70
+ const dy = e.touches[0].clientY - startY;
71
+ if (!isPanning && dist(dx, dy) > tapTolerance)
72
+ isPanning = true;
73
+ if (isPanning) {
74
+ const elapsed = Date.now() - startTime || 1;
75
+ emit('pan', {
76
+ deltaX: dx, deltaY: dy,
77
+ velocityX: dx / elapsed,
78
+ velocityY: dy / elapsed,
79
+ originalEvent: e,
80
+ });
81
+ }
82
+ }
83
+ if (e.touches.length === 2 && gestures.includes('pinch') && initialPinchDist > 0) {
84
+ const currentDist = touchDist(e.touches[0], e.touches[1]);
85
+ const scale = currentDist / initialPinchDist;
86
+ emit('pinch', {
87
+ scale,
88
+ distance: currentDist,
89
+ deltaX: 0, deltaY: 0,
90
+ originalEvent: e,
91
+ });
92
+ }
93
+ }
94
+ function onTouchEnd(e) {
95
+ if (longPressTimer) {
96
+ clearTimeout(longPressTimer);
97
+ longPressTimer = undefined;
98
+ }
99
+ if (e.changedTouches.length === 1) {
100
+ const dx = e.changedTouches[0].clientX - startX;
101
+ const dy = e.changedTouches[0].clientY - startY;
102
+ const elapsed = Date.now() - startTime || 1;
103
+ const d = dist(dx, dy);
104
+ // Tap detection
105
+ if (d < tapTolerance && elapsed < 300 && gestures.includes('tap')) {
106
+ emit('tap', { deltaX: dx, deltaY: dy, originalEvent: e });
107
+ return;
108
+ }
109
+ // Swipe detection
110
+ if (gestures.includes('swipe') && d >= swipeThreshold) {
111
+ const vx = Math.abs(dx / elapsed);
112
+ const vy = Math.abs(dy / elapsed);
113
+ if (vx >= swipeVelocity || vy >= swipeVelocity) {
114
+ let direction;
115
+ if (Math.abs(dx) > Math.abs(dy)) {
116
+ direction = dx > 0 ? 'right' : 'left';
117
+ }
118
+ else {
119
+ direction = dy > 0 ? 'down' : 'up';
120
+ }
121
+ emit('swipe', {
122
+ deltaX: dx, deltaY: dy,
123
+ velocityX: dx / elapsed, velocityY: dy / elapsed,
124
+ direction,
125
+ originalEvent: e,
126
+ });
127
+ }
128
+ }
129
+ }
130
+ initialPinchDist = 0;
131
+ isPanning = false;
132
+ }
133
+ el.addEventListener('touchstart', onTouchStart, { passive: true });
134
+ el.addEventListener('touchmove', onTouchMove, { passive: true });
135
+ el.addEventListener('touchend', onTouchEnd);
136
+ return {
137
+ on(type, handler) {
138
+ if (!handlers.has(type))
139
+ handlers.set(type, new Set());
140
+ handlers.get(type).add(handler);
141
+ return () => handlers.get(type)?.delete(handler);
142
+ },
143
+ destroy() {
144
+ el.removeEventListener('touchstart', onTouchStart);
145
+ el.removeEventListener('touchmove', onTouchMove);
146
+ el.removeEventListener('touchend', onTouchEnd);
147
+ for (const set of handlers.values())
148
+ set.clear();
149
+ },
150
+ };
151
+ }
152
+ //# sourceMappingURL=gesture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture.js","sourceRoot":"","sources":["../../src/gesture/gesture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { gesture } from './gesture';
2
+ export type { GestureType, SwipeDirection, GestureEvent, GestureOptions, GestureInstance } from './gesture';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gesture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { gesture } from './gesture';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gesture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Nova Engine — HTTP Client
3
+ *
4
+ * Typed fetch wrapper with interceptors, retries, timeout, and abort control.
5
+ * Pure TypeScript, zero external dependencies.
6
+ */
7
+ export interface HttpOptions {
8
+ baseUrl?: string;
9
+ headers?: Record<string, string>;
10
+ timeout?: number;
11
+ retries?: number;
12
+ retryDelay?: number;
13
+ retryBackoff?: boolean;
14
+ credentials?: RequestCredentials;
15
+ onRequest?: (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;
16
+ onResponse?: (response: Response, config: RequestConfig) => Response | Promise<Response>;
17
+ onError?: (error: HttpError) => void;
18
+ }
19
+ export interface RequestConfig {
20
+ url: string;
21
+ method: string;
22
+ headers: Record<string, string>;
23
+ body?: unknown;
24
+ signal?: AbortSignal;
25
+ timeout?: number;
26
+ retries?: number;
27
+ params?: Record<string, string | number | boolean>;
28
+ }
29
+ export interface HttpError extends Error {
30
+ status?: number;
31
+ response?: Response;
32
+ config: RequestConfig;
33
+ }
34
+ export interface HttpInstance {
35
+ get<T = unknown>(url: string, config?: Partial<RequestConfig>): Promise<T>;
36
+ post<T = unknown>(url: string, body?: unknown, config?: Partial<RequestConfig>): Promise<T>;
37
+ put<T = unknown>(url: string, body?: unknown, config?: Partial<RequestConfig>): Promise<T>;
38
+ patch<T = unknown>(url: string, body?: unknown, config?: Partial<RequestConfig>): Promise<T>;
39
+ delete<T = unknown>(url: string, config?: Partial<RequestConfig>): Promise<T>;
40
+ request<T = unknown>(config: RequestConfig): Promise<T>;
41
+ }
42
+ /** Create a typed HTTP client instance. */
43
+ export declare function createHttp(options?: HttpOptions): HttpInstance;
44
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,SAAU,SAAQ,KAAK;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5F,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3F,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACzD;AAiCD,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,OAAO,GAAE,WAAgB,GAAG,YAAY,CA8GlE"}