@yuktishaalaa/yuktai 5.3.4 → 5.3.7

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuktishaalaa/yuktai",
3
- "version": "5.3.4",
3
+ "version": "5.3.7",
4
4
  "description": "Accessibility, AI and data toolkit for Next.js, React and plain HTML: WCAG 2.2 auto-fix, agentic data grid, accessibility copilot, QA reports and in-browser RAG. Zero API keys.",
5
5
  "author": "Sandeep Miriyala — Yuktishaalaa AI Lab",
6
6
  "license": "GPL-3.0-only",
@@ -31,6 +31,9 @@
31
31
  "data-grid",
32
32
  "webmcp",
33
33
  "telugu",
34
+ "rust",
35
+ "webassembly",
36
+ "wasm",
34
37
  "indian-languages",
35
38
  "icons",
36
39
  "react-icons",
@@ -77,6 +80,8 @@
77
80
  "build": "tsup",
78
81
  "build:vanilla": "node vanilla/build.mjs",
79
82
  "build:all": "npm run build && npm run build:vanilla",
83
+ "build:rust": "node rust/build-wasm.mjs",
84
+ "test:rust": "cd rust/grid-core && cargo test",
80
85
  "lint": "eslint src --ext .ts,.tsx",
81
86
  "test": "vitest run",
82
87
  "prepublishOnly": "npm run build:all"
package/vanilla/README.md CHANGED
@@ -73,6 +73,8 @@ The v5.1 vanilla signature `renderGrid(container, rows, columns, options)` still
73
73
  | `customRules` | `[{ name, phrases, description, execute({ input, data, columns, executeTool }) }]`, in any language |
74
74
  | `parseIntent(text, ctx)` | Replace the built-in phrase parser |
75
75
  | `webmcp`, `toolName`, `toolDescriptions`, `onWebMCPStatusChange` | Expose the 11 grid tools to browser AI agents |
76
+ | `engine` | `"ts"` (default), `"rust"`, or `"auto"` (Rust from 10,000 rows). Rust runs the same search and number/date sort faster; results are identical. `grid.engine` tells you which one is active, `await grid.whenEngineReady()` waits for it |
77
+ | `showSearchTime`, `onSearchTime` | Show "· 0.9 ms · Rust" next to the row count after each search or sort, and/or get `{ query, ms, rows, engine }` in a callback. `grid.getSearchTime()` returns the last one |
76
78
  | `referenceDate` | "Now" for "this month" questions |
77
79
  | `onRowClick(row)`, `onOpenRow(id)` | Enables the `open` tool and "open Ravi" |
78
80
  | `onSelectionChange(keys)`, `onSortChange(sort)`, `onFiltersChange(filters)`, `onAgentResult(r)` | Events |
package/vanilla/index.js CHANGED
@@ -1,6 +1,6 @@
1
- /*! yuktai vanilla 5.3.0 — accessible data grid, page agents and WCAG tools for plain HTML.
1
+ /*! yuktai vanilla 5.3.7 — accessible data grid, page agents and WCAG tools for plain HTML.
2
2
  * No framework, no API keys, runs in the browser. ISC © Sandeep Miriyala, Yuktishaalaa AI Lab.
3
- * Built from github.com/sandeepmiriyala03/yuktai (vanilla/src + src/agentic, src/grid, src/core). */
3
+ * Built from github.com/sandeepmiriyala03/yuktai (vanilla/src + src/agentic, src/grid, src/core; grid engine in Rust: rust/grid-core). */
4
4
  "use strict";
5
5
  (() => {
6
6
  var __defProp = Object.defineProperty;
@@ -5283,6 +5283,350 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5283
5283
  };
5284
5284
  }
5285
5285
 
