diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js
index 46e040b9a..70456f0da 100644
--- a/docs/.vuepress/config.js
+++ b/docs/.vuepress/config.js
@@ -175,17 +175,6 @@ module.exports = {
['/guide/demo', 'Demo'],
]
},
- {
- title: 'Overview',
- collapsable: false,
- children: [
- ['/guide/quality', 'Quality'],
- ['/guide/supported-browsers', 'Supported browsers'],
- ['/guide/dependencies', 'Dependencies'],
- ['/guide/licensing', 'Licensing'],
- ['/guide/support', 'Support'],
- ]
- },
{
title: 'Getting started',
collapsable: false,
@@ -199,13 +188,16 @@ module.exports = {
]
},
{
- title: 'Framework integration',
+ title: 'Integrations',
collapsable: false,
children: [
['/guide/integration-with-react', 'Integration with React'],
['/guide/integration-with-vue', 'Integration with Vue'],
['/guide/integration-with-angular', 'Integration with Angular'],
['/guide/integration-with-svelte', 'Integration with Svelte'],
+ ['/guide/ai-sdk', 'HyperFormula AI SDK'],
+ ['/guide/integration-with-langchain', 'Integration with LangChain'],
+ ['/guide/mcp-server', 'HyperFormula MCP Server'],
]
},
{
@@ -276,6 +268,17 @@ module.exports = {
['/guide/migration-from-2.x-to-3.0', 'Migrating from 2.x to 3.0'],
]
},
+ {
+ title: 'About',
+ collapsable: false,
+ children: [
+ ['/guide/quality', 'Quality'],
+ ['/guide/supported-browsers', 'Supported browsers'],
+ ['/guide/dependencies', 'Dependencies'],
+ ['/guide/licensing', 'Licensing'],
+ ['/guide/support', 'Support'],
+ ]
+ },
{
title: 'Miscellaneous',
collapsable: false,
diff --git a/docs/guide/ai-sdk.md b/docs/guide/ai-sdk.md
new file mode 100644
index 000000000..aeb93e6ca
--- /dev/null
+++ b/docs/guide/ai-sdk.md
@@ -0,0 +1,51 @@
+# HyperFormula AI SDK
+
+Let LLMs safely read/write spreadsheets and compute formulas via a deterministic engine.
+
+## What it does
+
+- **Evaluate formulas on the fly** —call `calculateFormula()` to evaluate any Excel-compatible formula without placing it in a cell.
+- **Read and write cells and ranges** —get or set individual cells and multi-cell ranges so an LLM can inspect, populate, or modify sheet data programmatically.
+- **Trace dependencies** —call `getCellDependents()` and `getCellPrecedents()` to understand which cells feed into a formula and what downstream values would change.
+
+## Quickstart
+
+```js
+import HyperFormula from 'hyperformula';
+import { createSpreadsheetTools } from 'hyperformula/ai';
+
+// 1. Create a HyperFormula instance with initial data
+const hf = HyperFormula.buildFromArray([
+ ['Revenue', 100],
+ ['Cost', 60],
+ ['Profit', '=B1-B2'],
+]);
+
+// 2. Create tools your LLM agent can call
+const tools = createSpreadsheetTools(hf);
+
+// 3. Agent interaction examples
+tools.evaluate({ formula: '=IRR({-1000,300,400,500,200})' });
+// → 0.1189 — deterministic, no LLM math
+
+tools.setCellContents({ sheet: 0, col: 1, row: 0, value: 200 });
+tools.getRange({ sheet: 0, startCol: 0, startRow: 0, endCol: 1, endRow: 2 });
+// → [['Revenue', 200], ['Cost', 60], ['Profit', 140]]
+
+// Agent: "What drives the profit number?"
+tools.getDependents({ sheet: 0, col: 1, row: 0 });
+// → [{ sheet: 0, col: 1, row: 2 }] — Revenue flows into Profit
+```
+
+## Use cases
+
+- **Explain a sheet** —ask an agent to summarize what a spreadsheet does, which cells are inputs, and how outputs are derived.
+- **Generate a what-if scenario** —let the model tweak assumptions (price, volume, rate) and observe how results change in real time.
+- **Validate and clean data** —have the agent scan ranges for errors, missing values, or inconsistencies and fix them with formulas or direct edits.
+- **Create formulas from natural language** —describe a calculation in plain English and let the model write and verify the correct Excel formula.
+
+## Beta access
+
+::: tip
+[Sign up for beta access](https://2fmjvg.share-eu1.hsforms.com/2e6drCkuLTn-1RuiYB91eJA)
+:::
diff --git a/docs/guide/built-in-functions.md b/docs/guide/built-in-functions.md
index dd9777523..1549fd648 100644
--- a/docs/guide/built-in-functions.md
+++ b/docs/guide/built-in-functions.md
@@ -11,6 +11,13 @@ It makes the page wider to accommodate large tables
.page:has(.widePage) .page-nav /* footer links to the next and prev page */ {
max-width: 1200px !important; /* override default max-width of 740px for this page */
}
+
+/* Make wide tables horizontally scrollable on narrow screens */
+.page:has(.widePage) .theme-default-content:not(.custom) table {
+ display: block;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
## Overview
diff --git a/docs/guide/custom-functions.md b/docs/guide/custom-functions.md
index d78408e61..10d1db153 100644
--- a/docs/guide/custom-functions.md
+++ b/docs/guide/custom-functions.md
@@ -358,18 +358,12 @@ it('returns a VALUE error if the range argument contains a string', () => {
## Working demo
+Explore the full working example on [Stackblitz](https://stackblitz.com/github/handsontable/hyperformula-demos/tree/3.2.x/custom-functions?v=${$page.buildDateURIEncoded}).
+
This demo contains the implementation of both the
[`GREET`](#add-a-simple-custom-function) and
[`DOUBLE_RANGE`](#advanced-custom-function-example) custom functions.
-
-
## Function options
You can set the following options for your function:
diff --git a/docs/guide/i18n-features.md b/docs/guide/i18n-features.md
index 90eba856c..14bb7b3a0 100644
--- a/docs/guide/i18n-features.md
+++ b/docs/guide/i18n-features.md
@@ -7,7 +7,7 @@ Configure HyperFormula to match the languages and regions of your users.
## Function names and errors
-Each of HyperFormula's [built-in functions](built-in-functions.md) and [errors](types-of-errors.md) is available in [17 languages](localizing-functions.md#list-of-supported-languages).
+Each of HyperFormula's [built-in functions](built-in-functions.md) and [errors](types-of-errors.md) is available in [18 languages](localizing-functions.md#list-of-supported-languages).
You can easily [switch between languages](localizing-functions.md) ([`language`](../api/interfaces/configparams.md#language)).
diff --git a/docs/guide/integration-with-angular.md b/docs/guide/integration-with-angular.md
index 1991fe3fb..8f78e2097 100644
--- a/docs/guide/integration-with-angular.md
+++ b/docs/guide/integration-with-angular.md
@@ -6,10 +6,4 @@ For more details, see the [client-side installation](client-side-installation.md
## Demo
-
+Explore the full working example on [Stackblitz](https://stackblitz.com/github/handsontable/hyperformula-demos/tree/3.2.x/angular-demo?v=${$page.buildDateURIEncoded}).
diff --git a/docs/guide/integration-with-langchain.md b/docs/guide/integration-with-langchain.md
new file mode 100644
index 000000000..cbb695dcd
--- /dev/null
+++ b/docs/guide/integration-with-langchain.md
@@ -0,0 +1,53 @@
+# Integration with LangChain/LangGraph
+
+A LangChain/LangGraph tool that gives AI agents deterministic, Excel-compatible formula evaluation instead of relying on LLM-generated math.
+
+## What it does
+
+**Without HyperFormula:**
+
+```python
+result = llm.invoke(
+ "Calculate the IRR for these cash flows: [-1000, 300, 400, 500, 200]"
+)
+# "The IRR is approximately 12.4%" ← non-deterministic, unverifiable
+```
+
+**With HyperFormula tool:**
+
+```python
+from langchain_core.tools import tool
+from hyperformula import HyperFormula
+
+hf = HyperFormula.build_from_array([[-1000, 300, 400, 500, 200]])
+
+@tool
+def evaluate_formula(formula: str) -> str:
+ """Evaluate an Excel-compatible formula using HyperFormula."""
+ return hf.calculate_formula(formula, sheet_id=0)
+
+agent = create_react_agent(llm, [evaluate_formula])
+
+# Agent calls: evaluate_formula("=IRR(A1:E1)")
+# → 0.1189 ← deterministic, auditable
+```
+
+## How it works
+
+1. **Agent populates a HyperFormula sheet** —writes data and formulas (`=SUM`, `=IF`, `=VLOOKUP`, etc.) into cells.
+2. **HyperFormula evaluates deterministically** —resolves the full dependency graph using 400+ built-in functions. No LLM in the loop for math.
+3. **Agent continues with verified data** —computed values flow back into the chain for reasoning, reporting, or downstream actions.
+
+## Use cases
+
+- Financial modeling (NPV, IRR, amortization)
+- Data transformation and aggregation (SUMIF, VLOOKUP)
+- Dynamic pricing with formula-defined logic
+- What-if scenarios and forecasting
+- Report generation with verified KPIs
+
+## Beta access
+
+::: tip
+[Sign up for beta access](https://2fmjvg.share-eu1.hsforms.com/2e6drCkuLTn-1RuiYB91eJA)
+:::
diff --git a/docs/guide/integration-with-react.md b/docs/guide/integration-with-react.md
index 75b4c64e7..d4bc7fe75 100644
--- a/docs/guide/integration-with-react.md
+++ b/docs/guide/integration-with-react.md
@@ -6,10 +6,4 @@ For more details, see the [client-side installation](client-side-installation.md
## Demo
-
+Explore the full working example on [Stackblitz](https://stackblitz.com/github/handsontable/hyperformula-demos/tree/3.2.x/react-demo?v=${$page.buildDateURIEncoded}).
diff --git a/docs/guide/integration-with-svelte.md b/docs/guide/integration-with-svelte.md
index 310fc8823..8b3a5f4b6 100644
--- a/docs/guide/integration-with-svelte.md
+++ b/docs/guide/integration-with-svelte.md
@@ -6,10 +6,4 @@ For more details, see the [client-side installation](client-side-installation.md
## Demo
-
+Explore the full working example on [Stackblitz](https://stackblitz.com/github/handsontable/hyperformula-demos/tree/3.2.x/svelte-demo?v=${$page.buildDateURIEncoded}).
diff --git a/docs/guide/integration-with-vue.md b/docs/guide/integration-with-vue.md
index 5307780c6..eaa104e0e 100644
--- a/docs/guide/integration-with-vue.md
+++ b/docs/guide/integration-with-vue.md
@@ -31,14 +31,8 @@ This function prevents Vue from converting the HyperFormula instance into a reac
## Demo
+Explore the full working example on [Stackblitz](https://stackblitz.com/github/handsontable/hyperformula-demos/tree/3.2.x/vue-3-demo?v=${$page.buildDateURIEncoded}).
+
::: tip
This demo uses the [Vue 3](https://v3.vuejs.org/) framework. If you are looking for an example using Vue 2, check out the [code on GitHub](https://github.com/handsontable/hyperformula-demos/tree/2.5.x/vue-demo).
:::
-
-
diff --git a/docs/guide/list-of-differences.md b/docs/guide/list-of-differences.md
index 0c6828e5a..106e459ce 100644
--- a/docs/guide/list-of-differences.md
+++ b/docs/guide/list-of-differences.md
@@ -11,6 +11,13 @@ It makes the page wider to accommodate large tables
.page:has(.widePage) .page-nav /* footer links to the next and prev page */ {
max-width: 1200px !important; /* override default max-width of 740px for this page */
}
+
+/* Make wide tables horizontally scrollable on narrow screens */
+.page:has(.widePage) .theme-default-content:not(.custom) table {
+ display: block;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
See a full list of differences between HyperFormula, Microsoft Excel, and Google Sheets.
diff --git a/docs/guide/localizing-functions.md b/docs/guide/localizing-functions.md
index ee777d838..1f8a752b3 100644
--- a/docs/guide/localizing-functions.md
+++ b/docs/guide/localizing-functions.md
@@ -1,7 +1,7 @@
# Localizing functions
You can localize a function's ID and error
-messages. Currently, HyperFormula supports 17 languages, with British English
+messages. Currently, HyperFormula supports 18 languages, with British English
as the default.
To change the language all you need to do is import and
@@ -128,6 +128,7 @@ You can localize your custom functions as well. For details, see the [Custom fun
| Spanish | esES |
| Swedish | svSE |
| Turkish | trTR |
+| Indonesian | idID |
## Demo
diff --git a/docs/guide/mcp-server.md b/docs/guide/mcp-server.md
new file mode 100644
index 000000000..618323f22
--- /dev/null
+++ b/docs/guide/mcp-server.md
@@ -0,0 +1,44 @@
+# HyperFormula MCP Server
+
+An MCP (Model Context Protocol) server that exposes HyperFormula as a tool for any MCP-compatible AI client, giving LLMs deterministic spreadsheet computation.
+
+## What it does
+
+- **Evaluate formulas** —any MCP client can call HyperFormula to evaluate Excel-compatible formulas and get exact results.
+- **Read and write cells** —get or set individual cell values and ranges through standard MCP tool calls.
+- **Inspect dependencies** —trace which cells a formula depends on and understand the calculation graph.
+
+**Without HyperFormula:**
+
+```
+User: What's the NPV at 8% for these cash flows?
+Agent: "Approximately $142.50" ← non-deterministic, unverifiable
+```
+
+**With HyperFormula MCP server:**
+
+```
+User: What's the NPV at 8% for these cash flows?
+Agent → tool call: evaluate("=NPV(0.08, B1:B5)")
+Agent: "$138.43" ← deterministic, auditable
+```
+
+## How it works
+
+1. **Start the MCP server** —runs HyperFormula as a local MCP server that any compatible client (Claude Desktop, Cursor, VS Code, etc.) can connect to.
+2. **Client sends tool calls** —the AI client calls tools like `evaluate`, `getCellValue`, and `setCellContents` via the MCP protocol.
+3. **HyperFormula evaluates deterministically** —resolves formulas using 400+ built-in functions with full dependency tracking. No LLM in the loop for math.
+4. **Results flow back to the client** —computed values return through MCP, grounding the AI's response in verified numbers.
+
+## Use cases
+
+- Spreadsheet Q&A in Claude Desktop or other MCP clients
+- Formula evaluation in IDE-based AI assistants
+- Financial calculations in chat-based agent workflows
+- Data validation and transformation via natural language
+
+## Beta access
+
+::: tip
+[Sign up for beta access](https://2fmjvg.share-eu1.hsforms.com/2e6drCkuLTn-1RuiYB91eJA)
+:::
diff --git a/package-lock.json b/package-lock.json
index f2d4c6f11..716278366 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10062,6 +10062,34 @@
"esbuild-windows-arm64": "0.14.7"
}
},
+ "node_modules/esbuild-android-arm64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.7.tgz",
+ "integrity": "sha512-9/Q1NC4JErvsXzJKti0NHt+vzKjZOgPIjX/e6kkuCzgfT/GcO3FVBcGIv4HeJG7oMznE6KyKhvLrFgt7CdU2/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/esbuild-darwin-64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.7.tgz",
+ "integrity": "sha512-Z9X+3TT/Xj+JiZTVlwHj2P+8GoiSmUnGVz0YZTSt8WTbW3UKw5Pw2ucuJ8VzbD2FPy0jbIKJkko/6CMTQchShQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
"node_modules/esbuild-darwin-arm64": {
"version": "0.14.7",
"cpu": [
@@ -10074,6 +10102,202 @@
"darwin"
]
},
+ "node_modules/esbuild-freebsd-64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.7.tgz",
+ "integrity": "sha512-76zy5jAjPiXX/S3UvRgG85Bb0wy0zv/J2lel3KtHi4V7GUTBfhNUPt0E5bpSXJ6yMT7iThhnA5rOn+IJiUcslQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/esbuild-freebsd-arm64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.7.tgz",
+ "integrity": "sha512-lSlYNLiqyzd7qCN5CEOmLxn7MhnGHPcu5KuUYOG1i+t5A6q7LgBmfYC9ZHJBoYyow3u4CNu79AWHbvVLpE/VQQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/esbuild-linux-32": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.7.tgz",
+ "integrity": "sha512-Vk28u409wVOXqTaT6ek0TnfQG4Ty1aWWfiysIaIRERkNLhzLhUf4i+qJBN8mMuGTYOkE40F0Wkbp6m+IidOp2A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.7.tgz",
+ "integrity": "sha512-+Lvz6x+8OkRk3K2RtZwO+0a92jy9si9cUea5Zoru4yJ/6EQm9ENX5seZE0X9DTwk1dxJbjmLsJsd3IoowyzgVg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-arm": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.7.tgz",
+ "integrity": "sha512-OzpXEBogbYdcBqE4uKynuSn5YSetCvK03Qv1HcOY1VN6HmReuatjJ21dCH+YPHSpMEF0afVCnNfffvsGEkxGJQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-arm64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.7.tgz",
+ "integrity": "sha512-kJd5beWSqteSAW086qzCEsH6uwpi7QRIpzYWHzEYwKKu9DiG1TwIBegQJmLpPsLp4v5RAFjea0JAmAtpGtRpqg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-mips64le": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.7.tgz",
+ "integrity": "sha512-mFWpnDhZJmj/h7pxqn1GGDsKwRfqtV7fx6kTF5pr4PfXe8pIaTERpwcKkoCwZUkWAOmUEjMIUAvFM72A6hMZnA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-linux-ppc64le": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.7.tgz",
+ "integrity": "sha512-wM7f4M0bsQXfDL4JbbYD0wsr8cC8KaQ3RPWc/fV27KdErPW7YsqshZZSjDV0kbhzwpNNdhLItfbaRT8OE8OaKA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/esbuild-netbsd-64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.7.tgz",
+ "integrity": "sha512-J/afS7woKyzGgAL5FlgvMyqgt5wQ597lgsT+xc2yJ9/7BIyezeXutXqfh05vszy2k3kSvhLesugsxIA71WsqBw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ]
+ },
+ "node_modules/esbuild-openbsd-64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.7.tgz",
+ "integrity": "sha512-7CcxgdlCD+zAPyveKoznbgr3i0Wnh0L8BDGRCjE/5UGkm5P/NQko51tuIDaYof8zbmXjjl0OIt9lSo4W7I8mrw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/esbuild-sunos-64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.7.tgz",
+ "integrity": "sha512-GKCafP2j/KUljVC3nesw1wLFSZktb2FGCmoT1+730zIF5O6hNroo0bSEofm6ZK5mNPnLiSaiLyRB9YFgtkd5Xg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ]
+ },
+ "node_modules/esbuild-windows-32": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.7.tgz",
+ "integrity": "sha512-5I1GeL/gZoUUdTPA0ws54bpYdtyeA2t6MNISalsHpY269zK8Jia/AXB3ta/KcDHv2SvNwabpImeIPXC/k0YW6A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/esbuild-windows-64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.7.tgz",
+ "integrity": "sha512-CIGKCFpQOSlYsLMbxt8JjxxvVw9MlF1Rz2ABLVfFyHUF5OeqHD5fPhGrCVNaVrhO8Xrm+yFmtjcZudUGr5/WYQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/esbuild-windows-arm64": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.7.tgz",
+ "integrity": "sha512-eOs1eSivOqN7cFiRIukEruWhaCf75V0N8P0zP7dh44LIhLl8y6/z++vv9qQVbkBm5/D7M7LfCfCTmt1f1wHOCw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/escalade": {
"version": "3.2.0",
"dev": true,
diff --git a/src/i18n/languages/idID.ts b/src/i18n/languages/idID.ts
new file mode 100644
index 000000000..12b0a4f12
--- /dev/null
+++ b/src/i18n/languages/idID.ts
@@ -0,0 +1,425 @@
+/**
+ * @license
+ * Copyright (c) 2025 Handsoncode. All rights reserved.
+ */
+
+import {RawTranslationPackage} from '..'
+
+const dictionary: RawTranslationPackage = {
+ errors: {
+ CYCLE: '#SIKLUS!',
+ DIV_BY_ZERO: '#BAGI0!',
+ ERROR: '#GALAT!',
+ NA: '#N/A',
+ NAME: '#NAME?',
+ NUM: '#ANGKA!',
+ REF: '#REF!',
+ SPILL: '#TUMPAH!',
+ VALUE: '#NILAI!',
+ },
+ functions: {
+ FILTER: 'FILTER',
+ ADDRESS: 'ALAMAT',
+ 'ARRAY_CONSTRAIN': 'BATASAN.MATRIKS',
+ ARRAYFORMULA: 'RUMUS.MATRIKS',
+ ABS: 'ABS',
+ ACOS: 'ACOS',
+ ACOSH: 'ACOSH',
+ ACOT: 'ACOT',
+ ACOTH: 'ACOTH',
+ AND: 'DAN',
+ ARABIC: 'ARAB',
+ ASIN: 'ASIN',
+ ASINH: 'ASINH',
+ ATAN2: 'ATAN2',
+ ATAN: 'ATAN',
+ ATANH: 'ATANH',
+ AVERAGE: 'RATA-RATA',
+ AVERAGEA: 'RATA-RATAA',
+ AVERAGEIF: 'RATA-RATA.JIKA',
+ BASE: 'BASIS',
+ BIN2DEC: 'BIN.DEC',
+ BIN2HEX: 'BIN.HEX',
+ BIN2OCT: 'BIN.OKT',
+ BITAND: 'BITDAN',
+ BITLSHIFT: 'BIT.GESER.KIRI',
+ BITOR: 'BITATAU',
+ BITRSHIFT: 'BIT.GESER.KANAN',
+ BITXOR: 'BITXOR',
+ CEILING: 'BULATKAN.KEATAS',
+ CHAR: 'KARAKTER',
+ CHOOSE: 'PILIH',
+ CLEAN: 'BERSIHKAN',
+ CODE: 'KODE',
+ COLUMN: 'KOLOM',
+ COLUMNS: 'KOLOM2',
+ CONCATENATE: 'GABUNG',
+ CORREL: 'KOREL',
+ COS: 'COS',
+ COSH: 'COSH',
+ COT: 'COT',
+ COTH: 'COTH',
+ COUNT: 'HITUNG',
+ COUNTA: 'HITUNGA',
+ COUNTBLANK: 'HITUNG.KOSONG',
+ COUNTIF: 'HITUNG.JIKA',
+ COUNTIFS: 'HITUNG.JIKAS',
+ COUNTUNIQUE: 'HITUNG.UNIK',
+ CSC: 'CSC',
+ CSCH: 'CSCH',
+ CUMIPMT: 'KUM.BUNGA',
+ CUMPRINC: 'KUM.POKOK',
+ DATE: 'TANGGAL',
+ DATEDIF: 'TANGGAL.SELISIH',
+ DATEVALUE: 'NILAI.TANGGAL',
+ DAY: 'HARI',
+ DAYS360: 'HARI360',
+ DAYS: 'HARI2',
+ DB: 'DB',
+ DDB: 'DDB',
+ DEC2BIN: 'DES.BIN',
+ DEC2HEX: 'DES.HEX',
+ DEC2OCT: 'DES.OKT',
+ DECIMAL: 'DESIMAL',
+ DEGREES: 'DERAJAT',
+ DELTA: 'DELTA',
+ DOLLARDE: 'DOLAR.DES',
+ DOLLARFR: 'DOLAR.PEC',
+ EDATE: 'EDATE',
+ EFFECT: 'EFEKTIF',
+ EOMONTH: 'AKHIR.BULAN',
+ ERF: 'ERF',
+ ERFC: 'ERFC',
+ EVEN: 'GENAP',
+ EXACT: 'SAMA.PERSIS',
+ EXP: 'EXP',
+ FALSE: 'SALAH',
+ FIND: 'TEMUKAN',
+ FORMULATEXT: 'TEKS.RUMUS',
+ FV: 'FV',
+ FVSCHEDULE: 'FV.JADWAL',
+ HEX2BIN: 'HEX.BIN',
+ HEX2DEC: 'HEX.DEC',
+ HEX2OCT: 'HEX.OKT',
+ HLOOKUP: 'HLOOKUP',
+ HOUR: 'JAM',
+ HYPERLINK: 'TAUT.LINK',
+ IF: 'JIKA',
+ IFERROR: 'JIKA.GALAT',
+ IFNA: 'JIKA.NA',
+ IFS: 'JIKAS',
+ INDEX: 'INDEKS',
+ INT: 'BUL',
+ INTERVAL: 'INTERVAL',
+ IPMT: 'IPMT',
+ IRR: 'IRR',
+ ISBINARY: 'ADALAHA.BINER',
+ ISBLANK: 'ADALAHA.KOSONG',
+ ISERR: 'ADALAHA.GALAT',
+ ISERROR: 'ADALAHA.GALAT',
+ ISEVEN: 'ADALAHA.GENAP',
+ ISFORMULA: 'ADALAHA.RUMUS',
+ ISLOGICAL: 'ADALAHA.LOGIS',
+ ISNA: 'ADALAHA.NA',
+ ISNONTEXT: 'ADALAHA.BUKAN.TEKS',
+ ISNUMBER: 'ADALAHA.NOMOR',
+ ISODD: 'ADALAHA.GANJIL',
+ ISOWEEKNUM: 'ISO.MINGGU',
+ ISPMT: 'ISPMT',
+ ISREF: 'ADALAHA.REF',
+ ISTEXT: 'ADALAHA.TEKS',
+ LEFT: 'KIRI',
+ LEN: 'PANJANG',
+ LN: 'LN',
+ LOG10: 'LOG10',
+ LOG: 'LOG',
+ LOWER: 'HURUF.KECIL',
+ MATCH: 'COCOK',
+ MAX: 'MAKS',
+ MAXA: 'MAKSA',
+ MAXIFS: 'MAKS.JIKAS',
+ MAXPOOL: 'KOLOM.MAKS',
+ MEDIAN: 'MEDIAN',
+ MEDIANPOOL: 'KOLOM.MEDIAN',
+ MID: 'TENGAH',
+ MIN: 'MIN',
+ MINA: 'MINA',
+ MINIFS: 'MIN.JIKAS',
+ MINUTE: 'MENIT',
+ MIRR: 'MIRR',
+ MMULT: 'MMULT',
+ MOD: 'MOD',
+ MONTH: 'BULAN',
+ N: 'N',
+ NA: 'NA',
+ NETWORKDAYS: 'HARI.KERJA',
+ 'NETWORKDAYS.INTL': 'HARI.KERJA.INTL',
+ NOMINAL: 'NOMINAL',
+ NOT: 'TIDAK',
+ NOW: 'SEKARANG',
+ NPER: 'NPER',
+ NPV: 'NVP',
+ OCT2BIN: 'OKT.BIN',
+ OCT2DEC: 'OKT.DEC',
+ OCT2HEX: 'OKT.HEX',
+ ODD: 'GANJIL',
+ OFFSET: 'OFSET',
+ OR: 'ATAU',
+ PI: 'PI',
+ PMT: 'PMT',
+ PDURATION: 'PDURATION',
+ PRODUCT: 'PRODUK',
+ POWER: 'PANGKAT',
+ PPMT: 'PPMT',
+ PROPER: 'HURUF.AWALBESAR',
+ PV: 'PV',
+ RADIANS: 'RADIAN',
+ RAND: 'ACAK',
+ RATE: 'SUKU.BUNGA',
+ REPLACE: 'GANTI',
+ REPT: 'ULANG',
+ RIGHT: 'KANAN',
+ ROMAN: 'ROMAWI',
+ ROUND: 'BULATKAN',
+ ROUNDDOWN: 'BULATKAN.KEBAWAH',
+ ROUNDUP: 'BULATKAN.KEATAS',
+ ROW: 'BARIS',
+ ROWS: 'BARIS2',
+ RRI: 'RRI',
+ SEARCH: 'CARI',
+ SEC: 'SEC',
+ SECH: 'SECH',
+ SECOND: 'DETIK',
+ SHEET: 'LEMBAR',
+ SHEETS: 'LEMBAR2',
+ SIN: 'SIN',
+ SINH: 'SINH',
+ SLN: 'GSL',
+ SPLIT: 'PISAH',
+ SQRT: 'AKAR',
+ STDEVA: 'STDEVA',
+ 'STDEV.P': 'STDEV.P',
+ STDEVPA: 'STDEVPA',
+ 'STDEV.S': 'STDEV.S',
+ SUBSTITUTE: 'SUBSTITUSI',
+ SUBTOTAL: 'SUBTOTAL',
+ SUM: 'JUMLAH',
+ SUMIF: 'JUMLAH.JIKA',
+ SUMIFS: 'JUMLAH.JIKAS',
+ SUMPRODUCT: 'PRODUK.JUMLAH',
+ SUMSQ: 'JUMLAH.KUADRAT',
+ SWITCH: 'BERALIH',
+ SYD: 'SYD',
+ T: 'T',
+ TAN: 'TAN',
+ TANH: 'TANH',
+ TBILLEQ: 'TBILL.SAMA',
+ TBILLPRICE: 'TBILL.HARGA',
+ TBILLYIELD: 'TBILL.HASIL',
+ TEXT: 'TEKS',
+ TIME: 'WAKTU',
+ TIMEVALUE: 'NILAI.WAKTU',
+ TODAY: 'HARI.INI',
+ TRANSPOSE: 'TRANSPOS',
+ TRIM: 'HAPUS.SPASI',
+ TRUE: 'BENAR',
+ TRUNC: 'POTONG',
+ UNICHAR: 'UNIKARAKTER',
+ UNICODE: 'UNICODE',
+ UPPER: 'HURUF.BESAR',
+ VALUE: 'NILAI',
+ VARA: 'VARA',
+ 'VAR.P': 'VAR.P',
+ VARPA: 'VARPA',
+ 'VAR.S': 'VAR.S',
+ VLOOKUP: 'VLOOKUP',
+ WEEKDAY: 'HARI.MINGGU',
+ WEEKNUM: 'MINGGU',
+ WORKDAY: 'HARI.KERJA',
+ 'WORKDAY.INTL': 'HARI.KERJA.INTL',
+ XNPV: 'XNVP',
+ XOR: 'XATAU',
+ XLOOKUP: 'XLOOKUP',
+ YEAR: 'TAHUN',
+ YEARFRAC: 'FRAC.TAHUN',
+ 'HF.ADD': 'HF.ADD',
+ 'HF.CONCAT': 'HF.CONCAT',
+ 'HF.DIVIDE': 'HF.DIVIDE',
+ 'HF.EQ': 'HF.EQ',
+ 'HF.GT': 'HF.GT',
+ 'HF.GTE': 'HF.GTE',
+ 'HF.LT': 'HF.LT',
+ 'HF.LTE': 'HF.LTE',
+ 'HF.MINUS': 'HF.MINUS',
+ 'HF.MULTIPLY': 'HF.MULTIPLY',
+ 'HF.NE': 'HF.NE',
+ 'HF.POW': 'HF.POW',
+ 'HF.UMINUS': 'HF.UMINUS',
+ 'HF.UNARY_PERCENT': 'HF.UNARY_PERCENT',
+ 'HF.UPLUS': 'HF.UPLUS',
+ VARP: 'VARP',
+ VAR: 'VAR',
+ STDEVP: 'STDEVP',
+ STDEV: 'STDEV',
+ 'EXPON.DIST': 'EXPON.DIST',
+ FISHER: 'FISHER',
+ FISHERINV: 'FISHERINV',
+ GAMMA: 'GAMMA',
+ 'GAMMA.DIST': 'GAMMA.DIST',
+ GAMMALN: 'GAMMALN',
+ 'GAMMALN.PRECISE': 'GAMMALN.PRECISE',
+ 'GAMMA.INV': 'GAMMA.INV',
+ GAUSS: 'GAUSS',
+ FACT: 'FAKTOR',
+ FACTDOUBLE: 'FAKTOR.GANDA',
+ COMBIN: 'KOMBINASI',
+ COMBINA: 'KOMBINASIA',
+ GCD: 'FPB',
+ LCM: 'KPK',
+ MROUND: 'BULATKAN.MULTIPLE',
+ MULTINOMIAL: 'MULTINOMIAL',
+ QUOTIENT: 'HASIL.BAGI',
+ RANDBETWEEN: 'ACAK.ANTARA',
+ SERIESSUM: 'JUMLAH.SERI',
+ SIGN: 'TANDA',
+ SQRTPI: 'AKAR.PI',
+ SUMX2MY2: 'JUMLAH.X2MINY2',
+ SUMX2PY2: 'JUMLAH.X2TAMY2',
+ SUMXMY2: 'JUMLAH.XMINY2',
+ 'EXPONDIST': 'EXPONDIST',
+ GAMMADIST: 'GAMMADIST',
+ GAMMAINV: 'GAMMAINV',
+ 'BETA.DIST': 'BETA.DIST',
+ BETADIST: 'BETADIST',
+ 'BETA.INV': 'BETA.INV',
+ BETAINV: 'BETAINV',
+ 'BINOM.DIST': 'BINOM.DIST',
+ BINOMDIST: 'BINOMDIST',
+ 'BINOM.INV': 'BINOM.INV',
+ BESSELI: 'BESSELI',
+ BESSELJ: 'BESSELJ',
+ BESSELK: 'BESSELK',
+ BESSELY: 'BESSELY',
+ 'CHISQ.DIST': 'CHISQ.DIST',
+ 'CHISQ.DIST.RT': 'CHISQ.DIST.RT',
+ 'CHISQ.INV': 'CHISQ.INV',
+ 'CHISQ.INV.RT': 'CHISQ.INV.RT',
+ CHIDIST: 'CHIDIST',
+ CHIINV: 'CHIINV',
+ 'F.DIST': 'F.DIST',
+ 'F.DIST.RT': 'F.DIST.RT',
+ 'F.INV': 'F.INV',
+ 'F.INV.RT': 'F.INV.RT',
+ FDIST: 'FDIST',
+ FINV: 'FINV',
+ WEIBULL: 'WEIBULL',
+ 'WEIBULL.DIST': 'WEIBULL.DIST',
+ POISSON: 'POISSON',
+ 'POISSON.DIST': 'POISSON.DIST',
+ 'HYPGEOM.DIST': 'HYPGEOM.DIST',
+ HYPGEOMDIST: 'HYPGEOMDIST',
+ 'T.DIST': 'T.DIST',
+ 'T.DIST.2T': 'T.DIST.2T',
+ 'T.DIST.RT': 'T.DIST.RT',
+ 'T.INV': 'T.INV',
+ 'T.INV.2T': 'T.INV.2T',
+ TDIST: 'TDIST',
+ TINV: 'TINV',
+ LOGINV: 'LOGINV',
+ 'LOGNORM.DIST': 'LOGNORM.DIST',
+ 'LOGNORM.INV': 'LOGNORM.INV',
+ LOGNORMDIST: 'LOGNORMDIST',
+ 'NORM.DIST': 'NORM.DIST',
+ 'NORM.INV': 'NORM.INV',
+ 'NORM.S.DIST': 'NORM.S.DIST',
+ 'NORM.S.INV': 'NORM.S.INV',
+ NORMDIST: 'NORMDIST',
+ NORMINV: 'NORMINV',
+ NORMSDIST: 'NORMSDIST',
+ NORMSINV: 'NORMSINV',
+ PHI: 'PHI',
+ 'NEGBINOM.DIST': 'NEGBINOM.DIST',
+ 'NEGBINOMDIST': 'NEGBINOMDIST',
+ COMPLEX: 'KOMPLEKS',
+ IMABS: 'IMABS',
+ IMAGINARY: 'IMAGINER',
+ IMARGUMENT: 'IMARGUMEN',
+ IMCONJUGATE: 'IMKONJUGASI',
+ IMCOS: 'IMCOS',
+ IMCOSH: 'IMCOSH',
+ IMCOT: 'IMCOT',
+ IMCSC: 'IMCSC',
+ IMCSCH: 'IMCSCH',
+ IMDIV: 'IMBAGI',
+ IMEXP: 'IMEKSP',
+ IMLN: 'IMLN',
+ IMLOG10: 'IMLOG10',
+ IMLOG2: 'IMLOG2',
+ IMPOWER: 'IMPANGKAT',
+ IMPRODUCT: 'IMPRODUK',
+ IMREAL: 'IMRIIL',
+ IMSEC: 'IMSEC',
+ IMSECH: 'IMSECH',
+ IMSIN: 'IMSIN',
+ IMSINH: 'IMSINH',
+ IMSQRT: 'IMAKAR',
+ IMSUB: 'IMKURANG',
+ IMSUM: 'IMJUMLAH',
+ IMTAN: 'IMTAN',
+ LARGE: 'BESAR',
+ SMALL: 'KECIL',
+ AVEDEV: 'RATA.SIMPANG',
+ CONFIDENCE: 'KEYAKINAN',
+ 'CONFIDENCE.NORM': 'KEYAKINAN.NORM',
+ 'CONFIDENCE.T': 'KEYAKINAN.T',
+ DEVSQ: 'KUADRAT.SIMPANG',
+ GEOMEAN: 'RATA.GEO',
+ HARMEAN: 'RATA.HARM',
+ CRITBINOM: 'KRIT.BINOM',
+ 'COVARIANCE.P': 'KOVAR.P',
+ 'COVARIANCE.S': 'KOVAR.S',
+ 'COVAR': 'KOVAR',
+ PEARSON: 'PEARSON',
+ RSQ: 'RKUADRAT',
+ STANDARDIZE: 'STANDARISASI',
+ 'Z.TEST': 'Z.UJI',
+ ZTEST: 'ZUJI',
+ 'F.TEST': 'F.UJI',
+ FTEST: 'FUJI',
+ STEYX: 'STEYX',
+ SLOPE: 'KEMIRINGAN',
+ 'CHISQ.TEST': 'CHISQ.UJI',
+ CHITEST: 'CHIUJI',
+ 'T.TEST': 'T.UJI',
+ TTEST: 'TUJI',
+ SKEW: 'SKEW',
+ 'SKEW.P': 'SKEW.P',
+ WEIBULLDIST: 'WEIBULLDIST',
+ VARS: 'VARS',
+ TINV2T: 'TINV2T',
+ TDISTRT: 'TDISTRT',
+ TDIST2T: 'TDIST2T',
+ STDEVS: 'STDEVS',
+ FINVRT: 'FINVRT',
+ FDISTRT: 'FDISTRT',
+ CHIDISTRT: 'CHIDISTRT',
+ CHIINVRT: 'CHIINVRT',
+ COVARIANCEP: 'COVARIANCEP',
+ COVARIANCES: 'COVARIANCES',
+ LOGNORMINV: 'LOGNORMINV',
+ POISSONDIST: 'POISSONDIST',
+ SKEWP: 'SKEWP',
+ 'CEILING.MATH': 'BULATKAN.KEATAS.MATEMATIK',
+ FLOOR: 'BULATKAN.KEBAWAH',
+ 'FLOOR.MATH': 'BULATKAN.KEBAWAH.MATEMATIK',
+ 'CEILING.PRECISE': 'BULATKAN.KEATAS.PRESISI',
+ 'FLOOR.PRECISE': 'BULATKAN.KEBAWAH.PRESISI',
+ 'ISO.CEILING': 'ISO.BULATKAN.KEATAS',
+ },
+ langCode: 'idID',
+ ui: {
+ NEW_SHEET_PREFIX: 'Lembar',
+ },
+}
+
+export default dictionary
diff --git a/src/i18n/languages/index.ts b/src/i18n/languages/index.ts
index c5eaed084..dbffca47a 100644
--- a/src/i18n/languages/index.ts
+++ b/src/i18n/languages/index.ts
@@ -12,6 +12,7 @@ export {default as esES} from './esES'
export {default as fiFI} from './fiFI'
export {default as frFR} from './frFR'
export {default as huHU} from './huHU'
+export {default as idID} from './idID'
export {default as itIT} from './itIT'
export {default as nbNO} from './nbNO'
export {default as nlNL} from './nlNL'