@dxos/plugin-sheet 0.7.2 → 0.7.3-staging.0905f03

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.
Files changed (128) hide show
  1. package/dist/lib/browser/{SheetContainer-YAMIOFC6.mjs → SheetContainer-KCLT6PEO.mjs} +8 -6
  2. package/dist/lib/browser/SheetContainer-KCLT6PEO.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-QHQFM7LV.mjs → chunk-E5WQ7U7G.mjs} +77 -78
  4. package/dist/lib/browser/chunk-E5WQ7U7G.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-VMSX6Z4X.mjs → chunk-F3HE6D3J.mjs} +76 -26
  6. package/dist/lib/browser/chunk-F3HE6D3J.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-BVUN7SHF.mjs → chunk-JXFPOYNA.mjs} +1 -1
  8. package/dist/lib/browser/chunk-JXFPOYNA.mjs.map +7 -0
  9. package/dist/lib/browser/{compute-graph-GGWUX644.mjs → compute-graph-SNUS7HOH.mjs} +3 -3
  10. package/dist/lib/browser/index.mjs +84 -32
  11. package/dist/lib/browser/index.mjs.map +3 -3
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/types.mjs +1 -1
  14. package/dist/lib/node/{SheetContainer-BSDHHYXE.cjs → SheetContainer-VVVRYTQG.cjs} +32 -31
  15. package/dist/lib/node/SheetContainer-VVVRYTQG.cjs.map +7 -0
  16. package/dist/lib/node/{chunk-J5ZFWMOD.cjs → chunk-45YW2DX2.cjs} +96 -101
  17. package/dist/lib/node/chunk-45YW2DX2.cjs.map +7 -0
  18. package/dist/lib/node/{chunk-O7XR4R7Y.cjs → chunk-KSEEI5VC.cjs} +87 -27
  19. package/dist/lib/node/chunk-KSEEI5VC.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-AWKOWDMI.cjs → chunk-OWH2EUHZ.cjs} +4 -4
  21. package/dist/lib/node/chunk-OWH2EUHZ.cjs.map +7 -0
  22. package/dist/lib/node/{compute-graph-KGWA2QLE.cjs → compute-graph-WILPHO4A.cjs} +20 -20
  23. package/dist/lib/node/{compute-graph-KGWA2QLE.cjs.map → compute-graph-WILPHO4A.cjs.map} +2 -2
  24. package/dist/lib/node/index.cjs +101 -47
  25. package/dist/lib/node/index.cjs.map +3 -3
  26. package/dist/lib/node/meta.json +1 -1
  27. package/dist/lib/node/types.cjs +6 -6
  28. package/dist/lib/node/types.cjs.map +1 -1
  29. package/dist/lib/node-esm/{SheetContainer-T47T2NYJ.mjs → SheetContainer-LSBE6Q4X.mjs} +8 -6
  30. package/dist/lib/node-esm/SheetContainer-LSBE6Q4X.mjs.map +7 -0
  31. package/dist/lib/node-esm/{chunk-CR4K75EL.mjs → chunk-6JF2AHKO.mjs} +76 -26
  32. package/dist/lib/node-esm/chunk-6JF2AHKO.mjs.map +7 -0
  33. package/dist/lib/node-esm/{chunk-UIBWRHW7.mjs → chunk-BVS2IQRO.mjs} +1 -1
  34. package/dist/lib/node-esm/chunk-BVS2IQRO.mjs.map +7 -0
  35. package/dist/lib/node-esm/{chunk-6GSTEN7N.mjs → chunk-NYDNXI7L.mjs} +77 -78
  36. package/dist/lib/node-esm/chunk-NYDNXI7L.mjs.map +7 -0
  37. package/dist/lib/node-esm/{compute-graph-2SCZT7N5.mjs → compute-graph-S6CVN7RS.mjs} +3 -3
  38. package/dist/lib/node-esm/index.mjs +84 -32
  39. package/dist/lib/node-esm/index.mjs.map +3 -3
  40. package/dist/lib/node-esm/meta.json +1 -1
  41. package/dist/lib/node-esm/types.mjs +1 -1
  42. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  43. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  44. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +1 -0
  45. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/GridSheet/util.d.ts +0 -2
  47. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  48. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +2 -0
  49. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  50. package/dist/types/src/components/SheetObjectSettings.d.ts +7 -0
  51. package/dist/types/src/components/SheetObjectSettings.d.ts.map +1 -0
  52. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  53. package/dist/types/src/components/index.d.ts +1 -0
  54. package/dist/types/src/components/index.d.ts.map +1 -1
  55. package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -1
  56. package/dist/types/src/defs/types.d.ts +2 -4
  57. package/dist/types/src/defs/types.d.ts.map +1 -1
  58. package/dist/types/src/defs/util.d.ts +8 -0
  59. package/dist/types/src/defs/util.d.ts.map +1 -1
  60. package/dist/types/src/extensions/editor/extension.d.ts +2 -1
  61. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -1
  62. package/dist/types/src/index.d.ts +1 -0
  63. package/dist/types/src/index.d.ts.map +1 -1
  64. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  65. package/dist/types/src/model/sheet-model.d.ts +0 -4
  66. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  67. package/dist/types/src/model/testing.d.ts +6 -0
  68. package/dist/types/src/model/testing.d.ts.map +1 -0
  69. package/dist/types/src/testing/data.d.ts +3 -0
  70. package/dist/types/src/testing/data.d.ts.map +1 -0
  71. package/dist/types/src/testing/index.d.ts +1 -0
  72. package/dist/types/src/testing/index.d.ts.map +1 -1
  73. package/dist/types/src/testing/playwright/playwright.config.d.ts +3 -0
  74. package/dist/types/src/testing/playwright/playwright.config.d.ts.map +1 -0
  75. package/dist/types/src/testing/playwright/sheet-manager.d.ts +24 -0
  76. package/dist/types/src/testing/playwright/sheet-manager.d.ts.map +1 -0
  77. package/dist/types/src/testing/playwright/sheet.spec.d.ts +2 -0
  78. package/dist/types/src/testing/playwright/sheet.spec.d.ts.map +1 -0
  79. package/dist/types/src/testing/testing.d.ts +1 -2
  80. package/dist/types/src/testing/testing.d.ts.map +1 -1
  81. package/dist/types/src/translations.d.ts +61 -0
  82. package/dist/types/src/translations.d.ts.map +1 -1
  83. package/dist/types/src/types.d.ts +2 -3
  84. package/dist/types/src/types.d.ts.map +1 -1
  85. package/package.json +40 -37
  86. package/src/SheetPlugin.tsx +9 -21
  87. package/src/components/FunctionEditor/FunctionEditor.tsx +2 -2
  88. package/src/components/GridSheet/GridSheet.stories.tsx +2 -0
  89. package/src/components/GridSheet/GridSheet.tsx +18 -8
  90. package/src/components/GridSheet/util.ts +1 -9
  91. package/src/components/SheetContainer/SheetContainer.stories.tsx +44 -2
  92. package/src/components/SheetObjectSettings.tsx +38 -0
  93. package/src/components/Toolbar/Toolbar.tsx +7 -1
  94. package/src/components/index.ts +1 -0
  95. package/src/compute-graph/compute-graph.stories.tsx +1 -1
  96. package/src/compute-graph/compute-graph.test.ts +1 -1
  97. package/src/defs/sheet-range-types.ts +3 -0
  98. package/src/defs/types.ts +3 -1
  99. package/src/defs/util.ts +32 -1
  100. package/src/extensions/editor/extension.ts +3 -3
  101. package/src/index.ts +3 -0
  102. package/src/integrations/thread-ranges.ts +2 -0
  103. package/src/model/sheet-model.test.ts +35 -1
  104. package/src/model/sheet-model.ts +5 -17
  105. package/src/model/testing.ts +35 -0
  106. package/src/sanity.test.ts +1 -1
  107. package/src/testing/data.ts +33 -0
  108. package/src/testing/index.ts +1 -0
  109. package/src/testing/playwright/playwright.config.ts +18 -0
  110. package/src/testing/playwright/sheet-manager.ts +91 -0
  111. package/src/testing/playwright/sheet.spec.ts +78 -0
  112. package/src/testing/testing.tsx +1 -31
  113. package/src/translations.ts +4 -0
  114. package/src/types.ts +1 -3
  115. package/dist/lib/browser/SheetContainer-YAMIOFC6.mjs.map +0 -7
  116. package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +0 -7
  117. package/dist/lib/browser/chunk-QHQFM7LV.mjs.map +0 -7
  118. package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +0 -7
  119. package/dist/lib/node/SheetContainer-BSDHHYXE.cjs.map +0 -7
  120. package/dist/lib/node/chunk-AWKOWDMI.cjs.map +0 -7
  121. package/dist/lib/node/chunk-J5ZFWMOD.cjs.map +0 -7
  122. package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +0 -7
  123. package/dist/lib/node-esm/SheetContainer-T47T2NYJ.mjs.map +0 -7
  124. package/dist/lib/node-esm/chunk-6GSTEN7N.mjs.map +0 -7
  125. package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +0 -7
  126. package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +0 -7
  127. /package/dist/lib/browser/{compute-graph-GGWUX644.mjs.map → compute-graph-SNUS7HOH.mjs.map} +0 -0
  128. /package/dist/lib/node-esm/{compute-graph-2SCZT7N5.mjs.map → compute-graph-S6CVN7RS.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ComputeGraph/ComputeGraphContextProvider.tsx", "../../../src/extensions/compute.ts", "../../../src/extensions/editor/extension.ts", "../../../src/components/SheetContext/SheetContext.tsx", "../../../src/model/sheet-model.ts", "../../../src/model/useSheetModel.ts", "../../../src/components/GridSheet/GridSheet.tsx", "../../../src/components/GridSheet/util.ts", "../../../src/integrations/thread-ranges.ts", "../../../src/components/index.ts", "../../../src/components/RangeList/RangeList.tsx", "../../../src/components/SheetObjectSettings.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { createContext, type PropsWithChildren, useContext } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { type Space } from '@dxos/react-client/echo';\nimport { useAsyncState } from '@dxos/react-hooks';\n\nimport { type ComputeGraph, type ComputeGraphRegistry } from '../../compute-graph';\n\nexport type ComputeGraphContextType = {\n registry: ComputeGraphRegistry;\n};\n\n/**\n * The compute graph context manages a ComputeGraph for each space.\n */\nexport const ComputeGraphContext = createContext<ComputeGraphContextType | undefined>(undefined);\n\nexport const ComputeGraphContextProvider = ({ registry, children }: PropsWithChildren<ComputeGraphContextType>) => {\n return <ComputeGraphContext.Provider value={{ registry }}>{children}</ComputeGraphContext.Provider>;\n};\n\nexport const useComputeGraph = (space?: Space): ComputeGraph | undefined => {\n const { registry } = useContext(ComputeGraphContext) ?? raise(new Error('Missing ComputeGraphContext'));\n const [graph] = useAsyncState(async () => {\n if (space) {\n const graph = registry.getOrCreateGraph(space);\n await graph.open();\n return graph;\n }\n }, [space, registry]);\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type EditorState,\n type Extension,\n type RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n type Transaction,\n} from '@codemirror/state';\nimport { Decoration, EditorView, ViewPlugin, WidgetType } from '@codemirror/view';\n\nimport { type UnsubscribeCallback, debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { documentId, singleValueFacet } from '@dxos/react-ui-editor';\n\nimport { type ComputeGraph, type ComputeNode, createSheetName } from '../compute-graph';\nimport { type CellAddress } from '../defs';\nimport { type CellScalarValue } from '../types';\n\nconst LANGUAGE_TAG = 'dx';\n\n// TODO(burdon): Create marker just for our decorator?\nconst updateAllDecorations = StateEffect.define<void>();\n\nexport const computeGraphFacet = singleValueFacet<ComputeGraph>();\n\nexport type ComputeOptions = {};\n\nexport const compute = (options: ComputeOptions = {}): Extension => {\n let computeNode: ComputeNode | undefined;\n\n const update = (state: EditorState, current?: RangeSet<Decoration>) => {\n const builder = new RangeSetBuilder<Decoration>();\n if (computeNode) {\n computeNode.clear();\n syntaxTree(state).iterate({\n enter: (node) => {\n switch (node.name) {\n case 'FencedCode': {\n const cursor = state.selection.main.head;\n if (state.readOnly || cursor < node.from || cursor > node.to) {\n const info = node.node.getChild('CodeInfo');\n if (info) {\n const type = state.sliceDoc(info.from, info.to);\n const text = node.node.getChild('CodeText');\n if (type === LANGUAGE_TAG && text) {\n const formula = state.sliceDoc(text.from, text.to);\n\n const iter = current?.iter(node.node.from);\n if (iter?.value && iter?.value.spec.formula === formula) {\n // Add existing widget.\n builder.add(node.from, node.to, iter.value);\n } else {\n // TODO(burdon): Create ordered list of cells on each decoration run.\n const cell: CellAddress = { col: node.node.from, row: 0 };\n invariant(computeNode);\n // NOTE: This triggers re-render (below).\n computeNode.setValue(cell, formula);\n const value = computeNode.getValue(cell);\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new ComputeWidget(formula, value),\n formula,\n }),\n );\n }\n }\n }\n }\n\n break;\n }\n }\n },\n });\n }\n\n return builder.finish();\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n // Graph subscription.\n private _subscription?: UnsubscribeCallback;\n constructor(view: EditorView) {\n const id = view.state.facet(documentId);\n const computeGraph = view.state.facet(computeGraphFacet);\n if (id && computeGraph) {\n queueMicrotask(async () => {\n computeNode = computeGraph.getOrCreateNode(createSheetName({ type: '', id }));\n await computeNode.open();\n\n // Trigger re-render if values updated.\n // TODO(burdon): Trigger only if formula value updated (currently triggered during render).\n this._subscription = computeNode.update.on(\n debounce(({ type, ...rest }) => {\n if (type === 'valuesUpdated') {\n view.dispatch({\n effects: updateAllDecorations.of(),\n });\n }\n }, 250),\n );\n });\n }\n }\n\n destroy() {\n this._subscription?.();\n void computeNode?.close();\n computeNode = undefined;\n }\n },\n ),\n\n StateField.define<RangeSet<Decoration>>({\n create: (state) => update(state),\n update: (rangeSet: RangeSet<Decoration>, tr: Transaction) => update(tr.state, rangeSet),\n provide: (field) => EditorView.decorations.from(field),\n }),\n ];\n};\n\n// TODO(burdon): Click to edit.\nclass ComputeWidget extends WidgetType {\n constructor(\n private readonly formula: string,\n private readonly value: CellScalarValue,\n ) {\n super();\n }\n\n override toDOM(_view: EditorView) {\n const div = document.createElement('div');\n div.setAttribute('title', this.formula);\n div.innerText = String(this.value);\n return div;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n type Completion,\n type CompletionContext,\n type CompletionResult,\n acceptCompletion,\n autocompletion,\n completionStatus,\n startCompletion,\n} from '@codemirror/autocomplete';\nimport { HighlightStyle, type Language, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { type EditorView, ViewPlugin, type ViewUpdate, keymap } from '@codemirror/view';\nimport { type SyntaxNode } from '@lezer/common';\nimport { tags } from '@lezer/highlight';\nimport { spreadsheet } from 'codemirror-lang-spreadsheet';\n\nimport { singleValueFacet } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { type FunctionDefinition } from '../../compute-graph';\nimport { RANGE_NOTATION } from '../../defs';\n\n/**\n * https://codemirror.net/examples/styling\n * https://lezer.codemirror.net/docs/ref/#highlight\n * https://github.com/luizzappa/codemirror-lang-spreadsheet/blob/main/src/index.ts#L28 (mapping)\n */\n// TODO(burdon): Define light/dark.\nconst highlightStyles = HighlightStyle.define([\n // Function.\n {\n tag: tags.name,\n class: 'text-accentText',\n },\n // Range.\n {\n tag: tags.tagName,\n class: 'text-pinkText',\n },\n // Values.\n {\n tag: tags.number,\n class: 'text-tealText',\n },\n {\n tag: tags.bool,\n class: 'text-tealText',\n },\n {\n tag: tags.string,\n class: 'text-tealText',\n },\n // Error.\n {\n tag: tags.invalid,\n class: 'text-unAccent',\n },\n]);\n\nconst languageFacet = singleValueFacet<Language>();\n\nexport type SheetExtensionOptions = {\n debug?: boolean;\n functions?: FunctionDefinition[];\n};\n\n/**\n * Spreadsheet formula extension and parser.\n * https://github.com/luizzappa/codemirror-lang-spreadsheet\n * https://github.com/luizzappa/codemirror-app-spreadsheet/blob/master/src/editor.ts\n * https://github.com/codemirror/lang-example\n * https://hyperformula.handsontable.com/guide/key-concepts.html#grammar\n */\nexport const sheetExtension = ({ debug, functions = [] }: SheetExtensionOptions): Extension => {\n const { extension, language } = spreadsheet({ idiom: 'en-US', decimalSeparator: '.' });\n\n const createCompletion = (name: string) => {\n const { section = 'Custom', description, syntax } = functions.find((value) => value.name === name) ?? {};\n\n return {\n section,\n label: name,\n info: () => {\n if (!description && !syntax) {\n return null;\n }\n\n // TODO(burdon): Standardize color styles.\n const root = document.createElement('div');\n root.className = 'flex flex-col gap-2 text-sm';\n\n const title = document.createElement('h2');\n title.innerText = name;\n title.className = 'text-lg font-mono text-accentText';\n root.appendChild(title);\n\n if (description) {\n const info = document.createElement('p');\n info.innerText = description;\n info.className = 'text-subdued';\n root.appendChild(info);\n }\n\n if (syntax) {\n const detail = document.createElement('pre');\n detail.innerText = syntax;\n detail.className = 'whitespace-pre-wrap text-greenText';\n root.appendChild(detail);\n }\n\n return root;\n },\n apply: (view, completion, from, to) => {\n const insertParens = to === view.state.doc.toString().length;\n view.dispatch(\n view.state.update({\n changes: {\n from,\n to,\n insert: completion.label + (insertParens ? '()' : ''),\n },\n selection: {\n anchor: from + completion.label.length + 1,\n },\n }),\n );\n },\n } satisfies Completion;\n };\n\n return [\n extension,\n languageFacet.of(language),\n language.data.of({\n autocomplete: (context: CompletionContext): CompletionResult | null => {\n if (context.state.doc.toString()[0] !== '=') {\n return null;\n }\n const match = context.matchBefore(/\\w*/);\n if (!match || match.from === match.to) {\n return null;\n }\n\n const text = match.text.toUpperCase();\n if (!context.explicit && match.text.length < 2) {\n return null;\n }\n\n return {\n from: match.from,\n options:\n functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? [],\n };\n },\n }),\n\n syntaxHighlighting(highlightStyles),\n autocompletion({\n aboveCursor: false,\n defaultKeymap: true,\n activateOnTyping: true,\n closeOnBlur: !debug,\n icons: false,\n tooltipClass: () =>\n mx(\n '!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]',\n '[&>ul>li[aria-selected]]:!bg-accentSurface',\n 'border-separator',\n ),\n }),\n keymap.of([\n {\n key: 'Tab',\n run: (view) => {\n return completionStatus(view.state) === 'active' ? acceptCompletion(view) : startCompletion(view);\n },\n },\n ]),\n\n // Parsing.\n // StateField.define({\n // create: (state) => {},\n // update: (value, tr) => {\n // log.info('update');\n // syntaxTree(tr.state).iterate({\n // enter: ({ type, from, to }) => {\n // log.info('node', { type: type.name, from, to });\n // },\n // });\n // },\n // }),\n ];\n};\n\nexport type SelectionRange = { from: number; to: number };\n\nexport interface RangeController {\n setRange(range: string): void;\n}\n\nexport type RangeExtensionOptions = {\n /**\n * Provides controller callback when extension is initialized.\n */\n onInit?: (controller: RangeController) => void;\n /**\n * Called when the active range changes.\n * @param state The current state.\n * @param state.activeRange undefined if no range is active, otherwise a possibly partially defined range.\n */\n onStateChange?: (state: { activeRange: string | undefined }) => void;\n};\n\n/**\n * Tracks the currently active cell within a formula and provides a callback to modify it.\n */\nexport const rangeExtension = ({ onInit, onStateChange }: RangeExtensionOptions): Extension => {\n let view: EditorView;\n let activeRange: SelectionRange | undefined;\n\n // Called externally to provide current range.\n const notifier: RangeController = {\n setRange: (range: string) => {\n if (activeRange) {\n view.dispatch(\n view.state.update({\n changes: { ...activeRange, insert: range.toString() },\n selection: { anchor: activeRange.from + range.length },\n }),\n );\n }\n\n view.focus();\n },\n };\n\n return ViewPlugin.fromClass(\n class {\n constructor(_view: EditorView) {\n view = _view;\n onInit?.(notifier);\n }\n\n update(view: ViewUpdate) {\n const { anchor } = view.state.selection.ranges[0];\n\n // Find first Range or cell at cursor.\n activeRange = undefined;\n const language = view.state.facet(languageFacet);\n const { topNode } = language.parser.parse(view.state.doc.toString());\n visitTree(topNode, ({ type, from, to }) => {\n if (from <= anchor && to >= anchor) {\n switch (type.name) {\n case 'Function':\n // Mark but keep looking.\n activeRange = { from: to, to };\n break;\n\n case 'CloseParen':\n // Mark but keep looking.\n activeRange = { from, to: from };\n break;\n\n case 'RangeToken':\n case 'CellToken':\n activeRange = { from, to };\n return true;\n }\n }\n\n return false;\n });\n\n // Allow start of formula.\n if (!activeRange && view.state.doc.toString()[0] === '=') {\n const str = view.state.doc.sliceString(1);\n if (RANGE_NOTATION.test(str)) {\n activeRange = { from: 1, to: str.length + 1 };\n }\n }\n\n onStateChange?.({\n activeRange: activeRange ? view.state.doc.sliceString(activeRange.from, activeRange.to) : undefined,\n });\n }\n },\n );\n};\n\n/**\n * Lezer parse result visitor.\n */\nconst visitTree = (node: SyntaxNode, callback: (node: SyntaxNode) => boolean): boolean => {\n if (callback(node)) {\n return true;\n }\n\n for (let child = node.firstChild; child !== null; child = child.nextSibling) {\n if (visitTree(child, callback)) {\n return true;\n }\n }\n\n return false;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext, useCallback, useContext, useState } from 'react';\n\nimport { invariant } from '@dxos/invariant';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport {\n Grid,\n type GridContentProps,\n type GridEditing,\n type GridScopedProps,\n useGridContext,\n} from '@dxos/react-ui-grid';\n\nimport { type ComputeGraph } from '../../compute-graph';\nimport { type CellAddress, type CellRange, type CompleteCellRange } from '../../defs';\nimport { type SheetModel, useSheetModel } from '../../model';\nimport { type SheetType } from '../../types';\n\nexport type SheetContextValue = {\n id: string;\n\n model: SheetModel;\n\n // Cursor state.\n // TODO(burdon): Cursor and range should use indices.\n cursor?: CellAddress;\n setCursor: (cell: CellAddress | undefined) => void;\n range?: CellRange;\n setRange: (range: CellRange | undefined) => void;\n cursorFallbackRange?: CompleteCellRange;\n\n // Editing state (undefined if not editing).\n editing: GridEditing;\n setEditing: (editing: GridEditing) => void;\n\n // Active refs\n activeRefs: GridContentProps['activeRefs'];\n setActiveRefs: (activeRefs: GridContentProps['activeRefs']) => void;\n\n // Events.\n // TODO(burdon): Generalize.\n onInfo?: () => void;\n\n // Flags\n ignoreAttention?: boolean;\n};\n\nconst SheetContext = createContext<SheetContextValue | undefined>(undefined);\n\nexport const useSheetContext = (): SheetContextValue => {\n const context = useContext(SheetContext);\n invariant(context);\n return context;\n};\n\nconst SheetProviderImpl = ({\n model,\n onInfo,\n ignoreAttention,\n children,\n __gridScope,\n}: GridScopedProps<PropsWithChildren<Pick<SheetContextValue, 'onInfo' | 'model' | 'ignoreAttention'>>>) => {\n const { id, editing, setEditing } = useGridContext('SheetProvider', __gridScope);\n\n const [cursor, setCursorInternal] = useState<CellAddress>();\n const [range, setRangeInternal] = useState<CellRange>();\n const [cursorFallbackRange, setCursorFallbackRange] = useState<CompleteCellRange>();\n const [activeRefs, setActiveRefs] = useState<GridContentProps['activeRefs']>('');\n\n const setCursor = useCallback(\n (nextCursor?: CellAddress) => {\n setCursorInternal(nextCursor);\n setCursorFallbackRange(\n range?.to ? (range as CompleteCellRange) : nextCursor ? { from: nextCursor!, to: nextCursor! } : undefined,\n );\n },\n [range],\n );\n const setRange = useCallback(\n (nextRange?: CellRange) => {\n setRangeInternal(nextRange);\n setCursorFallbackRange(\n nextRange?.to ? (nextRange as CompleteCellRange) : cursor ? { from: cursor!, to: cursor! } : undefined,\n );\n },\n [cursor],\n );\n\n return (\n <SheetContext.Provider\n value={{\n id,\n model,\n editing,\n setEditing,\n cursor,\n setCursor,\n range,\n setRange,\n cursorFallbackRange,\n activeRefs,\n setActiveRefs,\n // TODO(burdon): Change to event.\n onInfo,\n ignoreAttention,\n }}\n >\n {children}\n </SheetContext.Provider>\n );\n};\n\nexport type SheetProviderProps = {\n graph: ComputeGraph;\n sheet: SheetType;\n readonly?: boolean;\n ignoreAttention?: boolean;\n} & Pick<SheetContextValue, 'onInfo'>;\n\nexport const SheetProvider = ({\n children,\n graph,\n sheet,\n readonly,\n ignoreAttention,\n onInfo,\n}: PropsWithChildren<SheetProviderProps>) => {\n const model = useSheetModel(graph, sheet, { readonly });\n\n return !model ? null : (\n <Grid.Root id={fullyQualifiedId(sheet)}>\n <SheetProviderImpl model={model} onInfo={onInfo} ignoreAttention={ignoreAttention}>\n {children}\n </SheetProviderImpl>\n </Grid.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type SimpleCellRange } from 'hyperformula/typings/AbsoluteCellRange';\nimport { type SimpleCellAddress } from 'hyperformula/typings/Cell';\nimport { type SimpleDate, type SimpleDateTime } from 'hyperformula/typings/DateTimeHelper';\n\nimport { Event } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { getTypename, FormatEnum, TypeEnum } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nimport { DetailedCellError, ExportedCellChange } from '#hyperformula';\nimport { type ComputeGraph, type ComputeNode, type ComputeNodeEvent, createSheetName } from '../compute-graph';\nimport {\n addressFromA1Notation,\n addressFromIndex,\n addressToA1Notation,\n addressToIndex,\n initialize,\n insertIndices,\n isFormula,\n type CellAddress,\n type CellRange,\n ReadonlyException,\n MAX_COLUMNS,\n MAX_ROWS,\n mapFormulaIndicesToRefs,\n mapFormulaRefsToIndices,\n} from '../defs';\nimport { type CellScalarValue, type CellValue, type SheetType, type RestoreAxis } from '../types';\n\n// Map sheet types to system types.\n// https://hyperformula.handsontable.com/guide/types-of-values.html\n// - https://github.com/handsontable/hyperformula/blob/master/src/Cell.ts (CellValueType)\n// - https://github.com/handsontable/hyperformula/blob/master/src/interpreter/InterpreterValue.ts (NumberType)\nconst typeMap: Record<string, { type: TypeEnum; format?: FormatEnum }> = {\n BOOLEAN: { type: TypeEnum.Boolean },\n NUMBER_RAW: { type: TypeEnum.Number },\n NUMBER_PERCENT: { type: TypeEnum.Number, format: FormatEnum.Percent },\n NUMBER_CURRENCY: { type: TypeEnum.Number, format: FormatEnum.Currency },\n NUMBER_DATETIME: { type: TypeEnum.String, format: FormatEnum.DateTime },\n NUMBER_DATE: { type: TypeEnum.String, format: FormatEnum.Date },\n NUMBER_TIME: { type: TypeEnum.String, format: FormatEnum.Time },\n};\n\nconst getTopLeft = (range: CellRange): CellAddress => {\n const to = range.to ?? range.from;\n return { row: Math.min(range.from.row, to.row), col: Math.min(range.from.col, to.col) };\n};\n\nconst toSimpleCellAddress = (sheet: number, cell: CellAddress): SimpleCellAddress => ({\n sheet,\n row: cell.row,\n col: cell.col,\n});\n\nconst toModelRange = (sheet: number, range: CellRange): SimpleCellRange => ({\n start: toSimpleCellAddress(sheet, range.from),\n end: toSimpleCellAddress(sheet, range.to ?? range.from),\n});\n\nexport type SheetModelOptions = {\n readonly?: boolean;\n};\n\n/**\n * Spreadsheet data model.\n *\n * [ComputeGraphContext] > [SheetContext]:[SheetModel] > [Sheet.Root]\n */\n// TODO(burdon): Factor out commonality with ComputeNode. Factor out HF.\nexport class SheetModel extends Resource {\n public readonly id = `model-${PublicKey.random().truncate()}`;\n\n // Wraps compute node.\n public readonly update = new Event<ComputeNodeEvent>();\n\n private _node?: ComputeNode;\n\n constructor(\n private readonly _graph: ComputeGraph,\n private readonly _sheet: SheetType,\n private readonly _options: SheetModelOptions = {},\n ) {\n super();\n }\n\n get graph() {\n return this._graph;\n }\n\n get sheet() {\n return this._sheet;\n }\n\n get readonly() {\n return this._options.readonly;\n }\n\n get bounds() {\n return {\n rows: this._sheet.rows.length,\n columns: this._sheet.columns.length,\n };\n }\n\n /**\n * Initialize sheet and engine.\n */\n protected override async _open() {\n log('initialize', { id: this.id });\n initialize(this._sheet);\n\n this._graph.update.on((event) => {\n if (event.type === 'functionsUpdated') {\n this.reset();\n }\n });\n\n // TODO(burdon): SheetModel should extend ComputeNode and be constructed via the graph.\n this._node = this._graph.getOrCreateNode(createSheetName({ type: getTypename(this._sheet)!, id: this._sheet.id }));\n await this._node.open();\n\n // Listen for model updates (e.g., async calculations).\n const unsubscribe = this._node.update.on((event) => this.update.emit(event));\n this._ctx.onDispose(unsubscribe);\n\n this.reset();\n }\n\n /**\n * Update engine.\n * NOTE: This resets the undo history.\n * @deprecated\n */\n reset() {\n invariant(this._node);\n this._node.graph.hf.clearSheet(this._node.sheetId);\n Object.entries(this._sheet.cells).forEach(([key, { value }]) => {\n invariant(this._node);\n const { col, row } = addressFromIndex(this._sheet, key);\n if (isFormula(value)) {\n const binding = this._graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(this._sheet, value));\n if (binding) {\n value = this._graph.mapFormulaToNative(binding);\n } else {\n // If binding is not found, render the cell as empty.\n // This prevents the cell from momentarily rendering an error while the binding is being loaded.\n value = '';\n }\n }\n\n this._node.graph.hf.setCellContents({ sheet: this._node.sheetId, row, col }, value);\n });\n }\n\n /**\n * Recalculate formulas.\n * NOTE: This resets the undo history.\n * https://hyperformula.handsontable.com/guide/volatile-functions.html#volatile-actions\n * @deprecated\n */\n // TODO(burdon): Remove.\n recalculate() {\n this._node?.graph.hf.rebuildAndRecalculate();\n }\n\n insertRows(i: number, n = 1) {\n const idx = insertIndices(this._sheet.rows, i, n, MAX_ROWS);\n this.reset();\n return idx;\n }\n\n insertColumns(i: number, n = 1) {\n const idx = insertIndices(this._sheet.columns, i, n, MAX_COLUMNS);\n this.reset();\n return idx;\n }\n\n dropRow(rowIndex: string): RestoreAxis {\n const range = {\n from: addressFromIndex(this._sheet, `${this._sheet.columns[0]}@${rowIndex}`),\n to: addressFromIndex(this._sheet, `${this._sheet.columns[this._sheet.columns.length - 1]}@${rowIndex}`),\n };\n const values = this.getCellValues(range).flat();\n const index = this._sheet.rows.indexOf(rowIndex);\n this.clear(range);\n this._sheet.rows.splice(index, 1);\n delete this._sheet.rowMeta[rowIndex];\n this.reset();\n return { axis: 'row', index, axisIndex: rowIndex, axisMeta: this._sheet.rowMeta[rowIndex], values };\n }\n\n dropColumn(colIndex: string): RestoreAxis {\n const range = {\n from: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[0]}`),\n to: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[this._sheet.rows.length - 1]}`),\n };\n const values = this.getCellValues(range).flat();\n const index = this._sheet.columns.indexOf(colIndex);\n this.clear(range);\n this._sheet.columns.splice(index, 1);\n delete this._sheet.columnMeta[colIndex];\n this.reset();\n return { axis: 'col', index, axisIndex: colIndex, axisMeta: this._sheet.rowMeta[colIndex], values };\n }\n\n restoreRow({ index, axisIndex, axisMeta, values }: RestoreAxis) {\n this._sheet.rows.splice(index, 0, axisIndex);\n values.forEach((value, col) => {\n if (value) {\n this._sheet.cells[`${this._sheet.columns[col]}@${axisIndex}`] = { value };\n }\n });\n if (axisMeta) {\n this._sheet.rowMeta[axisIndex] = axisMeta;\n }\n this.reset();\n }\n\n restoreColumn({ index, axisIndex, axisMeta, values }: RestoreAxis) {\n this._sheet.columns.splice(index, 0, axisIndex);\n values.forEach((value, row) => {\n if (value) {\n this._sheet.cells[`${axisIndex}@${this._sheet.rows[row]}`] = { value };\n }\n });\n if (axisMeta) {\n this._sheet.columnMeta[axisIndex] = axisMeta;\n }\n this.reset();\n }\n\n //\n // Undoable actions.\n // TODO(burdon): Group undoable methods; consistently update hf/sheet.\n //\n\n /**\n * Clear range of values.\n */\n clear(range: CellRange) {\n invariant(this._node);\n const topLeft = getTopLeft(range);\n const values = this._iterRange(range, () => null);\n this._node.graph.hf.setCellContents(toSimpleCellAddress(this._node.sheetId, topLeft), values);\n this._iterRange(range, (cell) => {\n const idx = addressToIndex(this._sheet, cell);\n delete this._sheet.cells[idx];\n });\n }\n\n cut(range: CellRange) {\n invariant(this._node);\n this._node.graph.hf.cut(toModelRange(this._node.sheetId, range));\n this._iterRange(range, (cell) => {\n const idx = addressToIndex(this._sheet, cell);\n delete this._sheet.cells[idx];\n });\n }\n\n copy(range: CellRange) {\n invariant(this._node);\n this._node.graph.hf.copy(toModelRange(this._node.sheetId, range));\n }\n\n paste(cell: CellAddress) {\n invariant(this._node);\n if (!this._node.graph.hf.isClipboardEmpty()) {\n const changes = this._node.graph.hf.paste(toSimpleCellAddress(this._node.sheetId, cell));\n for (const change of changes) {\n if (change instanceof ExportedCellChange) {\n const { address, newValue } = change;\n const idx = addressToIndex(this._sheet, { row: address.row, col: address.col });\n this._sheet.cells[idx] = { value: newValue };\n }\n }\n }\n }\n\n // TODO(burdon): Display undo/redo state.\n undo() {\n invariant(this._node);\n if (this._node.graph.hf.isThereSomethingToUndo()) {\n this._node.graph.hf.undo();\n // this.update.emit();\n }\n }\n\n redo() {\n invariant(this._node);\n if (this._node.graph.hf.isThereSomethingToRedo()) {\n this._node.graph.hf.redo();\n // this.update.emit();\n }\n }\n\n /**\n * Get value from sheet.\n */\n getCellValue(cell: CellAddress): CellScalarValue {\n const idx = addressToIndex(this._sheet, cell);\n return this._sheet.cells[idx]?.value ?? null;\n }\n\n /**\n * Get value as a string for editing.\n */\n getCellText(cell: CellAddress): string | undefined {\n const value = this.getCellValue(cell);\n if (value == null) {\n return undefined;\n }\n\n if (isFormula(value)) {\n return this._graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(this._sheet, value));\n } else {\n return String(value);\n }\n }\n\n /**\n * Get array of raw values from sheet.\n */\n getCellValues(range: CellRange): CellScalarValue[][] {\n return this._iterRange(range, (cell) => this.getCellValue(cell));\n }\n\n /**\n * Gets the regular or computed value from the engine.\n */\n getValue(cell: CellAddress): CellScalarValue {\n // Applies rounding and post-processing.\n invariant(this._node);\n const address = toSimpleCellAddress(this._node.sheetId, cell);\n const value = this._node.graph.hf.getCellValue(address);\n if (value instanceof DetailedCellError) {\n // TODO(wittjosiah): Error details should be shown in cell `title`.\n log.info('cell error', { cell, error: value });\n return value.toString();\n }\n\n return value;\n }\n\n /**\n * Get value type.\n */\n getValueDescription(cell: CellAddress): { type: TypeEnum; format?: FormatEnum } | undefined {\n invariant(this._node);\n const addr = toSimpleCellAddress(this._node.sheetId, cell);\n const type = this._node.graph.hf.getCellValueDetailedType(addr);\n return typeMap[type];\n }\n\n /**\n * Sets the value, updating the sheet and engine.\n */\n setValue(cell: CellAddress, value: CellScalarValue) {\n invariant(this._node);\n if (this._options.readonly) {\n throw new ReadonlyException();\n }\n\n // Reallocate if > current bounds.\n let refresh = false;\n if (cell.row >= this._sheet.rows.length) {\n insertIndices(this._sheet.rows, cell.row, 1, MAX_ROWS);\n refresh = true;\n }\n if (cell.col >= this._sheet.columns.length) {\n insertIndices(this._sheet.columns, cell.col, 1, MAX_COLUMNS);\n refresh = true;\n }\n\n if (refresh) {\n // TODO(burdon): Remove.\n this.reset();\n }\n\n // Insert into engine.\n this._node.graph.hf.setCellContents({ sheet: this._node.sheetId, row: cell.row, col: cell.col }, [\n [isFormula(value) ? this._graph.mapFormulaToNative(value) : value],\n ]);\n\n // Insert into sheet.\n const idx = addressToIndex(this._sheet, cell);\n if (value === undefined || value === null) {\n delete this._sheet.cells[idx];\n } else {\n if (isFormula(value)) {\n value = this._graph.mapFunctionBindingToId(mapFormulaRefsToIndices(this._sheet, value));\n }\n\n this._sheet.cells[idx] = { value };\n }\n }\n\n /**\n * Sets values from a simple map.\n */\n setValues(values: Record<string, CellValue>) {\n Object.entries(values).forEach(([key, { value }]) => {\n this.setValue(addressFromA1Notation(key), value);\n });\n }\n\n /**\n * Iterate range.\n */\n private _iterRange(range: CellRange, cb: (cell: CellAddress) => CellScalarValue | void): CellScalarValue[][] {\n const to = range.to ?? range.from;\n const rowRange = [Math.min(range.from.row, to.row), Math.max(range.from.row, to.row)];\n const columnRange = [Math.min(range.from.col, to.col), Math.max(range.from.col, to.col)];\n const rows: CellScalarValue[][] = [];\n for (let row = rowRange[0]; row <= rowRange[1]; row++) {\n const rowCells: CellScalarValue[] = [];\n for (let column = columnRange[0]; column <= columnRange[1]; column++) {\n const value = cb({ row, col: column });\n if (value !== undefined) {\n rowCells.push(value);\n }\n }\n\n rows.push(rowCells);\n }\n\n return rows;\n }\n\n // TODO(burdon): Delete index.\n private _deleteIndices(indices: string[], i: number, n: number) {\n throw new Error('Not implemented');\n }\n\n // TODO(burdon): Move. Cannot use fractional without changing. Switch back to using unique IDs?\n private _moveIndices(indices: string[], i: number, j: number, n: number) {\n throw new Error('Not implemented');\n }\n\n /**\n * Map from indices to A1 notation.\n */\n mapFormulaIndicesToRefs(formula: string): string {\n invariant(isFormula(formula));\n return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {\n return addressToA1Notation(addressFromIndex(this._sheet, idx));\n });\n }\n\n //\n // Values\n //\n\n /**\n * https://hyperformula.handsontable.com/guide/date-and-time-handling.html#example\n * https://hyperformula.handsontable.com/api/interfaces/configparams.html#nulldate\n * NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().\n */\n toLocalDate(num: number): Date {\n const { year, month, day, hours, minutes, seconds } = this.toDateTime(num);\n return new Date(year, month - 1, day, hours, minutes, seconds);\n }\n\n toDateTime(num: number): SimpleDateTime {\n invariant(this._node);\n return this._node.graph.hf.numberToDateTime(num) as SimpleDateTime;\n }\n\n toDate(num: number): SimpleDate {\n invariant(this._node);\n return this._node.graph.hf.numberToDate(num) as SimpleDate;\n }\n\n toTime(num: number): SimpleDate {\n invariant(this._node);\n return this._node.graph.hf.numberToTime(num) as SimpleDate;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type ComputeGraph } from '../compute-graph';\nimport { SheetModel } from '../model';\nimport { type SheetType } from '../types';\n\nexport type UseSheetModelOptions = {\n readonly?: boolean;\n};\n\nexport const useSheetModel = (\n graph?: ComputeGraph,\n sheet?: SheetType,\n { readonly }: UseSheetModelOptions = {},\n): SheetModel | undefined => {\n const [model, setModel] = useState<SheetModel>();\n useEffect(() => {\n if (!graph || !sheet) {\n return;\n }\n\n let model: SheetModel | undefined;\n const t = setTimeout(async () => {\n model = new SheetModel(graph, sheet, { readonly });\n await model.open();\n setModel(model);\n });\n\n return () => {\n clearTimeout(t);\n void model?.close();\n };\n }, [graph, sheet, readonly]);\n\n return model;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n type FocusEvent,\n type KeyboardEvent,\n type WheelEvent,\n type MouseEvent,\n useState,\n} from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport { DropdownMenu, Icon, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n closestCell,\n defaultSizeRow,\n editorKeys,\n Grid,\n GridCellEditor,\n type DxGridElement,\n type EditorKeyHandler,\n type EditorBlurHandler,\n type GridContentProps,\n type DxGridPosition,\n type DxGridCellIndex,\n parseCellIndex,\n} from '@dxos/react-ui-grid';\n\nimport { colLabelCell, rowLabelCell, useSheetModelDxGridProps } from './util';\nimport { DEFAULT_COLUMNS, DEFAULT_ROWS, rangeToA1Notation, type CellRange } from '../../defs';\nimport { rangeExtension, sheetExtension, type RangeController } from '../../extensions';\nimport { useSelectThreadOnCellFocus, useUpdateFocusedCellOnThreadSelection } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { SheetAction } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nconst inertPosition: DxGridPosition = { plane: 'grid', col: 0, row: 0 };\n\nconst initialCells = {\n grid: {},\n frozenColsStart: [...Array(64)].reduce((acc, _, i) => {\n acc[`0,${i}`] = rowLabelCell(i);\n return acc;\n }, {}),\n frozenRowsStart: [...Array(12)].reduce((acc, _, i) => {\n acc[`${i},0`] = colLabelCell(i);\n return acc;\n }, {}),\n};\n\nconst frozen = {\n frozenColsStart: 1,\n frozenRowsStart: 1,\n};\n\nconst sheetRowDefault = {\n frozenRowsStart: { size: defaultSizeRow, readonly: true },\n grid: { size: defaultSizeRow, resizeable: true },\n};\nconst sheetColDefault = { frozenColsStart: { size: 48, readonly: true }, grid: { size: 180, resizeable: true } };\n\nexport const GridSheet = () => {\n const { t } = useTranslation(SHEET_PLUGIN);\n const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } =\n useSheetContext();\n // NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us\n // a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const [extraplanarFocus, setExtraplanarFocus] = useState<DxGridPosition | null>(null);\n const dispatch = useIntentDispatcher();\n const rangeController = useRef<RangeController>();\n const { hasAttention } = useAttention(id);\n\n const handleFocus = useCallback(\n (event: FocusEvent) => {\n if (!editing) {\n const cell = closestCell(event.target);\n if (cell) {\n if (cell.plane === 'grid') {\n setCursor({ col: cell.col, row: cell.row });\n setExtraplanarFocus(null);\n } else {\n setExtraplanarFocus(cell);\n }\n } else {\n setExtraplanarFocus(null);\n }\n }\n },\n [editing],\n );\n\n // TODO(burdon): Validate formula before closing: hf.validateFormula();\n const handleClose = useCallback<EditorKeyHandler>(\n (_value, event) => {\n if (event) {\n const { key, shift } = event;\n const axis = ['Enter', 'ArrowUp', 'ArrowDown'].includes(key)\n ? 'row'\n : ['Tab', 'ArrowLeft', 'ArrowRight'].includes(key)\n ? 'col'\n : undefined;\n const delta = key.startsWith('Arrow') ? (['ArrowUp', 'ArrowLeft'].includes(key) ? -1 : 1) : shift ? -1 : 1;\n dxGrid?.refocus(axis, delta);\n }\n },\n [model, editing, dxGrid],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n (value) => {\n if (value !== undefined) {\n model.setValue(parseCellIndex(editing!.index), value);\n }\n },\n [model, editing],\n );\n\n const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(\n ({ axis, size, index: numericIndex }) => {\n if (axis === 'row') {\n const rowId = model.sheet.rows[parseInt(numericIndex)];\n model.sheet.rowMeta[rowId] ??= {};\n model.sheet.rowMeta[rowId].size = size;\n } else {\n const columnId = model.sheet.columns[parseInt(numericIndex)];\n model.sheet.columnMeta[columnId] ??= {};\n model.sheet.columnMeta[columnId].size = size;\n }\n },\n [model],\n );\n\n const handleSelect = useCallback<NonNullable<GridContentProps['onSelect']>>(\n ({ minCol, maxCol, minRow, maxRow }) => {\n const range: CellRange = { from: { col: minCol, row: minRow } };\n if (minCol !== maxCol || minRow !== maxRow) {\n range.to = { col: maxCol, row: maxRow };\n }\n if (editing) {\n // Update range selection in formula.\n rangeController.current?.setRange(rangeToA1Notation(range));\n } else {\n // Setting range while editing causes focus to move to null, avoid doing so.\n setRange(range.to ? range : undefined);\n }\n },\n [editing],\n );\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const selectEntireAxis = useCallback(\n (pos: DxGridPosition) => {\n switch (pos.plane) {\n case 'frozenRowsStart':\n return dxGrid?.setSelection({\n start: { col: pos.col, row: 0, plane: 'grid' },\n end: { col: pos.col, row: model.sheet.rows.length - 1, plane: 'grid' },\n });\n case 'frozenColsStart':\n return dxGrid?.setSelection({\n start: { row: pos.row, col: 0, plane: 'grid' },\n end: { row: pos.row, col: model.sheet.columns.length - 1, plane: 'grid' },\n });\n }\n },\n [dxGrid, model.sheet],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell) {\n selectEntireAxis(cell);\n }\n },\n [selectEntireAxis],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'Backspace':\n case 'Delete':\n event.preventDefault();\n return cursorFallbackRange && model.clear(cursorFallbackRange);\n case 'Enter':\n case 'Space':\n if (dxGrid && extraplanarFocus) {\n switch (extraplanarFocus.plane) {\n case 'frozenRowsStart':\n case 'frozenColsStart':\n event.preventDefault();\n return selectEntireAxis(extraplanarFocus);\n }\n }\n }\n if (event.metaKey || event.ctrlKey) {\n switch (event.key) {\n case 'x':\n case 'X':\n event.preventDefault();\n return cursorFallbackRange && model.cut(cursorFallbackRange);\n case 'c':\n case 'C':\n event.preventDefault();\n return cursorFallbackRange && model.copy(cursorFallbackRange);\n case 'v':\n case 'V':\n event.preventDefault();\n return cursor && model.paste(cursor);\n case 'z':\n event.preventDefault();\n return event.shiftKey ? model.redo() : model.undo();\n case 'Z':\n case 'y':\n event.preventDefault();\n return model.redo();\n }\n }\n },\n [cursorFallbackRange, model, cursor, extraplanarFocus, selectEntireAxis],\n );\n\n const contextMenuAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [contextMenuOpen, setContextMenuOpen] = useState<DxGridPosition | null>(null);\n const contextMenuAxis = contextMenuOpen?.plane.startsWith('frozenRows') ? 'col' : 'row';\n\n const handleContextMenu = useCallback((event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell && cell.plane.startsWith('frozen')) {\n event.preventDefault();\n contextMenuAnchorRef.current = event.target as HTMLButtonElement;\n setContextMenuOpen(cell);\n }\n }, []);\n\n const handleAxisMenuAction = useCallback(\n (operation: 'insert-before' | 'insert-after' | 'drop') => {\n switch (operation) {\n case 'insert-before':\n case 'insert-after':\n return dispatch({\n action: SheetAction.INSERT_AXIS,\n data: {\n model,\n axis: contextMenuAxis,\n index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),\n } satisfies SheetAction.InsertAxis,\n });\n break;\n case 'drop':\n return dispatch({\n action: SheetAction.DROP_AXIS,\n data: {\n model,\n axis: contextMenuAxis,\n axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],\n } satisfies SheetAction.DropAxis,\n });\n }\n },\n [contextMenuAxis, contextMenuOpen, model, dispatch],\n );\n\n const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);\n\n const extension = useMemo(\n () => [\n editorKeys({ onClose: handleClose, ...(editing?.initialContent && { onNav: handleClose }) }),\n sheetExtension({ functions: model.graph.getFunctions() }),\n rangeExtension({\n onInit: (fn) => (rangeController.current = fn),\n onStateChange: (state) => {\n if (dxGrid) {\n // This can’t dispatch a setState in this component, otherwise the cell editor remounts and loses focus.\n dxGrid.mode = typeof state.activeRange === 'undefined' ? 'edit' : 'edit-select';\n }\n },\n }),\n ],\n [model, handleClose, editing],\n );\n\n const getCellContent = useCallback(\n (index: DxGridCellIndex) => {\n return model.getCellText(parseCellIndex(index));\n },\n [model],\n );\n\n useUpdateFocusedCellOnThreadSelection(dxGrid);\n useSelectThreadOnCellFocus();\n\n return (\n <div role='none' className='relative min-bs-0'>\n <GridCellEditor getCellContent={getCellContent} extension={extension} onBlur={handleBlur} />\n <Grid.Content\n initialCells={initialCells}\n limitColumns={DEFAULT_COLUMNS}\n limitRows={DEFAULT_ROWS}\n columns={columns}\n rows={rows}\n onAxisResize={handleAxisResize}\n onSelect={handleSelect}\n rowDefault={sheetRowDefault}\n columnDefault={sheetColDefault}\n frozen={frozen}\n onFocus={handleFocus}\n onWheelCapture={handleWheel}\n onKeyDown={handleKeyDown}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n overscroll='trap'\n className='[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:border-bs [&_.dx-grid]:absolute [&_.dx-grid]:inset-0 [&_.dx-grid]:border-separator'\n activeRefs={activeRefs}\n ref={setDxGrid}\n />\n <DropdownMenu.Root\n modal={false}\n open={!!contextMenuOpen}\n onOpenChange={(nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)}\n >\n <DropdownMenu.VirtualTrigger virtualRef={contextMenuAnchorRef} />\n <DropdownMenu.Content side={contextMenuAxis === 'col' ? 'bottom' : 'right'} sideOffset={4} collisionPadding={8}>\n <DropdownMenu.Viewport>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-before')}\n data-testid={`grid.${contextMenuAxis}.insert-before`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-left--regular' : 'ph--rows-plus-top--regular'}\n />\n <span>{t(`add ${contextMenuAxis} before label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-after')}\n data-testid={`grid.${contextMenuAxis}.insert-after`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-right--regular' : 'ph--rows-plus-bottom--regular'}\n />\n <span>{t(`add ${contextMenuAxis} after label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('drop')}\n data-testid={`grid.${contextMenuAxis}.drop`}\n >\n <Icon size={5} icon='ph--backspace--regular' />\n <span>{t(`delete ${contextMenuAxis} label`)}</span>\n </DropdownMenu.Item>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';\nimport { parseValue, cellClassesForFieldType } from '@dxos/react-ui-form';\nimport {\n type GridContentProps,\n type DxGridElement,\n type DxGridAxisMeta,\n type DxGridPlane,\n type DxGridPlaneRange,\n type DxGridPlaneCells,\n type DxGridCellValue,\n colToA1Notation,\n rowToA1Notation,\n commentedClassName,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { inRange, cellClassNameForRange, rangeFromIndex } from '../../defs';\nimport { parseThreadAnchorAsCellRange } from '../../integrations';\nimport { type SheetModel } from '../../model';\n\nconst createDxGridColumns = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.columns.reduce(\n (acc: DxGridAxisMeta, columnId, numericIndex) => {\n if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {\n acc.grid[numericIndex] = { size: model.sheet.columnMeta[columnId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst createDxGridRows = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.rows.reduce(\n (acc: DxGridAxisMeta, rowId, numericIndex) => {\n if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {\n acc.grid[numericIndex] = { size: model.sheet.rowMeta[rowId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst projectCellProps = (model: SheetModel, col: number, row: number): DxGridCellValue => {\n const address = { col, row };\n const rawValue = model.getValue(address);\n const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));\n const threadRefs = model.sheet.threads\n ?.filter((thread) => {\n const range = thread?.anchor && parseThreadAnchorAsCellRange(thread!.anchor);\n return thread && range ? inRange(range, address) : false;\n })\n .map((thread) => fullyQualifiedId(thread!))\n .join(' ');\n\n const description = model.getValueDescription(address);\n const type = description?.type;\n const format = description?.format;\n const classNames = ranges?.map(cellClassNameForRange).reverse();\n\n return {\n value: parseValue({ type, format, value: rawValue }),\n className: mx(cellClassesForFieldType({ type, format }), threadRefs && commentedClassName, classNames),\n dataRefs: threadRefs,\n };\n};\nconst gridCellGetter = (model: SheetModel) => {\n // TODO(thure): Actually use the cache.\n const cachedGridCells: DxGridPlaneCells = {};\n return (nextBounds: DxGridPlaneRange): DxGridPlaneCells => {\n [...Array(nextBounds.end.col - nextBounds.start.col)].forEach((_, c0) => {\n return [...Array(nextBounds.end.row - nextBounds.start.row)].forEach((_, r0) => {\n const col = nextBounds.start.col + c0;\n const row = nextBounds.start.row + r0;\n cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);\n });\n });\n return cachedGridCells;\n };\n};\n\nexport const rowLabelCell = (row: number) => ({\n value: rowToA1Notation(row),\n className: 'text-end !pie-1 text-subdued',\n resizeHandle: 'row',\n});\n\nexport const colLabelCell = (col: number) => ({\n value: colToA1Notation(col),\n className: 'text-subdued',\n resizeHandle: 'col',\n});\n\nconst cellGetter = (model: SheetModel) => {\n const getGridCells = gridCellGetter(model);\n return (nextBounds: DxGridPlaneRange, plane: DxGridPlane): DxGridPlaneCells => {\n switch (plane) {\n case 'grid':\n return getGridCells(nextBounds);\n case 'frozenColsStart':\n return [...Array(nextBounds.end.row - nextBounds.start.row)].reduce((acc, _, r0) => {\n const r = nextBounds.start.row + r0;\n acc[`0,${r}`] = rowLabelCell(r);\n return acc;\n }, {});\n case 'frozenRowsStart':\n return [...Array(nextBounds.end.col - nextBounds.start.col)].reduce((acc, _, c0) => {\n const c = nextBounds.start.col + c0;\n acc[`${c},0`] = colLabelCell(c);\n return acc;\n }, {});\n default:\n return {};\n }\n };\n};\n\nexport const useSheetModelDxGridProps = (\n dxGrid: DxGridElement | null,\n model: SheetModel,\n): Pick<GridContentProps, 'columns' | 'rows'> => {\n const [columns, setColumns] = useState<DxGridAxisMeta>(createDxGridColumns(model));\n const [rows, setRows] = useState<DxGridAxisMeta>(createDxGridRows(model));\n\n useEffect(() => {\n const cellsAccessor = createDocAccessor(model.sheet, ['cells']);\n if (dxGrid) {\n dxGrid.getCells = cellGetter(model);\n }\n const handleCellsUpdate = () => {\n dxGrid?.requestUpdate('initialCells');\n };\n cellsAccessor.handle.addListener('change', handleCellsUpdate);\n const unsubscribe = model.graph.update.on(handleCellsUpdate);\n return () => {\n cellsAccessor.handle.removeListener('change', handleCellsUpdate);\n unsubscribe();\n };\n }, [model, dxGrid]);\n\n useEffect(() => {\n const columnMetaAccessor = createDocAccessor(model.sheet, ['columnMeta']);\n const rowMetaAccessor = createDocAccessor(model.sheet, ['rowMeta']);\n const handleColumnMetaUpdate = () => {\n setColumns(createDxGridColumns(model));\n };\n const handleRowMetaUpdate = () => {\n setRows(createDxGridRows(model));\n };\n columnMetaAccessor.handle.addListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.addListener('change', handleRowMetaUpdate);\n return () => {\n columnMetaAccessor.handle.removeListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.removeListener('change', handleRowMetaUpdate);\n };\n }, [model, dxGrid]);\n\n return { columns, rows };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport { type IntentResolver, LayoutAction, useIntentDispatcher, useIntentResolver } from '@dxos/app-framework';\nimport { debounce } from '@dxos/async';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { type DxGridElement, type DxGridPosition } from '@dxos/react-ui-grid';\n\nimport { useSheetContext } from '../components';\nimport { type CellAddress, type CompleteCellRange, inRange } from '../defs';\nimport { SHEET_PLUGIN } from '../meta';\n\nexport const completeCellRangeToThreadCursor = (range: CompleteCellRange): string => {\n return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;\n};\n\nexport const parseThreadAnchorAsCellRange = (cursor: string): CompleteCellRange | null => {\n const coords = cursor.split(',');\n if (coords.length !== 4) {\n return null;\n } else {\n const [fromCol, fromRow, toCol, toRow] = coords;\n return {\n from: { col: parseInt(fromCol), row: parseInt(fromRow) },\n to: { col: parseInt(toCol), row: parseInt(toRow) },\n };\n }\n};\n\nexport const useUpdateFocusedCellOnThreadSelection = (grid: DxGridElement | null) => {\n const { model, setActiveRefs } = useSheetContext();\n const handleScrollIntoView: IntentResolver = useCallback(\n ({ action, data }) => {\n switch (action) {\n case LayoutAction.SCROLL_INTO_VIEW: {\n if (!data?.id || data?.cursor === undefined || data?.id !== fullyQualifiedId(model.sheet)) {\n return;\n }\n setActiveRefs(data.thread);\n // TODO(Zan): Everywhere we refer to the cursor in a thread context should change to `anchor`.\n const range = parseThreadAnchorAsCellRange(data.cursor);\n range && grid?.setFocus({ ...range.to, plane: 'grid' }, true);\n\n return { data: true };\n }\n }\n },\n [model.sheet, setActiveRefs],\n );\n\n useIntentResolver(SHEET_PLUGIN, handleScrollIntoView);\n};\n\nexport const useSelectThreadOnCellFocus = () => {\n const { model, cursor } = useSheetContext();\n const dispatch = useIntentDispatcher();\n\n const threads = useMemo(\n () => model.sheet.threads?.filter((thread): thread is NonNullable<typeof thread> => !!thread) ?? [],\n [\n // TODO(thure): Surely we can find a better dependency for this…\n JSON.stringify(model.sheet.threads),\n ],\n );\n\n const selectClosestThread = useCallback(\n (cellAddress: CellAddress) => {\n if (!cellAddress || !threads) {\n return;\n }\n\n const closestThread = threads?.find(({ anchor }) => {\n if (anchor) {\n const range = parseThreadAnchorAsCellRange(anchor);\n return range ? inRange(range, cellAddress) : false;\n } else {\n return false;\n }\n });\n\n if (closestThread) {\n void dispatch([\n { action: 'dxos.org/plugin/thread/action/select', data: { current: fullyQualifiedId(closestThread) } },\n ]);\n }\n },\n [dispatch, threads],\n );\n\n const debounced = useMemo(() => {\n return debounce((cellCoords: DxGridPosition) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);\n }, [selectClosestThread]);\n\n useEffect(() => {\n if (!cursor) {\n return;\n }\n debounced(cursor);\n }, [cursor, debounced]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './ComputeGraph';\nexport * from './GridSheet';\nexport * from './RangeList';\nexport * from './SheetContext';\nexport * from './SheetObjectSettings';\n\nexport const SheetContainer = lazy(() => import('./SheetContainer'));\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport { useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover } from '@dxos/react-ui-theme';\n\nimport { rangeFromIndex, rangeToA1Notation } from '../../defs';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { Range, type SheetType } from '../../types';\n\nexport type RangeListProps = {\n sheet: SheetType;\n};\n\nexport const RangeList = ({ sheet }: RangeListProps) => {\n const { t } = useTranslation(SHEET_PLUGIN);\n // TODO(thure): Implement similar to comments, #8121\n const handleSelectRange = (range: Range) => {};\n const handleDeleteRange = useCallback(\n (range: Range) => {\n const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);\n sheet.ranges.splice(index, 1);\n },\n [sheet],\n );\n return (\n <>\n <h2 className='p-2 text-sm font-semibold'>{t('range list heading')}</h2>\n <List.Root<Range> items={sheet.ranges} isItem={S.is(Range)}>\n {({ items: ranges }) =>\n ranges.map((range, i) => (\n <List.Item key={i} item={range} classNames={['p-2', ghostHover]}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleSelectRange(range)}>\n {t('range title', {\n position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),\n key: t(`range key ${range.key} label`),\n value: t(`range value ${range.value} label`),\n })}\n </List.ItemTitle>\n <List.ItemDeleteButton onClick={() => handleDeleteRange(range)} />\n </List.Item>\n ))\n }\n </List.Root>\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { SPACE_PLUGIN } from '@dxos/plugin-space/meta';\nimport { Input, useTranslation } from '@dxos/react-ui';\n\nimport { RangeList } from './RangeList';\nimport { type SheetType } from '../types';\n\nexport type SheetObjectSettingsProps = {\n sheet: SheetType;\n};\n\nexport const SheetObjectSettings = ({ sheet }: SheetObjectSettingsProps) => {\n const { t } = useTranslation(SPACE_PLUGIN);\n\n // TODO(burdon): Standardize forms.\n return (\n <>\n <div role='form' className='flex flex-col w-full p-2 gap-1'>\n <Input.Root>\n <Input.Label>{t('name label')}</Input.Label>\n <Input.TextInput\n placeholder={t('name placeholder')}\n value={sheet.name ?? ''}\n onChange={(event) => {\n sheet.name = event.target.value;\n }}\n />\n </Input.Root>\n </div>\n <RangeList sheet={sheet} />\n </>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "createContext", "useContext", "raise", "useAsyncState", "ComputeGraphContext", "createContext", "undefined", "ComputeGraphContextProvider", "registry", "children", "Provider", "value", "useComputeGraph", "space", "useContext", "raise", "Error", "graph", "useAsyncState", "getOrCreateGraph", "open", "syntaxTree", "RangeSetBuilder", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "debounce", "invariant", "documentId", "singleValueFacet", "updateAllDecorations", "StateEffect", "define", "computeGraphFacet", "singleValueFacet", "acceptCompletion", "autocompletion", "completionStatus", "startCompletion", "HighlightStyle", "syntaxHighlighting", "ViewPlugin", "keymap", "tags", "spreadsheet", "singleValueFacet", "mx", "highlightStyles", "HighlightStyle", "define", "tag", "tags", "name", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "singleValueFacet", "sheetExtension", "debug", "functions", "extension", "language", "spreadsheet", "idiom", "decimalSeparator", "createCompletion", "section", "description", "syntax", "find", "value", "label", "info", "root", "document", "createElement", "className", "title", "innerText", "appendChild", "detail", "apply", "view", "completion", "from", "to", "insertParens", "state", "doc", "toString", "length", "dispatch", "update", "changes", "insert", "selection", "anchor", "of", "data", "autocomplete", "context", "match", "matchBefore", "text", "toUpperCase", "explicit", "options", "filter", "startsWith", "map", "syntaxHighlighting", "autocompletion", "aboveCursor", "defaultKeymap", "activateOnTyping", "closeOnBlur", "icons", "tooltipClass", "mx", "keymap", "key", "run", "completionStatus", "acceptCompletion", "startCompletion", "rangeExtension", "onInit", "onStateChange", "activeRange", "notifier", "setRange", "range", "focus", "ViewPlugin", "fromClass", "constructor", "_view", "ranges", "undefined", "facet", "topNode", "parser", "parse", "visitTree", "type", "str", "sliceString", "RANGE_NOTATION", "test", "node", "callback", "child", "firstChild", "nextSibling", "React", "createContext", "useCallback", "useContext", "useState", "invariant", "fullyQualifiedId", "Grid", "useGridContext", "Event", "Resource", "getTypename", "FormatEnum", "TypeEnum", "invariant", "PublicKey", "log", "DetailedCellError", "ExportedCellChange", "typeMap", "BOOLEAN", "type", "TypeEnum", "Boolean", "NUMBER_RAW", "Number", "NUMBER_PERCENT", "format", "FormatEnum", "Percent", "NUMBER_CURRENCY", "Currency", "NUMBER_DATETIME", "String", "DateTime", "NUMBER_DATE", "Date", "NUMBER_TIME", "Time", "getTopLeft", "range", "to", "from", "row", "Math", "min", "col", "toSimpleCellAddress", "sheet", "cell", "toModelRange", "start", "end", "SheetModel", "Resource", "constructor", "_graph", "_sheet", "_options", "id", "PublicKey", "random", "truncate", "update", "Event", "graph", "readonly", "bounds", "rows", "length", "columns", "_open", "log", "initialize", "on", "event", "reset", "_node", "getOrCreateNode", "createSheetName", "getTypename", "open", "unsubscribe", "emit", "_ctx", "onDispose", "invariant", "hf", "clearSheet", "sheetId", "Object", "entries", "cells", "forEach", "key", "value", "addressFromIndex", "isFormula", "binding", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "mapFormulaToNative", "setCellContents", "recalculate", "rebuildAndRecalculate", "insertRows", "i", "n", "idx", "insertIndices", "MAX_ROWS", "insertColumns", "MAX_COLUMNS", "dropRow", "rowIndex", "values", "getCellValues", "flat", "index", "indexOf", "clear", "splice", "rowMeta", "axis", "axisIndex", "axisMeta", "dropColumn", "colIndex", "columnMeta", "restoreRow", "restoreColumn", "topLeft", "_iterRange", "addressToIndex", "cut", "copy", "paste", "isClipboardEmpty", "changes", "change", "ExportedCellChange", "address", "newValue", "undo", "isThereSomethingToUndo", "redo", "isThereSomethingToRedo", "getCellValue", "getCellText", "undefined", "getValue", "DetailedCellError", "info", "error", "toString", "getValueDescription", "addr", "getCellValueDetailedType", "setValue", "ReadonlyException", "refresh", "mapFunctionBindingToId", "mapFormulaRefsToIndices", "setValues", "addressFromA1Notation", "cb", "rowRange", "max", "columnRange", "rowCells", "column", "push", "_deleteIndices", "indices", "Error", "_moveIndices", "j", "formula", "replace", "addressToA1Notation", "toLocalDate", "num", "year", "month", "day", "hours", "minutes", "seconds", "toDateTime", "numberToDateTime", "toDate", "numberToDate", "toTime", "numberToTime", "useEffect", "useState", "useSheetModel", "graph", "sheet", "readonly", "model", "setModel", "useState", "useEffect", "t", "setTimeout", "SheetModel", "open", "clearTimeout", "close", "SheetContext", "createContext", "undefined", "useSheetContext", "context", "useContext", "invariant", "SheetProviderImpl", "model", "onInfo", "ignoreAttention", "children", "__gridScope", "id", "editing", "setEditing", "useGridContext", "cursor", "setCursorInternal", "useState", "range", "setRangeInternal", "cursorFallbackRange", "setCursorFallbackRange", "activeRefs", "setActiveRefs", "setCursor", "useCallback", "nextCursor", "to", "from", "setRange", "nextRange", "React", "Provider", "value", "SheetProvider", "graph", "sheet", "readonly", "useSheetModel", "Grid", "Root", "fullyQualifiedId", "React", "useCallback", "useMemo", "useRef", "useState", "useIntentDispatcher", "DropdownMenu", "Icon", "useTranslation", "useAttention", "closestCell", "defaultSizeRow", "editorKeys", "Grid", "GridCellEditor", "parseCellIndex", "useEffect", "useState", "createDocAccessor", "fullyQualifiedId", "parseValue", "cellClassesForFieldType", "colToA1Notation", "rowToA1Notation", "commentedClassName", "mx", "useCallback", "useEffect", "useMemo", "LayoutAction", "useIntentDispatcher", "useIntentResolver", "debounce", "fullyQualifiedId", "lazy", "React", "useCallback", "S", "useTranslation", "List", "ghostHover", "RangeList", "sheet", "t", "useTranslation", "SHEET_PLUGIN", "handleSelectRange", "range", "handleDeleteRange", "useCallback", "index", "ranges", "findIndex", "sheetRange", "splice", "React", "h2", "className", "List", "Root", "items", "isItem", "S", "is", "Range", "map", "i", "Item", "key", "item", "classNames", "ghostHover", "ItemDragHandle", "ItemTitle", "onClick", "position", "rangeToA1Notation", "rangeFromIndex", "value", "ItemDeleteButton", "React", "SPACE_PLUGIN", "Input", "useTranslation", "SheetObjectSettings", "sheet", "t", "useTranslation", "SPACE_PLUGIN", "React", "div", "role", "className", "Input", "Root", "Label", "TextInput", "placeholder", "value", "name", "onChange", "event", "target", "RangeList", "SheetContainer", "lazy", "completeCellRangeToThreadCursor", "range", "from", "col", "row", "to", "parseThreadAnchorAsCellRange", "cursor", "coords", "split", "length", "fromCol", "fromRow", "toCol", "toRow", "parseInt", "useUpdateFocusedCellOnThreadSelection", "grid", "model", "setActiveRefs", "useSheetContext", "handleScrollIntoView", "useCallback", "action", "data", "LayoutAction", "SCROLL_INTO_VIEW", "id", "undefined", "fullyQualifiedId", "sheet", "thread", "setFocus", "plane", "useIntentResolver", "SHEET_PLUGIN", "useSelectThreadOnCellFocus", "dispatch", "useIntentDispatcher", "threads", "useMemo", "filter", "JSON", "stringify", "selectClosestThread", "cellAddress", "closestThread", "find", "anchor", "inRange", "current", "debounced", "debounce", "cellCoords", "requestAnimationFrame", "useEffect", "createDxGridColumns", "model", "sheet", "columns", "reduce", "acc", "columnId", "numericIndex", "columnMeta", "size", "grid", "resizeable", "createDxGridRows", "rows", "rowId", "rowMeta", "projectCellProps", "col", "row", "address", "rawValue", "getValue", "ranges", "filter", "range", "inRange", "rangeFromIndex", "threadRefs", "threads", "thread", "anchor", "parseThreadAnchorAsCellRange", "map", "fullyQualifiedId", "join", "description", "getValueDescription", "type", "format", "classNames", "cellClassNameForRange", "reverse", "value", "parseValue", "className", "mx", "cellClassesForFieldType", "commentedClassName", "dataRefs", "gridCellGetter", "cachedGridCells", "nextBounds", "Array", "end", "start", "forEach", "_", "c0", "r0", "rowLabelCell", "rowToA1Notation", "resizeHandle", "colLabelCell", "colToA1Notation", "cellGetter", "getGridCells", "plane", "r", "c", "useSheetModelDxGridProps", "dxGrid", "setColumns", "useState", "setRows", "useEffect", "cellsAccessor", "createDocAccessor", "getCells", "handleCellsUpdate", "requestUpdate", "handle", "addListener", "unsubscribe", "graph", "update", "on", "removeListener", "columnMetaAccessor", "rowMetaAccessor", "handleColumnMetaUpdate", "handleRowMetaUpdate", "inertPosition", "plane", "col", "row", "initialCells", "grid", "frozenColsStart", "Array", "reduce", "acc", "_", "i", "rowLabelCell", "frozenRowsStart", "colLabelCell", "frozen", "sheetRowDefault", "size", "defaultSizeRow", "readonly", "resizeable", "sheetColDefault", "GridSheet", "t", "useTranslation", "SHEET_PLUGIN", "id", "model", "editing", "setCursor", "setRange", "cursor", "cursorFallbackRange", "activeRefs", "ignoreAttention", "useSheetContext", "dxGrid", "setDxGrid", "useState", "extraplanarFocus", "setExtraplanarFocus", "dispatch", "useIntentDispatcher", "rangeController", "useRef", "hasAttention", "useAttention", "handleFocus", "useCallback", "event", "cell", "closestCell", "target", "handleClose", "_value", "key", "shift", "axis", "includes", "undefined", "delta", "startsWith", "refocus", "handleBlur", "value", "setValue", "parseCellIndex", "index", "handleAxisResize", "numericIndex", "rowId", "sheet", "rows", "parseInt", "rowMeta", "columnId", "columns", "columnMeta", "handleSelect", "minCol", "maxCol", "minRow", "maxRow", "range", "from", "to", "current", "rangeToA1Notation", "handleWheel", "stopPropagation", "selectEntireAxis", "pos", "setSelection", "start", "end", "length", "handleClick", "handleKeyDown", "preventDefault", "clear", "metaKey", "ctrlKey", "cut", "copy", "paste", "shiftKey", "redo", "undo", "contextMenuAnchorRef", "contextMenuOpen", "setContextMenuOpen", "contextMenuAxis", "handleContextMenu", "handleAxisMenuAction", "operation", "action", "SheetAction", "INSERT_AXIS", "data", "DROP_AXIS", "axisIndex", "useSheetModelDxGridProps", "extension", "useMemo", "editorKeys", "onClose", "initialContent", "onNav", "sheetExtension", "functions", "graph", "getFunctions", "rangeExtension", "onInit", "fn", "onStateChange", "state", "mode", "activeRange", "getCellContent", "getCellText", "useUpdateFocusedCellOnThreadSelection", "useSelectThreadOnCellFocus", "React", "div", "role", "className", "GridCellEditor", "onBlur", "Grid", "Content", "limitColumns", "DEFAULT_COLUMNS", "limitRows", "DEFAULT_ROWS", "onAxisResize", "onSelect", "rowDefault", "columnDefault", "onFocus", "onWheelCapture", "onKeyDown", "onContextMenu", "onClick", "overscroll", "ref", "DropdownMenu", "Root", "modal", "open", "onOpenChange", "nextOpen", "VirtualTrigger", "virtualRef", "side", "sideOffset", "collisionPadding", "Viewport", "Item", "data-testid", "Icon", "icon", "span", "Arrow"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SheetType
3
- } from "./chunk-BVUN7SHF.mjs";
3
+ } from "./chunk-JXFPOYNA.mjs";
4
4
 