5286
+ // src/grid/rust/gridCoreWasm.ts
5287
+ var GRID_CORE_WASM_BASE64 = [
5288
+ "AGFzbQEAAAABYA1gA39/fwF/YAJ/fwF/YAN/f38AYAV/f39/fwBgBX9/f39/AX9gBH9/f38AYAR/f39/AX9gCH9/f39/f39/AX9g",
5289
+ "AX8AYAABf2AHf39/f39/fwF/YAZ/f39/f38Bf2AAAAMkIwIDBAIFBQICAgIGBgYGAwcICQoFCQIBBQILBQYAAQICAgwABAUBcAEC",
5290
+ "AgUDAQARBgkBfwFBgIDAAAsHPAUGbWVtb3J5AgAMeWtfaGVhcF9iYXNlABEJeWtfc2VhcmNoABIHeWtfc29ydAATCnlrX3ZlcnNp",
5291
+ "b24AFAkHAQBBAQsBHQrEWiO8BgMFfwJ8BH8CQCABQQJJDQACQAJAAkACQAJAAkACQAJAAkAgACgCBCIDIAIoAgAiBCgCBCIFTw0A",
5292
+ "IAAoAgAiBiAFTw0BIAQoAgAiByAGQQN0aisDACEIAkACQCAHIANBA3RqKwMAIgkgCWINACAIIAhiDQFBAEEAQX8gCSAIZiIKG0EB",
5293
+ "QX4gChsgCSAIZRsiCmsgCiAEKAIILQAAG0H/AXEiCkH/AUYgAyAGSSAKGw0BDAYLIAMgBk8NBSAIIAhhDQULQQIhCkEBIQsgAUEC",
5294
+ "Rg0GIABBCGohDEECIQoDQCADIQYgDCgCACIDIAVPDQMgBiAFTw0EIAcgBkEDdGorAwAhCAJAAkAgByADQQN0aisDACIJIAliDQAg",
5295
+ "CCAIYg0BQQBBAEF/IAkgCGYiDRtBAUF+IA0bIAkgCGUbIg1rIA0gBCgCCC0AABtB/wFxIg1B/wFGIAMgBkkgDRtBAUYNAUEBIQsM",
5296
+ "CQsgAyAGTw0IIAggCGENCAsgDEEEaiEMIAEgCkEBaiIKRw0AC0EBIQsMBQsgAyAFQdSEwIAAEJiAgIAAAAsgBiAFQeSEwIAAEJiA",
5297
+ "gIAAAAsgAyAFQdSEwIAAEJiAgIAAAAsgBiAFQeSEwIAAEJiAgIAAAAtBAiEKQQAhCyABQQJGDQEgAEEIaiEMQQIhCgNAIAMhBiAM",
5298
+ "KAIAIgMgBU8NAyAGIAVPDQQgByAGQQN0aisDACEIAkACQCAHIANBA3RqKwMAIgkgCWINACAIIAhiDQRBAEEAQX8gCSAIZiING0EB",
5299
+ "QX4gDRsgCSAIZRsiDWsgDSAEKAIILQAAG0H/AXEiDUH/AUYgAyAGSSANG0UNAUEAIQsMBAsgAyAGTw0AIAggCGINAwsgDEEEaiEM",
5300
+ "IAEgCkEBaiIKRw0ACwsgASEKCwJAIAogAUYNACAAIAFBACABQQFyZ0EBdEE+cyACEIGAgIAADAMLIAtFDQIgAUEBdiEGIAFBAnQg",
5301
+ "AGpBfGohAwNAIAAoAgAhCiAAIAMoAgA2AgAgAyAKNgIAIANBfGohAyAAQQRqIQAgBkF/aiIGDQAMAwsLIAMgBUHUhMCAABCYgICA",
5302
+ "AAALIAYgBUHkhMCAABCYgICAAAALC7YIBAh/AnwDfwF8I4CAgIAAQRBrIgUkgICAgAACQAJAIAFBIUkNACADQX9qIQMDQAJAIANB",
5303
+ "f0cNACAAIAEgBBCJgICAAAwDCyAAIAFBA3YiBkEcbGohByAAIAZBBHRqIQgCQAJAIAFBwABJDQAgACAIIAcgBiAEEIKAgIAAIQYM",
5304
+ "AQsCQAJAAkACQAJAAkAgACgCACIGIAQoAgAiCSgCBCIKTw0AIAgoAgAiCyAKTw0BIAkoAgAiDCALQQN0aisDACENAkACQAJAAkAg",
5305
+ "DCAGQQN0aisDACIOIA5iIg8NACANIA1hDQFBASEQDAMLIA0gDWINAUEAIRAMAgtBAEEAQX8gDiANZiIRG0EBQX4gERsgDiANZRsi",
5306
+ "EWsgESAJKAIILQAAG0H/AXEiEUH/AUYgBiALSSARGyEQDAELIAYgC0khEAsgBygCACIRIApPDQIgDCARQQN0aisDACESAkACQAJA",
5307
+ "AkACQAJAAkAgDw0AIBIgEmENASAAIQYgEEUNDSANIA1iDQYMCwsgEiASYg0BIAAhBiAQDQwgDSANYQ0DDAkLQQBBAEF/IA4gEmYi",
5308
+ "ChtBAUF+IAobIA4gEmUbIgprIAogCSgCCC0AABtB/wFxIgpB/wFGIAYgEUkgChshCgwBCyAGIBFJIQoLIAAhBiAQIApHDQkgDSAN",
5309
+ "Yg0BIBIgEmINBwtBAEEAQX8gDSASZiIGG0EBQX4gBhsgDSASZRsiBmsgBiAJKAIILQAAG0H/AXEiBkH/AUYgCyARSSAGGyEGDAcL",
5310
+ "IBIgEmENBAsgCyARSSEGDAULIAYgCkHUhMCAABCYgICAAAALIAsgCkHkhMCAABCYgICAAAALIBEgCkHkhMCAABCYgICAAAALQQAh",
5311
+ "BgwBC0EBIQYLIAcgCCAQIAZzGyEGCyAGIABrIgdBAnYhBgJAAkAgAkUNAAJAAkACQCACKAIAIgggBCgCACIJKAIEIgtPDQAgACAH",
5312
+ "aigCACIHIAtPDQEgCSgCACILIAdBA3RqKwMAIQ0CQAJAIAsgCEEDdGorAwAiEiASYg0AIA0gDWINBUEAQQBBfyASIA1mIgsbQQFB",
5313
+ "fiALGyASIA1lGyILayALIAkoAggtAAAbQf8BcSIJQf8BRiAIIAdJIAkbDQUMAQsgCCAHTw0AIA0gDWINBAsgBSAENgIMIAAgASAG",
5314
+ "IAVBDGoQjICAgAAiBkEBaiECIAYgAU8NAiABIAJrIQEgACACQQJ0aiEAQQAhAgwECyAIIAtB1ITAgAAQmICAgAAACyAHIAtB5ITA",
5315
+ "gAAQmICAgAAACyACIAEgAUHEhMCAABCXgICAAAALIAAgACABIAYgBBCNgICAACIGIAIgAyAEEIGAgIAAIAEgBkF/c2ohASAAIAZB",
5316
+ "AnRqIgJBBGohAAsgA0F/aiEDIAFBIU8NAAsLIAAgASAEEIiAgIAACyAFQRBqJICAgIAAC4kFBAR/AnwCfwF8AkAgA0H4////AXFF",
5317
+ "DQAgACAAIANBA3YiA0EEdCIFaiAAIANBHGwiBmogAyAEEIKAgIAAIQAgASABIAVqIAEgBmogAyAEEIKAgIAAIQEgAiACIAVqIAIg",
5318
+ "BmogAyAEEIKAgIAAIQILAkACQAJAAkACQAJAAkAgACgCACIDIAQoAgAiBCgCBCIHTw0AIAEoAgAiBSAHTw0BIAQoAgAiCCAFQQN0",
5319
+ "aisDACEJAkACQAJAAkAgCCADQQN0aisDACIKIApiIgsNACAJIAlhDQFBASEMDAMLIAkgCWINAUEAIQwMAgtBAEEAQX8gCiAJZiIG",
5320
+ "G0EBQX4gBhsgCiAJZRsiBmsgBiAEKAIILQAAG0H/AXEiBkH/AUYgAyAFSSAGGyEMDAELIAMgBUkhDAsgAigCACIGIAdPDQIgCCAG",
5321
+ "QQN0aisDACENAkACQAJAAkACQAJAAkAgCw0AIA0gDWENASAMRQ0NIAkgCWINBgwLCyANIA1iDQEgDA0MIAkgCWENAwwJC0EAQQBB",
5322
+ "fyAKIA1mIgcbQQFBfiAHGyAKIA1lGyIHayAHIAQoAggtAAAbQf8BcSIHQf8BRiADIAZJIAcbIQMMAQsgAyAGSSEDCyAMIANHDQkg",
5323
+ "CSAJYg0BIA0gDWINBwtBAEEAQX8gCSANZiIAG0EBQX4gABsgCSANZRsiAGsgACAEKAIILQAAG0H/AXEiAEH/AUYgBSAGSSAAGyEA",
5324
+ "DAcLIA0gDWENBAsgBSAGSSEADAULIAMgB0HUhMCAABCYgICAAAALIAUgB0HkhMCAABCYgICAAAALIAYgB0HkhMCAABCYgICAAAAL",
5325
+ "QQAhAAwBC0EBIQALIAIgASAMIABzGyEACyAAC9wDAwR/AnwBfwJAAkAgASgCACIDIAIoAgAiAigCBCIETw0AAkAgAUF8aiIFKAIA",
5326
+ "IgYgBE8NACACKAIAIgQgBkEDdGorAwAhBwJAAkAgBCADQQN0aisDACIIIAhiDQAgByAHYg0BQQBBAEF/IAggB2YiBBtBAUF+IAQb",
5327
+ "IAggB2UbIgRrIAQgAigCCC0AABtB/wFxIgRB/wFGIAMgBkkgBBtBAUYNAQwECyADIAZPDQMgByAHYQ0DCyABIAY2AgACQCAFIABG",
5328
+ "DQAgA0EDdCEJA0AgBSEGAkACQAJAIAMgAigCBCIETw0AIAZBfGoiBSgCACIBIARPDQEgAigCACIEIAFBA3RqKwMAIQcCQAJAIAQg",
5329
+ "CWorAwAiCCAIYg0AIAcgB2INBEEAQQBBfyAIIAdmIgQbQQFBfiAEGyAIIAdlGyIEayAEIAIoAggtAAAbQf8BcSIEQf8BRiADIAFJ",
5330
+ "IAQbQQFHDQEMBAsgAyABTw0AIAcgB2INAwsgBiEFDAQLIAMgBEHUhMCAABCYgICAAAALIAEgBEHkhMCAABCYgICAAAALIAYgATYC",
5331
+ "ACAFIABHDQALCyAFIAM2AgAPCyAGIARB5ITAgAAQmICAgAAACyADIARB1ITAgAAQmICAgAAACwunBQMIfwJ8A38gAiABQQJ0QXxq",
5332
+ "IgRqIQUgACAEaiEGIAAgAUEBdiIHQQJ0aiIIQXxqIQkgAygCACEDAkACQAJAAkACQANAIAgoAgAiCiADKAIEIgtPDQEgACgCACIE",
5333
+ "IAtPDQIgAygCACILIARBA3RqKwMAIQwCQAJAAkAgCyAKQQN0aisDACINIA1iDQAgDCAMYg0BQQAhC0EAQQBBfyANIAxmIg4bQQFB",
5334
+ "fiAOGyANIAxlGyIOayAOIAMoAggtAAAbQf8BcSIOQf8BRiAKIARJIA4bQQFGDQEMAgtBACELIAogBE8NASAMIAxhDQELQQEhCyAK",
5335
+ "IQQLIAIgBDYCACAGKAIAIgQgAygCBCIOTw0DIAkoAgAiCiAOTw0EIAtBAnQhDiALQQFzQQJ0IQ8gAygCACILIApBA3RqKwMAIQwC",
5336
+ "QAJAAkAgCyAEQQN0aisDACINIA1iDQAgDCAMYg0BQQAhC0EAQQBBfyANIAxmIhAbQQFBfiAQGyANIAxlGyIQayAQIAMoAggtAAAb",
5337
+ "Qf8BcSIQQf8BRiAEIApJIBAbQQFGDQEMAgtBACELIAQgCk8NASAMIAxhDQELQQEhCyAKIQQLIAJBBGohAiAIIA5qIQggACAPaiEA",
5338
+ "IAUgBDYCACAFQXxqIQUgCSALQQJ0IgRrIQkgBCAGakF8aiEGIAdBf2oiBw0ACyAGQQRqIQQgCUEEaiEDAkAgAUEBcUUNACACIAAg",
5339
+ "CCAAIANJIgobKAIANgIAIAggACADT0ECdGohCCAAIApBAnRqIQALAkAgCCAERw0AIAAgA0YNBQsQoYCAgAAACyAKIAtB1ITAgAAQ",
5340
+ "mICAgAAACyAEIAtB5ITAgAAQmICAgAAACyAEIA5B1ITAgAAQmICAgAAACyAKIA5B5ITAgAAQmICAgAAACwuDAgICfwJ8AkACQAJA",
5341
+ "AkAgACACQQJ0aiIEKAIAIgIgAygCACIDKAIEIgVPDQAgACABQQJ0aiIBKAIAIgAgBU8NASADKAIAIgUgAEEDdGorAwAhBgJAAkAg",
5342
+ "BSACQQN0aisDACIHIAdiDQAgBiAGYg0EQQBBAEF/IAcgBmYiBRtBAUF+IAUbIAcgBmUbIgVrIAUgAygCCC0AABtB/wFxIgNB/wFG",
5343
+ "IAIgAEkgAxtBAUcNAQwECyACIABPDQAgBiAGYg0DCyAAIQMgAiEADAMLIAIgBUHUhMCAABCYgICAAAALIAAgBUHkhMCAABCYgICA",
5344
+ "AAALIAIhAwsgASADNgIAIAQgADYCAAvsAgACQCABQQlJDQAgAEEAQQMgAhCFgICAACAAQQFBByACEIWAgIAAIABBAkEFIAIQhYCA",
5345
+ "gAAgAEEEQQggAhCFgICAACAAQQBBByACEIWAgIAAIABBAkEEIAIQhYCAgAAgAEEDQQggAhCFgICAACAAQQVBBiACEIWAgIAAIABB",
5346
+ "AEECIAIQhYCAgAAgAEEBQQMgAhCFgICAACAAQQRBBSACEIWAgIAAIABBB0EIIAIQhYCAgAAgAEEBQQQgAhCFgICAACAAQQNBBiAC",
5347
+ "EIWAgIAAIABBBUEHIAIQhYCAgAAgAEEAQQEgAhCFgICAACAAQQJBBCACEIWAgIAAIABBA0EFIAIQhYCAgAAgAEEGQQggAhCFgICA",
5348
+ "ACAAQQJBAyACEIWAgIAAIABBBEEFIAIQhYCAgAAgAEEGQQcgAhCFgICAACAAQQFBAiACEIWAgIAAIABBA0EEIAIQhYCAgAAgAEEF",
5349
+ "QQYgAhCFgICAAA8LAAuEBQACQCABQQ1JDQAgAEEAQQwgAhCFgICAACAAQQFBCiACEIWAgIAAIABBAkEJIAIQhYCAgAAgAEEDQQcg",
5350
+ "AhCFgICAACAAQQVBCyACEIWAgIAAIABBBkEIIAIQhYCAgAAgAEEBQQYgAhCFgICAACAAQQJBAyACEIWAgIAAIABBBEELIAIQhYCA",
5351
+ "gAAgAEEHQQkgAhCFgICAACAAQQhBCiACEIWAgIAAIABBAEEEIAIQhYCAgAAgAEEBQQIgAhCFgICAACAAQQNBBiACEIWAgIAAIABB",
5352
+ "B0EIIAIQhYCAgAAgAEEJQQogAhCFgICAACAAQQtBDCACEIWAgIAAIABBBEEGIAIQhYCAgAAgAEEFQQkgAhCFgICAACAAQQhBCyAC",
5353
+ "EIWAgIAAIABBCkEMIAIQhYCAgAAgAEEAQQUgAhCFgICAACAAQQNBCCACEIWAgIAAIABBBEEHIAIQhYCAgAAgAEEGQQsgAhCFgICA",
5354
+ "ACAAQQlBCiACEIWAgIAAIABBAEEBIAIQhYCAgAAgAEECQQUgAhCFgICAACAAQQZBCSACEIWAgIAAIABBB0EIIAIQhYCAgAAgAEEK",
5355
+ "QQsgAhCFgICAACAAQQFBAyACEIWAgIAAIABBAkEEIAIQhYCAgAAgAEEFQQYgAhCFgICAACAAQQlBCiACEIWAgIAAIABBAUECIAIQ",
5356
+ "hYCAgAAgAEEDQQQgAhCFgICAACAAQQVBByACEIWAgIAAIABBBkEIIAIQhYCAgAAgAEECQQMgAhCFgICAACAAQQRBBSACEIWAgIAA",
5357
+ "IABBBkEHIAIQhYCAgAAgAEEIQQkgAhCFgICAACAAQQNBBCACEIWAgIAAIABBBUEGIAIQhYCAgAAPCwALlgIBB38jgICAgABBgAFr",
5358
+ "IgMkgICAgAACQAJAIAFBAkkNACABQSBLDQEgASABQQF2IgQgAUESSSIFGyEGIAEgBGshByAAIARBAnRqIQggACEJA0ACQAJAIAZB",
5359
+ "DEsNAEEBIQQgBkEITQ0BIAkgBiACEIaAgIAAQQkhBAwBCyAJIAYgAhCHgICAAEENIQQLIARBf2ogBk8NAgJAIAQgBkYNACAEQQJ0",
5360
+ "IQQgBkECdCEGA0AgCSAJIARqIAIQg4CAgAAgBiAEQQRqIgRHDQALCyAFDQEgCSAARiEEIAghCSAHIQYgBA0ACyAAIAEgAyACEISA",
5361
+ "gIAAIAFBAnQiBEUNACAAIAMgBPwKAAALIANBgAFqJICAgIAADwsAC/0EAwh/AnwBfwJAAkACQAJAAkAgAUEBdiABaiIDRQ0AIAIo",
5362
+ "AgAhBANAAkACQCADQX9qIgMgAU8NACAAKAIAIQIgACAAIANBAnRqIgUoAgA2AgAgBSACNgIAQQAhAgwBCyADIAFrIQILAkAgAkEB",
5363
+ "dCIGQQFyIgUgASADIAEgA0kbIgdPDQAgBCgCBCEIA0AgAiEJAkACQCAGQQJqIgIgB0kNACAFIQIMAQsgACAFQQJ0aigCACIGIAhP",
5364
+ "DQUgACACQQJ0aigCACICIAhPDQYgBCgCACIKIAJBA3RqKwMAIQsCQAJAAkACQCAKIAZBA3RqKwMAIgwgDGINACALIAthDQFBASEC",
5365
+ "DAMLIAsgC2INAUEAIQIMAgtBAEEAQX8gDCALZiIKG0EBQX4gChsgDCALZRsiCmsgCiAEKAIILQAAG0H/AXEiCkH/AUYgBiACSSAK",
5366
+ "GyECDAELIAYgAkkhAgsgBSACaiECCyAAIAlBAnRqIgooAgAiBSAITw0GIAAgAkECdGoiDSgCACIGIAhPDQcgBCgCACIJIAZBA3Rq",
5367
+ "KwMAIQsCQAJAIAkgBUEDdGorAwAiDCAMYg0AIAsgC2INAUEAQQBBfyAMIAtmIgkbQQFBfiAJGyAMIAtlGyIJayAJIAQoAggtAAAb",
5368
+ "Qf8BcSIJQf8BRiAFIAZJIAkbQQFGDQEMAwsgBSAGTw0CIAsgC2ENAgsgDSAFNgIAIAogBjYCACACQQF0IgZBAXIiBSAHSQ0ACwsg",
5369
+ "Aw0ACwsPCyAGIAhB1ITAgAAQmICAgAAACyACIAhB5ITAgAAQmICAgAAACyAFIAhB1ITAgAAQmICAgAAACyAGIAhB5ITAgAAQmICA",
5370
+ "gAAAC9IIAwp/AnwDfwJAIAENAEEADwsgAigCACEEIAAoAgAhBUEAIQYgACECAkAgAEEEaiIHIAAgAUECdGoiCEF8aiIJTw0AIAMo",
5371
+ "AgAoAgAiCigCBCEBIARBA3QhC0EAIQYgACECAkACQAJAAkADQCAEIAFPDQEgAkEEaiIMKAIAIgcgAU8NAiAKKAIAIg0gB0EDdGor",
5372
+ "AwAhDgJAAkACQAJAIA0gC2orAwAiDyAPYiIQDQAgDiAOYQ0BQQEhEQwDCyAOIA5iDQFBACERDAILQQBBAEF/IA8gDmYiEhtBAUF+",
5373
+ "IBIbIA8gDmUbIhJrIBIgCigCCC0AABtB/wFxIhJB/wFGIAQgB0kgEhshEQwBCyAEIAdJIRELIAIgACAGQQJ0aiISKAIANgIAIBIg",
5374
+ "BzYCACACQQhqIgIoAgAiByABTw0DIAYgEUEBc2ohBiANIAdBA3RqKwMAIQ4CQAJAAkACQCAQDQAgDiAOYQ0BQQEhDQwDCyAOIA5i",
5375
+ "DQFBACENDAILQQBBAEF/IA8gDmYiDRtBAUF+IA0bIA8gDmUbIg1rIA0gCigCCC0AABtB/wFxIg1B/wFGIAQgB0kgDRshDQwBCyAE",
5376
+ "IAdJIQ0LIAwgACAGQQJ0aiISKAIANgIAIBIgBzYCACAGIA1BAXNqIQYgAkEEaiAJTw0EDAALCyAEIAFB1ITAgAAQmICAgAAACyAH",
5377
+ "IAFB5ITAgAAQmICAgAAACyAHIAFB5ITAgAAQmICAgAAACyACQQRqIQcLAkACQAJAAkACQCAHIAhGDQAgAygCACEMIARBA3QhEgNA",
5378
+ "IAIhDSAHIQIgBCAMKAIAIgEoAgQiCk8NAiACKAIAIgcgCk8NAyABKAIAIgogB0EDdGorAwAhDwJAAkACQAJAIAogEmorAwAiDiAO",
5379
+ "Yg0AIA8gD2ENAUEBIQEMAwsgDyAPYg0BQQAhAQwCC0EAQQBBfyAOIA9mIgobQQFBfiAKGyAOIA9lGyIKayAKIAEoAggtAAAbQf8B",
5380
+ "cSIBQf8BRiAEIAdJIAEbIQEMAQsgBCAHSSEBCyANIAAgBkECdGoiCigCADYCACAKIAc2AgAgBiABQQFzaiEGIAJBBGoiByAIRw0A",
5381
+ "CyAHQXxqIQILIAQgAygCACgCACIHKAIEIgFPDQIgBSABTw0DIAcoAgAiASAFQQN0aisDACEPAkACQAJAAkAgASAEQQN0aisDACIO",
5382
+ "IA5iDQAgDyAPYQ0BQQEhBAwDCyAPIA9iDQFBACEEDAILQQBBAEF/IA4gD2YiARtBAUF+IAEbIA4gD2UbIgFrIAEgBygCCC0AABtB",
5383
+ "/wFxIgdB/wFGIAQgBUkgBxshBAwBCyAEIAVJIQQLIAIgACAGQQJ0aiIHKAIANgIAIAcgBTYCACAGIARBAXNqDwsgBCAKQdSEwIAA",
5384
+ "EJiAgIAAAAsgByAKQeSEwIAAEJiAgIAAAAsgBCABQdSEwIAAEJiAgIAAAAsgBSABQeSEwIAAEJiAgIAAAAuwCAMJfwJ8An8CQCAB",
5385
+ "DQBBAA8LIAIoAgAhBCAAKAIAIQVBACEGIAAhAgJAIABBBGoiByAAIAFBAnRqIghBfGoiCU8NACADKAIAIgooAgQhAUEAIQYgACEC",
5386
+ "AkACQAJAAkADQCACQQRqIgsoAgAiByABTw0BIAQgAU8NAiAKKAIAIgwgBEEDdGorAwAhDQJAAkACQAJAIAwgB0EDdGorAwAiDiAO",
5387
+ "Yg0AIA0gDWENAUEBIQ8MAwsgDSANYg0BQQAhDwwCC0EAQQBBfyAOIA1mIhAbQQFBfiAQGyAOIA1lGyIQayAQIAooAggtAAAbQf8B",
5388
+ "cSIQQf8BRiAHIARJIBAbIQ8MAQsgByAESSEPCyACIAAgBkECdGoiECgCADYCACAQIAc2AgAgAkEIaiICKAIAIgcgAU8NAyAGIA9q",
5389
+ "IQYCQAJAAkACQCAMIAdBA3RqKwMAIg4gDmINACANIA1hDQFBASEMDAMLIA0gDWINAUEAIQwMAgtBAEEAQX8gDiANZiIMG0EBQX4g",
5390
+ "DBsgDiANZRsiDGsgDCAKKAIILQAAG0H/AXEiDEH/AUYgByAESSAMGyEMDAELIAcgBEkhDAsgCyAAIAZBAnRqIhAoAgA2AgAgECAH",
5391
+ "NgIAIAYgDGohBiACQQRqIAlPDQQMAAsLIAcgAUHUhMCAABCYgICAAAALIAQgAUHkhMCAABCYgICAAAALIAcgAUHUhMCAABCYgICA",
5392
+ "AAALIAJBBGohBwsCQAJAAkACQAJAIAcgCEYNACADKAIAIQEDQCACIQwgByICKAIAIgcgASgCBCIKTw0CIAQgCk8NAyABKAIAIgog",
5393
+ "BEEDdGorAwAhDQJAAkACQAJAIAogB0EDdGorAwAiDiAOYg0AIA0gDWENAUEBIQoMAwsgDSANYg0BQQAhCgwCC0EAQQBBfyAOIA1m",
5394
+ "IgobQQFBfiAKGyAOIA1lGyIKayAKIAEoAggtAAAbQf8BcSIKQf8BRiAHIARJIAobIQoMAQsgByAESSEKCyAMIAAgBkECdGoiCygC",
5395
+ "ADYCACALIAc2AgAgBiAKaiEGIAJBBGoiByAIRw0ACyAHQXxqIQILIAUgAygCACIHKAIEIgFPDQIgBCABTw0DIAcoAgAiASAEQQN0",
5396
+ "aisDACENAkACQAJAAkAgASAFQQN0aisDACIOIA5iDQAgDSANYQ0BQQEhBAwDCyANIA1iDQFBACEEDAILQQBBAEF/IA4gDWYiARtB",
5397
+ "AUF+IAEbIA4gDWUbIgFrIAEgBygCCC0AABtB/wFxIgdB/wFGIAUgBEkgBxshBAwBCyAFIARJIQQLIAIgACAGQQJ0aiIHKAIANgIA",
5398
+ "IAcgBTYCACAGIARqDwsgByAKQdSEwIAAEJiAgIAAAAsgBCAKQeSEwIAAEJiAgIAAAAsgBSABQdSEwIAAEJiAgIAAAAsgBCABQeSE",
5399
+ "wIAAEJiAgIAAAAt3AQF/AkAgAQ0AQQAPCwJAIAIgAU8NACAAKAIAIQQgACAAIAJBAnRqIgIoAgA2AgAgAiAENgIAIABBBGogAUF/",
5400
+ "aiAAIAMQioCAgAAiAiABTw0AIAAoAgAhASAAIAAgAkECdGoiAygCADYCACADIAE2AgAgAg8LAAt3AQF/AkAgAQ0AQQAPCwJAIAIg",
5401
+ "AU8NACAAKAIAIQQgACAAIAJBAnRqIgIoAgA2AgAgAiAENgIAIABBBGogAUF/aiAAIAMQi4CAgAAiAiABTw0AIAAoAgAhASAAIAAg",
5402
+ "AkECdGoiAygCADYCACADIAE2AgAgAg8LAAvRAQEDfyOAgICAAEEgayIFJICAgIAAIAUgAjoADwJAIAQgASAEIAFJGyIGRQ0AIAZB",
5403
+ "AnQhB0EAIQRBACECA0AgAyAEaiACNgIAIAJBAWohAiAHIARBBGoiBEcNAAsgBSABNgIUIAUgADYCECAFIAVBD2o2AhggBSAFQRBq",
5404
+ "NgIcIAZBAUYNAAJAIAZBFUkNACADIAYgBUEcahCAgICAAAwBC0EEIQQDQCADIAMgBGogBUEcahCDgICAACAHIARBBGoiBEcNAAsL",
5405
+ "IAVBIGokgICAgAALxgIBC39BACEIAkACQAJAIANBAkkNACAFRQ0AQQEgBWshCSADQX9qIQpBACEIQQAhCwNAIAggB08hDANAIAsg",
5406
+ "CiALIApLGyENIAIgC0ECdGohAwNAIA0gC0YNAyAMDQMgC0EBaiELIAMoAgAhDiADQQRqIg8hAyAPKAIAIhAgDkkNACAPIQMgECAB",
5407
+ "Sw0ACyAAIA5qIQ0gBSAQIA5rIg9LDQAgCSAQaiAOayERQQAhAyAELQAAQf8BcSEQA0AgDyADRg0EAkACQCANIANqIg4tAAAgEEcN",
5408
+ "ACAFIANqIhIgD0sNByAOIAQgBRCigICAAEUNAQsgESADQQFqIgNGDQIMAQsLCyAGIAhBAnRqIAtBf2o2AgAgCEEBaiEIDAALCyAI",
5409
+ "DwsgDyAPQfSEwIAAEJiAgIAAAAsgAyASIA9BhIXAgAAQl4CAgAAACwMAAAsIAEHQh8CAAAsbACAAIAEgAiADQQFqIAQgBSAGIAMQ",
5410
+ "j4CAgAALFQAgACABIAJBAEcgAyABEI6AgIAACwQAQQELRwEBfyOAgICAAEEgayIDJICAgIAAIAMgATYCECADIAA2AgwgA0EBOwEc",
5411
+ "IAMgAjYCGCADIANBDGo2AhQgA0EUahCQgICAAAALmAQBCX8CQAJAIAEgAEEDakF8cSICIABrIgNJDQAgASADayIEQQJ2IgVFDQAg",
5412
+ "BEEDcSEGQQAhB0EAIQgCQCACIABGDQAgACACayECQQAhCCAAIQEDQCAIIAEsAABBv39KaiEIIAFBAWohASACQQFqIgINAAsLIAAg",
5413
+ "A2ohCQJAIAZFDQAgCSAEQfz///8HcWohAEEAIQcDQCAHIAAsAABBv39KaiEHIABBAWohACAGQX9qIgYNAAsLIAcgCGohAgNAIAkh",
5414
+ "AyAFRQ0CIAVBwAEgBUHAAUkbIgRBA3EhCgJAAkAgBEECdCIJQfAHcSIADQBBACEBDAELIAMgAGohCEEAIQEgAyEGA0BBACEAA0Ag",
5415
+ "BiAAaigCACIHQX9zQQd2IAdBBnZyQYGChAhxIAFqIQEgAEEEaiIAQRBHDQALIAZBEGoiBiAIRw0ACwsgBSAEayEFIAMgCWohCSAB",
5416
+ "QQh2Qf+B/AdxIAFB/4H8B3FqQYGABGxBEHYgAmohAiAKRQ0ACyAKQQJ0IQcgAyAEQfwBcUECdGohAEEAIQEDQCAAKAIAIgZBf3NB",
5417
+ "B3YgBkEGdnJBgYKECHEgAWohASAAQQRqIQAgB0F8aiIHDQALIAFBCHZB/4H8B3EgAUH/gfwHcWpBgYAEbEEQdiACaiECDAELQQAh",
5418
+ "AiABRQ0AA0AgAiAALAAAQb9/SmohAiAAQQFqIQAgAUF/aiIBDQALCyACC0QAAkACQCAAIAJLDQAgASACSw0BIAAgAU0NASAAIAEg",
5419
+ "AxCegICAAAALIAAgAiADEJ+AgIAAAAsgASACIAMQoICAgAAAC2EBAX8jgICAgABBIGsiAySAgICAACADIAE2AgwgAyAANgIIIANB",
5420
+ "gYCAgAA2AhwgA0GBgICAADYCFCADIANBCGo2AhggAyADQQxqNgIQQaiAwIAAIANBEGogAhCVgICAAAALjwUCBn8BfiOAgICAAEEQ",
5421
+ "ayIGJICAgIAAAkACQCABDQAgBUEBaiEHIAAoAgghCEEtIQkMAQtBK0F/IAAoAggiCEGAgIABcSIBGyEJIAFBFXYgBWohBwsCQAJA",
5422
+ "IAhBgICABHENAEEAIQIMAQsCQAJAIANBEEkNACACIAMQloCAgAAhCgwBC0EAIQogA0UNACACIQEgAyELA0AgCiABLAAAQb9/Smoh",
5423
+ "CiABQQFqIQEgC0F/aiILDQALCyAKIAdqIQcLAkACQAJAAkACQCAHIAAvAQwiCk8NACAIQYCAgAhxDQFBASEBIAYgACAKIAdrQQEQ",
5424
+ "moCAgAAgBigCACIHQX9GDQQgBi8BBCELIAAgCSACIAMQm4CAgAANBCAAKAIAIgMgBCAFIAAoAgQiAigCDBGAgICAAICAgIAADQRB",
5425
+ "ACEKIAtB//8DcSELA0AgCyAKQf//A3EiAEshASALIABNDQUgCkEBaiEKIAMgByACKAIQEYGAgIAAgICAgABFDQAMBQsLIAAgCSAC",
5426
+ "IAMQm4CAgABFDQEMAgsgACAAKQIIIgynQYCAgP95cUGwgICAAnI2AgggACAJIAIgAxCbgICAAA0BQQEhASAGQQhqIAAgCiAHa0EB",
5427
+ "EJqAgIAAIAYoAggiC0F/Rg0CIAYvAQwhAiAAKAIAIgcgBCAFIAAoAgQiAygCDBGAgICAAICAgIAADQJBACEKIAJB//8DcSECAkAD",
5428
+ "QCACIApB//8DcU0NAUEBIQEgCkEBaiEKIAcgCyADKAIQEYGAgIAAgICAgABFDQAMBAsLIAAgDDcCCEEAIQEMAgsgACgCACAEIAUg",
5429
+ "ACgCBCgCDBGAgICAAICAgIAAIQEMAQtBASEBCyAGQRBqJICAgIAAIAELuAEBA38gAiEEAkACQAJAAkAgASgCCCIFQR12QQNxDgQB",
5430
+ "AwACAQsgAkH+/wNxQQF2IQQMAgtBACEEDAELIAJBACADQf8BcRshBAsgBUH///8AcSEFIAEoAgQhAyABKAIAIQZBACEBAkACQANA",
5431
+ "IAFB//8DcSAEQf//A3FPDQEgAUEBaiEBIAYgBSADKAIQEYGAgIAAgICAgABFDQALQX8hBQwBCyACIARrIQELIAAgATsBBCAAIAU2",
5432
+ "AgALUgACQCABQX9GDQAgACgCACABIAAoAgQoAhARgYCAgACAgICAAEUNAEEBDwsCQCACDQBBAA8LIAAoAgAgAiADIAAoAgQoAgwR",
5433
+ "gICAgACAgICAAAvRAwEJfwJAAkAgAEHoB08NACAAIQMMAQsgAUF8aiEEQQAhBSAAIQYCQAJAAkACQAJAA0AgBiAGQZDOAG4iA0GQ",
5434
+ "zgBsayIHQf//A3FB5ABuIQggAiAFaiIJQXxqIAJPDQEgBCACaiIKIAhBAXQiCy0ApIXAgAA6AAAgCUF9aiACTw0CIApBAWogC0Gl",
5435
+ "hcCAAGotAAA6AAAgCUF+aiACTw0DIApBAmogByAIQeQAbGtBAXRB/v8HcSIILQCkhcCAADoAACAJQX9qIAJPDQQgCkEDaiAIQaWF",
5436
+ "wIAAai0AADoAACAEQXxqIQQgBUF8aiEFIAZB/6ziBEshCSADIQYgCUUNBQwACwsgCUF8aiACQZSFwIAAEJiAgIAAAAsgCUF9aiAC",
5437
+ "QZSFwIAAEJiAgIAAAAsgCUF+aiACQZSFwIAAEJiAgIAAAAsgCUF/aiACQZSFwIAAEJiAgIAAAAsgAiAFaiECCwJAAkAgA0EKTw0A",
5438
+ "IAMhBgwBCyABIAJBfmoiAmogAyADQf//A3FB5ABuIgZB5ABsa0H//wNxQQF0LwCkhcCAADsAAAsCQAJAIABFDQAgBkUNAQsgASAC",
5439
+ "QX9qIgJqIAZBAXRBHnEtAKWFwIAAOgAACyACC1EBAX8jgICAgABBEGsiAiSAgICAACABQQFBAUEAIAJBBmogACgCACACQQZqQQoQ",
5440
+ "nICAgAAiAGpBCiAAaxCZgICAACEAIAJBEGokgICAgAAgAAthAQF/I4CAgIAAQSBrIgMkgICAgAAgAyABNgIMIAMgADYCCCADQYGA",
5441
+ "gIAANgIcIANBgYCAgAA2AhQgAyADQQxqNgIYIAMgA0EIajYCEEGAgMCAACADQRBqIAIQlYCAgAAAC2EBAX8jgICAgABBIGsiAySA",
5442
+ "gICAACADIAE2AgwgAyAANgIIIANBgYCAgAA2AhwgA0GBgICAADYCFCADIANBDGo2AhggAyADQQhqNgIQQd+AwIAAIANBEGogAhCV",
5443
+ "gICAAAALYQEBfyOAgICAAEEgayIDJICAgIAAIAMgATYCDCADIAA2AgggA0GBgICAADYCHCADQYGAgIAANgIUIAMgA0EMajYCGCAD",
5444
+ "IANBCGo2AhBBmIHAgAAgA0EQaiACEJWAgIAAAAsYAEHshsCAAEGZAUG4h8CAABCVgICAAAALSgEDf0EAIQMCQCACRQ0AAkADQCAA",
5445
+ "LQAAIgQgAS0AACIFRw0BIABBAWohACABQQFqIQEgAkF/aiICRQ0CDAALCyAEIAVrIQMLIAMLC9IHAQBBgIDAAAvIBxZzbGljZSBp",
5446
+ "bmRleCBzdGFydHMgYXQgwA0gYnV0IGVuZHMgYXQgwAAgaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyDAEiBidXQgdGhl",
5447
+ "IGluZGV4IGlzIMAAEnJhbmdlIHN0YXJ0IGluZGV4IMAiIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIMAAEHJhbmdl",
5448
+ "IGVuZCBpbmRleCDAIiBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCDAAC9yb290Ly5ydXN0dXAvdG9vbGNoYWlucy9z",
5449
+ "dGFibGUteDg2XzY0LXVua25vd24tbGludXgtZ251L2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uv",
5450
+ "c29ydC9zaGFyZWQvc21hbGxzb3J0LnJzAC9yb290Ly5ydXN0dXAvdG9vbGNoYWlucy9zdGFibGUteDg2XzY0LXVua25vd24tbGlu",
5451
+ "dXgtZ251L2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC91bnN0YWJsZS9xdWlja3NvcnQu",
5452
+ "cnMAL3Jvb3QvLnJ1c3R1cC90b29sY2hhaW5zL3N0YWJsZS14ODZfNjQtdW5rbm93bi1saW51eC1nbnUvbGliL3J1c3RsaWIvc3Jj",
5453
+ "L3J1c3QvbGlicmFyeS9jb3JlL3NyYy9mbXQvbnVtLnJzAHNyYy9saWIucnMAAABNARAAfwAAADgAAAAbAAAANwIQAAoAAAAlAAAA",
5454
+ "EgAAADcCEAAKAAAAJgAAABIAAAA3AhAACgAAAGAAAAAMAAAANwIQAAoAAABgAAAAIwAAAM0BEABpAAAAWAIAAAUAAAAwMDAxMDIw",
5455
+ "MzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQw",
5456
+ "NDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3",
5457
+ "ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OXVzZXItcHJvdmlkZWQgY29tcGFyaXNvbiBmdW5jdGlv",
5458
+ "biBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IGEgdG90YWwgb3JkZXLPABAAfQAAAFYDAAAFAAAA"
5459
+ ].join("");
5460
+
5461
+ // src/grid/rust/engine.ts
5462
+ var RUST_AUTO_MIN_ROWS = 1e4;
5463
+ var SEARCH_SEPARATOR = "\0";
5464
+ function wantsRustEngine(engine, rowCount) {
5465
+ return engine === "rust" || engine === "auto" && rowCount >= RUST_AUTO_MIN_ROWS;
5466
+ }
5467
+ var ENGINE_VERSION = 1;
5468
+ var PAGE = 65536;
5469
+ var compiled = null;
5470
+ var loading = null;
5471
+ function decodeBase64(b64) {
5472
+ if (typeof atob === "function") {
5473
+ const bin = atob(b64);
5474
+ const out = new Uint8Array(bin.length);
5475
+ for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
5476
+ return out;
5477
+ }
5478
+ const B = globalThis.Buffer;
5479
+ if (B) return new Uint8Array(B.from(b64, "base64"));
5480
+ throw new Error("No base64 decoder");
5481
+ }
5482
+ function loadGridCore() {
5483
+ if (compiled) return Promise.resolve(compiled);
5484
+ if (!loading) {
5485
+ loading = (async () => {
5486
+ try {
5487
+ if (typeof WebAssembly === "undefined") return null;
5488
+ compiled = await WebAssembly.compile(decodeBase64(GRID_CORE_WASM_BASE64));
5489
+ return compiled;
5490
+ } catch {
5491
+ return null;
5492
+ }
5493
+ })();
5494
+ }
5495
+ return loading;
5496
+ }
5497
+ function isWellFormed(s) {
5498
+ const native = s.isWellFormed;
5499
+ if (typeof native === "function") return native.call(s);
5500
+ for (let i = 0; i < s.length; i++) {
5501
+ const c = s.charCodeAt(i);
5502
+ if (c >= 55296 && c <= 56319) {
5503
+ const d = s.charCodeAt(i + 1);
5504
+ if (d >= 56320 && d <= 57343) {
5505
+ i++;
5506
+ continue;
5507
+ }
5508
+ return false;
5509
+ }
5510
+ if (c >= 56320 && c <= 57343) return false;
5511
+ }
5512
+ return true;
5513
+ }
5514
+ var align8 = (n) => n + 7 & ~7;
5515
+ var GridCore = class _GridCore {
5516
+ x;
5517
+ base;
5518
+ encoder = new TextEncoder();
5519
+ offsetsPtr = 0;
5520
+ textPtr = 0;
5521
+ textLen = 0;
5522
+ rows = 0;
5523
+ hasIndex = false;
5524
+ freePtr;
5525
+ constructor(x) {
5526
+ this.x = x;
5527
+ this.base = align8(x.yk_heap_base());
5528
+ this.freePtr = this.base;
5529
+ }
5530
+ /** Creates an engine from a compiled module (default: the one already loaded). */
5531
+ static create(mod = compiled) {
5532
+ if (!mod) return null;
5533
+ try {
5534
+ const instance = new WebAssembly.Instance(mod, {});
5535
+ const x = instance.exports;
5536
+ if (x.yk_version() !== ENGINE_VERSION) return null;
5537
+ return new _GridCore(x);
5538
+ } catch {
5539
+ return null;
5540
+ }
5541
+ }
5542
+ ensure(end) {
5543
+ const missing = end - this.x.memory.buffer.byteLength;
5544
+ if (missing > 0) this.x.memory.grow(Math.ceil(missing / PAGE));
5545
+ }
5546
+ /**
5547
+ * Stores one search text per row (the grid joins its columns with
5548
+ * SEARCH_SEPARATOR). Returns false when Rust can't match TypeScript
5549
+ * exactly for this data; the grid then searches in TypeScript.
5550
+ */
5551
+ setSearchTexts(texts) {
5552
+ this.hasIndex = false;
5553
+ this.freePtr = this.base;
5554
+ try {
5555
+ let maxBytes = 0;
5556
+ for (const t of texts) {
5557
+ if (!isWellFormed(t)) return false;
5558
+ maxBytes += t.length * 3;
5559
+ }
5560
+ const rows = texts.length;
5561
+ const offsetsPtr = this.base;
5562
+ const textPtr = align8(offsetsPtr + (rows + 1) * 4);
5563
+ this.ensure(textPtr + maxBytes);
5564
+ const buffer = this.x.memory.buffer;
5565
+ const offsets = new Uint32Array(buffer, offsetsPtr, rows + 1);
5566
+ const bytes = new Uint8Array(buffer, textPtr, maxBytes);
5567
+ let pos = 0;
5568
+ for (let i = 0; i < rows; i++) {
5569
+ offsets[i] = pos;
5570
+ pos += this.encoder.encodeInto(texts[i], bytes.subarray(pos)).written ?? 0;
5571
+ }
5572
+ offsets[rows] = pos;
5573
+ this.offsetsPtr = offsetsPtr;
5574
+ this.textPtr = textPtr;
5575
+ this.textLen = pos;
5576
+ this.rows = rows;
5577
+ this.freePtr = align8(textPtr + pos);
5578
+ this.hasIndex = true;
5579
+ return true;
5580
+ } catch {
5581
+ return false;
5582
+ }
5583
+ }
5584
+ /**
5585
+ * Positions (in the array given to setSearchTexts) of the rows whose text
5586
+ * contains `query`, in original order. Null means "use TypeScript".
5587
+ */
5588
+ search(query) {
5589
+ if (!this.hasIndex || !query || query.includes(SEARCH_SEPARATOR) || !isWellFormed(query)) return null;
5590
+ try {
5591
+ const q = this.encoder.encode(query);
5592
+ const qPtr = this.freePtr;
5593
+ const outPtr = align8(qPtr + q.length);
5594
+ this.ensure(outPtr + this.rows * 4);
5595
+ new Uint8Array(this.x.memory.buffer, qPtr, q.length).set(q);
5596
+ const n = this.x.yk_search(this.textPtr, this.textLen, this.offsetsPtr, this.rows, qPtr, q.length, outPtr);
5597
+ return new Uint32Array(this.x.memory.buffer, outPtr, n).slice();
5598
+ } catch {
5599
+ return null;
5600
+ }
5601
+ }
5602
+ /**
5603
+ * Row positions sorted by `keys` (NaN = empty, always last; equal keys keep
5604
+ * their order). Null means "use TypeScript".
5605
+ */
5606
+ sortByKeys(keys, desc) {
5607
+ try {
5608
+ const n = keys.length;
5609
+ const keysPtr = this.freePtr;
5610
+ const outPtr = align8(keysPtr + n * 8);
5611
+ this.ensure(outPtr + n * 4);
5612
+ new Float64Array(this.x.memory.buffer, keysPtr, n).set(keys);
5613
+ this.x.yk_sort(keysPtr, n, desc ? 1 : 0, outPtr);
5614
+ return new Uint32Array(this.x.memory.buffer, outPtr, n).slice();
5615
+ } catch {
5616
+ return null;
5617
+ }
5618
+ }
5619
+ };
5620
+ function formatSearchTime(ms) {
5621
+ if (!(ms >= 0.1)) return "<0.1 ms";
5622
+ return `${ms < 10 ? ms.toFixed(1) : Math.round(ms)} ms`;
5623
+ }
5624
+ function pickRows(rows, positions) {
5625
+ const out = new Array(positions.length);
5626
+ for (let i = 0; i < positions.length; i++) out[i] = rows[positions[i]];
5627
+ return out;
5628
+ }
5629
+
5286
5630
  // vanilla/src/grid.js
