@yuktishaalaa/yuktai 5.3.4 → 5.3.6

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.6",
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,7 @@ 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 |
76
77
  | `referenceDate` | "Now" for "this month" questions |
77
78
  | `onRowClick(row)`, `onOpenRow(id)` | Enables the `open` tool and "open Ravi" |
78
79
  | `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.5 — 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,346 @@ 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 pickRows(rows, positions) {
5621
+ const out = new Array(positions.length);
5622
+ for (let i = 0; i < positions.length; i++) out[i] = rows[positions[i]];
5623
+ return out;
5624
+ }
5625
+
5286
5626
  // vanilla/src/grid.js
5287
5627
  var UI = {
5288
5628
  en: {
@@ -5389,7 +5729,7 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5389
5729
  let pageSize = Number(pagination && pagination.pageSize || opts.pageSize) || 10;
5390
5730
  let theme = THEMES.includes(opts.theme) ? opts.theme : "default";
5391
5731
  let view = ["table", "card", "auto"].includes(opts.view) ? opts.view : "auto";
5392
- let loading = !!opts.loading;
5732
+ let loading2 = !!opts.loading;
5393
5733
  let narrow = false;
5394
5734
  let active = { r: 1, c: 0 };
5395
5735
  const selected = new Set((opts.selectedKeys || []).map(String));
@@ -5431,6 +5771,53 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5431
5771
  status.textContent = "";
5432
5772
  statusTimer = setTimeout(() => status.textContent = text, 40);
5433
5773
  };
5774
+ const engineOption = opts.engine === "rust" || opts.engine === "auto" ? opts.engine : "ts";
5775
+ let core = null;
5776
+ let coreLoading = null;
5777
+ let searchIndex = { data: null, columns: null, ready: false };
5778
+ function ensureCore() {
5779
+ if (core || coreLoading || !wantsRustEngine(engineOption, data.length)) return coreLoading || Promise.resolve(core ? "rust" : "ts");
5780
+ coreLoading = loadGridCore().then((mod) => {
5781
+ core = mod ? GridCore.create(mod) : null;
5782
+ if (core && host.isConnected) render();
5783
+ return core ? "rust" : "ts";
5784
+ });
5785
+ return coreLoading;
5786
+ }
5787
+ function rustSearch(q) {
5788
+ if (!core || !wantsRustEngine(engineOption, data.length)) return null;
5789
+ if (searchIndex.data !== data || searchIndex.columns !== columns) {
5790
+ const texts = data.map(
5791
+ (row) => columns.map((c) => norm3(row[c.key]) + SEARCH_SEPARATOR + norm3(formatPlain(c, row[c.key]))).join(SEARCH_SEPARATOR)
5792
+ );
5793
+ searchIndex = { data, columns, ready: core.setSearchTexts(texts) };
5794
+ }
5795
+ if (!searchIndex.ready) return null;
5796
+ const hits = core.search(q);
5797
+ return hits ? pickRows(data, hits) : null;
5798
+ }
5799
+ function rustSort(rows, column, dir) {
5800
+ if (!core || !wantsRustEngine(engineOption, data.length)) return null;
5801
+ if (column.type !== "number" && column.type !== "date") return null;
5802
+ const keys = new Float64Array(rows.length);
5803
+ let lo = Infinity;
5804
+ let hi = -Infinity;
5805
+ for (let i = 0; i < rows.length; i++) {
5806
+ const v = rows[i][column.key];
5807
+ if (v == null || v === "") {
5808
+ keys[i] = NaN;
5809
+ continue;
5810
+ }
5811
+ const k = column.type === "number" ? Number(v) : new Date(v).getTime();
5812
+ if (!Number.isFinite(k)) return null;
5813
+ keys[i] = k;
5814
+ if (k < lo) lo = k;
5815
+ if (k > hi) hi = k;
5816
+ }
5817
+ if (lo === Infinity || !Number.isFinite(hi - lo)) return null;
5818
+ const order = core.sortByKeys(keys, dir === "desc");
5819
+ return order ? pickRows(rows, order) : null;
5820
+ }
5434
5821
  function compare2(a, b, column, dir) {
5435
5822
  const av = a[column.key];
5436
5823
  const bv = b[column.key];
@@ -5444,23 +5831,35 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5444
5831
  return dir === "desc" ? -out : out;
5445
5832
  }
5446
5833
  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)));
5834
+ ensureCore();
5835
+ let out;
5836
+ const q = query ? norm3(query) : "";
5837
+ const found = q ? rustSearch(q) : null;
5838
+ if (found) {
5839
+ out = applyGridFilters(found, toolColumns, filters);
5840
+ } else {
5841
+ out = applyGridFilters(data, toolColumns, filters);
5842
+ if (q) out = out.filter((row) => columns.some((c) => norm3(row[c.key]).includes(q) || norm3(formatPlain(c, row[c.key])).includes(q)));
5451
5843
  }
5452
5844
  if (sort && sort.key) {
5453
5845
  const column = columns.find((c) => c.key === sort.key);
5454
- if (column) out = out.slice().sort((a, b) => compare2(a, b, column, sort.direction));
5846
+ if (column) out = rustSort(out, column, sort.direction) || out.slice().sort((a, b) => compare2(a, b, column, sort.direction));
5455
5847
  }
5456
5848
  return out;
5457
5849
  }
5850
+ let numberFormat = null;
5851
+ let dateFormat = null;
5458
5852
  function formatPlain(column, value) {
5459
5853
  if (value == null || value === "") return "";
5460
- if (column.type === "number" && Number.isFinite(Number(value))) return Number(value).toLocaleString(numberLocale);
5854
+ if (column.type === "number" && Number.isFinite(Number(value))) {
5855
+ numberFormat = numberFormat || new Intl.NumberFormat(numberLocale);
5856
+ return numberFormat.format(Number(value));
5857
+ }
5461
5858
  if (column.type === "date") {
5462
5859
  const d = new Date(value);
5463
- return Number.isNaN(d.getTime()) ? String(value) : d.toLocaleDateString(numberLocale, { year: "numeric", month: "short", day: "numeric" });
5860
+ if (Number.isNaN(d.getTime())) return String(value);
5861
+ dateFormat = dateFormat || new Intl.DateTimeFormat(numberLocale, { year: "numeric", month: "short", day: "numeric" });
5862
+ return dateFormat.format(d);
5464
5863
  }
5465
5864
  if (column.type === "boolean") return value === true || value === "true" ? t.yes : t.no;
5466
5865
  return String(value);
@@ -5494,15 +5893,15 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
5494
5893
  const { pages, start, end } = pageBounds(rows.length);
5495
5894
  const current = rows.slice(start, end);
5496
5895
  host.className = `yv-grid yv-theme-${theme}${opts.wrap ? " yv-wrap" : ""}${opts.className ? " " + opts.className : ""}`;
5497
- host.setAttribute("aria-busy", String(loading));
5896
+ host.setAttribute("aria-busy", String(loading2));
5498
5897
  info.textContent = `${rows.length.toLocaleString(numberLocale)} ${t.rows}${selectable ? ` \xB7 ${selected.size.toLocaleString(numberLocale)} ${t.selected}` : ""}`;
5499
5898
  viewBtn.innerHTML = icon(isCards() ? "grid" : "cards", 18);
5500
5899
  viewBtn.setAttribute("aria-label", isCards() ? t.tableView : t.cardView);
5501
5900
  viewBtn.title = isCards() ? t.tableView : t.cardView;
5502
5901
  renderFilterBar();
5503
5902
  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();
5903
+ body.replaceChildren(loading2 ? h("div", { class: "yv-loading", role: "status" }, t.loading) : isCards() ? renderCards(current, start) : renderTable(current, start, rows.length));
5904
+ if (hadFocus && !loading2) restoreFocus();
5506
5905
  renderPager(rows.length, pages, start, end);
5507
5906
  }
5508
5907
  function renderTable(current, start, total) {
@@ -6058,6 +6457,12 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
6058
6457
  return api;
6059
6458
  },
6060
6459
  getSort: () => sort ? { ...sort } : null,
6460
+ // engine: "rust" when the Rust engine is active for this grid, else "ts"
6461
+ get engine() {
6462
+ return core && wantsRustEngine(engineOption, data.length) ? "rust" : "ts";
6463
+ },
6464
+ /** Resolves "rust" or "ts" once the engine choice is settled. */
6465
+ whenEngineReady: () => ensureCore().then(() => api.engine),
6061
6466
  // highlight
6062
6467
  highlight(list, scroll) {
6063
6468
  setHighlights(list, scroll === void 0 ? autoScroll : scroll);
@@ -6101,7 +6506,7 @@ Missing landmarks: ${missing.join(", ")}.` : ""}`,
6101
6506
  return api;
6102
6507
  },
6103
6508
  setLoading(on) {
6104
- loading = !!on;
6509
+ loading2 = !!on;
6105
6510
  render();
6106
6511
  return api;
6107
6512
  },
@@ -6900,7 +7305,7 @@ ${command ? command.say : "Not a voice command. Try: make text bigger, high cont
6900
7305
  }
6901
7306
 
6902
7307
  // vanilla/src/index.js
6903
- var VERSION = "5.3.0";
7308
+ var VERSION = "5.3.5";
6904
7309
  (function boot() {
6905
7310
  if (!isBrowser2()) return;
6906
7311
  if (window.yuktai && window.yuktai.__vanillaInitialized) return;