5
5
  // packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts
6
6
  import { Event as Event2 } from "@dxos/async";
@@ -8,7 +8,7 @@ import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
8
8
  import { FQ_ID_LENGTH } from "@dxos/client/echo";
9
9
  import { Resource as Resource2 } from "@dxos/context";
10
10
  import { getTypename } from "@dxos/echo-schema";
11
- import { invariant as invariant2 } from "@dxos/invariant";
11
+ import { invariant as invariant3 } from "@dxos/invariant";
12
12
  import { PublicKey } from "@dxos/keys";
13
13
  import { log as log3 } from "@dxos/log";
14
14
  import { FunctionType as FunctionType2 } from "@dxos/plugin-script/types";
@@ -68,7 +68,7 @@ var posEquals = (a, b) => {
68
68
  var columnLetter = (col) => {
69
69
  invariant(col < MAX_COLUMNS, `Invalid column: ${col}`, {
70
70
  F: __dxlog_file,
71
- L: 31,
71
+ L: 32,
72
72
  S: void 0,
73
73
  A: [
74
74
  "col < MAX_COLUMNS",
@@ -84,7 +84,7 @@ var addressFromA1Notation = (ref) => {
84
84
  const match = ref.match(/([A-Z]+)(\d+)/);
85
85
  invariant(match, `Invalid notation: ${ref}`, {
86
86
  F: __dxlog_file,
87
- L: 45,
87
+ L: 46,
88
88
  S: void 0,
89
89
  A: [
90
90
  "match",
@@ -102,6 +102,13 @@ var rangeToA1Notation = (range) => {
102
102
  range?.to && addressToA1Notation(range?.to)
103
103
  ].filter(Boolean).join(":");
104
104
  };
105
+ var rangeFromA1Notation = (ref) => {
106
+ const [from, to] = ref.split(":").map(addressFromA1Notation);
107
+ return {
108
+ from,
109
+ to
110
+ };
111
+ };
105
112
  var inRange = (range, cell) => {
106
113
  if (!range) {
107
114
  return false;
@@ -125,7 +132,9 @@ var inRange = (range, cell) => {
125
132
 
126
133
  // packages/plugins/plugin-sheet/src/defs/util.ts
127
134
  import { randomBytes } from "@dxos/crypto";
128
- import { create } from "@dxos/echo-schema";
135
+ import { invariant as invariant2 } from "@dxos/invariant";
136
+ import { create } from "@dxos/live-object";
137
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/defs/util.ts";
129
138
  var ApiError = class extends Error {
130
139
  };
131
140
  var ReadonlyException = class extends ApiError {
@@ -175,6 +184,9 @@ var createSheet = ({ name, cells, ...size } = {}) => {
175
184
  if (cells) {
176
185
  Object.entries(cells).forEach(([key, { value }]) => {
177
186
  const idx = addressToIndex(sheet, addressFromA1Notation(key));
187
+ if (isFormula(value)) {
188
+ value = mapFormulaRefsToIndices(sheet, value);
189
+ }
178
190
  sheet.cells[idx] = {
179
191
  value
180
192
  };
@@ -214,6 +226,34 @@ var compareIndexPositions = (sheet, indexA, indexB) => {
214
226
  return columnA - columnB;
215
227
  }
216
228
  };
229
+ var mapFormulaRefsToIndices = (sheet, formula) => {
230
+ invariant2(isFormula(formula), void 0, {
231
+ F: __dxlog_file2,
232
+ L: 153,
233
+ S: void 0,
234
+ A: [
235
+ "isFormula(formula)",
236
+ ""
237
+ ]
238
+ });
239
+ return formula.replace(/([a-zA-Z]+)([0-9]+)/g, (match) => {
240
+ return addressToIndex(sheet, addressFromA1Notation(match));
241
+ });
242
+ };
243
+ var mapFormulaIndicesToRefs = (sheet, formula) => {
244
+ invariant2(isFormula(formula), void 0, {
245
+ F: __dxlog_file2,
246
+ L: 163,
247
+ S: void 0,
248
+ A: [
249
+ "isFormula(formula)",
250
+ ""
251
+ ]
252
+ });
253
+ return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
254
+ return addressToA1Notation(addressFromIndex(sheet, idx));
255
+ });
256
+ };
217
257
 
218
258
  // packages/plugins/plugin-sheet/src/compute-graph/compute-node.ts
219
259
  var ComputeNode = class extends Resource {
@@ -262,7 +302,7 @@ import defaultsDeep from "lodash.defaultsdeep";
262
302
  import { debounce } from "@dxos/async";
263
303
  import { log } from "@dxos/log";
264
304
  import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "#hyperformula";
265
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/functions/async-function.ts";
305
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/functions/async-function.ts";
266
306
  var defaultFunctionContextOptions = {
267
307
  defaultTtl: 5e3,
268
308
  debounceDelay: 200,
@@ -286,7 +326,7 @@ var FunctionContext = class _FunctionContext {
286
326
  this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
287
327
  this._onUpdate = debounce((update) => {
288
328
  log("update", update, {
289
- F: __dxlog_file2,
329
+ F: __dxlog_file3,
290
330
  L: 86,
291
331
  S: this,
292
332
  C: (f, a) => f(...a)
@@ -342,7 +382,7 @@ var FunctionContext = class _FunctionContext {
342
382
  cell,
343
383
  value: value2
344
384
  }, {
345
- F: __dxlog_file2,
385
+ F: __dxlog_file3,
346
386
  L: 144,
347
387
  S: this,
348
388
  C: (f, a) => f(...a)
@@ -356,7 +396,7 @@ var FunctionContext = class _FunctionContext {
356
396
  cell,
357
397
  err
358
398
  }, {
359
- F: __dxlog_file2,
399
+ F: __dxlog_file3,
360
400
  L: 148,
361
401
  S: this,
362
402
  C: (f, a) => f(...a)
@@ -376,7 +416,7 @@ var FunctionContext = class _FunctionContext {
376
416
  args,
377
417
  cache: value
378
418
  }, {
379
- F: __dxlog_file2,
419
+ F: __dxlog_file3,
380
420
  L: 156,
381
421
  S: this,
382
422
  C: (f, a) => f(...a)
@@ -408,7 +448,7 @@ import { getUserFunctionUrlInMetadata } from "@dxos/plugin-script/edge";
408
448
  import { FunctionType } from "@dxos/plugin-script/types";
409
449
  import { nonNullable } from "@dxos/util";
410
450
  import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "#hyperformula";
411
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/functions/edge-function.ts";
451
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/functions/edge-function.ts";
412
452
  var EDGE_FUNCTION_NAME = "DX";
413
453
  var FUNCTION_TTL = 1e4;
414
454
  var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
@@ -425,7 +465,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
425
465
  log2.info("Function not found", {
426
466
  binding
427
467
  }, {
428
- F: __dxlog_file3,
468
+ F: __dxlog_file4,
429
469
  L: 41,
430
470
  S: this,
431
471
  C: (f, a) => f(...a)
@@ -437,7 +477,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
437
477
  log2("function changed", {
438
478
  fn
439
479
  }, {
440
- F: __dxlog_file3,
480
+ F: __dxlog_file4,
441
481
  L: 47,
442
482
  S: this,
443
483
  C: (f, a) => f(...a)
@@ -463,7 +503,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
463
503
  log2("function executed", {
464
504
  result
465
505
  }, {
466
- F: __dxlog_file3,
506
+ F: __dxlog_file4,
467
507
  L: 65,
468
508
  S: this,
469
509
  C: (f, a) => f(...a)
@@ -2904,7 +2944,7 @@ var defaultFunctions = [
2904
2944
  ];
2905
2945
 
2906
2946
  // packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts
2907
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts";
2947
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts";
2908
2948
  var UNKNOWN_BINDING = "__UNKNOWN__";
2909
2949
  var createSheetName = ({ type, id }) => `${type}@${id}`;
2910
2950
  var parseSheetName = (name) => {
@@ -2981,8 +3021,8 @@ var ComputeGraph = class extends Resource2 {
2981
3021
  // E.g., Cross-object reference would be stored as "ObjectId!A1"
2982
3022
  // The graph would then load the object and create a ComputeNode (model) of the appropriate type.
2983
3023
  getOrCreateNode(name) {
2984
- invariant2(name.length, void 0, {
2985
- F: __dxlog_file4,
3024
+ invariant3(name.length, void 0, {
3025
+ F: __dxlog_file5,
2986
3026
  L: 129,
2987
3027
  S: this,
2988
3028
  A: [
@@ -2995,7 +3035,7 @@ var ComputeGraph = class extends Resource2 {
2995
3035
  space: this._space?.id,
2996
3036
  sheet: name
2997
3037
  }, {
2998
- F: __dxlog_file4,
3038
+ F: __dxlog_file5,
2999
3039
  L: 131,
3000
3040
  S: this,
3001
3041
  C: (f, a) => f(...a)
@@ -3003,8 +3043,8 @@ var ComputeGraph = class extends Resource2 {
3003
3043
  this._hf.addSheet(name);
3004
3044
  }
3005
3045
  const sheetId = this._hf.getSheetId(name);
3006
- invariant2(sheetId !== void 0, void 0, {
3007
- F: __dxlog_file4,
3046
+ invariant3(sheetId !== void 0, void 0, {
3047
+ F: __dxlog_file5,
3008
3048
  L: 136,
3009
3049
  S: this,
3010
3050
  A: [
@@ -3113,10 +3153,10 @@ var ComputeGraph = class extends Resource2 {
3113
3153
  // packages/plugins/plugin-sheet/src/compute-graph/compute-graph-registry.ts
3114
3154
  import defaultsDeep2 from "lodash.defaultsdeep";
3115
3155
  import { Resource as Resource3 } from "@dxos/context";
3116
- import { invariant as invariant3 } from "@dxos/invariant";
3156
+ import { invariant as invariant4 } from "@dxos/invariant";
3117
3157
  import { log as log4 } from "@dxos/log";
3118
3158
  import { HyperFormula } from "#hyperformula";
3119
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/compute-graph-registry.ts";
3159
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/compute-graph-registry.ts";
3120
3160
  var defaultOptions = {
3121
3161
  licenseKey: "gpl-v3"
3122
3162
  };
@@ -3146,7 +3186,7 @@ var ComputeGraphRegistry = class extends Resource3 {
3146
3186
  log4("create graph", {
3147
3187
  space: space.id
3148
3188
  }, {
3149
- F: __dxlog_file5,
3189
+ F: __dxlog_file6,
3150
3190
  L: 69,
3151
3191
  S: this,
3152
3192
  C: (f, a) => f(...a)
@@ -3156,8 +3196,8 @@ var ComputeGraphRegistry = class extends Resource3 {
3156
3196
  return graph;
3157
3197
  }
3158
3198
  createGraph(space) {
3159
- invariant3(!this._graphs.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
3160
- F: __dxlog_file5,
3199
+ invariant4(!this._graphs.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
3200
+ F: __dxlog_file6,
3161
3201
  L: 77,
3162
3202
  S: this,
3163
3203
  A: [
@@ -3180,6 +3220,7 @@ var ComputeGraphRegistry = class extends Resource3 {
3180
3220
 
3181
3221
  export {
3182
3222
  alignKey,
3223
+ commentKey,
3183
3224
  styleKey,
3184
3225
  cellClassNameForRange,
3185
3226
  DEFAULT_ROWS,
@@ -3188,11 +3229,18 @@ export {
3188
3229
  MAX_COLUMNS,
3189
3230
  RANGE_NOTATION,
3190
3231
  isFormula,
3232
+ posEquals,
3233
+ columnLetter,
3191
3234
  addressToA1Notation,
3192
3235
  addressFromA1Notation,
3193
3236
  rangeToA1Notation,
3237
+ rangeFromA1Notation,
3194
3238
  inRange,
3239
+ ApiError,
3195
3240
  ReadonlyException,
3241
+ RangeException,
3242
+ createIndex,
3243
+ createIndices,
3196
3244
  insertIndices,
3197
3245
  initialize,
3198
3246
  createSheet,
@@ -3201,6 +3249,8 @@ export {
3201
3249
  rangeToIndex,
3202
3250
  rangeFromIndex,
3203
3251
  compareIndexPositions,
3252
+ mapFormulaRefsToIndices,
3253
+ mapFormulaIndicesToRefs,
3204
3254
  ComputeNode,
3205
3255
  defaultFunctionContextOptions,
3206
3256
  FunctionContext,
@@ -3216,4 +3266,4 @@ export {
3216
3266
  defaultPlugins,
3217
3267
  ComputeGraphRegistry
3218
3268
  };
3219
- //# sourceMappingURL=chunk-VMSX6Z4X.mjs.map
3269
+ //# sourceMappingURL=chunk-F3HE6D3J.mjs.map