5287
5631
  var UI = {
5288
5632
  en: {
@@ -5389,7 +5733,7 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5389
5733
  let pageSize = Number(pagination && pagination.pageSize || opts.pageSize) || 10;
5390
5734
  let theme = THEMES.includes(opts.theme) ? opts.theme : "default";
5391
5735
  let view = ["table", "card", "auto"].includes(opts.view) ? opts.view : "auto";
5392
- let loading = !!opts.loading;
5736
+ let loading2 = !!opts.loading;
5393
5737
  let narrow = false;
5394
5738
  let active = { r: 1, c: 0 };
5395
5739
  const selected = new Set((opts.selectedKeys || []).map(String));
@@ -5431,6 +5775,53 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5431
5775
  status.textContent = "";
5432
5776
  statusTimer = setTimeout(() => status.textContent = text, 40);
5433
5777
  };
5778
+ const engineOption = opts.engine === "rust" || opts.engine === "auto" ? opts.engine : "ts";
5779
+ let core = null;
5780
+ let coreLoading = null;
5781
+ let searchIndex = { data: null, columns: null, ready: false };
5782
+ function ensureCore() {
5783
+ if (core || coreLoading || !wantsRustEngine(engineOption, data.length)) return coreLoading || Promise.resolve(core ? "rust" : "ts");
5784
+ coreLoading = loadGridCore().then((mod) => {
5785
+ core = mod ? GridCore.create(mod) : null;
5786
+ if (core && host.isConnected) render();
5787
+ return core ? "rust" : "ts";
5788
+ });
5789
+ return coreLoading;
5790
+ }
5791
+ function rustSearch(q) {
5792
+ if (!core || !wantsRustEngine(engineOption, data.length)) return null;
5793
+ if (searchIndex.data !== data || searchIndex.columns !== columns) {
5794
+ const texts = data.map(
5795
+ (row) => columns.map((c) => norm3(row[c.key]) + SEARCH_SEPARATOR + norm3(formatPlain(c, row[c.key]))).join(SEARCH_SEPARATOR)
5796
+ );
5797
+ searchIndex = { data, columns, ready: core.setSearchTexts(texts) };
5798
+ }
5799
+ if (!searchIndex.ready) return null;
5800
+ const hits = core.search(q);
5801
+ return hits ? pickRows(data, hits) : null;
5802
+ }
5803
+ function rustSort(rows, column, dir) {
5804
+ if (!core || !wantsRustEngine(engineOption, data.length)) return null;
5805
+ if (column.type !== "number" && column.type !== "date") return null;
5806
+ const keys = new Float64Array(rows.length);
5807
+ let lo = Infinity;
5808
+ let hi = -Infinity;
5809
+ for (let i = 0; i < rows.length; i++) {
5810
+ const v = rows[i][column.key];
5811
+ if (v == null || v === "") {
5812
+ keys[i] = NaN;
5813
+ continue;
5814
+ }
5815
+ const k = column.type === "number" ? Number(v) : new Date(v).getTime();
5816
+ if (!Number.isFinite(k)) return null;
5817
+ keys[i] = k;
5818
+ if (k < lo) lo = k;
5819
+ if (k > hi) hi = k;
5820
+ }
5821
+ if (lo === Infinity || !Number.isFinite(hi - lo)) return null;
5822
+ const order = core.sortByKeys(keys, dir === "desc");
5823
+ return order ? pickRows(rows, order) : null;
5824
+ }
5434
5825
  function compare2(a, b, column, dir) {
5435
5826
  const av = a[column.key];
5436
5827
  const bv = b[column.key];
@@ -5443,24 +5834,51 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5443
5834
  if (!Number.isFinite(out)) out = String(av).localeCompare(String(bv));
5444
5835
  return dir === "desc" ? -out : out;
5445
5836
  }
5837
+ let lastSearchTime = null;
5838
+ let lastRunKey = null;
5446
5839
  function viewRows() {
5447
- let out = applyGridFilters(data, toolColumns, filters);
5448
- if (query) {
5449
- const q = norm3(query);
5450
- out = out.filter((row) => columns.some((c) => norm3(row[c.key]).includes(q) || norm3(formatPlain(c, row[c.key])).includes(q)));
5840
+ ensureCore();
5841
+ const t0 = performance.now();
5842
+ let searchedBy = null;
5843
+ let sortedBy = null;
5844
+ let out;
5845
+ const q = query ? norm3(query) : "";
5846
+ const found = q ? rustSearch(q) : null;
5847
+ if (found) {
5848
+ searchedBy = "rust";
5849
+ out = applyGridFilters(found, toolColumns, filters);
5850
+ } else {
5851
+ out = applyGridFilters(data, toolColumns, filters);
5852
+ if (q) {
5853
+ searchedBy = "ts";
5854
+ out = out.filter((row) => columns.some((c) => norm3(row[c.key]).includes(q) || norm3(formatPlain(c, row[c.key])).includes(q)));
5855
+ }
5451
5856
  }
5857
+ const matched = out.length;
5452
5858
  if (sort && sort.key) {
5453
5859
  const column = columns.find((c) => c.key === sort.key);
5454
- if (column) out = out.slice().sort((a, b) => compare2(a, b, column, sort.direction));
5860
+ if (column) {
5861
+ const fast = rustSort(out, column, sort.direction);
5862
+ sortedBy = fast ? "rust" : "ts";
5863
+ out = fast || out.slice().sort((a, b) => compare2(a, b, column, sort.direction));
5864
+ }
5455
5865
  }
5866
+ lastSearchTime = searchedBy || sortedBy ? { query: q ? query : "", ms: performance.now() - t0, rows: matched, engine: searchedBy === "rust" || sortedBy === "rust" ? "rust" : "ts" } : null;
5456
5867
  return out;
5457
5868
  }
5869
+ let numberFormat = null;
5870
+ let dateFormat = null;
5458
5871
  function formatPlain(column, value) {
5459
5872
  if (value == null || value === "") return "";
5460
- if (column.type === "number" && Number.isFinite(Number(value))) return Number(value).toLocaleString(numberLocale);
5873
+ if (column.type === "number" && Number.isFinite(Number(value))) {
5874
+ numberFormat = numberFormat || new Intl.NumberFormat(numberLocale);
5875
+ return numberFormat.format(Number(value));
5876
+ }
5461
5877
  if (column.type === "date") {
5462
5878
  const d = new Date(value);
5463
- return Number.isNaN(d.getTime()) ? String(value) : d.toLocaleDateString(numberLocale, { year: "numeric", month: "short", day: "numeric" });
5879
+ if (Number.isNaN(d.getTime())) return String(value);
5880
+ dateFormat = dateFormat || new Intl.DateTimeFormat(numberLocale, { year: "numeric", month: "short", day: "numeric" });
5881
+ return dateFormat.format(d);
5464
5882
  }
5465
5883
  if (column.type === "boolean") return value === true || value === "true" ? t.yes : t.no;
5466
5884
  return String(value);
@@ -5494,15 +5912,19 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5494
5912
  const { pages, start, end } = pageBounds(rows.length);
5495
5913
  const current = rows.slice(start, end);
5496
5914
  host.className = `yv-grid yv-theme-${theme}${opts.wrap ? " yv-wrap" : ""}${opts.className ? " " + opts.className : ""}`;
5497
- host.setAttribute("aria-busy", String(loading));
5498
- info.textContent = `${rows.length.toLocaleString(numberLocale)} ${t.rows}${selectable ? ` \xB7 ${selected.size.toLocaleString(numberLocale)} ${t.selected}` : ""}`;
5915
+ host.setAttribute("aria-busy", String(loading2));
5916
+ info.textContent = `${rows.length.toLocaleString(numberLocale)} ${t.rows}${selectable ? ` \xB7 ${selected.size.toLocaleString(numberLocale)} ${t.selected}` : ""}${opts.showSearchTime && lastSearchTime ? ` \xB7 ${formatSearchTime(lastSearchTime.ms)} \xB7 ${lastSearchTime.engine === "rust" ? "Rust" : "TS"}` : ""}`;
5917
+ const runKey = lastSearchTime ? [query, sort && sort.key, sort && sort.direction, filters, data] : null;
5918
+ const changed = !runKey || !lastRunKey || runKey.some((v, i) => v !== lastRunKey[i]);
5919
+ if (lastSearchTime && changed && typeof opts.onSearchTime === "function") opts.onSearchTime({ ...lastSearchTime });
5920
+ lastRunKey = runKey;
5499
5921
  viewBtn.innerHTML = icon(isCards() ? "grid" : "cards", 18);
5500
5922
  viewBtn.setAttribute("aria-label", isCards() ? t.tableView : t.cardView);
5501
5923
  viewBtn.title = isCards() ? t.tableView : t.cardView;
5502
5924
  renderFilterBar();
5503
5925
  const hadFocus = body.contains(document.activeElement);
5504
- body.replaceChildren(loading ? h("div", { class: "yv-loading", role: "status" }, t.loading) : isCards() ? renderCards(current, start) : renderTable(current, start, rows.length));
5505
- if (hadFocus && !loading) restoreFocus();
5926
+ body.replaceChildren(loading2 ? h("div", { class: "yv-loading", role: "status" }, t.loading) : isCards() ? renderCards(current, start) : renderTable(current, start, rows.length));
5927
+ if (hadFocus && !loading2) restoreFocus();
5506
5928
  renderPager(rows.length, pages, start, end);
5507
5929
  }
5508
5930
  function renderTable(current, start, total) {
@@ -6058,6 +6480,14 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
6058
6480
  return api;
6059
6481
  },
6060
6482
  getSort: () => sort ? { ...sort } : null,
6483
+ // engine: "rust" when the Rust engine is active for this grid, else "ts"
6484
+ get engine() {
6485
+ return core && wantsRustEngine(engineOption, data.length) ? "rust" : "ts";
6486
+ },
6487
+ /** Last search/sort: { query, ms, rows, engine } or null. */
6488
+ getSearchTime: () => lastSearchTime ? { ...lastSearchTime } : null,
6489
+ /** Resolves "rust" or "ts" once the engine choice is settled. */
6490
+ whenEngineReady: () => ensureCore().then(() => api.engine),
6061
6491
  // highlight
6062
6492
  highlight(list, scroll) {
6063
6493
  setHighlights(list, scroll === void 0 ? autoScroll : scroll);
@@ -6101,7 +6531,7 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
6101
6531
  return api;
6102
6532
  },
6103
6533
  setLoading(on) {
6104
- loading = !!on;
6534
+ loading2 = !!on;
6105
6535
  render();
6106
6536
  return api;
6107
6537
  },
@@ -6900,7 +7330,7 @@ ${command ? command.say : "Not a voice command. Try: make text bigger, high cont
6900
7330
  }
6901
7331
 
6902
7332
  // vanilla/src/index.js
6903
- var VERSION = "5.3.0";
7333
+ var VERSION = "5.3.7";
6904
7334
  (function boot() {
6905
7335
  if (!isBrowser2()) return;
6906
7336
  if (window.yuktai && window.yuktai.__vanillaInitialized) return;