@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,540 @@
1
+ /**
2
+ * Nova Engine — Command Palette & Content Search
3
+ *
4
+ * Full-featured search/command palette with fuzzy matching,
5
+ * keyboard navigation, category grouping, and recent items.
6
+ */
7
+ import { fuzzyScore, fuzzyRanges } from './fuzzy';
8
+ let _batchScorer = null;
9
+ /** Register an external batch scorer (called by @nova/search/wasm) */
10
+ export function setBatchScorer(scorer) {
11
+ _batchScorer = scorer;
12
+ }
13
+ const RECENT_KEY = '__nova_search_recent';
14
+ const MAX_RECENT = 5;
15
+ function getTheme(opt) {
16
+ if (opt !== 'auto')
17
+ return opt;
18
+ const el = document.documentElement;
19
+ return el.getAttribute('data-theme') === 'light' ? 'light' : 'dark';
20
+ }
21
+ function loadRecent() {
22
+ try {
23
+ return JSON.parse(localStorage.getItem(RECENT_KEY) || '[]');
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ function saveRecent(ids) {
30
+ try {
31
+ localStorage.setItem(RECENT_KEY, JSON.stringify(ids.slice(0, MAX_RECENT)));
32
+ }
33
+ catch { }
34
+ }
35
+ function addRecent(id) {
36
+ const recent = loadRecent().filter((r) => r !== id);
37
+ recent.unshift(id);
38
+ saveRecent(recent);
39
+ }
40
+ /** Inject scoped styles into the container */
41
+ function injectStyles(container, theme) {
42
+ const isDark = theme === 'dark';
43
+ const bg = isDark ? 'rgba(14,14,16,0.92)' : 'rgba(255,255,255,0.92)';
44
+ const surface = isDark ? 'rgba(24,24,28,0.98)' : 'rgba(248,248,250,0.98)';
45
+ const border = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.08)';
46
+ const text = isDark ? '#e4e4e7' : '#18181b';
47
+ const textMuted = isDark ? '#71717a' : '#a1a1aa';
48
+ const accent = isDark ? '#a78bfa' : '#7c3aed';
49
+ const hoverBg = isDark ? 'rgba(255,255,255,0.04)' : 'rgba(0,0,0,0.03)';
50
+ const activeBg = isDark ? 'rgba(167,139,250,0.08)' : 'rgba(124,58,237,0.06)';
51
+ const style = document.createElement('style');
52
+ style.setAttribute('data-nova-search', '');
53
+ style.textContent = `
54
+ .nova-search-overlay {
55
+ position: fixed; inset: 0; z-index: 99999;
56
+ background: ${bg}; backdrop-filter: blur(12px);
57
+ display: flex; align-items: flex-start; justify-content: center;
58
+ padding-top: min(20vh, 200px);
59
+ opacity: 0; visibility: hidden;
60
+ transition: opacity 180ms ease, visibility 180ms ease;
61
+ }
62
+ .nova-search-overlay.open { opacity: 1; visibility: visible; }
63
+ .nova-search-modal {
64
+ width: min(580px, 92vw); max-height: 60vh;
65
+ background: ${surface}; border: 1px solid ${border};
66
+ border-radius: 14px; overflow: hidden;
67
+ transform: scale(0.96) translateY(-8px);
68
+ transition: transform 180ms ease;
69
+ box-shadow: 0 24px 80px rgba(0,0,0,${isDark ? '0.6' : '0.15'}),
70
+ 0 0 0 1px ${border};
71
+ display: flex; flex-direction: column;
72
+ }
73
+ .nova-search-overlay.open .nova-search-modal {
74
+ transform: scale(1) translateY(0);
75
+ }
76
+ .nova-search-input-wrap {
77
+ display: flex; align-items: center; gap: 10px;
78
+ padding: 14px 18px; border-bottom: 1px solid ${border};
79
+ }
80
+ .nova-search-input-wrap svg {
81
+ width: 18px; height: 18px; flex-shrink: 0;
82
+ color: ${textMuted};
83
+ }
84
+ .nova-search-input {
85
+ flex: 1; background: none; border: none; outline: none;
86
+ font: 15px/1.4 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
87
+ color: ${text}; caret-color: ${accent};
88
+ }
89
+ .nova-search-input::placeholder { color: ${textMuted}; }
90
+ .nova-search-kbd {
91
+ font: 11px/1 ui-monospace, monospace;
92
+ padding: 3px 6px; border-radius: 4px;
93
+ background: ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'};
94
+ color: ${textMuted}; flex-shrink: 0;
95
+ }
96
+ .nova-search-list {
97
+ overflow-y: auto; overscroll-behavior: contain;
98
+ padding: 6px;
99
+ }
100
+ .nova-search-group-label {
101
+ font: 600 11px/1.2 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
102
+ text-transform: uppercase; letter-spacing: 0.06em;
103
+ color: ${textMuted}; padding: 10px 10px 4px;
104
+ }
105
+ .nova-search-item {
106
+ display: flex; align-items: center; gap: 10px;
107
+ padding: 10px 12px; border-radius: 8px; cursor: pointer;
108
+ transition: background 80ms ease;
109
+ }
110
+ .nova-search-item:hover { background: ${hoverBg}; }
111
+ .nova-search-item.active { background: ${activeBg}; border-left: 2px solid ${accent}; }
112
+ .nova-search-item-icon {
113
+ width: 20px; height: 20px; display: flex;
114
+ align-items: center; justify-content: center;
115
+ flex-shrink: 0; color: ${textMuted}; font-size: 16px;
116
+ }
117
+ .nova-search-item-body { flex: 1; min-width: 0; }
118
+ .nova-search-item-title {
119
+ font: 14px/1.3 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
120
+ color: ${text}; white-space: nowrap;
121
+ overflow: hidden; text-overflow: ellipsis;
122
+ }
123
+ .nova-search-item-desc {
124
+ font: 12px/1.3 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
125
+ color: ${textMuted}; white-space: nowrap;
126
+ overflow: hidden; text-overflow: ellipsis;
127
+ margin-top: 1px;
128
+ }
129
+ .nova-search-item-shortcut {
130
+ font: 11px/1 ui-monospace, monospace;
131
+ padding: 2px 6px; border-radius: 4px;
132
+ background: ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'};
133
+ color: ${textMuted}; flex-shrink: 0;
134
+ }
135
+ .nova-search-highlight { color: ${accent}; font-weight: 600; }
136
+ .nova-search-empty {
137
+ text-align: center; padding: 32px 16px;
138
+ font: 13px/1.4 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
139
+ color: ${textMuted};
140
+ }
141
+ .nova-search-footer {
142
+ display: flex; align-items: center; gap: 12px;
143
+ padding: 8px 16px; border-top: 1px solid ${border};
144
+ font: 11px/1 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
145
+ color: ${textMuted};
146
+ }
147
+ .nova-search-footer kbd {
148
+ font: inherit; font-family: ui-monospace, monospace;
149
+ padding: 2px 5px; border-radius: 3px;
150
+ background: ${isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)'};
151
+ }
152
+ `;
153
+ container.appendChild(style);
154
+ return style;
155
+ }
156
+ function buildHighlightedText(text, ranges) {
157
+ const frag = document.createDocumentFragment();
158
+ let cursor = 0;
159
+ for (const [start, end] of ranges) {
160
+ if (start > cursor) {
161
+ frag.appendChild(document.createTextNode(text.slice(cursor, start)));
162
+ }
163
+ const mark = document.createElement('span');
164
+ mark.className = 'nova-search-highlight';
165
+ mark.textContent = text.slice(start, end);
166
+ frag.appendChild(mark);
167
+ cursor = end;
168
+ }
169
+ if (cursor < text.length) {
170
+ frag.appendChild(document.createTextNode(text.slice(cursor)));
171
+ }
172
+ return frag;
173
+ }
174
+ function parseTrigger(trigger) {
175
+ const parts = trigger.toLowerCase().split('+');
176
+ return {
177
+ key: parts[parts.length - 1],
178
+ mod: parts.includes('mod') || parts.includes('ctrl') || parts.includes('cmd'),
179
+ shift: parts.includes('shift'),
180
+ alt: parts.includes('alt'),
181
+ };
182
+ }
183
+ function matchesTrigger(e, t) {
184
+ const isMac = /Mac|iPhone|iPad/.test(navigator.userAgent);
185
+ const modKey = isMac ? e.metaKey : e.ctrlKey;
186
+ return (e.key.toLowerCase() === t.key &&
187
+ (t.mod ? modKey : true) &&
188
+ (t.shift ? e.shiftKey : !e.shiftKey) &&
189
+ (t.alt ? e.altKey : !e.altKey));
190
+ }
191
+ export function createSearch(options) {
192
+ const { trigger = 'mod+k', placeholder = 'Search or jump to...', maxResults = 10, onSelect, onClose, theme = 'auto', container = document.body, groupByCategory = true, recentItems = true, noResultsText = 'No results found', } = options;
193
+ let itemSource = options.items;
194
+ const triggerCombo = parseTrigger(trigger);
195
+ let activeIndex = 0;
196
+ let currentResults = [];
197
+ let isVisible = false;
198
+ // Build DOM safely — no innerHTML
199
+ const overlay = document.createElement('div');
200
+ overlay.className = 'nova-search-overlay';
201
+ const modal = document.createElement('div');
202
+ modal.className = 'nova-search-modal';
203
+ modal.setAttribute('role', 'dialog');
204
+ modal.setAttribute('aria-label', 'Search');
205
+ // Input row
206
+ const inputWrap = document.createElement('div');
207
+ inputWrap.className = 'nova-search-input-wrap';
208
+ const searchSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
209
+ searchSvg.setAttribute('viewBox', '0 0 24 24');
210
+ searchSvg.setAttribute('fill', 'none');
211
+ searchSvg.setAttribute('stroke', 'currentColor');
212
+ searchSvg.setAttribute('stroke-width', '2');
213
+ const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
214
+ circle.setAttribute('cx', '11');
215
+ circle.setAttribute('cy', '11');
216
+ circle.setAttribute('r', '8');
217
+ const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
218
+ line.setAttribute('x1', '21');
219
+ line.setAttribute('y1', '21');
220
+ line.setAttribute('x2', '16.65');
221
+ line.setAttribute('y2', '16.65');
222
+ searchSvg.appendChild(circle);
223
+ searchSvg.appendChild(line);
224
+ const input = document.createElement('input');
225
+ input.className = 'nova-search-input';
226
+ input.type = 'text';
227
+ input.placeholder = placeholder;
228
+ input.setAttribute('aria-label', 'Search input');
229
+ input.spellcheck = false;
230
+ input.autocomplete = 'off';
231
+ const kbd = document.createElement('span');
232
+ kbd.className = 'nova-search-kbd';
233
+ kbd.textContent = 'ESC';
234
+ inputWrap.appendChild(searchSvg);
235
+ inputWrap.appendChild(input);
236
+ inputWrap.appendChild(kbd);
237
+ // Results list
238
+ const list = document.createElement('div');
239
+ list.className = 'nova-search-list';
240
+ list.setAttribute('role', 'listbox');
241
+ // Footer
242
+ const footer = document.createElement('div');
243
+ footer.className = 'nova-search-footer';
244
+ const footerNav = document.createElement('span');
245
+ const kbdUp = document.createElement('kbd');
246
+ kbdUp.textContent = '\u2191';
247
+ const kbdDown = document.createElement('kbd');
248
+ kbdDown.textContent = '\u2193';
249
+ footerNav.appendChild(kbdUp);
250
+ footerNav.appendChild(document.createTextNode(' '));
251
+ footerNav.appendChild(kbdDown);
252
+ footerNav.appendChild(document.createTextNode(' navigate'));
253
+ const footerSelect = document.createElement('span');
254
+ const kbdEnter = document.createElement('kbd');
255
+ kbdEnter.textContent = '\u21B5';
256
+ footerSelect.appendChild(kbdEnter);
257
+ footerSelect.appendChild(document.createTextNode(' select'));
258
+ const footerClose = document.createElement('span');
259
+ const kbdEsc = document.createElement('kbd');
260
+ kbdEsc.textContent = 'esc';
261
+ footerClose.appendChild(kbdEsc);
262
+ footerClose.appendChild(document.createTextNode(' close'));
263
+ footer.appendChild(footerNav);
264
+ footer.appendChild(footerSelect);
265
+ footer.appendChild(footerClose);
266
+ modal.appendChild(inputWrap);
267
+ modal.appendChild(list);
268
+ modal.appendChild(footer);
269
+ overlay.appendChild(modal);
270
+ // Inject styles & mount
271
+ const styleEl = injectStyles(container, getTheme(theme));
272
+ container.appendChild(overlay);
273
+ function getItems() {
274
+ return typeof itemSource === 'function' ? itemSource() : itemSource;
275
+ }
276
+ function selectItem(item) {
277
+ if (recentItems)
278
+ addRecent(item.id);
279
+ if (onSelect) {
280
+ onSelect(item);
281
+ }
282
+ else if (item.action) {
283
+ item.action();
284
+ }
285
+ else if (item.href) {
286
+ window.location.href = item.href;
287
+ }
288
+ close();
289
+ }
290
+ function renderResults(query) {
291
+ // Clear list safely
292
+ while (list.firstChild)
293
+ list.removeChild(list.firstChild);
294
+ const items = getItems();
295
+ let results;
296
+ if (!query) {
297
+ // Show recent items when empty
298
+ if (recentItems) {
299
+ const recentIds = loadRecent();
300
+ const recentMatches = recentIds
301
+ .map((id) => items.find((i) => i.id === id))
302
+ .filter(Boolean);
303
+ if (recentMatches.length > 0) {
304
+ const groupLabel = document.createElement('div');
305
+ groupLabel.className = 'nova-search-group-label';
306
+ groupLabel.textContent = 'Recent';
307
+ list.appendChild(groupLabel);
308
+ recentMatches.forEach((item, idx) => {
309
+ list.appendChild(buildItemEl(item, idx, ''));
310
+ });
311
+ currentResults = recentMatches;
312
+ activeIndex = 0;
313
+ updateActive();
314
+ return;
315
+ }
316
+ }
317
+ // Show all items grouped
318
+ results = items.slice(0, maxResults).map((item) => ({ item, score: 1 }));
319
+ }
320
+ else if (_batchScorer) {
321
+ // Wasm fast path: score all items in a single call
322
+ const wasmItems = items.map((i) => ({
323
+ id: i.id,
324
+ title: i.title,
325
+ description: i.description,
326
+ keywords: i.keywords,
327
+ }));
328
+ const scored = _batchScorer(query, wasmItems);
329
+ if (scored && scored.length > 0) {
330
+ const itemMap = new Map(items.map((i) => [i.id, i]));
331
+ results = scored
332
+ .slice(0, maxResults)
333
+ .map((r) => ({ item: itemMap.get(r.id), score: r.score }))
334
+ .filter((r) => r.item);
335
+ }
336
+ else {
337
+ results = [];
338
+ }
339
+ }
340
+ else {
341
+ // Pure TS fallback: score items individually
342
+ results = items
343
+ .map((item) => {
344
+ const titleScore = fuzzyScore(query, item.title);
345
+ const descScore = item.description ? fuzzyScore(query, item.description) * 0.6 : 0;
346
+ const kwScore = item.keywords
347
+ ? Math.max(...item.keywords.map((kw) => fuzzyScore(query, kw))) * 0.8
348
+ : 0;
349
+ return { item, score: Math.max(titleScore, descScore, kwScore) };
350
+ })
351
+ .filter((r) => r.score > 0)
352
+ .sort((a, b) => b.score - a.score)
353
+ .slice(0, maxResults);
354
+ }
355
+ if (results.length === 0) {
356
+ const empty = document.createElement('div');
357
+ empty.className = 'nova-search-empty';
358
+ empty.textContent = noResultsText;
359
+ list.appendChild(empty);
360
+ currentResults = [];
361
+ activeIndex = 0;
362
+ return;
363
+ }
364
+ currentResults = results.map((r) => r.item);
365
+ activeIndex = 0;
366
+ if (groupByCategory && currentResults.some((i) => i.category)) {
367
+ const groups = new Map();
368
+ for (const item of currentResults) {
369
+ const cat = item.category || 'Other';
370
+ if (!groups.has(cat))
371
+ groups.set(cat, []);
372
+ groups.get(cat).push(item);
373
+ }
374
+ let idx = 0;
375
+ for (const [cat, catItems] of groups) {
376
+ const groupLabel = document.createElement('div');
377
+ groupLabel.className = 'nova-search-group-label';
378
+ groupLabel.textContent = cat;
379
+ list.appendChild(groupLabel);
380
+ for (const item of catItems) {
381
+ list.appendChild(buildItemEl(item, idx, query));
382
+ idx++;
383
+ }
384
+ }
385
+ }
386
+ else {
387
+ currentResults.forEach((item, idx) => {
388
+ list.appendChild(buildItemEl(item, idx, query));
389
+ });
390
+ }
391
+ updateActive();
392
+ }
393
+ function buildItemEl(item, index, query) {
394
+ const el = document.createElement('div');
395
+ el.className = 'nova-search-item';
396
+ el.setAttribute('role', 'option');
397
+ el.dataset.index = String(index);
398
+ // Icon
399
+ if (item.icon) {
400
+ const iconEl = document.createElement('span');
401
+ iconEl.className = 'nova-search-item-icon';
402
+ iconEl.textContent = item.icon;
403
+ el.appendChild(iconEl);
404
+ }
405
+ // Body
406
+ const body = document.createElement('div');
407
+ body.className = 'nova-search-item-body';
408
+ const titleEl = document.createElement('div');
409
+ titleEl.className = 'nova-search-item-title';
410
+ if (query) {
411
+ const ranges = fuzzyRanges(query, item.title);
412
+ titleEl.appendChild(buildHighlightedText(item.title, ranges));
413
+ }
414
+ else {
415
+ titleEl.textContent = item.title;
416
+ }
417
+ body.appendChild(titleEl);
418
+ if (item.description) {
419
+ const descEl = document.createElement('div');
420
+ descEl.className = 'nova-search-item-desc';
421
+ if (query) {
422
+ const ranges = fuzzyRanges(query, item.description);
423
+ descEl.appendChild(buildHighlightedText(item.description, ranges));
424
+ }
425
+ else {
426
+ descEl.textContent = item.description;
427
+ }
428
+ body.appendChild(descEl);
429
+ }
430
+ el.appendChild(body);
431
+ // Shortcut badge
432
+ if (item.shortcut) {
433
+ const shortcutEl = document.createElement('span');
434
+ shortcutEl.className = 'nova-search-item-shortcut';
435
+ shortcutEl.textContent = item.shortcut;
436
+ el.appendChild(shortcutEl);
437
+ }
438
+ // Click handler
439
+ el.addEventListener('click', () => selectItem(item));
440
+ el.addEventListener('mouseenter', () => {
441
+ activeIndex = index;
442
+ updateActive();
443
+ });
444
+ return el;
445
+ }
446
+ function updateActive() {
447
+ const items = list.querySelectorAll('.nova-search-item');
448
+ items.forEach((el, i) => {
449
+ el.classList.toggle('active', i === activeIndex);
450
+ if (i === activeIndex) {
451
+ el.scrollIntoView({ block: 'nearest' });
452
+ }
453
+ });
454
+ }
455
+ function open() {
456
+ if (isVisible)
457
+ return;
458
+ isVisible = true;
459
+ input.value = '';
460
+ renderResults('');
461
+ overlay.classList.add('open');
462
+ requestAnimationFrame(() => input.focus());
463
+ }
464
+ function close() {
465
+ if (!isVisible)
466
+ return;
467
+ isVisible = false;
468
+ overlay.classList.remove('open');
469
+ onClose?.();
470
+ }
471
+ function toggle() {
472
+ isVisible ? close() : open();
473
+ }
474
+ // Event handlers
475
+ function onInput() {
476
+ renderResults(input.value.trim());
477
+ }
478
+ function onKeyDown(e) {
479
+ if (!isVisible)
480
+ return;
481
+ switch (e.key) {
482
+ case 'ArrowDown':
483
+ e.preventDefault();
484
+ if (currentResults.length) {
485
+ activeIndex = (activeIndex + 1) % currentResults.length;
486
+ updateActive();
487
+ }
488
+ break;
489
+ case 'ArrowUp':
490
+ e.preventDefault();
491
+ if (currentResults.length) {
492
+ activeIndex = (activeIndex - 1 + currentResults.length) % currentResults.length;
493
+ updateActive();
494
+ }
495
+ break;
496
+ case 'Enter':
497
+ e.preventDefault();
498
+ if (currentResults[activeIndex]) {
499
+ selectItem(currentResults[activeIndex]);
500
+ }
501
+ break;
502
+ case 'Escape':
503
+ e.preventDefault();
504
+ close();
505
+ break;
506
+ }
507
+ }
508
+ function onGlobalKeyDown(e) {
509
+ if (matchesTrigger(e, triggerCombo)) {
510
+ e.preventDefault();
511
+ toggle();
512
+ }
513
+ }
514
+ function onOverlayClick(e) {
515
+ if (e.target === overlay)
516
+ close();
517
+ }
518
+ // Bind events
519
+ input.addEventListener('input', onInput);
520
+ input.addEventListener('keydown', onKeyDown);
521
+ document.addEventListener('keydown', onGlobalKeyDown);
522
+ overlay.addEventListener('click', onOverlayClick);
523
+ function destroy() {
524
+ input.removeEventListener('input', onInput);
525
+ input.removeEventListener('keydown', onKeyDown);
526
+ document.removeEventListener('keydown', onGlobalKeyDown);
527
+ overlay.removeEventListener('click', onOverlayClick);
528
+ overlay.remove();
529
+ styleEl.remove();
530
+ }
531
+ return {
532
+ open,
533
+ close,
534
+ toggle,
535
+ isOpen: () => isVisible,
536
+ updateItems(items) { itemSource = items; },
537
+ destroy,
538
+ };
539
+ }
540
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/search/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Nova Engine — Wasm Fuzzy Search Scorer
3
+ *
4
+ * Optional Wasm-accelerated fuzzy scorer compiled from Rust.
5
+ * Import this module and call `initWasm()` to upgrade the search
6
+ * module's scorer from pure TS to Wasm automatically.
7
+ *
8
+ * Usage:
9
+ * import { initWasm } from '@nova/search/wasm';
10
+ * await initWasm();
11
+ * // createSearch() now uses Wasm scoring automatically
12
+ */
13
+ export interface ScorerItem {
14
+ id: string;
15
+ title: string;
16
+ description?: string;
17
+ keywords?: string[];
18
+ }
19
+ export interface ScorerResult {
20
+ id: string;
21
+ score: number;
22
+ ranges: Array<[number, number]>;
23
+ }
24
+ /**
25
+ * Initialize the Wasm module and register it as the search scorer.
26
+ * Call once at app startup. Safe to call multiple times.
27
+ *
28
+ * @param wasmUrl - Optional URL to the .wasm file.
29
+ */
30
+ export declare function initWasm(wasmUrl?: string): Promise<void>;
31
+ /** Check if the Wasm module is loaded and ready. */
32
+ export declare function isReady(): boolean;
33
+ /** Score a single query against a target using Wasm. */
34
+ export declare function fuzzyScore(query: string, target: string): number | null;
35
+ //# sourceMappingURL=wasm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../src/search/wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjC;AAKD;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAED,oDAAoD;AACpD,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGvE"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Nova Engine — Wasm Fuzzy Search Scorer
3
+ *
4
+ * Optional Wasm-accelerated fuzzy scorer compiled from Rust.
5
+ * Import this module and call `initWasm()` to upgrade the search
6
+ * module's scorer from pure TS to Wasm automatically.
7
+ *
8
+ * Usage:
9
+ * import { initWasm } from '@nova/search/wasm';
10
+ * await initWasm();
11
+ * // createSearch() now uses Wasm scoring automatically
12
+ */
13
+ import { setBatchScorer } from './search';
14
+ let wasm = null;
15
+ let initPromise = null;
16
+ /**
17
+ * Initialize the Wasm module and register it as the search scorer.
18
+ * Call once at app startup. Safe to call multiple times.
19
+ *
20
+ * @param wasmUrl - Optional URL to the .wasm file.
21
+ */
22
+ export async function initWasm(wasmUrl) {
23
+ if (wasm)
24
+ return;
25
+ if (initPromise)
26
+ return initPromise;
27
+ initPromise = (async () => {
28
+ // @ts-ignore — wasm-bindgen generated glue, resolved at runtime from dist/
29
+ const mod = await import('./wasm/nova_fuzzy_wasm.js');
30
+ await mod.default(wasmUrl);
31
+ wasm = mod;
32
+ // Register Wasm scorer with the search module
33
+ setBatchScorer((query, items) => {
34
+ if (!wasm)
35
+ return null;
36
+ return wasm.scoreBatch(query, items);
37
+ });
38
+ })();
39
+ return initPromise;
40
+ }
41
+ /** Check if the Wasm module is loaded and ready. */
42
+ export function isReady() {
43
+ return wasm !== null;
44
+ }
45
+ /** Score a single query against a target using Wasm. */
46
+ export function fuzzyScore(query, target) {
47
+ if (!wasm)
48
+ return null;
49
+ return wasm.fuzzyScore(query, target);
50
+ }
51
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../src/search/wasm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAoB1C,IAAI,IAAI,GAAuB,IAAI,CAAC;AACpC,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAgB;IAC7C,IAAI,IAAI;QAAE,OAAO;IACjB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,2EAA2E;QAC3E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACtD,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,GAAG,GAA6B,CAAC;QAErC,8CAA8C;QAC9C,cAAc,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,KAAK,IAAI,CAAC;AACvB,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAc;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}