@sheetpane/grid 0.4.2 → 0.5.1

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.
@@ -1,11 +1,11 @@
1
1
  # sheetpane — the full public contract
2
2
 
3
- > Everything llms.txt links to, inlined: the package READMEs, the docs, the laws and the component records. Version 0.4.2; links pinned to v0.4.2.
3
+ > Everything llms.txt links to, inlined: the package READMEs, the docs, the laws and the component records. Version 0.5.1; links pinned to v0.5.1.
4
4
 
5
5
 
6
6
  ---
7
7
 
8
- <!-- source: README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/README.md) -->
8
+ <!-- source: README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/README.md) -->
9
9
 
10
10
  <div align="center">
11
11
 
@@ -40,6 +40,15 @@
40
40
 
41
41
  ---
42
42
 
43
+ ## In plain words
44
+
45
+ - Your users have spreadsheets. You want them to open one **inside your app**, fix it, and get it back.
46
+ - sheetpane is a spreadsheet you drop into a web page. It opens `.xlsx` and `.csv`, lets people edit, and **points at the cells that are wrong**, with what the right value should be.
47
+ - It all happens in the browser tab: **the file is never uploaded anywhere.**
48
+ - When they press Download, they get **their own file back**, with only the cells they changed updated.
49
+
50
+ ---
51
+
43
52
  ## Three lines of HTML
44
53
 
45
54
  ```html
@@ -94,9 +103,7 @@ The rules behind it are [this JSON file](docs/readme/holdings.rules.json), with
94
103
 
95
104
  ## Get started
96
105
 
97
- > [!NOTE]
98
- > **`0.1.0` is about to ship.** Until it is on npm, the install commands and the
99
- > playground links will not work yet.
106
+ **`0.5.0` is on npm**, with all 20 packages on one version, published from CI with signed provenance.
100
107
 
101
108
  ```sh
102
109
  npm install @sheetpane/grid
@@ -174,6 +181,23 @@ Anything else is refused with a clear message — never half-read.
174
181
 
175
182
  ---
176
183
 
