{"id":24111264,"url":"https://github.com/jstrieb/code-grid","last_synced_at":"2026-03-02T20:35:30.000Z","repository":{"id":271914458,"uuid":"883201921","full_name":"jstrieb/code-grid","owner":"jstrieb","description":"Spreadsheet for programmers where XSS is a feature, not a bug","archived":false,"fork":false,"pushed_at":"2026-02-09T18:20:34.000Z","size":760,"stargazers_count":3,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-02-09T22:30:28.005Z","etag":null,"topics":["runes","spreadsheet","svelte","svelte-5","svelte-reactivity","svelte-runes","svelte5","sveltejs","xss"],"latest_commit_sha":null,"homepage":"https://jstrieb.github.io/code-grid/","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jstrieb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-04T14:52:53.000Z","updated_at":"2026-01-30T17:43:29.000Z","dependencies_parsed_at":"2025-01-10T18:33:53.223Z","dependency_job_id":"90840107-d7b8-46cc-87b7-64609dc7870e","html_url":"https://github.com/jstrieb/code-grid","commit_stats":null,"previous_names":["jstrieb/code-grid"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jstrieb/code-grid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstrieb%2Fcode-grid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstrieb%2Fcode-grid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstrieb%2Fcode-grid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstrieb%2Fcode-grid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jstrieb","download_url":"https://codeload.github.com/jstrieb/code-grid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstrieb%2Fcode-grid/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30018583,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T17:00:27.440Z","status":"ssl_error","status_checked_at":"2026-03-02T17:00:03.402Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["runes","spreadsheet","svelte","svelte-5","svelte-reactivity","svelte-runes","svelte5","sveltejs","xss"],"created_at":"2025-01-11T02:21:37.667Z","updated_at":"2026-03-02T20:35:29.984Z","avatar_url":"https://github.com/jstrieb.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003e\n\n\u003ca href=\"https://jstrieb.github.io/code-grid\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/jstrieb/code-grid/blob/master/public/favicon.svg?raw=true\" width=\"125\" height=\"125\" align=\"left\" /\u003e\u003c/a\u003e\n\nCode Grid\n\n\u003c/h1\u003e\n\n\u003ca href=\"https://jstrieb.github.io/code-grid\" target=\"_blank\"\u003eSpreadsheet for programmers where XSS is a feature, not a bug.\u003c/a\u003e\n\n\u003cbr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"https://jstrieb.github.io/code-grid\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/jstrieb/code-grid/blob/master/public/opengraph.png?raw=true\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003e [!WARNING]\n\u003e \n\u003e This is alpha-quality code. It is likely to have bugs. The APIs are not yet\n\u003e stable, so things like spreadsheet links may break as the code is updated.\n\n# About\n\nCode Grid is a web-based spreadsheet that is designed to be easy to extend.\n\n- Write new formula functions using JavaScript\n- Create HTML elements inside cells\n- Navigate with Vim keybindings\n- Build small applications that are easy to share and modify\n- Never send data to a back end – Code Grid runs fully client-side\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://github.com/jstrieb/code-grid/blob/master/public/line.svg?raw=true\"\u003e\n\u003c/div\u003e\n\n# Examples\n\n- [Do budgeting and basic personal finance modeling](https://jstrieb.github.io/code-grid/#iVBORw0KGgoAAAANSUhEUgAAAGcAAABnCAYAAAAdQVz5AAAgAElEQVR4Xu2d63Nc5ZXun33ri67dkiXbOCG2sQO+EVnYBAPJxFgXy5IgMU5NqKl8oKZyTqWKZKoyRb5M5cv5D87fkKLIOQlJcJiYSxwPBYYkSDIxCUkgtoDEGGNs69b33Xuf39uS7dbVrdae4XyYTmVMBu/du993vWs961nPWtv6t63/Gl45NKWmlpN67aPH9FH7hxrMvazRk1u16+hn5eZdlZ77SI0P36lC4On5t331bJ9Q6qXX9dOvf0kPlUO1/vSsPmrL6VxeKrslla0m7Sp9rMYD/QqdRjW9+Jo+ShX1e/1XfawbX7S3eEWxA0eUbPmlxj46oIOvN2rmq3HFijN6ZuxlbUrsUav9F6XOb5J3dKtipWa1Xfm5fv5agwrH9utI6OqXp09qy51HtTVWUnPbL9T4i8f01P0z+mo8puLMMxp7eZMSe1pl/yWl87dt1ENmfYJQP/lrUo/ss+RdfE7/vuB+mx94SNsnUgrCn+ivyUe0z/L0TOvzekx79ez525VtnJH1ve88GS76gi1T2hILZTf/UX9fcNM7121RLLT1VtdFbmQ+N29282E/p31D+zQd/Fgfxh7RbutZvV06pM9z3S9OndSx/UcUur/U6ZMr/L3U63rsqfvnL2QDC5mYUix+UZq4R+O3jWnyTOHm/X7frmyxpGF/cNHibdzZpMlCUn+//I7yVlKpu0vS731NWK5SIX/GkvoHrv19YUp+4Zj2Hwnl/vK0ft+eVbE0rD3+ed2enb+xdxw4qm1sfmPe0U8uZXTH2ZJu/0Zabf/3df2samOX/3sb9MJjT+n+ma8qHitq5pkxvbypQXtaE5qKxWXd9fBj4aZ0SUGhUWm+YPpioE5vXHZnXiPjTpX1jKjdlywexHokr54lN+UOHTi6TcUrjco7P9El65jOXrow99Ajmrx0TO0vP6+Tyz64pWNnL+nCHWdVuv0bGpm8pGPtLyv5+mJL7byjQ9Pylf6bq3jlea/p7Llu7W5+j3/O6fSlqk17o0l51+bheXbHklOwVI6HcooDyg5gXs8uXvibJ2q7pnfHK17jz/Yn2nfWVfGOmEK7WX/8+2tqqNrIk7s6tDteUOD9WfYn+3TWLeoOY+Rvdeniok1IsAm2/pJv1LY5g3s7vEfe+7Y6r7ypc913y9rT/c2wM/eKPsml5STzmnCqftSZVuWssiyXhynb8ionxVJ/tsf8Ip2//Ws3XNXKP/B2Xbk3VOk30rouKetI3ujfVHqkT+PjOd2/BZcwdVWO+7omTkqvNVQ9w8ltaq3x2l9ucFY4zV3aNbRVJ3/906qTO/f/M+5khVM6fiEpTU6qVLURIxiAeks6sqSREhK+0qWXrl7RY591lYm36Phz7+nYcJrTm9JL50s6uNXVG8ffVF/vFuVaf6V3rhzVlrYX9aupwzr023/XqaAg6/uPPxHOupgIbvgIi7PCj3zvXEK5Kb/qNI6qJTsovNCS1nvP/f1an2lU2Q914pU/6ODgBZ06+xX13p5Qc+yaXjzxoR469hlhoLJfOqnnq634nvvVvz6jxrKv8MQr+sPBQV04dVZf6b1dieaYrr14Qh8+dEyfmb1YJ5MrP/v4eLPyE7l5niRVGlKxb+ln3/vAV7T5akrZZk5sWFTDsy/q3OF+3V4+qeNXD+to2xWV3GYVXzmu94aH9cH/OTUvxpnrrX/95++Ftd8gJWcFH3nxwgeyLlf/gLNqP5RR35LWVRVEd0+r+0pZI15Z94Ul/Ubr1KWsHM5q8tzbC05Stzq6r6g84ql834LTeOY+/aUG92HZ2/XH8mVtGrfVunNa43anNPKh8oVqNz6qVC7UYOnIKr3E3brQNU1MdOSeL6i9ylNMD31J3eWyZvylPMQ+xRdcZz38aG9oXEz1hSu7h+26b/gzmnZieLgX9PrPbgbPk9vv0/BnpjX7r1YOdhc1oXvGb9PY5JkqiznDSRrgJC0Mkhu1s2lSheTfdfmdvGIuFjlhK9l0FWCRUmbeaZy9x1IBfOsXhrTdK+jE+y069t6orhzaq5df/FmVm9uqLwxtl1c4ofdbjum90Ss6tPdlNb6wOOY1gM4SUzHNYpNx3TY2qTNVJ3cUIDGYuwUwiQFGshOyk026CipMZeaDEat7f1c4eJdP/MiqsRo1dN+nf7jNUqsFapmylWkp6sQL4+rl4RvOXJOzZUzvefvV3uDKD8v6zc9fn3csu+/7B91mtcriS6fsjFqKJ/TCeK+GtjfozDVHW8bek7e/XQ0ubqf8G/3cxIvVorMR0NlQToMLr9u4U02TBSX/flnv5NlEYPxlUFnTNYt/zuuKXxXTKve4S/4cfL2JOO/Wrq/eoQb/qsrHP1AGmD32vqOvfDahYpDTC79+qWpTb/F3W0+v/re92SLrB7v/LVyI2efBTpsdLU5UwICPlebnWembajm01A+7Q/uObhbbplyxif8b1+8ulLSvc0rJF97QL6vR2r6j2uxy71xRTaDB+O8uqLSvU1PJF/SZ/1i9xb7Zcki5W5w8h99RmLDkNl2TleQ3XamOg8v9pl36wtc6gdlJ+XZBLQT5/xi19cVtE2r61ev6edVv2vWFr6kTA0j6tgotcbX8x6jsL27TRNOvtOHF2n+T9fgTT4IHTmukJauhW+UHK27UCO5kaEl3chOW7tZ0JV50KNO9hF9OntPbC/Kq7o5uXSmPqCPTDXSeANGdV+GGIz+j+/6yXEKYV+O22XzhomVr+x/L+nvzJDCxVTunDfQ2YSavQjU6HWlRNhy+CVC+dj1tXiqXq4qZuwraVfxEXtO4/vD6Pdp0b1bNkw1qeXdhvNyrTbuK+sRr0vgfXtc9m+4FMEyq4Q/3Eitn8+Zq1Gs9+cTjocmUry9Ck3O34oVA3p8LCq8HszMXdabKMlb+u7UFZZ1v0KSu6qNr3YqnJxXmP9Rk9UKNpZQLBjUbjxfnIbsbu3U2UdLdc3lF/KPrP/TCvGdd/u+ZBVkY2xbnHvpgk8Yvf6xr5B3NAIhOjejDyWrg8Adcdka2V51usMr9WfXeCgjtuqB92WZNNpxVcqpbb66b1pbCer3/p9n86cbJObk3vsRfPKcH36nBMpWQZx782qjOpRNK5rHw6pygJZBrZUEJjXLjNymcnumH5pDQgnhXlSVf1DhWGCp37pD6vj6pEz9+TbkHyTFmurQj4CTYgZw3peI+YsrIJ/qb7lJqC25nHJelTRrTGQVdt8kcVD/9N3nxpBq4/ENyjXM9ffr65An9+LWczC0v3H1Am87+Vm+qCuTYoVpSZvGndPvGHZr9Soe/U9Q+t0kjn/xNuivForZonJima+9wyqHDdh3Q+3veWjHWWIm5Z3mX58mU5sH0Vj8ha9/d+0P+lEfg9+2yEuUhTfcukzVX0yfg/skQPu3Q/B8401XDD9g0Jp0J1HWbcVUmy/cUTzYop7e4p/+fs2gzuKimXTrw/h69tVI6YGFcZvfempRvfahMqQo8jKZUcmALeGZHJXm2LQuXqd7lGJNNqkZ147iwMHdOh/q+rskTP9ZruQf5zTPq2hHgRWwFs1ZGLByR2XPrsd6DYaFlXGbTZ9esS7fNmpn+5sUrD2rxoIF/Tj3zbnpBdx/YpLO/5YZVLs8OW4CEsAlTt2vjMl96V2oLgXL2Oyf+6ulauvZFM89SWrhoZ9qhVyBonaI8B3TJ0tnQTD3+IazsA37U7XrqoeuE7p2AFRLXyRZyz3FdOdauU2d8DW1eJ1hIlUGlDb/4tX5WTequN6RtwJE3/63vs3d6atVEsLW7e1+4mq/bW7xaI8u7E5aXH/7cX9W19yM1/XYhLdOlO6v+/dltS0DpOcb4w08acJMTylXnES15OcNF9S2E0XPXxOCp3r1qa7r4itKBPY96GeVal2t767zW49qeOq+Nce2hGq+1dm/9fnidgTUPHefih2q8uJprGm2B8BsuLM45aloswAfXHqnze8W1A3Vea3Ht4Tqvtbm2v85rHa69lWFZm3dtDhdbVgHLKtRpWQV5XFufZRUU49paLWuhccS5tj7DKmJYO5ZIRK/DZVcWNE/F1X/wDvCHuFO4Mg/0vNEE4IkDw/uWLwFcLF1V17ttcrzzsrf7+tOkq/w5XGlyakkAZe3vPhAuRFALk9KbQe1tnceXX+veoNSfzqmY69bGB97VVdufX1chXwhDDzbWUZIAbzuzfHbYM7144atAxtvncVVA6w2pP+lcMafujQ9UXJM/j+Ihn+LeysCWJ2zFATG+FZcX9mj60AoL8/Z5yhjX1L0hpT+dKyrXvVEPvHtVtj+fdhlpZZFdYovfIMUKQDMCcymmwXzPohrR6telVVlKCEExKS9WVmhSFtauNOgvPvmsizU0dDA0xataF6Y1R2ZddhTGbIW+JTvuEyYHVOiJYmFy2GRZBTgnhzhh+WXZoKG+4uFIFiZvx8Qt1QBwCLDIgHrbQPFQNPfGUHyIU88DlPiQi2G/ZgbWtibWt7beH460FuSQ0DlF6IYwhrVjWQ5HtH9tN68wD61FhTywazVghKGKsLKe6+rwTDSLUvRsFUNyHaw7pESedEP1zByJZMFLpBcFjLCBg1S22FhOabwnF8npb+V544UyZQMHohjAkg/JwXqVrTJy63E2p7o0erHm44+78hANYCUxK1BgOyqXDyu/RmuZ3VBfCScvfzYB44TaKifKGtqWXUzQbprL6l0LWmY20fzgHRI48pN5jAPV0Kz1iPwjKxjc9WQ6f1qXakyiIwkBxksXqeg6A8odvvl8a9icrLwEJlWi1s3m9OWicT05ysflkisXpjtwcPglYsuwvxjJ1RGrWvNsmp/HFXsw4QRBp4xBHZEfiUHhIUzhDn0CvlhJKpllYmN/rrfuU3yzEjrSSs6bIPvNK4nP5/7K4+bswcxiqFnPwmD9HAbibEwOBTWLk+YGfZqJJFaV2UySZY/6ftnlVwQq4vYHZ/rrXpgbIhTWJSAZz2IkDbjMsOSpRE3IO7xErlPPuoSAmQzpLUx3CLHs4EpDYrg5Qdb/+JfvhUspP2p2b6kcFoMvLjZg6cQtCMA8tx+OJKZA5yMZ8jn2ceKgCwAJkCP1TUcRrygbgMpKLLbHCbWtkkpwZsnB3GI4Xseip7AOqxjg+mEuYuSPJUBUGUHJSm51QUixNh89FC4JKVOcI6BkQY3ATeAfBKOKlgb3ZGry+y6uw5R/r42dU8pJsbrc60o1m/uGmrIWqUFpcTJWzeElZu+TP31pHjHYAl0zy6Xiq29QHMDph6IAMdzYYWF9l6ord69kAgCNSIwC0UwsoXKAhwrNn3B0rFWZNGMhY2F9qeeR8LoWrGY4DWSMlXAdhAQXF2iVsWinT/neKBYGfItROJxEHCvMMjwZaKzPjwaB+YlQ+XxcjQANMg1OCwn3gL+igdS8Lsin3CyGzIn0QL3cnU0eUKZO1DuPvhlJIaoguFsBOQAQ1S0WOfqehvP1B7Wbvtu4KHIBhIUNIdooO8+Gri1gVt+7SPAteiBInj9pzpK5fy/q1BVK37UueqoEkAD2Wh5aN9yUVc5j8UPzkNVCQWDtYYGQADddthsAELhuWG+njAeIJuaEiqERKLkJkQZgjY4S/ENPJooNTSvnceRBEjZW6RRKyHt5+CMoeiJY9HSBe+IByjHyJAPeiD35vnwkyDBNLHPwMGXCgUsOGRZAKIle3Tm9vIDRtXbOE0pa3zy0ORw7h+SpEhYKulJdjTS5gU1usBLU/FRyA2gQEFSAuwMDknjOBR389iJurY5g3orbSwA+ipQf8CNKkG4JjWs08QxX58IhwoCUqR0F1EuLy7g96+DRR8Oaj2Ar58LLycftgYVlAy9jw/loMmYgZZix0EETeqFXyJflBb0U/iKIYyhurIACWQJyCLfqgKIcTktvJorcLIU7haXARSd46nKOeyP77S89tGYYb92/t5t8zEZ2y81BVD6gzKPo5B8uRZLfpIgFsQwlI2iKICwQE7BGa1jZqky4bn+dZtGRVsUDqBWQVcgvAbACHqLIb9IqAh6KIFVTJfYgV0vA7SMzA2te9NMjaZWJXzlyMo+NLVu+krhYf3B6nru2tt6/NdxUx9Fvy2KB5AVFchs3TpAk2tiFQc2sAscvywy3wQbDk5k4YzQCLgE5ZIH681HkN22AEnAgTIQdkslD4pbQgw/syEeYIsCWL1UIXGWKYB04cGCuEhqVTyVT58fGwgY2jjwm4hyhGGLNBIGGEDQGzeMYKiaiUkSrH6cfyYLgrDQkgCaB2dag8pGwGACneEaFcgO5E78hx2kxuZO//Em0Hr3rrrC2Gg1QOMbRC4okZ+B5x5dLULYiCsIpODq7gKowCTrjmJtSQYhKvBiF+0sFuOyscn5jpQxheLsy9x8s9UXiovLAdx+kR0sWrhVX64Ag+ua7qEqj1io9FG5tb5jGAkNgquclsXrD8YR8wZBmosi20yxMOaswTqSvBDRcCi5qeDoK392mPHyUT7BPEuCpAKEwBcoPZSMBKW24UxVgxx0SYWKyV6F4BlSMxHUjRHEz1MaMa8Ho8QgmHvdVEaXWE49vDU3b3OqreiheyGcoS0BDVAoe1FVYmIF8JHC2nZzJorAXQqOUqKUkKeoVi4PaWag9TzANVSumCYb1Nuz0vI9NZ9xKhkO6MtdcNq9Bi+pvQNkii4E0zi8t170e1tbvPx7O9j2OqDVHbaZMMEZ415dbOxQ8XWG6LTYxRsEKtnUoE0nG3gqvFgOQBI3AEJOYBhAxIMAVazW11qmA3fg+oDbMPP2wTgzQQ/53ZMUNq7V8j+6NXIHGOiVJdwJOirGP3uzSQMcaOng0jF+s/eYhdE6GLreYRb2/IlVn0Y/kl6yBr5azS5NROyVq6vBeToXGYPGtHuXr5KaqWzJG0sBsBwadfMQ2rICh/0kEh2gXWXvBrE05qrssi+I+8RKPQpuudHht7tV64slvhebUtBGQQ8MfVVo6QLLwR4FlOrciSALpVbGIN6ZubywlAM05VFAHIoHG7dRucHkksUkabnECFQ7M7ylGkqe1k7Qq4ylIGq6ADeU7HJOnRVGgW0dxrlxUAk8QmJNqNIuUX3qmZ5Pjed3Uq48760AnPDsVRaMf5ukrAgf17VFuUb/LEjIjNmtWYz2mcylHqWUkRw6So8JKRvIpUUi0/uA5ULdSmYzhUaJUGLVCH6GV3heGbJmxOBto7BlGNBLKJFuh+isojagbENTj0D19+SjgK5QJz1uEGTDfEYuTm7BS8aFouLUU9FQsCyPvURoBkBgyyaLjYTkOrNJmUmtMS8OSMM8ABQ0sgSFOYqxNUYPTi0siVs8jQ+Fs+1ytcScNDeMgloAQBJ0YJtoigPrEnSiY4jZIR8835CA+PIb1cG/1IBSPgIVuK3PvHNIrDnlI63uiVELzNqhcFNC43aQgwB8MJkYXnUU+aJUHNb2Ge99snmqHsCMf8bAadBCgNhI1mqnya7j5dZnvyLqCEiZHKCQozhnI7VOMwvvloyAeca1YYoY9TIAISUf4oHWLJNB3AE4CsnoSbhbdhB8bsOL2zkRiLJ051prYToOFYXsRG5KXDG1TZvkJHlXS0xpjgvuIv1gzvEoeKfpSM3V7SNEyhCtCK/4z+zE9QWtHZ60gsxjEZVGxBAgTi2DfzM3rzmlujnIZUQoNmwuRax3Yvy8sQceUefpEVJLWFMthKpGGyTUNGSAQU3fpi2Rh0sqDQnzY3Dim7PJnjvk7dn8mGjgPHi4TD9wkp4VFD43iNJLnhs0w9BdUj2cmiBgXWI6hSV+e5rGOPnpXWGu5tg3IV85C8zQY14S2rEzA946oEAXN015k+4q4UqN/BvaxMAXuP1SKgv5fR3EO2TDFszjUPPomqpNQVhGpN9dhHGEOOOywJuRPJVy2g6Yit0bCdFaO20FljiAc0hZYsnLQd5WISUyIQrzdycKYviQYagR9FsimDJjweqMRtXdy5At0Ytvo4Qw/6BgRugjyUeRn67kf7IBHSaRkYg45jtHGDdwZpQIJ9RAFy6XA1A0hO4TRpyBBAlZSX/dKJiKCzCIuLwRYcRbfzR/oHPiGCMsLqQKMPGgvhhcpwfgEuCs7DoCKotMhBa0TZGTdu38vM4c4loYA9B0N+lEgqDQnEBE4AsAK1DZST0jMoUjkTVAl3NRQJdBeCoDHOFsFh3MrgpKaXTfJh0Op2SepdOPETRBmGIdCish12z4gAvYfEE89iuTVHtDMMmWR1WkI1lFIMxXPIvkCqgrqRRUfOxCJ2G4d9I6P7JUEkMX3ENuZxLUEWbqoa22VdRFDT3XwrAV6ixwsPaBuZCGusBFtRCK87yRNRUaWDBigZyaSAOkdgMpAZm0Jt/Xkt7aGp0fWUxehboE5NprCERmxC+7uieIUjTJ4gRMUwA7ESSyNatSJM82wZ4m2u1Uv+qhas4AScrN43Iweo0BH2dmHLN2ZibC04DaaGuCCj+HAVpJ/rb20UKfiMwF7zGaCeIaza7OOyjgxSgshlpYxMwU4m27vEo24q9448gW0YyqYRilyBoCCi+qmFFVpIZ2jiFhGk0pMg+kuoaXwiqEOR+K6YWGgday77+0Kk+Azn5vbUPR2fzTq+TaE28Z9xIj1PkitTIUyTDARKhLfnacBi9KCyaFwgyaweXZ/NG2H6+AEYdAdYHGRWJwEJhcZuVKIoly+DtAQUBVmuKDLmpi+o4Cs4cgyqHiV9ZwOeqWCSmnYjHSwcFEG01OMjyQYd1IutwpEeuKCT93C5jSV/J5oyhbMEojDd4V02DHKSgFCDhfCsYdRkmtmDHDdRVxqkZPaABcYEivL0D4DM2tLRWZjzmgrNREsBeuuNNiSFZeQJln9K3cA1IaAGCrHKUISZ8AgXJVpt+CEonTcEWVcoPUkOUfb3wwOt1AUfUqlhiKFRNMqGQtgC0hhlis11BVzUlmYV9T5RUhMD2a6bLqZIys1GGEgFUuKZzagpOSVKjRNNKUGhIIYSBH37caNS6EkEPTM68OsW+DI6OY45fKyeW5+gY/k1kZqdZipwPWezKrOtjaCcqAMCxIz8YKWQnCQ7N5cJFC2nXzEYG/DSvvQKD7V0ISYsxNF0raO+8LuWvS9WGbGGcDC7stG8twduCqaztCywUIkZ3+DGQ4RhSa7swSPh8DdIbaVzGYaENCXudGnc2Ok12o1VSZ3WE+M8AsEnUbyh1wB8QJQOaTtPQLqZLTF5CK0Whi+18zgwdqp8migUL8l3mgZwY2XQXA54kOcwEwBo4LkDvsRIE+GF5nCJeN/SEtgrnFfceJoXx0nyNr7zR3hvMHZo7CnwFmfKmCl1c/sqhHL9X5ehQhLz15jEqy14HMLyv3ToZgM5wj3aEB+3CSuUZYemClHNaCM7LixyHgaRnxVlx6sf/ned8Ibo+PrySWwPJvuAKO7tQATDrq1ReNR6rhvmjb3GHWNnOnY5jtcpL0DkfSZtlW00QWPISkFmpYQxVqgFa9viYFBdTx3O3RPQA5YBi4Df7g3z144olwdghDrmzu2hvMkRFQtzU09Oq1slJQl0wODHz8cCXXfQZUVBgJ1PeWMiryqDMKymeoXRYm7E/dRgq8yEp8yxFuC0oAMdxVFXAOK21A0SN+pw6CTI3YaVNufWRtcriThQPESWsECRKqHEUIwAYio6i41gHXVKhx8eEDdPGs0zqAVohyz+RHH9i8xZGjV1jiqdA74bfpODe1DicBifszQGnOI2UUxpwgSATRoppaUEMh75k8YirXzeaNaB7VEqk+I4E8Okms4N39Y22pUrVr/tGdveEvZaowcYm640P/vOUSJk1jA+hrNkBtaFudq05GgqxTgxwhnwgRv/zDNWEatFFX1GDooZOi5eVeEy3R438z+6d73xTCaiUjpys0zwMMG9Gc0E/OhC67Pj0Tc12Z6QulUNhNXDHlqmyKNDisXhRoUcYuhVWK0npfMtEJDoCLkGI6KbWddKCCzmTwzRTtDN8X7bz1Dx9q1+Wh4qxFaHWBDmxFaRRqOXBJOMC4+keQtCn3bemggfLhjs6FkzKZmX4YN9yPgssyAPhdRsp1HIwFcDhPUDSgnDzBest7EsBqO+ySyedPGSEoBq1UZjBQczkdAZRlXjsL0nrsPhDbCucCMAIZfsQaWmPpXR5xogzy00KCVGkwbGcGZkSRlRpKsPfDjy/NsIutsNwLxKVEHSVSXyG/XnhiOqgMAZGUYUsfwCQdW0iZIu4M7NB1hGhEjjTDd2/M+S6QR8+ibTyePYJXJrEi/oWczkbSZp3B7FgXBgElTCQu2eo1Ci8okK/pPE6SrPkDHoVoawuIXACort4vUKtQktwSYVDTq1NOMdyKJ4OT8YHe4aMblqk8KLz5ifV24pCI0BBlPZUS+4/QoEwFbMLIODRpHpUgx0AYVekiMzNHpmYkgo2c6fJEFMb1F8biZUMjiIOLwe2YiOOUjjM0nuONW6ZPkJFIDwwV6LvC+hnWxjh7qClccq7ieOJNjCAS8EksDdwVKcY8oG0FdZpQhfDbEpg0b6aDKYX+ZKAWMzUVB4/M+NDi2LMlgjIKbRWGQEWxyBvMRAJRRtXE6PQTbBYJNHFfoI+a3ytF0iY8iB3CK3G9/1/7QNPF4BEvwSSSDEEY7gJyMkM+TDMZYHIcSddFB3xYBgBjFWCzRroc1BgzdNpOe4DvVv20mwm5oyt7DK08J+a8IAYsZAqYEeu4s/eAaRjZSuZKZaI72OEhCCiKVJQuOshs6TZxBIQu7axAryhYzQTFkYFIUMaeNPhpuHkJT4Twq8+JCrHsgCp0Fr4kpwWgghSdXBThRyjAvYYss5qxDWGGh4LfQV+eZ+Irego2guTWKPKST0i7daKa+41T+Sx6S6FcmEloGuG2arkiyy8iSHQwmSNDFHYXb5h0OgZslgTcDLCzlydVMef1wjUP6rK4dm8NlRxBDfxcQgpeoo8ehIGwzMhhoGQ4uMc181SACv236OnFLNi1V4woAAAzGSURBVG7JNsV0svpS7DD0ydq76UZNYkn7LMUA3J95bGpUnNrhKMZdjnbA3ZWVw7M0mmG1LLzFtI+huY606veHrp4KW8+GGjEkcfLA3i+G5h0y0KeyD2ciSKDGeNcZQyKMRMksuumsM+MR0Q7fmYtQrpRgYNJKJ+dTKkGbEmIOXbYLuYsibE30kbVj6+5wXvsB8lUvbywYaBkc1nQdVPeiQdpp4hijFG2y87KZ9oQeuwzaGY5ERtQ2N0eG2T3InwKYY9NpXmTW2trJS1IE3GjIDE4LvquE0NExU4BDGIwITvdIB5UzFEpGPOmYPllca8jcnuvNXNZ3nnwirLtu3smoSYYNlU3Ch3AjBD2VSz0RUS9wXbhSnzYJvBEKPZPneBrKRZDbwKL71FnM2w0bcNsF4pmFFmIwFwX9j04BV1oktjRyenzz8MRI45VW251n7dn7zXD+OPpRtTPG3Wd6hWs0ySy6mQFjg+Gj6KwepaPBjEKPuw0sPBoFM8zRYjBpBIhqlK6AkK6A0GuAnqe8YEaekHb35iNoIxmjLAIhmqW3Jkay6pEQ58htnL4opmuNkTeZMfrkZA0l+DoXaS855Rd/8M3wepvb4hdhr77LLUHn84rZ76cVC6Bdckb4QWNU8rq2NqpONE63zTtFPdyq+Q4zEyiKUsJsfw7zaTwzn4YjbmROLm/q81GCRFNK4FWP+GnTCZ80swiYIxOUqV0s83KF1Q6WmC3cUoAzWmkjfqeG45f7IznlIx2caj9XEajTx4AChx4jNBU9axjkfXMuKfp006HHczuclAo/gnq1t0oIUv/sG0qrAQ+bNS8sAQUHJYI8FLpLLX7RO2XqgNkp3JGFhsC8oiQ0b8wA/SVIKGciyJtG26jtI9oIyo2U402xMsfSY4xRzCUdXQevWORF5WxkBcgb9SobAG20Wm3FkjGnk4JQieqQ0wDtQptekmy7hIYginaJMfg0BhJU+iEDfLZntFvWkUhGqIy1ZVGymPyG+gqvhwnM5HcoqSiS1TF0zjE/i6aCSqXh+4k5ARxjpOkBpQ/I6Bsfq6urCxO9xVCfTylOmIbfLKRiMgYbEAFgGDFz1zjrAb2tSlo04kbRKNYGuUowR4xgirTGbftoKKJ4/0Jl3hrzDSgqURhD2hjjPTDmvTJFXiYfRTVyBDVmAn9aYtaNDwvgUEUt00Y3HAkn1Yl0ivvlc+asVCY8hWXzUpwoqpGIJkFMQZacjwV3iQtG5+2YQUkR5DijcJj4bbr+TG3IzHs38kl73gzRNcQcWguNmIKO5zjKGMe8UQlv2x/FcIbRdopaVCPNAAXga8CmWmxoGJGwvhNVTAGeC90KqQIleGBs6chMBIW+MbXQdmGZjm16XV2gfGVmnFuf1mERKz1Gxc+BfjCJk0U8oJqA3Q9GMstsjKKZY0ZeYYl50GCC+JB3yLYjIBnHTI6DO3F45ZaFNs5sps28mm1RUkYVrbQRBVd9/hNDQv0nx7y6BJiWNS/7NsMaTHWST1TDUNO868GcGPPCCgpCJKrR5A6VknMbRsKM0hBXDgjEWEgloK2iae3n1ANE8oQH0+pi7NyobYI6VEhLoDWaW7PEH1iHOE1MBTOfALeV4GhO11BaveUL6zoNLKZdwrw/jS8JTc0c/9K/Yn9ljbV408REsgnXWolBZuAWeFmD2QheUgFDTx80tAwuvAhXyFhLnzgUq0HidOuXBMLQw5p76OLyjGsJaeqiVYJWdzQEi15mWkdeso6mWZ9j5BpKwxS7+CG2Hc1E9VEjhTVdaUB8x9TkoboDXvQQxdjIMTOtnfqTGaVSwo17Rqlq9AlRlBbGmINamVsN0KJq6TG0zycmHc7XZiwr13PGOmEKSKjISeJGd0yab9xBbyGCGv8ZakWmOcq85xkUZF73GOcdcD3bS9GVm8kZSOgXfG6lmFl7F3Q97TSthAYvQ22LJMpIA82Hod8/CCN5gQJyUhtxIEpshJhRkIGMtjRNviApD7hcwpVUBtna5GRRlDEoxsVtU2FlIKrRMjNCk+AWEcRH0QN6LXJqkmZYBqob8/Ae755bjW4P9c0/hUu9KHU9QqqSEVKRtVLoA7LBUJs3yEaQDI62spFGF0xkMEJyy3QWl8irIpjtNgradNEx+4iCERGYyZYkbbyDIIouCSB+CbdXQLBiOjAqA5RMvQdqJorQ0IkOLmC2m2Vm0pHYWvvuOxCal+lEoS8ba0GwgTKG90hi8cwqwCUSeHjbRgQ1mDEyce5l5E6NBOICPSRxpEk9xQhqMGNYOoiQ5jZiA+SvWXwmGBYiOKFnWtGqAR5iiFpKJgfCzzoU62rp17mlbu0M9EGABtgpGvEDtId5ARBiwT3bscgzTyl56KuUY4uaGSMebf2F3j7ZrEzwWX12z/vatOGgguZptU47+iiZV9vLb+n49gPqHWmS/42foMo8SMLmKp14SVfCXp2aadDRF1/Rr9sgC69+RV96eIZ2xhewoiGF5Bi//Riu7K3j2n5gQJ973hyJvJ55NKFhUxInk/eDE0o0ksGXfwVo6NGpbKN6W5+FDT+m41PXdKiljdeB/Vj50lG9mJlWD2x8aqZJxYaTOj7Rp14qtK2tr+gnU4d16LcfqfG+jbgjEtSmohpOvacPO0i8aVRuTF9SZnpcl97t030Pgz5L3OPUFKMX12k6OM9ztSjd/Bv91L5HDz/1Km/AOqbnrEn1hM14nw+kphH99Ufo6h78si68yqtijj3HFazF5LSutN/8d9bmzU+E5l8GmWPqvHxF4chf9SM4qAe/fEGv8v6aY881a3L4GmiG3pXCx5r2zBef0htPH9Teh6sf5h19nNmituOv6uVWaf29PfpcM2r6n04r840Rvc9GbKlsRE7FZ14VrxHQqaZe9V6Dt6Xdu/DxtLyWtJpPjehpCnIbgPDl/FX13fOwnnr1OD+8d96P+91p1m3/Ute/xPUNN67P5FJy2+Nq3vFFFoL7HO3V8KLvfINrirPXNOzUgQuvqvXBh/XDV2n11yk19fbqGhDa6L0/nvbUkm7WqZGn1ZZJVxBH7vKg7nn4Kc0+Zo9C87sre/A7nSbY7F/q+pe4Pnb9ekQiKVftXrN2HGDdK485LOvxb383nPelb3BRdvai5J1mZ1v14MM/1Kuzq6ne3sUbNfI0pdk27JjANzE4ay3H+Vm9PaGa6aL+QE0amV3NJa9/iesbr1/PC8NTbrvs5h16kEU6rqPqXdI4sOLKNQ3abQyp9UE9/MNbbPrGnMAByl7qq2sxNybaSRGyupQxz9gmt3mn7l/xGTcqb74wsb3mDV+XRX1jTelq3z2yvrt5c7i6hVyn+Hrokamrqlhlm63mnQ+ubJXIS9ebbH/ngZo3e5qZY2FhQoP1nJy0qxSFrMLErEWm7WbtevCmRS46BRhkeoYu6LBx3kbnF52Cft21hKE8/zTrgD037/qytrQd16vGdXzuXv3j2Rnlj7bp2feTOrhlUqfe8/WNkfdVPLgFyVlaCToknnnVXcb4cHPf/e6T4U0/aVwTP2LFU8K8M9xehWGqXjz+56PHbvrNFd1OW0IpQ31XbjG3gLyPtGH3/tlN5mOO9VKL2JbHV1cunb+QK7vJKaaIVL6t6mRXHlgHiQXTV9pvcbI7eKfdwudllMruB275vB3TqFwrj7tbX67RXaan1lfELZUk9IZ1rmaB047Ww6cFhRldrriilJLEDvvz5nSsvMDp6dkvL8TurPmB26Y78LSMKJ646d9ZXR07aGly+orab+Xf3evXzxpDiolJnret4m4qT7tcLGqbUYdp94/XvrgbpjqJNNO6fMPFr8YQNsiB4tL0ZVk7N3eFbipG7uhpxwOzR58nXeaobdC0udCrfVHTmY1waRN1WmxasY1UOiYmeFMTriOFwrLxTu2/1YLCmm40rPTu2mPmNAL5cKrKja7KUF2tx41OzXmBFGUILzYLLFbc+PRM5Tp3mee0vv3db4fVKGzk6Q1YVl4zdVrohgRvqJq5vpgIFxrvuvVDbsgzSzk2z997C1xk/11LuLnnn66cWLd5t+7f0qbjr76sVn1O9/7jWc3kj6rt2d8rOHavTrz30ap8/WIUeitX36Ep4/YWuPlDA9cR8MqorYP3gNKKpYk5D+Q0mN6m7dcBwQrHumO64q8ba7bCuZhU54O2sbkBjTQ3HxSdmLPr1qeFMoCJY7U/Z1ozgI6gzudMewAIcp4bz5mkBdL9/BzCXGE90xnACol09XpmBnSs8zK53ohMrL5uiJyc/xnewO5zlmiaZ73G7bq3Yo2giWOOmos/1gyKyGoM/6NHB6oC6o906MtzlnKxRHMVDzjepue2/G+d+1+VGP/fn1WugMWkiEW87Srv8d9//T9pBf4f8v3+y8kDlp0AAAAASUVORK5CYII=)\n- [Make charts and graphs](https://jstrieb.github.io/code-grid/#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)\n- [Create interactive applications](https://jstrieb.github.io/code-grid/#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)\n- [Write formulas using Python (via Pyodide)](https://jstrieb.github.io/code-grid/#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)\n- [Use LaTeX (via KaTeX) to render\n  math](https://jstrieb.github.io/code-grid/#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)\n- [Split receipts using OpenCV](https://jstrieb.github.io/code-grid/#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)\n- [Write custom parsers with ease](https://jstrieb.github.io/code-grid/#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)\n- [Constrained optimization and mixed-integer linear programming using SCIP](https://jstrieb.github.io/code-grid/#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)\n- [DJ from a spreadsheet](https://jstrieb.github.io/code-grid/#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)\n- [Modify Code Grid internals from formulas](https://jstrieb.github.io/code-grid/#iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAE60lEQVQ4T42V3U/TVxjHP+f3Ky+FvgwRCSVRaIZDggnKukDNIlhgEwS5YMkI3pjFXTG8UC/M7vxfiDMGF4XhxFUkA9QoxS4GFaPgJrOzq1IsfS9np8As+JLtd3Vycp5znufz/T7PT3xvPyEDriVMFjeTvm58hX/SFhljyl2Oo7UaPWeQkR+/4vMDKaT1Ar/5iol6U+gkIC9BUuaRSEryqiP8nV/PF1In3zSCcPbslQmvIIn69sQIZtfTarQw7PFR32jHSz/OUCc52XFCAx7GSnPZbdV4GBHsLADDvWLulhbSWq2zOHiZKfVkrMuB6D11TA5PuCl3tFKtD2MZ6abfGaIzJ5t4aADPWCm5u61oDyOItZsovlulsrj/5pJWaSB9R42vh9nutUTEd6d65Qcz2aHif58CPUaXelgahplwV+DrWaC730moM4fseIgBzxilubuxag+JiJ0UYEBUHrFLm4p/vhrfpbhKDMMTuMt89JTm8WR7mPz/QmHLonFXNlaDheTyc4YmphD2arvMZFPGJ427yLYasCSXGbDefE9mFfhtj9LSkZpeodJWx7zZT+2cDc8rD5FKG3XzZoRLiWfzvMQTqcRWN4/ZX8tTm4fwxJoI//IT1U240gL/UszkOseMoCVUmYLEjM/wz0bRjEWI6rI9EgTGogiByAaWU4Uk2iK0vM2ypApTMIbxmZ/ZqKbi4vjTlhJGiiIBIus4xTG7U04VJpR3W95xQ0mViWDMyDP/LFFNBcb9q7YUKqNIILKhoikKE21URp6wPZy/Kqo41XtUvk/Ve8V32V7YyY6o6gNLkuXnQyhNNgv8sYPOtQNKtAGsNzNWFb1H7TLtVVOFn22PViVheiXDe07xfuWJZESaVyK9zIjkr32KzRNmYpMlBaKmpkYxhqX25LsO+BBPmUJLbvR2KW9jE47qMpnmJlMa7fq7XfchzunzyY2+L93sDLHX4ZDxVVklKa0d/X9YKXM+ucmSpRsqVHbbK99YJl1i+6fsU89M9xtxrbesR9exD87gbtrHoZQkYYqTNxpnqfVnHvyQyz5TlFB9I1GDGf36JWaKlHOO9JXJ8ZGvofgGBF9gaWqhQk2obfFlRn+dRqSc1H32B4UpNThuxAnWRzGYdS57H8DrAFSF+UglEptz0ly+hWiJkl8mEMf7TsjRUIilR1doqetY3TTFRwmJJky6m4vGWjr6x8n+8iByMg/RpkbrWS9XGypo1I1v2n/i0nUaXW0ETToFdy4gvj3eJy3XogQa0gPay1DIQYdmQFtaZPm2m1xXB5pBY2lxmdnUDOWWBcbDh3EVrKDFcrgVTuBYX8+vBKlUDZVzKwtx8nSvDP6UAy2PMSfKeK0b2Drs41yWlwanYpW7X2W+yODIuMro0GoVd140szBuoLlLxxw/T1Ck96cJJA8oKHNsUTxE3zcn5ZoYSoCl+1xpqaNjXaDRkKBJlea+aKS2o5/x7C85KCfJE23EgmfxXm1g52GTutTDxUuNuNqCal3AnQt/pRmflNeiARr0fEzeIUKOTOm33bm4OjQM2hKLy7OkZsqxLIwTPuyiYEUjlnOLcMKxvp5nJVipJpzCk6UqPd17TK6RMJMoe41u2Mqw7xxZ3iacqr1z95vQF9UPdVxldEit3Xd40aw4G5rp0s3EzwcR6f3pAMkDk1jPPOaMAvIPJLa4Kb4i1N4AAAAASUVORK5CYII=)\n- TODO simple spreadsheet\n- TODO Keystone and unicorn\n\n# API Documentation\n\nUse the help menu within Code Grid to access a tutorial.\n\n## Formulas\n\nFormulas begin with an equals sign (`=`), and can contain:\n\n- Numbers such as `123` and `-3.21`\n- Strings such as `\"asdf\"` and `\"multi\\nline\"`\n- Singleton references in R1C1 notation such as `R10C3` (zero-indexed) for\n  absolute references, `R[-1]c[2]` for relative references, and `RC` for\n  self-references\n  - Negative absolute references start from the end of a row or column, such as\n    `R-1C-1` to select the cell in the bottom right corner of the sheet, and\n    `R1C0:R1C-1` to select all of row 1\n- Ranges such as `R[-3]C:R[-1]C`\n- References and ranges across sheets like `S1!R1C1` and `S[1]!R2C2:R2C-1` and\n  `S-1R2C3` (the exclamation point is optional)\n- Function calls (case insensitive) containing expressions as arguments such as\n  `sum(RC0:RC[-1])`, `sLiDeR(0, 10, 1)`, and `DOLLARS(PRODUCT(1 * 2 + 3, 4, 3,\n  R[-1]C))`\n- Optionally parenthesized binary operations combining any of the expressions\n  above such as `(RC[-2] + RC[-3]) * 100` and `1 + -2 + 3 ** 5`\n\n## Writing Formula Functions\n\nThe formula language above can be extended by adding new formula functions.\nFormula functions are written in JavaScript from the Code Grid user interface,\nand saved alongside sheet data.\n\n### Simple Formula Functions\n\nTo register formula functions, add them to the `functions` object.\n\n``` javascript\nfunctions.digits = (n) =\u003e {\n  // Compute the number of digits that n has\n  let result = 0;\n  while (n \u003e 0) {\n    result++;\n    n = Math.floor(n / 10);\n  }\n  return result;\n}\n```\n\nRegistered functions will become available within formulas. In this example,\n`=DIGITS(1234)` will put the value 4 in the cell.\n\n### Advanced Formula Functions\n\n\u003cdetails\u003e\n\n\u003csummary\u003eClick to read about advanced formula functions\u003c/summary\u003e\n\nFormula functions can be `async`. They will be awaited automatically by the Code\nGrid runtime. Cells that depend on async formulas will only update when the\ndependencies' promises resolve.\n\n``` javascript\nfunctions.crypto = async (ticker) =\u003e {\n  return await fetch(\"https://api.gemini.com/v1/pricefeed\", { cache: \"force-cache\" })\n    .then((r) =\u003e r.json())\n    .then((l) =\u003e Number(\n      l.filter((o) =\u003e o.pair === ticker.toUpperCase() + \"USD\")[0].price,\n    ));\n}\n```\n\nFormula functions declared using `function() { /* */ }` syntax are passed a\n`this` object that enables advanced functionality. \n\n**JavaScript arrow functions (such as `x =\u003e x + 1`) are not passed a `this`\nobject!** This is inherent to JavaScript. To use `this` in formula functions,\nthe functions must be declared using `function(){}` syntax. To quote\n[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions):\n\n\u003e An arrow function expression is a compact alternative to a traditional\n\u003e function expression, with some semantic differences and deliberate limitations\n\u003e in usage:\n\u003e \n\u003e - Arrow functions don't have their own bindings to `this`, `arguments`, or \n\u003e   `super`, and should not be used as methods.\n\nThe `this` object passed to formula functions when they execute contains:\n\n- `this.row` and `this.col` – the current row and column, respectively\n- `this.set` – a function that sets the cell's value to whatever parameter it is passed\n  - Useful for updating the cell value asynchronously or in callbacks\n- `this.update` – a function that takes a callback, where the callback takes the\n  previous cell value and returns the value to set the cell to\n  - Useful for updating the cell value based on the previous one\n- `this.element` – an HTML element that will be put in the cell if defined\n- `this.style` – the style attribute passed to the cell's `\u003ctd\u003e` element\n\nThe `element` can be set to add custom displays or interfaces to a sheet. For\nexample, to add marquees:\n\n``` javascript\nfunctions.marquee = function(x) {\n  // Wrap whatever element was set before\n  const oldElement = this.element;\n  this.element = document.createElement(\"marquee\");\n  this.element.appendChild(\n    oldElement ?? document.createTextNode(x)\n  );\n  // Return the input value so this cell can still be used in formulas\n  return x;\n}\n```\n\nThe following advanced example adds a formula function for interactive\ncheckboxes. The output value of the formula is the checked state of the box. Note\nthe use of `this.set` in the callback to update the cell's value upon\ninteraction, and `this.update` to set the initial value of the checkbox. Setting\nthe initial value means the checkbox state is saved and loaded from the URL.\n\n``` javascript\nfunctions.checkbox = function (label) {\n  let value;\n  this.update((previous) =\u003e {\n    value = previous;\n    return previous;\n  });\n  this.element = Object.assign(document.createElement(\"label\"), {\n    innerText: label,\n    style: \"display: flex; align-items: center; gap: 1ch; margin: 0 0.5em;\",\n  });\n  this.element.appendChild(\n    Object.assign(document.createElement(\"input\"), {\n      type: \"checkbox\",\n      style: \"appearance: auto;\",\n      checked: value,\n      oninput: (e) =\u003e this.set(e.target.checked),\n    }),\n  );\n  return value;\n};\n```\n\nThe `style` can be set to alter the display of the cell. For example, to make\nthe cell's text centered:\n\n``` javascript\nfunctions.center = function(x) {\n  this.style += \"text-align: center;\"\n  return x;\n}\n```\n\nThe `set` function is useful in interactive element callbacks, as demonstrated\nabove. It is also useful for functions that run on a timeout or interval. For\nexample:\n\n``` javascript\nfunctions.sleep = async function(ms) {\n  // Will say \"sleeping\" until complete\n  this.set(\"Sleeping...\");\n  await new Promise(r =\u003e setTimeout(r, ms));\n  return \"Complete!\";\n}\n\nfunctions.time = function() {\n  // Will auto-update once per second with the Unix time\n  setInterval(() =\u003e this.set(Date.now()), 1000);\n  return Date.now();\n}\n```\n\n\u003c/details\u003e\n\n### Operator Overloading\n\n\u003cdetails\u003e\n\n\u003csummary\u003eClick to read about operator overloading\u003c/summary\u003e\n\nIn Code Grid formulas, infix operators (such as `+`) are compatible with the\nsame types as the corresponding JavaScript operator. For example, it is equally\nvalid to do `\"x\" + \"y\"` or `3 + 2` in formulas, since addition works on both\nstrings and numbers in JavaScript. Using the same infix operator (`+`) for\ndifferent operations on different types is called \"operator overloading.\"\n\nCode Grid allows users to extend infix operations to work on more complex types\nthrough advanced operator overloading. To make a type use a custom operation for\nan infix operator, define a method with the same name as that operator. That's\nit. For binary operations, the implementing method should take one argument. For\nunary operations, the method should take no arguments.\n\nFor example, we could implement vectors that support element-wise addition:\n\n``` javascript\nclass Vector {\n  constructor(a) {\n    this.elements = a;\n  }\n  \n  toString() {\n    return \"\u003c\" + this.elements.join(\", \") + \"\u003e\";\n  }\n  \n  [\"+\"](v) {\n    return new Vector(this.elements.map((x, i) =\u003e x + v.elements[i]));\n  }\n}\n\nfunctions.v = (...a) =\u003e new Vector(a);\n```\n\nThen, the following would be a valid Code Grid formula that would evaluate to\n`\u003c1, 2, 3\u003e`, even though adding vector objects in JavaScript would throw an\nerror:\n\n```\n=v(0, 3, 1) + v(1, -1, 2)\n```\n\nWe could also implement overloading of the unary `~` operator to switch the sign\nof all vector elements by adding the following method to the `Vector` class:\n\n``` javascript\nclass Vector {\n  // ...\n\n  // ~\u003c1, -1, 3\u003e =\u003e \u003c-1, 1, -3\u003e\n  [\"~\"]() {\n    return new Vector(this.elements.map(x =\u003e -x));\n  };\n\n  // ...\n}\n```\n\nConsider operations between different types. For example, if we want to\nimplement vector-scalar subtraction, we will need to handle `\u003cvector\u003e - scalar`\nas well as `scalar - \u003cvector\u003e`. \n\nWhen evaluating an infix operation `x op y`, Code Grid first tries `x.op(y)`,\nthen `x.op.forward(y)`, then `y.op.reverse(x)`, finally falling back on the\ndefault operator implementation if nothing else works. In this example, we will\nimplement `\u003cvector\u003e - scalar` in the `forward` method, and `scalar - \u003cvector\u003e`\nin the `reverse` method:\n\n``` javascript\nclass Vector {\n  // ...\n\n  [\"-\"] = {\n    // \u003cv\u003e - s\n    forward: (s) =\u003e new Vector(this.elements.map(x =\u003e x - s));\n    // s - \u003cv\u003e\n    reverse: (s) =\u003e new Vector(this.elements.map(x =\u003e s - x));\n  };  // The trailing semicolon is important!\n\n  // ...\n}\n```\n\n\u003c/details\u003e\n\n# How Code Grid Works\n\n## Code Table of Contents\n\nThe links below are listed in the order the code should be read to understand\nthe application from the highest to lowest level.\n\n- [`Makefile`](Makefile) – build and run the application locally\n- [`index.html`](index.html) and [`src/App.svelte`](src/App.svelte) – entrypoint\n  to the main, high-level application (the index page mounts the App)\n- [`src/Table.svelte`](src/Table.svelte) and\n  [`src/Cell.svelte`](src/Cell.svelte) – interactive spreadsheet UI code\n- [`src/classes.svelte.js`](src/classes.svelte.js) – classes that manage state\n  throughout the application\n  - `Sheet.newCell` is responsible for reactively rederiving the store that\n    computes a cell's value; it is run whenever the cell's value changes\n- [`src/lib/store.js`](src/lib/store.js) – implementation of \"rederivable\"\n  stores that can change their derived dependencies without invalidating their\n  object reference\n  - Every cell's value is a rederivable store that is rederived when its formula\n    changes, and updated whenever any of its dependencies' values changes\n- [`src/formula.js`](src/formula.js) – formula parsing logic\n- [`src/parsers.js`](src/lib/parsers.js) – parser combinator library used for\n  formula parsing\n- [`src/keyboard.js`](src/keyboard.js) – mapping of keyboard shortcuts to\n  handlers\n- [`src/*.svelte`](src/) – UI \"views\" consisting of the composition of\n  components with logic\n- [`src/components/*.svelte`](src/components/) – atomic UI components\n- [`src/formula-functions.js`](src/formula-functions.js) – \"standard library\"\n  formula functions available in every spreadsheet\n  - Includes functionality to `eval` user code and add functions to the formula\n    function object\n- [`src/global.css`](src/global.css) and [`public/*`](public/) – global\n  stylesheet, favicons, etc.\n- [`src/lib/compress.js`](src/lib/compress.js) – compress and decompress text\n  using PNGs\n- [`test/*`](test/) – test suite and related functions\n\n## Cool Code Highlights\n\n- Spreadsheet formulas are built on a custom Svelte store that is\n  \"[rederivable](https://github.com/jstrieb/code-grid/blob/05a1545730555a671186717950bb758148161bab/src/store.js).\"\n  It functions like a Svelte derived store, except it can add or remove\n  dependencies it is derived from without changing its object reference.\n- The [menu\n  implementation](https://github.com/jstrieb/code-grid/blob/05a1545730555a671186717950bb758148161bab/src/ShyMenu.svelte)\n  (and the [right click\n  menu](https://github.com/jstrieb/code-grid/blob/05a1545730555a671186717950bb758148161bab/src/ContextMenu.svelte))\n  features advanced usage of the new Svelte snippets feature, and would have\n  been much harder to build (maybe even impossible) using slots in Svelte 4.\n- [Formulas are\n  parsed](https://github.com/jstrieb/code-grid/blob/05a1545730555a671186717950bb758148161bab/src/formula.js)\n  using a custom [parser combinator\n  implementation](https://github.com/jstrieb/code-grid/blob/05a1545730555a671186717950bb758148161bab/src/parsers.js).\n- The [SVG favicon uses\n  CSS](https://github.com/jstrieb/code-grid/blob/05a1545730555a671186717950bb758148161bab/public/favicon.svg?short_path=04e3b01#L2)\n  to invert its own colors based on user light/dark-mode preferences.\n- All spreadsheet data is saved to the URL, so sheets can be shared without\n  using a storage back end or database.\n- Spreadsheet URLs are\n  [compressed](https://github.com/jstrieb/code-grid/blob/7f6431624c703d61e794a7dd6f83f3baba459cd3/src/compress.js#L17-L35)\n  by setting `\u003ccanvas\u003e` element pixel data to the serialized sheet bytes, and\n  having the browser convert the canvas to a PNG (since pixel data is ZLIB\n  compressed in PNG files).\n\n## Running the Code\n\n[Install NodeJS](https://nodejs.org/en/download) if you do not already have it.\nOnce NodeJS is installed, to run Code Grid locally, you only need to run the\nfollowing inside the repository:\n\n``` bash\nmake dev\n```\n\nTo build a static version of the code to host elsewhere, run:\n\n``` bash\nmake build\n```\n\nThe static, compiled files for Code Grid will be generated in the `dist/`\nsubdirectory.\n\n# Warning\n\nCross-Site Scripting (XSS) is a class of web security vulnerabilities in which\nusers can execute their own (potentially malicious) code on someone else's\nwebsite. Usually it is caused by a mistake made by the website owner. In this\ncase, I am deliberately letting you execute your code on my website to make Code\nGrid do whatever you want.\n\nClicking Code Grid links can be risky, because the links can run arbitrary code.\nOnly click links from those you trust. Links running code in your browser means\nthat those links:\n\n- Can impersonate my website\n- Can redirect to malicious pages\n- Can steal locally stored data about other Code Grid spreadsheets\n- Can make requests to other websites to upload or download data\n\n# Known Issues\n\nSee the list of bugs at the bottom of [`TODO.md`](TODO.md).\n\n# Project Status \u0026 Contributing\n\nCode Grid is under active development. \n\nBug reports and feature requests via [GitHub\nIssues](https://github.com/jstrieb/code-grid/issues) are encouraged. Pull\nrequests with more than 20 lines of code are unlikely to be merged quickly,\nunless attached to prior discussion or accompanied by substantial, explanatory,\nEnglish prose. In other words, pull requests containing code without context may\nbe merged after much delay, or may not be merged at all.\n\nSince Code Grid is a fully static web application with no server-side\nprocessing, it is extremely scalable, and has a very low maintenance burden. As\nsuch, even if something were to happen to me, and I could not continue to work\non the project, the [public version](https://jstrieb.github.io/code-grid) should\ncontinue to remain functional and available online as long as my GitHub account\nis open, and [jstrieb.github.io](https://jstrieb.github.io) domain is active.\n\n## Support the Project\n\nThe best ways to support the project are to:\n\n- Share the project on sites like Twitter, Reddit, and Hacker News\n- Report any bugs, glitches, errors, or shortcomings that you find\n- Star the repository and follow me on GitHub\n- Host a version of the code translated into another language\n\nIf you insist on spending money to show your support, please do so in a way\nthat benefits as many people as possible. In particular, donations to the\nfollowing organizations help me, as well as the general, Internet-using public:\n\n- [Electronic Frontier Foundation](https://supporters.eff.org/donate/)\n- [The Internet Archive](https://archive.org/donate/index.php)\n- [Signal Foundation](https://signal.org/donate/)\n- [Mozilla](https://donate.mozilla.org/en-US/)\n\n# Acknowledgments \u0026 Greetz\n\nThanks to [Logan Snow](https://github.com/lsnow99) for consulting on all manner\nof web esoterica, and for testing many versions of Code Grid. Check out\n[Listable](https://getlistable.app/) for a different take on achieving\ntranquility through web-based tables.\n\nThanks to [Amy Liu](https://www.youtube.com/watch?v=7gJX3lvi5OY) for feedback on\nearly versions of Code Grid, and for continued demonstration of great patience\nand tolerance, despite my incurable penchant for mischief.\n\nShout out to [Ella Liu](https://www.instagram.com/ella.liu/) for doing a full\nfinancial model in a *very* early version of Code Grid. It's not easy for\n[Excel-loving bankers](https://www.instagram.com/ellassaddesksalads/) to use\nother spreadsheet software; her struggle drove feature development that has\nbenefited us all.\n\nShout out to [Chris Cherian](https://twitter.com/chrischerian) for being a\nsuspiciously enthusiastic early adopter, and for consistently providing\ninvaluable user feedback based on real use cases (which were more helpful than\nmy imagined ones).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjstrieb%2Fcode-grid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjstrieb%2Fcode-grid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjstrieb%2Fcode-grid/lists"}