184
+ ## Is sheetpane for you?
185
+
186
+ **Choose sheetpane when:**
187
+
188
+ - your users bring **their own `.xlsx` or `.csv`** and must review or correct it inside your app (uploads, imports, reconciliations, data checks);
189
+ - the file **must not leave the browser**, for compliance, privacy or simply trust;
190
+ - you need the download to be **their file**, not a re-generated copy that loses their formatting;
191
+ - you want one component that works in **any framework**, typed, and testable.
192
+
193
+ **Look elsewhere when:**
194
+
195
+ - you need a **full spreadsheet app**: real-time collaboration, server storage, pivot recalculation, macros;
196
+ - your files are **`.xls`, `.xlsm`, `.ods` or `.numbers`**. They are refused by design;
197
+ - you need a **data grid for your own records** (sorting and paging an API's rows). sheetpane is built around a workbook file.
198
+
199
+ ---
200
+
177
201
  ## How far it is proven
178
202
 
179
203
  **Every feature has tests**, in Node and a real browser: Chromium on every
@@ -198,11 +222,53 @@ Until 1.0 the API may change between minor versions — the
198
222
 
199
223
  </details>
200
224
 
201
- **Found a file that opens wrongly?** [Open an issue](https://github.com/arpitarya/sheetpane/issues/new)
225
+ **Found a file that opens wrongly?** [Open a file issue](https://github.com/arpitarya/sheetpane/issues/new?template=file_issue.yml)
202
226
  with the file (or a minimal copy) attached — it is the most useful thing you can send.
203
227
 
204
228
  ---
205
229
 
230
+ ## Roadmap
231
+
232
+ From the live queue ([`OPEN-WORK`](work/OPEN-WORK.md)) and the [backlog](work/BACKLOG.md). Nothing here is promised by a date.
233
+
234
+ | | what | state |
235
+ |---|---|---|
236
+ | 🔜 | **Files saved by Excel, Google Sheets, LibreOffice and Numbers** in the import tests (W-30) | needs those files saved by hand |
237
+ | 🔜 | **Firefox and WebKit green every night**, not just Chromium (W-70) | in progress |
238
+ | 🔜 | **The agent skills tried in Claude Code, Kiro and Codex** on a real prompt (W-48) | needs a hands-on run |
239
+ | 🔜 | Every sheet-protection switch honoured in Edit: format, sort, filter (B-038) | named |
240
+ | 🔜 | Excel 2010 `x14:` validation and conditional-format rules read and written (B-041) | named |
241
+ | 💭 | **Live pivot tables**, recalculated in the grid ([proposal](work/proposals/pivots.md)) | waiting for a host to ask |
242
+ | 💭 | **Dismiss** a workbook's own validation warning for one review ([proposal](work/proposals/dismiss-workbook-errors.md)) | proposed |
243
+ | 💭 | Keep the workbook in IndexedDB as well as memory (B-025) | deferred |
244
+
245
+ ---
246
+
247
+ ## FAQ
248
+
249
+ **Is my file uploaded anywhere?**
250
+ No. sheetpane reads, edits and checks it in the tab. Its only network requests are the GETs for the `src` and `rules-src` you set ([law L11](records/0013_LAW-11-workbook-stays-in-the-browser.md)).
251
+
252
+ **Do formulas work?**
253
+ With the [`formulas`](packages/formulas/README.md) plugin, yes: it recalculates as you edit, using IronCalc in WebAssembly, loaded only when you use it. Without it, a formula cell shows the value saved in the file.
254
+
255
+ **How do I save the edited file?**
256
+ Press Download, or call `export()` on `<sheetpane-excel>` for a `Blob` with every change. sheetpane keeps every change in memory; storing the file is your app's job ([law L6](records/0008_LAW-6-edits-in-memory-export-with-changes.md)).
257
+
258
+ **Can I use the reader and writer without the UI?**
259
+ Yes. [`@sheetpane/import`](packages/import/README.md) reads `.xlsx` / `.csv` into a plain JavaScript object, in a page or in Node. [`@sheetpane/export`](packages/export/README.md) turns one back into a file.
260
+
261
+ **Which frameworks?**
262
+ Any. The elements are standard web components; React, Vue, Svelte, Solid and Angular each need one line of setup ([guide](packages/grid/README.md#vue-svelte-solid-angular)).
263
+
264
+ **Will the API change?**
265
+ Until 1.0 it can change between minor versions. The [CHANGELOG](CHANGELOG.md) says what changed and what to do, under *Before you upgrade*.
266
+
267
+ **Where do the error rules come from?**
268
+ Three places: a JSON rules file, column rules you set in code, and the workbook's own data validation (with the [`validation`](packages/validation/README.md) plugin). Every error code is listed in [`docs/ERRORS.md`](docs/ERRORS.md).
269
+
270
+ ---
271
+
206
272
  ## Packages
207
273
 
208
274
  **One version for all**, ESM with types.
@@ -226,8 +292,9 @@ open source ([law L2](records/0004_LAW-2-foss-dependencies.md)).
226
292
 
227
293
  ## Contributing
228
294
 
229
- **Welcome — especially failing files and bug reports.** You need **Node 22+**,
230
- **pnpm 10** and [**just**](https://just.systems).
295
+ **Welcome — especially failing files and bug reports.** Read [CONTRIBUTING.md](CONTRIBUTING.md); report security issues privately ([SECURITY.md](SECURITY.md)); everyone follows the [Code of Conduct](CODE_OF_CONDUCT.md).
296
+
297
+ You need **Node 22+**, **pnpm 10** and [**just**](https://just.systems).
231
298
 
232
299
  ```sh
233
300
  just install # pnpm install --frozen-lockfile
@@ -262,14 +329,14 @@ the evidence**. Start at [`CLAUDE.md`](CLAUDE.md) if you are one.
262
329
 
263
330
  <div align="center">
264
331
 
265
- [MIT](LICENSE) © Arpit Arya
332
+ [MIT licence](LICENSE) © Arpit Arya — free for commercial and private use
266
333
 
267
334
  </div>
268
335
 
269
336
 
270
337
  ---
271
338
 
272
- <!-- source: packages/grid/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/grid/README.md) -->
339
+ <!-- source: packages/grid/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/grid/README.md) -->
273
340
 
274
341
  # @sheetpane/grid
275
342
 
@@ -986,7 +1053,7 @@ The specs are the records [SR-GRID](../../records/0105_GRID.md) and
986
1053
 
987
1054
  ---
988
1055
 
989
- <!-- source: packages/export/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/export/README.md) -->
1056
+ <!-- source: packages/export/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/export/README.md) -->
990
1057
 
991
1058
  # @sheetpane/export
992
1059
 
@@ -1202,7 +1269,7 @@ The spec is the record [SR-EXPORT](../../records/0103_EXPORT.md).
1202
1269
 
1203
1270
  ---
1204
1271
 
1205
- <!-- source: packages/import/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/import/README.md) -->
1272
+ <!-- source: packages/import/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/import/README.md) -->
1206
1273
 
1207
1274
  # @sheetpane/import
1208
1275
 
@@ -1269,7 +1336,7 @@ The spec is the record [SR-IMPORT](../../records/0104_IMPORT.md).
1269
1336
 
1270
1337
  ---
1271
1338
 
1272
- <!-- source: packages/numfmt/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/numfmt/README.md) -->
1339
+ <!-- source: packages/numfmt/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/numfmt/README.md) -->
1273
1340
 
1274
1341
  # @sheetpane/numfmt
1275
1342
 
@@ -1380,7 +1447,7 @@ How plugins plug in: [`work/compare/plugins.compare.md`](../../work/compare/plug
1380
1447
 
1381
1448
  ---
1382
1449
 
1383
- <!-- source: packages/formulas/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/formulas/README.md) -->
1450
+ <!-- source: packages/formulas/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/formulas/README.md) -->
1384
1451
 
1385
1452
  # @sheetpane/formulas
1386
1453
 
@@ -1493,7 +1560,7 @@ How plugins plug in: [`work/compare/plugins.compare.md`](../../work/compare/plug
1493
1560
 
1494
1561
  ---
1495
1562
 
1496
- <!-- source: packages/styles/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/styles/README.md) -->
1563
+ <!-- source: packages/styles/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/styles/README.md) -->
1497
1564
 
1498
1565
  # @sheetpane/styles
1499
1566
 
@@ -1599,7 +1666,7 @@ How plugins plug in: [`work/compare/plugins.compare.md`](../../work/compare/plug
1599
1666
 
1600
1667
  ---
1601
1668
 
1602
- <!-- source: packages/validation/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/validation/README.md) -->
1669
+ <!-- source: packages/validation/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/validation/README.md) -->
1603
1670
 
1604
1671
  # @sheetpane/validation
1605
1672
 
@@ -1830,7 +1897,7 @@ the rule rows when you need them.
1830
1897
 
1831
1898
  ---
1832
1899
 
1833
- <!-- source: packages/condfmt/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/condfmt/README.md) -->
1900
+ <!-- source: packages/condfmt/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/condfmt/README.md) -->
1834
1901
 
1835
1902
  # @sheetpane/condfmt
1836
1903
 
@@ -1948,7 +2015,7 @@ How plugins plug in: [`work/compare/plugins.compare.md`](../../work/compare/plug
1948
2015
 
1949
2016
  ---
1950
2017
 
1951
- <!-- source: packages/images/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/images/README.md) -->
2018
+ <!-- source: packages/images/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/images/README.md) -->
1952
2019
 
1953
2020
  # @sheetpane/images
1954
2021
 
@@ -2034,7 +2101,7 @@ LibreOffice are owed by W-30.
2034
2101
 
2035
2102
  ---
2036
2103
 
2037
- <!-- source: packages/charts/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/charts/README.md) -->
2104
+ <!-- source: packages/charts/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/charts/README.md) -->
2038
2105
 
2039
2106
  # @sheetpane/charts
2040
2107
 
@@ -2168,7 +2235,7 @@ How plugins plug in: [`work/compare/plugins.compare.md`](../../work/compare/plug
2168
2235
 
2169
2236
  ---
2170
2237
 
2171
- <!-- source: packages/comments/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/comments/README.md) -->
2238
+ <!-- source: packages/comments/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/comments/README.md) -->
2172
2239
 
2173
2240
  # @sheetpane/comments
2174
2241
 
@@ -2308,7 +2375,7 @@ Spec: [`work/open/W-22-comments.md`](../../work/open/W-22-comments.md).
2308
2375
 
2309
2376
  ---
2310
2377
 
2311
- <!-- source: packages/visibility/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/visibility/README.md) -->
2378
+ <!-- source: packages/visibility/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/visibility/README.md) -->
2312
2379
 
2313
2380
  # @sheetpane/visibility
2314
2381
 
@@ -2348,7 +2415,7 @@ Spec: [SR-VISIBILITY](../../records/0121_VISIBILITY.md). MIT.
2348
2415
 
2349
2416
  ---
2350
2417
 
2351
- <!-- source: packages/tables/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/tables/README.md) -->
2418
+ <!-- source: packages/tables/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/tables/README.md) -->
2352
2419
 
2353
2420
  # @sheetpane/tables
2354
2421
 
@@ -2395,7 +2462,7 @@ Spec: [SR-TABLES](../../records/0122_TABLES.md). MIT.
2395
2462
 
2396
2463
  ---
2397
2464
 
2398
- <!-- source: packages/compare/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/compare/README.md) -->
2465
+ <!-- source: packages/compare/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/compare/README.md) -->
2399
2466
 
2400
2467
  # @sheetpane/compare
2401
2468
 
@@ -2467,7 +2534,7 @@ Spec: [SR-COMPARE](../../records/0124_COMPARE.md). MIT.
2467
2534
 
2468
2535
  ---
2469
2536
 
2470
- <!-- source: packages/review/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/review/README.md) -->
2537
+ <!-- source: packages/review/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/review/README.md) -->
2471
2538
 
2472
2539
  # @sheetpane/review
2473
2540
 
@@ -2599,7 +2666,7 @@ Spec: [SR-REVIEW](../../records/0123_REVIEW.md). MIT.
2599
2666
 
2600
2667
  ---
2601
2668
 
2602
- <!-- source: packages/fixtures/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/fixtures/README.md) -->
2669
+ <!-- source: packages/fixtures/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/fixtures/README.md) -->
2603
2670
 
2604
2671
  # @sheetpane/fixtures
2605
2672
 
@@ -2639,7 +2706,7 @@ The spec is the record [SR-FIXTURES](../../records/0115_FIXTURES.md).
2639
2706
 
2640
2707
  ---
2641
2708
 
2642
- <!-- source: packages/testing/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/testing/README.md) -->
2709
+ <!-- source: packages/testing/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/testing/README.md) -->
2643
2710
 
2644
2711
  # @sheetpane/testing
2645
2712
 
@@ -2689,7 +2756,7 @@ The spec is the record [SR-TESTING](../../records/0118_TESTING.md).
2689
2756
 
2690
2757
  ---
2691
2758
 
2692
- <!-- source: packages/skills/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/skills/README.md) -->
2759
+ <!-- source: packages/skills/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/skills/README.md) -->
2693
2760
 
2694
2761
  # @sheetpane/skills
2695
2762
 
@@ -2760,7 +2827,7 @@ the elements do not have. The spec is the record
2760
2827
 
2761
2828
  ---
2762
2829
 
2763
- <!-- source: packages/mcp/README.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/packages/mcp/README.md) -->
2830
+ <!-- source: packages/mcp/README.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/packages/mcp/README.md) -->
2764
2831
 
2765
2832
  # @sheetpane/mcp
2766
2833
 
@@ -2801,7 +2868,7 @@ Spec: [SR-MCP](../../records/0119_MCP.md). MIT.
2801
2868
 
2802
2869
  ---
2803
2870
 
2804
- <!-- source: docs/ARCHITECTURE.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/docs/ARCHITECTURE.md) -->
2871
+ <!-- source: docs/ARCHITECTURE.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/docs/ARCHITECTURE.md) -->
2805
2872
 
2806
2873
  # sheetpane — architecture
2807
2874
 
@@ -3040,7 +3107,7 @@ How it is all tested — Vitest, real browsers, fixtures, goldens — is the
3040
3107
 
3041
3108
  ---
3042
3109
 
3043
- <!-- source: docs/GLOSSARY.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/docs/GLOSSARY.md) -->
3110
+ <!-- source: docs/GLOSSARY.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/docs/GLOSSARY.md) -->
3044
3111
 
3045
3112
  # Glossary
3046
3113
 
@@ -3081,7 +3148,7 @@ How it is all tested — Vitest, real browsers, fixtures, goldens — is the
3081
3148
 
3082
3149
  ---
3083
3150
 
3084
- <!-- source: docs/ERRORS.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/docs/ERRORS.md) -->
3151
+ <!-- source: docs/ERRORS.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/docs/ERRORS.md) -->
3085
3152
 
3086
3153
  # Error codes
3087
3154
 
@@ -4162,7 +4229,7 @@ throws: each problem is one `note` error, `author: 'host'`, with its `code`.
4162
4229
 
4163
4230
  ---
4164
4231
 
4165
- <!-- source: records/0001_LAWS.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0001_LAWS.md) -->
4232
+ <!-- source: records/0001_LAWS.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0001_LAWS.md) -->
4166
4233
 
4167
4234
  # SR-LAWS — the laws have exactly one home each
4168
4235
 
@@ -4211,6 +4278,8 @@ A law restated in two places is two laws the moment one is edited.
4211
4278
  | **L9** | [SR-LAW-9](0011_LAW-9-memory-is-a-javascript-object.md) | memory means a JavaScript object, for now |
4212
4279
  | **L10** | [SR-LAW-10](0012_LAW-10-examples-maintained.md) | the examples are maintained with every package change |
4213
4280
  | **L11** | [SR-LAW-11](0013_LAW-11-workbook-stays-in-the-browser.md) | the workbook never leaves the browser |
4281
+ | **L12** | [SR-LAW-12](0014_LAW-12-every-plugin-in-the-demos.md) | every plugin is in the demos, and All plugins has them all |
4282
+ | **L13** | [SR-LAW-13](0015_LAW-13-popups-always-visible.md) | every dropdown is wholly visible, inside the viewport, on top |
4214
4283
 
4215
4284
  2. **A new law** takes the next handle and the next free number in the law
4216
4285
  range, on the decider's ruling named in its record; this table gains its row and
@@ -4248,7 +4317,7 @@ carries a law's normative text.
4248
4317
 
4249
4318
  ---
4250
4319
 
4251
- <!-- source: records/0002_LAW-0-authority.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0002_LAW-0-authority.md) -->
4320
+ <!-- source: records/0002_LAW-0-authority.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0002_LAW-0-authority.md) -->
4252
4321
 
4253
4322
  # SR-LAW-0 — L0, the records are the only source of truth
4254
4323
 
@@ -4364,7 +4433,7 @@ is never listed here.*
4364
4433
 
4365
4434
  ---
4366
4435
 
4367
- <!-- source: records/0003_LAW-1-retired-records-archived.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0003_LAW-1-retired-records-archived.md) -->
4436
+ <!-- source: records/0003_LAW-1-retired-records-archived.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0003_LAW-1-retired-records-archived.md) -->
4368
4437
 
4369
4438
  # SR-LAW-1 — L1, a retired record is archived, never deleted
4370
4439
 
@@ -4457,7 +4526,7 @@ is never listed here.*
4457
4526
 
4458
4527
  ---
4459
4528
 
4460
- <!-- source: records/0004_LAW-2-foss-dependencies.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0004_LAW-2-foss-dependencies.md) -->
4529
+ <!-- source: records/0004_LAW-2-foss-dependencies.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0004_LAW-2-foss-dependencies.md) -->
4461
4530
 
4462
4531
  # SR-LAW-2 — L2, every dependency is free and open source
4463
4532
 
@@ -4566,7 +4635,7 @@ is never listed here.*
4566
4635
 
4567
4636
  ---
4568
4637
 
4569
- <!-- source: records/0005_LAW-3-xlsx-and-csv-only.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0005_LAW-3-xlsx-and-csv-only.md) -->
4638
+ <!-- source: records/0005_LAW-3-xlsx-and-csv-only.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0005_LAW-3-xlsx-and-csv-only.md) -->
4570
4639
 
4571
4640
  # SR-LAW-3 — L3, sheetpane supports XLSX and CSV only
4572
4641
 
@@ -4679,7 +4748,7 @@ is never listed here.*
4679
4748
 
4680
4749
  ---
4681
4750
 
4682
- <!-- source: records/0006_LAW-4-web-component.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0006_LAW-4-web-component.md) -->
4751
+ <!-- source: records/0006_LAW-4-web-component.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0006_LAW-4-web-component.md) -->
4683
4752
 
4684
4753
  # SR-LAW-4 — L4, sheetpane is always a web component
4685
4754
 
@@ -4799,7 +4868,7 @@ is never listed here.*
4799
4868
 
4800
4869
  ---
4801
4870
 
4802
- <!-- source: records/0007_LAW-5-host-font.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0007_LAW-5-host-font.md) -->
4871
+ <!-- source: records/0007_LAW-5-host-font.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0007_LAW-5-host-font.md) -->
4803
4872
 
4804
4873
  # SR-LAW-5 — L5, the font is the browser's default unless the host sets one
4805
4874
 
@@ -4918,7 +4987,7 @@ is never listed here.*
4918
4987
 
4919
4988
  ---
4920
4989
 
4921
- <!-- source: records/0008_LAW-6-edits-in-memory-export-with-changes.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0008_LAW-6-edits-in-memory-export-with-changes.md) -->
4990
+ <!-- source: records/0008_LAW-6-edits-in-memory-export-with-changes.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0008_LAW-6-edits-in-memory-export-with-changes.md) -->
4922
4991
 
4923
4992
  # SR-LAW-6 — L6, every change is held in memory and export carries it
4924
4993
 
@@ -5029,7 +5098,7 @@ is never listed here.*
5029
5098
 
5030
5099
  ---
5031
5100
 
5032
- <!-- source: records/0009_LAW-7-surfaces-always-in-sync.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0009_LAW-7-surfaces-always-in-sync.md) -->
5101
+ <!-- source: records/0009_LAW-7-surfaces-always-in-sync.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0009_LAW-7-surfaces-always-in-sync.md) -->
5033
5102
 
5034
5103
  # SR-LAW-7 — L7, the view, edit and error components are always in sync
5035
5104
 
@@ -5138,7 +5207,7 @@ is never listed here.*
5138
5207
 
5139
5208
  ---
5140
5209
 
5141
- <!-- source: records/0010_LAW-8-npm-package.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0010_LAW-8-npm-package.md) -->
5210
+ <!-- source: records/0010_LAW-8-npm-package.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0010_LAW-8-npm-package.md) -->
5142
5211
 
5143
5212
  # SR-LAW-8 — L8, sheetpane is consumed as an npm package
5144
5213
 
@@ -5247,7 +5316,7 @@ is never listed here.*
5247
5316
 
5248
5317
  ---
5249
5318
 
5250
- <!-- source: records/0011_LAW-9-memory-is-a-javascript-object.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0011_LAW-9-memory-is-a-javascript-object.md) -->
5319
+ <!-- source: records/0011_LAW-9-memory-is-a-javascript-object.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0011_LAW-9-memory-is-a-javascript-object.md) -->
5251
5320
 
5252
5321
  # SR-LAW-9 — L9, memory means a JavaScript object, for now
5253
5322
 
@@ -5345,7 +5414,7 @@ is never listed here.*
5345
5414
 
5346
5415
  ---
5347
5416
 
5348
- <!-- source: records/0101_DOWNLOAD.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0101_DOWNLOAD.md) -->
5417
+ <!-- source: records/0101_DOWNLOAD.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0101_DOWNLOAD.md) -->
5349
5418
 
5350
5419
  # SR-DOWNLOAD — download(): export output in, a saved .xlsx or .csv out
5351
5420
 
@@ -5591,7 +5660,7 @@ is never listed here.*
5591
5660
 
5592
5661
  ---
5593
5662
 
5594
- <!-- source: records/0102_BUILD.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0102_BUILD.md) -->
5663
+ <!-- source: records/0102_BUILD.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0102_BUILD.md) -->
5595
5664
 
5596
5665
  # SR-BUILD — the monorepo build
5597
5666
 
@@ -5861,16 +5930,16 @@ pnpm and a justfile; the testing verdict chose the runner.
5861
5930
  installs both from `pnpm pack` tarballs (every package, the eight plugins
5862
5931
  included) outside the workspace and runs the same check — `just
5863
5932
  demo-packed`, nightly. Both share one look (2026-10-19): a host bar
5864
- (Views, Open file…, the CSV sample, the pop-up, Font, and Theme — light ·
5933
+ (Open file…, the CSV sample, the pop-up, Font, and Theme — light ·
5865
5934
  dark · auto, set on every component), the components filling the window,
5866
5935
  and a footer of host events (the `sheetpane-export` line names the file,
5867
5936
  the format and the first 12 hex digits of its SHA-256, W-65);
5868
5937
  `examples/react/src/demo.css` is the
5869
- stylesheet the HTML demo inlines.
5938
+ stylesheet the HTML demo inlines. The sheet and the error list are always
5939
+ shown side by side; there is no view switch (decider, 2026-10-19).
5870
5940
  11a. **The plugin gallery (W-32):** both demos carry a second tab row —
5871
5941
  Review (the demo above) · Vanilla · Number formats · Styles · Formulas ·
5872
- Validation · Conditional formats · Images · Charts · Comments · All
5873
- plugins · Hide and show (W-49: `@sheetpane/visibility` — hide a row from
5942
+ Validation · Conditional formats · Images · Charts · Comments · Hide and show (W-49: `@sheetpane/visibility` — hide a row from
5874
5943
  its header menu, the marker unhides it) · Tables (W-61: `tables
5875
5944
  validation` on the showcase's Tables sheet — both tables in their style
5876
5945
  colours, and C9 typed "furlong" fails the list over `Units[Unit]`) · Compare (W-63:
@@ -5879,14 +5948,17 @@ pnpm and a justfile; the testing verdict chose the runner.
5879
5948
  `demo-check` reads the status line's 4 sheets · 7 rows · 2 cells, the
5880
5949
  amber price, the 7 listed changes and Alt+F5 to D4) · Review sheet (W-59:
5881
5950
  `@sheetpane/review` — the download gains a Review sheet listing the
5882
- review, flagged cells coloured) · Rules file (W-33: the showcase's rules sample — `rules-src` in
5951
+ review, flagged cells coloured) · All plugins (every plugin on one pane,
5952
+ SR-LAW-12; `test/plugins-in-demos.test.ts` fails when a package that
5953
+ calls `registerPlugin` is not imported by a demo, has no tab of its own
5954
+ or is missing from All plugins, 2026-10-19) · Rules file (W-33: the showcase's rules sample — `rules-src` in
5883
5955
  HTML, the `rules` prop in React — with `flagging="off"`). Every gallery
5884
5956
  tab opens one showcase workbook from `@sheetpane/fixtures` (SR-FIXTURES:
5885
5957
  the HTML import path `./node_modules/@sheetpane/fixtures/files/…`, a
5886
5958
  `?url` import in React; W-42) on its
5887
5959
  own `pane`, mounted when the tab first opens and kept after; a plugin's
5888
5960
  peer loads with it (condfmt with styles, charts with images). Both demos
5889
- depend on all eight plugins, and the HTML import map lists them with
5961
+ depend on every plugin, and the HTML import map lists them with
5890
5962
  `numfmt` (its ESM build, `dist/index.mjs`) and `@ironcalc/wasm`.
5891
5963
  `demo-check` asserts per tab: Vanilla plain (1.25, no overlay, no errors);
5892
5964
  1 1/4; the yellow fill; B6 recalculated; two rule errors; a data bar; the
@@ -5956,7 +6028,7 @@ is never listed here.*
5956
6028
 
5957
6029
  ---
5958
6030
 
5959
- <!-- source: records/0103_EXPORT.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0103_EXPORT.md) -->
6031
+ <!-- source: records/0103_EXPORT.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0103_EXPORT.md) -->
5960
6032
 
5961
6033
  # SR-EXPORT — @sheetpane/export
5962
6034
 
@@ -6278,7 +6350,7 @@ is never listed here.*
6278
6350
 
6279
6351
  ---
6280
6352
 
6281
- <!-- source: records/0104_IMPORT.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0104_IMPORT.md) -->
6353
+ <!-- source: records/0104_IMPORT.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0104_IMPORT.md) -->
6282
6354
 
6283
6355
  # SR-IMPORT — @sheetpane/import
6284
6356
 
@@ -6576,7 +6648,7 @@ is never listed here.*
6576
6648
 
6577
6649
  ---
6578
6650
 
6579
- <!-- source: records/0105_GRID.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0105_GRID.md) -->
6651
+ <!-- source: records/0105_GRID.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0105_GRID.md) -->
6580
6652
 
6581
6653
  # SR-GRID — @sheetpane/grid
6582
6654
 
@@ -6896,7 +6968,7 @@ the grid, contract, plugins and testing verdicts in `work/compare/`.
6896
6968
  every cell of it the same way (W-46). Delete or Backspace over a range
6897
6969
  clears every filled cell through `beforechange`, refused cells skipped,
6898
6970
  one undo step. Over 1,000,000 cells nothing is pasted, and the status line
6899
- says why. There is no fill gesture yet.
6971
+ says why.
6900
6972
  11b. **Range selection (W-46):** the selection is drawn by **one layer**, never
6901
6973
  per cell — over the range a fill (`--sp-accent-soft`) with the active cell
6902
6974
  left unfilled (an even-odd hole), one 2 px `--sp-accent` border on the
@@ -6983,6 +7055,43 @@ the grid, contract, plugins and testing verdicts in `work/compare/`.
6983
7055
  link is the user's act. **Copy link** joins the cell menu and the ⋯
6984
7056
  menu after Copy ref while `link="hash"` (decision 13): the page's URL
6985
7057
  with this pane's selection as its link.
7058
+ 11e. **Editing in the cell, as in Excel (Arpit, 2026-10-19):**
7059
+ - **Opening:** typing, Enter, F2 or a double press on a cell (two presses
7060
+ within 400 ms) opens an editor on the cell itself. The cell bar holds the
7061
+ same draft, so either can be typed in. The editor grows with its text up
7062
+ to the sheet's edge and follows the cell through scrolling and zoom.
7063
+ - **Keys:** Enter commits and moves down, Tab across. After a run of Tabs,
7064
+ Enter goes back to the column the run began in, a row down. Esc restores
7065
+ the value. Arrows commit and move when the draft was started by typing,
7066
+ and move the caret after Enter, F2 or a double press (F2 switches).
7067
+ Ctrl/⌘+Enter puts the entry in every shown cell of the range, one undo
7068
+ step, and keeps the selection.
7069
+ - **The fill handle (Edit):** a square at the selection's corner. Dragged,
7070
+ it extends along the axis the pointer has gone furthest, autoscrolling,
7071
+ with the last cell's value shown beside it.
7072
+ - **Numbers:** two or more make a linear series and one repeats;
7073
+ Ctrl/⌘ at release swaps the two.
7074
+ - **Text ending in a number** counts on.
7075
+ - **Formulas** shift their relative references.
7076
+ - **Anything else** cycles.
7077
+ - **Writing:** each cell goes through `beforechange`; hidden cells are
7078
+ left alone; the fill is one undo step, and the filled range is
7079
+ selected. Esc cancels.
7080
+ - **Double-click and keys:** a double-click on the handle fills down as far
7081
+ as the column beside the source has data. Ctrl+D / Ctrl+R copy the top
7082
+ row (left column) of the range over the rest, a single cell from above
7083
+ (left); formulas move.
7084
+ - **A file dropped** anywhere on a loaded sheet opens it. While it is
7085
+ dragged over, an overlay says so, and names the changes not yet
7086
+ downloaded that it would replace.
7087
+ - **An insert at the edge grows the grid:** the grid shows at least the
7088
+ rows and columns it showed, plus what was inserted (less what was deleted),
7089
+ so a column inserted right of the last one appears and takes typing.
7090
+ - **Right-click inside the range** keeps the range.
7091
+ - **Every menu and card floats** ([L13](0015_LAW-13-popups-always-visible.md)): it is shown in the
7092
+ top layer and placed inside the viewport by `excel/float.ts`. Esc closes
7093
+ the keyboard help from its button.
7094
+ - **The pure parts** (`fillSeries`, `fillDownTo`) are in `excel/fill.ts`.
6986
7095
  12. **Keyboard (APG grid):** focus stays on the `role="grid"` element and
6987
7096
  `aria-activedescendant` names the active cell; arrows, Shift+arrows,
6988
7097
  Home/End, Ctrl+Home/End, PageUp/PageDown; Ctrl/⌘+arrow jumps to the edge
@@ -6990,8 +7099,8 @@ the grid, contract, plugins and testing verdicts in `work/compare/`.
6990
7099
  the column, Shift+Space the row; Ctrl/⌘+A the data region, again the
6991
7100
  sheet; Shift+Backspace collapses to the active cell; inside a range Enter,
6992
7101
  Shift+Enter, Tab and Shift+Tab move the active cell within it and wrap;
6993
- otherwise Enter or F2 edits; a printable
6994
- key replaces the cell; Delete clears (a range: decision 11a); F flags; Esc
7102
+ otherwise Enter or F2 edits in the cell, and a printable key replaces it
7103
+ (decision 11e); Ctrl+D / Ctrl+R fill down / right; Delete clears (a range: decision 11a); F flags; Esc
6995
7104
  cancels the innermost thing — a drag, a menu, the form, find, the copied
6996
7105
  outline, a resize, the header menu — or closes the pop-up; Alt+Shift+↓ /
6997
7106
  ↑ expands or collapses the row group at the active cell (W-49); arrows
@@ -7728,7 +7837,7 @@ is never listed here.*
7728
7837
 
7729
7838
  ---
7730
7839
 
7731
- <!-- source: records/0106_ERRORS.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0106_ERRORS.md) -->
7840
+ <!-- source: records/0106_ERRORS.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0106_ERRORS.md) -->
7732
7841
 
7733
7842
  # SR-ERRORS — <sheetpane-errors>
7734
7843
 
@@ -8048,7 +8157,7 @@ is never listed here.*
8048
8157
 
8049
8158
  ---
8050
8159
 
8051
- <!-- source: records/0107_IMAGES.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0107_IMAGES.md) -->
8160
+ <!-- source: records/0107_IMAGES.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0107_IMAGES.md) -->
8052
8161
 
8053
8162
  # SR-IMAGES — @sheetpane/images
8054
8163
 
@@ -8176,7 +8285,7 @@ is never listed here.*
8176
8285
 
8177
8286
  ---
8178
8287
 
8179
- <!-- source: records/0108_VALIDATION.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0108_VALIDATION.md) -->
8288
+ <!-- source: records/0108_VALIDATION.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0108_VALIDATION.md) -->
8180
8289
 
8181
8290
  # SR-VALIDATION — @sheetpane/validation
8182
8291
 
@@ -8428,7 +8537,7 @@ is never listed here.*
8428
8537
 
8429
8538
  ---
8430
8539
 
8431
- <!-- source: records/0109_NUMFMT.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0109_NUMFMT.md) -->
8540
+ <!-- source: records/0109_NUMFMT.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0109_NUMFMT.md) -->
8432
8541
 
8433
8542
  # SR-NUMFMT — @sheetpane/numfmt
8434
8543
 
@@ -8564,7 +8673,7 @@ is never listed here.*
8564
8673
 
8565
8674
  ---
8566
8675
 
8567
- <!-- source: records/0110_STYLES.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0110_STYLES.md) -->
8676
+ <!-- source: records/0110_STYLES.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0110_STYLES.md) -->
8568
8677
 
8569
8678
  # SR-STYLES — @sheetpane/styles
8570
8679
 
@@ -8730,7 +8839,7 @@ is never listed here.*
8730
8839
 
8731
8840
  ---
8732
8841
 
8733
- <!-- source: records/0111_FORMULAS.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0111_FORMULAS.md) -->
8842
+ <!-- source: records/0111_FORMULAS.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0111_FORMULAS.md) -->
8734
8843
 
8735
8844
  # SR-FORMULAS — @sheetpane/formulas
8736
8845
 
@@ -8900,7 +9009,7 @@ is never listed here.*
8900
9009
 
8901
9010
  ---
8902
9011
 
8903
- <!-- source: records/0112_COMMENTS.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0112_COMMENTS.md) -->
9012
+ <!-- source: records/0112_COMMENTS.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0112_COMMENTS.md) -->
8904
9013
 
8905
9014
  # SR-COMMENTS — @sheetpane/comments
8906
9015
 
@@ -9073,7 +9182,7 @@ is never listed here.*
9073
9182
 
9074
9183
  ---
9075
9184
 
9076
- <!-- source: records/0113_CHARTS.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0113_CHARTS.md) -->
9185
+ <!-- source: records/0113_CHARTS.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0113_CHARTS.md) -->
9077
9186
 
9078
9187
  # SR-CHARTS — @sheetpane/charts
9079
9188
 
@@ -9225,7 +9334,7 @@ is never listed here.*
9225
9334
 
9226
9335
  ---
9227
9336
 
9228
- <!-- source: records/0114_CONDFMT.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0114_CONDFMT.md) -->
9337
+ <!-- source: records/0114_CONDFMT.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0114_CONDFMT.md) -->
9229
9338
 
9230
9339
  # SR-CONDFMT — @sheetpane/condfmt
9231
9340
 
@@ -9378,7 +9487,7 @@ is never listed here.*
9378
9487
 
9379
9488
  ---
9380
9489
 
9381
- <!-- source: records/0115_FIXTURES.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0115_FIXTURES.md) -->
9490
+ <!-- source: records/0115_FIXTURES.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0115_FIXTURES.md) -->
9382
9491
 
9383
9492
  # SR-FIXTURES — @sheetpane/fixtures
9384
9493
 
@@ -9530,7 +9639,7 @@ is never listed here.*
9530
9639
 
9531
9640
  ---
9532
9641
 
9533
- <!-- source: records/0116_SKILLS.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0116_SKILLS.md) -->
9642
+ <!-- source: records/0116_SKILLS.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0116_SKILLS.md) -->
9534
9643
 
9535
9644
  # SR-SKILLS — @sheetpane/skills
9536
9645
 
@@ -9724,7 +9833,7 @@ is never listed here.*
9724
9833
 
9725
9834
  ---
9726
9835
 
9727
- <!-- source: records/0117_CODES.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0117_CODES.md) -->
9836
+ <!-- source: records/0117_CODES.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0117_CODES.md) -->
9728
9837
 
9729
9838
  # SR-CODES — stable error codes
9730
9839
 
@@ -9893,7 +10002,7 @@ is never listed here.*
9893
10002
 
9894
10003
  ---
9895
10004
 
9896
- <!-- source: records/0118_TESTING.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0118_TESTING.md) -->
10005
+ <!-- source: records/0118_TESTING.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0118_TESTING.md) -->
9897
10006
 
9898
10007
  # SR-TESTING — @sheetpane/testing
9899
10008
 
@@ -9995,7 +10104,7 @@ is never listed here.*
9995
10104
 
9996
10105
  ---
9997
10106
 
9998
- <!-- source: records/0119_MCP.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0119_MCP.md) -->
10107
+ <!-- source: records/0119_MCP.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0119_MCP.md) -->
9999
10108
 
10000
10109
  # SR-MCP — @sheetpane/mcp
10001
10110
 
@@ -10176,7 +10285,7 @@ is never listed here.*
10176
10285
 
10177
10286
  ---
10178
10287
 
10179
- <!-- source: records/0121_VISIBILITY.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0121_VISIBILITY.md) -->
10288
+ <!-- source: records/0121_VISIBILITY.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0121_VISIBILITY.md) -->
10180
10289
 
10181
10290
  # SR-VISIBILITY — @sheetpane/visibility
10182
10291
 
@@ -10290,7 +10399,7 @@ is never listed here.*
10290
10399
 
10291
10400
  ---
10292
10401
 
10293
- <!-- source: records/0122_TABLES.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0122_TABLES.md) -->
10402
+ <!-- source: records/0122_TABLES.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0122_TABLES.md) -->
10294
10403
 
10295
10404
  # SR-TABLES — @sheetpane/tables
10296
10405
 
@@ -10412,7 +10521,7 @@ is never listed here.*
10412
10521
 
10413
10522
  ---
10414
10523
 
10415
- <!-- source: records/0123_REVIEW.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0123_REVIEW.md) -->
10524
+ <!-- source: records/0123_REVIEW.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0123_REVIEW.md) -->
10416
10525
 
10417
10526
  # SR-REVIEW — @sheetpane/review
10418
10527
 
@@ -10611,7 +10720,7 @@ is never listed here.*
10611
10720
 
10612
10721
  ---
10613
10722
 
10614
- <!-- source: records/0124_COMPARE.md (https://github.com/arpitarya/sheetpane/blob/v0.4.2/records/0124_COMPARE.md) -->
10723
+ <!-- source: records/0124_COMPARE.md (https://github.com/arpitarya/sheetpane/blob/v0.5.1/records/0124_COMPARE.md) -->
10615
10724
 
10616
10725
  # SR-COMPARE — @sheetpane/compare
10617
10726