@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
@@ -4,18 +4,19 @@ import {
4
4
  completeCellRangeToThreadCursor,
5
5
  useComputeGraph,
6
6
  useSheetContext
7
- } from "./chunk-QHQFM7LV.mjs";
7
+ } from "./chunk-E5WQ7U7G.mjs";
8
8
  import {
9
9
  addressToA1Notation,
10
10
  alignKey,
11
11
  inRange,
12
12
  isFormula,
13
+ mapFormulaIndicesToRefs,
13
14
  rangeFromIndex,
14
15
  rangeToA1Notation,
15
16
  rangeToIndex,
16
17
  styleKey
17
- } from "./chunk-VMSX6Z4X.mjs";
18
- import "./chunk-BVUN7SHF.mjs";
18
+ } from "./chunk-F3HE6D3J.mjs";
19
+ import "./chunk-JXFPOYNA.mjs";
19
20
  import {
20
21
  SHEET_PLUGIN
21
22
  } from "./chunk-RABELMEQ.mjs";
@@ -34,7 +35,7 @@ var FunctionEditor = () => {
34
35
  if (cursor) {
35
36
  value = model.getCellValue(cursor);
36
37
  if (isFormula(value)) {
37
- value = model.graph.mapFunctionBindingFromId(model.mapFormulaIndicesToRefs(value));
38
+ value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));
38
39
  formula = true;
39
40
  } else if (value != null) {
40
41
  value = String(value);
@@ -190,7 +191,8 @@ var Alignment = () => {
190
191
  itemType: "toggleGroupItem",
191
192
  key: value2,
192
193
  value: value2,
193
- icon
194
+ icon,
195
+ "data-testid": `grid.toolbar.${alignKey}.${value2}`
194
196
  }, t("toolbar action label", {
195
197
  key: t(`range key ${alignKey} label`),
196
198
  value: t(`range value ${value2} label`)
@@ -291,4 +293,4 @@ var SheetContainer_default = SheetContainer;
291
293
  export {
292
294
  SheetContainer_default as default
293
295
  };
294
- //# sourceMappingURL=SheetContainer-YAMIOFC6.mjs.map
296
+ //# sourceMappingURL=SheetContainer-KCLT6PEO.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/SheetContainer/SheetContainer.tsx", "../../../src/components/FunctionEditor/FunctionEditor.tsx", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/SheetContainer/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { type SheetType } from '../../types';\nimport { useComputeGraph } from '../ComputeGraph';\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider } from '../SheetContext';\nimport { Toolbar } from '../Toolbar';\n\nexport const SheetContainer = ({\n space,\n sheet,\n role,\n ignoreAttention,\n}: {\n space: Space;\n sheet: SheetType;\n role?: string;\n ignoreAttention?: boolean;\n}) => {\n const graph = useComputeGraph(space);\n\n return graph ? (\n <SheetProvider sheet={sheet} graph={graph} ignoreAttention={ignoreAttention}>\n <StackItem.Content toolbar statusbar {...(role === 'section' && { classNames: 'aspect-video' })}>\n <Toolbar.Root role={role}>\n <Toolbar.Styles />\n <Toolbar.Alignment />\n <Toolbar.Separator />\n <Toolbar.Actions />\n </Toolbar.Root>\n <GridSheet />\n <FunctionEditor />\n </StackItem.Content>\n </SheetProvider>\n ) : null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Icon } from '@dxos/react-ui';\n\nimport { addressToA1Notation, isFormula, mapFormulaIndicesToRefs, rangeToA1Notation } from '../../defs';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let formula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (isFormula(value)) {\n value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));\n formula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div className='flex shrink-0 justify-between items-center px-4 py-1 text-sm attention-surface border-bs !border-separator'>\n <div className='flex gap-4 items-center'>\n <div className='flex w-16 items-center font-mono'>\n {(range && rangeToA1Notation(range)) || (cursor && addressToA1Notation(cursor))}\n </div>\n <div className='flex gap-2 items-center'>\n <Icon icon='ph--function--regular' classNames={['text-greenText', formula ? 'visible' : 'invisible']} />\n <span className='font-mono'>{value}</span>\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useCallback } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport {\n Icon,\n type ThemedClassName,\n Toolbar as NaturalToolbar,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n type ToolbarToggleProps as NaturalToolbarToggleProps,\n Tooltip,\n useTranslation,\n} from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { nonNullable } from '@dxos/util';\n\nimport {\n alignKey,\n type AlignKey,\n type AlignValue,\n type CommentKey,\n type CommentValue,\n inRange,\n rangeFromIndex,\n rangeToIndex,\n styleKey,\n type StyleKey,\n type StyleValue,\n} from '../../defs';\nimport { completeCellRangeToThreadCursor } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type SheetType } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\n//\n// Buttons\n//\n\nconst buttonStyles = 'min-bs-0 p-2';\nconst tooltipProps = { side: 'bottom' as const, classNames: 'z-10' };\n\nconst ToolbarSeparator = () => <div role='separator' className='grow' />;\n\n//\n// ToolbarItem\n//\n\ntype ToolbarItemProps =\n | (NaturalToolbarButtonProps & { itemType: 'button'; icon: string })\n | (NaturalToolbarToggleGroupItemProps & { itemType: 'toggleGroupItem'; icon: string })\n | (NaturalToolbarToggleProps & { itemType: 'toggle'; icon: string });\n\nexport const ToolbarItem = ({ itemType, icon, children, ...props }: ToolbarItemProps) => {\n const Invoker =\n itemType === 'toggleGroupItem'\n ? NaturalToolbar.ToggleGroupItem\n : itemType === 'toggle'\n ? NaturalToolbar.Toggle\n : NaturalToolbar.Button;\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n {/* TODO(thure): type the props spread better. */}\n <Invoker variant='ghost' {...(props as any)} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </Invoker>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\n//\n// Root\n//\n\ntype AlignAction = { key: AlignKey; value: AlignValue };\ntype CommentAction = { key: CommentKey; value: CommentValue; cellContent?: string };\ntype StyleAction = { key: StyleKey; value: StyleValue };\n\nexport type ToolbarAction = StyleAction | AlignAction | CommentAction;\nexport type ToolbarActionAnnotated = ToolbarAction & { unset?: boolean };\n\nexport type ToolbarActionType = ToolbarAction['key'];\n\nexport type ToolbarActionHandler = (action: ToolbarActionAnnotated) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n role?: string;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<{\n onAction: (action: ToolbarActionAnnotated) => void;\n}>('Toolbar');\n\ntype Range = SheetType['ranges'][number];\n\nconst ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {\n const { id, model, cursorFallbackRange, cursor } = useSheetContext();\n const { hasAttention } = useAttention(id);\n const dispatch = useIntentDispatcher();\n\n // TODO(Zan): Externalize the toolbar action handler. E.g., Toolbar/keys should both fire events.\n const handleAction = useCallback(\n (action: ToolbarActionAnnotated) => {\n switch (action.key) {\n case 'alignment':\n if (cursorFallbackRange) {\n const index =\n model.sheet.ranges?.findIndex(\n (range) =>\n range.key === action.key &&\n inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: action.key,\n value: action.value,\n };\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n } else if (model.sheet.ranges![index].value === action.value) {\n model.sheet.ranges?.splice(index, 1);\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n }\n }\n break;\n case 'style':\n if (action.unset) {\n const index = model.sheet.ranges?.findIndex(\n (range) =>\n range.key === action.key &&\n cursorFallbackRange &&\n inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n );\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n } else if (cursorFallbackRange) {\n model.sheet.ranges?.push({\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: action.key,\n value: action.value,\n });\n }\n break;\n case 'comment': {\n // TODO(Zan): We shouldn't hardcode the action ID.\n if (cursorFallbackRange) {\n void dispatch({\n action: 'dxos.org/plugin/thread/action/create',\n data: {\n cursor: completeCellRangeToThreadCursor(cursorFallbackRange),\n name: action.cellContent,\n subject: model.sheet,\n },\n });\n }\n }\n }\n },\n [model.sheet, cursorFallbackRange, cursor, dispatch],\n );\n\n return (\n <ToolbarContextProvider onAction={handleAction}>\n <NaturalToolbar.Root classNames={['pli-0.5 attention-surface', !hasAttention && 'opacity-20', classNames]}>\n {children}\n </NaturalToolbar.Root>\n </ToolbarContextProvider>\n );\n};\n\n// TODO(burdon): Generalize.\n// TODO(burdon): Detect and display current state.\ntype ButtonProps<T> = {\n value: T;\n icon: string;\n disabled?: (state: Range) => boolean;\n};\n\n//\n// Alignment\n//\n\nconst alignmentOptions: ButtonProps<AlignValue>[] = [\n { value: 'start', icon: 'ph--text-align-left--regular' },\n { value: 'center', icon: 'ph--text-align-center--regular' },\n { value: 'end', icon: 'ph--text-align-right--regular' },\n];\n\nconst Alignment = () => {\n const { cursor, model } = useSheetContext();\n const { onAction } = useToolbarContext('Alignment');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const value = cursor\n ? model.sheet.ranges?.findLast(\n ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),\n )?.value\n : undefined;\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n value={\n // TODO(thure): providing `undefined` leaves the last item active which was active rather than showing none.\n value ?? 'never'\n }\n onValueChange={(value: AlignValue) => onAction?.({ key: alignKey, value })}\n >\n {alignmentOptions.map(({ value, icon }) => (\n <ToolbarItem\n itemType='toggleGroupItem'\n key={value}\n value={value}\n icon={icon}\n data-testid={`grid.toolbar.${alignKey}.${value}`}\n >\n {t('toolbar action label', {\n key: t(`range key ${alignKey} label`),\n value: t(`range value ${value} label`),\n })}\n </ToolbarItem>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nconst styleOptions: ButtonProps<StyleValue>[] = [\n { value: 'highlight', icon: 'ph--highlighter--regular' },\n { value: 'softwrap', icon: 'ph--paragraph--regular' },\n];\n\nconst Styles = () => {\n const { cursorFallbackRange, model } = useSheetContext();\n const { onAction } = useToolbarContext('Styles');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const activeValues = cursorFallbackRange\n ? model.sheet.ranges\n ?.filter(\n ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .reduce((acc, { value }) => {\n acc.add(value);\n return acc;\n }, new Set())\n : undefined;\n\n return (\n <>\n {styleOptions.map(({ value, icon }) => (\n <ToolbarItem\n itemType='toggle'\n key={value}\n pressed={activeValues?.has(value)}\n onPressedChange={(nextPressed: boolean) => {\n onAction?.({ key: 'style', value, unset: !nextPressed });\n }}\n icon={icon}\n >\n {t('toolbar action label', {\n key: t(`range key ${styleKey} label`),\n value: t(`range value ${value} label`),\n })}\n </ToolbarItem>\n ))}\n </>\n );\n};\n\n//\n// Actions\n//\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { cursorFallbackRange, cursor, model } = useSheetContext();\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const overlapsCommentAnchor = (model.sheet.threads ?? [])\n .filter(nonNullable)\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursorFallbackRange) {\n return false;\n }\n return rangeToIndex(model.sheet, cursorFallbackRange) === thread.anchor;\n });\n\n const tooltipLabelKey = !cursor\n ? 'no cursor label'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment label'\n : 'comment label';\n\n return (\n <ToolbarItem\n itemType='button'\n value='comment'\n icon='ph--chat-text--regular'\n data-testid='editor.toolbar.comment'\n onClick={() => {\n if (!cursorFallbackRange) {\n return;\n }\n return onAction?.({\n key: 'comment',\n value: rangeToIndex(model.sheet, cursorFallbackRange),\n cellContent: model.getCellText(cursorFallbackRange.from),\n });\n }}\n disabled={!cursorFallbackRange || overlapsCommentAnchor}\n >\n {t(tooltipLabelKey)}\n </ToolbarItem>\n );\n};\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Separator: ToolbarSeparator,\n Alignment,\n Styles,\n Actions,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { SheetContainer } from './SheetContainer';\n\nexport default SheetContainer;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "StackItem", "React", "Icon", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "createContext", "React", "useCallback", "useIntentDispatcher", "Icon", "Toolbar", "NaturalToolbar", "Tooltip", "useTranslation", "useAttention", "nonNullable", "buttonStyles", "tooltipProps", "side", "classNames", "ToolbarSeparator", "React", "div", "role", "className", "ToolbarItem", "itemType", "icon", "children", "props", "Invoker", "NaturalToolbar", "ToggleGroupItem", "Toggle", "Button", "Tooltip", "Root", "Trigger", "asChild", "variant", "Icon", "size", "span", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "id", "model", "cursorFallbackRange", "cursor", "useSheetContext", "hasAttention", "useAttention", "dispatch", "useIntentDispatcher", "handleAction", "useCallback", "action", "key", "index", "sheet", "ranges", "findIndex", "range", "inRange", "rangeFromIndex", "from", "nextRangeEntity", "rangeToIndex", "value", "push", "splice", "unset", "data", "completeCellRangeToThreadCursor", "name", "cellContent", "subject", "onAction", "alignmentOptions", "Alignment", "t", "useTranslation", "SHEET_PLUGIN", "findLast", "alignKey", "undefined", "ToggleGroup", "type", "onValueChange", "map", "data-testid", "styleOptions", "Styles", "activeValues", "filter", "reduce", "acc", "add", "Set", "pressed", "has", "onPressedChange", "nextPressed", "styleKey", "Actions", "overlapsCommentAnchor", "threads", "nonNullable", "thread", "status", "some", "anchor", "tooltipLabelKey", "onClick", "getCellText", "disabled", "Toolbar", "Separator", "SheetContainer", "space", "sheet", "role", "ignoreAttention", "graph", "useComputeGraph", "React", "SheetProvider", "StackItem", "Content", "toolbar", "statusbar", "classNames", "Toolbar", "Root", "Styles", "Alignment", "Separator", "Actions", "GridSheet", "FunctionEditor", "SheetContainer"]
7
+ }
@@ -15,13 +15,15 @@ import {
15
15
  initialize,
16
16
  insertIndices,
17
17
  isFormula,
18
+ mapFormulaIndicesToRefs,
19
+ mapFormulaRefsToIndices,
18
20
  rangeFromIndex,
19
21
  rangeToA1Notation
20
- } from "./chunk-VMSX6Z4X.mjs";
22
+ } from "./chunk-F3HE6D3J.mjs";
21
23
  import {
22
24
  Range,
23
25
  SheetAction
24
- } from "./chunk-BVUN7SHF.mjs";
26
+ } from "./chunk-JXFPOYNA.mjs";
25
27
  import {
26
28
  SHEET_PLUGIN
27
29
  } from "./chunk-RABELMEQ.mjs";
@@ -102,7 +104,7 @@ var highlightStyles = HighlightStyle.define([
102
104
  }
103
105
  ]);
104
106
  var languageFacet = singleValueFacet2();
105
- var sheetExtension = ({ functions = [] }) => {
107
+ var sheetExtension = ({ debug, functions = [] }) => {
106
108
  const { extension, language } = spreadsheet({
107
109
  idiom: "en-US",
108
110
  decimalSeparator: "."
@@ -178,8 +180,7 @@ var sheetExtension = ({ functions = [] }) => {
178
180
  aboveCursor: false,
179
181
  defaultKeymap: true,
180
182
  activateOnTyping: true,
181
- // NOTE: Useful for debugging.
182
- closeOnBlur: false,
183
+ closeOnBlur: !debug,
183
184
  icons: false,
184
185
  tooltipClass: () => mx("!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]", "[&>ul>li[aria-selected]]:!bg-accentSurface", "border-separator")
185
186
  }),
@@ -366,7 +367,7 @@ var SheetModel = class extends Resource {
366
367
  id: this.id
367
368
  }, {
368
369
  F: __dxlog_file,
369
- L: 113,
370
+ L: 115,
370
371
  S: this,
371
372
  C: (f, a) => f(...a)
372
373
  });
@@ -393,7 +394,7 @@ var SheetModel = class extends Resource {
393
394
  reset() {
394
395
  invariant2(this._node, void 0, {
395
396
  F: __dxlog_file,
396
- L: 139,
397
+ L: 141,
397
398
  S: this,
398
399
  A: [
399
400
  "this._node",
@@ -404,7 +405,7 @@ var SheetModel = class extends Resource {
404
405
  Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
405
406
  invariant2(this._node, void 0, {
406
407
  F: __dxlog_file,
407
- L: 142,
408
+ L: 144,
408
409
  S: this,
409
410
  A: [
410
411
  "this._node",
@@ -413,7 +414,7 @@ var SheetModel = class extends Resource {
413
414
  });
414
415
  const { col, row } = addressFromIndex(this._sheet, key);
415
416
  if (isFormula(value)) {
416
- const binding = this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value));
417
+ const binding = this._graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(this._sheet, value));
417
418
  if (binding) {
418
419
  value = this._graph.mapFormulaToNative(binding);
419
420
  } else {
@@ -523,7 +524,7 @@ var SheetModel = class extends Resource {
523
524
  clear(range) {
524
525
  invariant2(this._node, void 0, {
525
526
  F: __dxlog_file,
526
- L: 245,
527
+ L: 247,
527
528
  S: this,
528
529
  A: [
529
530
  "this._node",
@@ -541,7 +542,7 @@ var SheetModel = class extends Resource {
541
542
  cut(range) {
542
543
  invariant2(this._node, void 0, {
543
544
  F: __dxlog_file,
544
- L: 256,
545
+ L: 258,
545
546
  S: this,
546
547
  A: [
547
548
  "this._node",
@@ -557,7 +558,7 @@ var SheetModel = class extends Resource {
557
558
  copy(range) {
558
559
  invariant2(this._node, void 0, {
559
560
  F: __dxlog_file,
560
- L: 265,
561
+ L: 267,
561
562
  S: this,
562
563
  A: [
563
564
  "this._node",
@@ -569,7 +570,7 @@ var SheetModel = class extends Resource {
569
570
  paste(cell) {
570
571
  invariant2(this._node, void 0, {
571
572
  F: __dxlog_file,
572
- L: 270,
573
+ L: 272,
573
574
  S: this,
574
575
  A: [
575
576
  "this._node",
@@ -596,7 +597,7 @@ var SheetModel = class extends Resource {
596
597
  undo() {
597
598
  invariant2(this._node, void 0, {
598
599
  F: __dxlog_file,
599
- L: 285,
600
+ L: 287,
600
601
  S: this,
601
602
  A: [
602
603
  "this._node",
@@ -610,7 +611,7 @@ var SheetModel = class extends Resource {
610
611
  redo() {
611
612
  invariant2(this._node, void 0, {
612
613
  F: __dxlog_file,
613
- L: 293,
614
+ L: 295,
614
615
  S: this,
615
616
  A: [
616
617
  "this._node",
@@ -637,7 +638,7 @@ var SheetModel = class extends Resource {
637
638
  return void 0;
638
639
  }
639
640
  if (isFormula(value)) {
640
- return this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value));
641
+ return this._graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(this._sheet, value));
641
642
  } else {
642
643
  return String(value);
643
644
  }
@@ -654,7 +655,7 @@ var SheetModel = class extends Resource {
654
655
  getValue(cell) {
655
656
  invariant2(this._node, void 0, {
656
657
  F: __dxlog_file,
657
- L: 336,
658
+ L: 338,
658
659
  S: this,
659
660
  A: [
660
661
  "this._node",
@@ -669,7 +670,7 @@ var SheetModel = class extends Resource {
669
670
  error: value
670
671
  }, {
671
672
  F: __dxlog_file,
672
- L: 341,
673
+ L: 343,
673
674
  S: this,
674
675
  C: (f, a) => f(...a)
675
676
  });
@@ -683,7 +684,7 @@ var SheetModel = class extends Resource {
683
684
  getValueDescription(cell) {
684
685
  invariant2(this._node, void 0, {
685
686
  F: __dxlog_file,
686
- L: 352,
687
+ L: 354,
687
688
  S: this,
688
689
  A: [
689
690
  "this._node",
@@ -700,7 +701,7 @@ var SheetModel = class extends Resource {
700
701
  setValue(cell, value) {
701
702
  invariant2(this._node, void 0, {
702
703
  F: __dxlog_file,
703
- L: 362,
704
+ L: 364,
704
705
  S: this,
705
706
  A: [
706
707
  "this._node",
@@ -736,7 +737,7 @@ var SheetModel = class extends Resource {
736
737
  delete this._sheet.cells[idx];
737
738
  } else {
738
739
  if (isFormula(value)) {
739
- value = this._graph.mapFunctionBindingToId(this.mapFormulaRefsToIndices(value));
740
+ value = this._graph.mapFunctionBindingToId(mapFormulaRefsToIndices(this._sheet, value));
740
741
  }
741
742
  this._sheet.cells[idx] = {
742
743
  value
@@ -788,33 +789,13 @@ var SheetModel = class extends Resource {
788
789
  _moveIndices(indices, i, j, n) {
789
790
  throw new Error("Not implemented");
790
791
  }
791
- //
792
- // Indices.
793
- //
794
- /**
795
- * Map from A1 notation to indices.
796
- */
797
- mapFormulaRefsToIndices(formula) {
798
- invariant2(isFormula(formula), void 0, {
799
- F: __dxlog_file,
800
- L: 451,
801
- S: this,
802
- A: [
803
- "isFormula(formula)",
804
- ""
805
- ]
806
- });
807
- return formula.replace(/([a-zA-Z]+)([0-9]+)/g, (match) => {
808
- return addressToIndex(this._sheet, addressFromA1Notation(match));
809
- });
810
- }
811
792
  /**
812
793
  * Map from indices to A1 notation.
813
794
  */
814
795
  mapFormulaIndicesToRefs(formula) {
815
796
  invariant2(isFormula(formula), void 0, {
816
797
  F: __dxlog_file,
817
- L: 461,
798
+ L: 449,
818
799
  S: this,
819
800
  A: [
820
801
  "isFormula(formula)",
@@ -840,7 +821,7 @@ var SheetModel = class extends Resource {
840
821
  toDateTime(num) {
841
822
  invariant2(this._node, void 0, {
842
823
  F: __dxlog_file,
843
- L: 482,
824
+ L: 470,
844
825
  S: this,
845
826
  A: [
846
827
  "this._node",
@@ -852,7 +833,7 @@ var SheetModel = class extends Resource {
852
833
  toDate(num) {
853
834
  invariant2(this._node, void 0, {
854
835
  F: __dxlog_file,
855
- L: 487,
836
+ L: 475,
856
837
  S: this,
857
838
  A: [
858
839
  "this._node",
@@ -864,7 +845,7 @@ var SheetModel = class extends Resource {
864
845
  toTime(num) {
865
846
  invariant2(this._node, void 0, {
866
847
  F: __dxlog_file,
867
- L: 492,
848
+ L: 480,
868
849
  S: this,
869
850
  A: [
870
851
  "this._node",
@@ -976,11 +957,11 @@ var SheetProvider = ({ children, graph, sheet, readonly, ignoreAttention, onInfo
976
957
  };
977
958
 
978
959
  // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
979
- import React4, { useCallback as useCallback4, useMemo as useMemo2, useRef, useState as useState4 } from "react";
960
+ import React5, { useCallback as useCallback4, useMemo as useMemo2, useRef, useState as useState4 } from "react";
980
961
  import { useIntentDispatcher as useIntentDispatcher2 } from "@dxos/app-framework";
981
- import { DropdownMenu, Icon, useTranslation as useTranslation2 } from "@dxos/react-ui";
962
+ import { DropdownMenu, Icon, useTranslation as useTranslation3 } from "@dxos/react-ui";
982
963
  import { useAttention } from "@dxos/react-ui-attention";
983
- import { closestCell, defaultSizeRow, editorKeys, Grid as Grid2, GridCellEditor } from "@dxos/react-ui-grid";
964
+ import { closestCell, defaultSizeRow, editorKeys, Grid as Grid2, GridCellEditor, parseCellIndex } from "@dxos/react-ui-grid";
984
965
 
985
966
  // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
986
967
  import { useEffect as useEffect3, useState as useState3 } from "react";
@@ -1037,8 +1018,28 @@ var RangeList = ({ sheet }) => {
1037
1018
  })))));
1038
1019
  };
1039
1020
 
1021
+ // packages/plugins/plugin-sheet/src/components/SheetObjectSettings.tsx
1022
+ import React4 from "react";
1023
+ import { SPACE_PLUGIN } from "@dxos/plugin-space/meta";
1024
+ import { Input, useTranslation as useTranslation2 } from "@dxos/react-ui";
1025
+ var SheetObjectSettings = ({ sheet }) => {
1026
+ const { t } = useTranslation2(SPACE_PLUGIN);
1027
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement("div", {
1028
+ role: "form",
1029
+ className: "flex flex-col w-full p-2 gap-1"
1030
+ }, /* @__PURE__ */ React4.createElement(Input.Root, null, /* @__PURE__ */ React4.createElement(Input.Label, null, t("name label")), /* @__PURE__ */ React4.createElement(Input.TextInput, {
1031
+ placeholder: t("name placeholder"),
1032
+ value: sheet.name ?? "",
1033
+ onChange: (event) => {
1034
+ sheet.name = event.target.value;
1035
+ }
1036
+ }))), /* @__PURE__ */ React4.createElement(RangeList, {
1037
+ sheet
1038
+ }));
1039
+ };
1040
+
1040
1041
  // packages/plugins/plugin-sheet/src/components/index.ts
1041
- var SheetContainer = lazy(() => import("./SheetContainer-YAMIOFC6.mjs"));
1042
+ var SheetContainer = lazy(() => import("./SheetContainer-KCLT6PEO.mjs"));
1042
1043
 
1043
1044
  // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
1044
1045
  var completeCellRangeToThreadCursor = (range) => {
@@ -1076,6 +1077,9 @@ var useUpdateFocusedCellOnThreadSelection = (grid) => {
1076
1077
  ...range.to,
1077
1078
  plane: "grid"
1078
1079
  }, true);
1080
+ return {
1081
+ data: true
1082
+ };
1079
1083
  }
1080
1084
  }
1081
1085
  }, [
@@ -1134,13 +1138,6 @@ var useSelectThreadOnCellFocus = () => {
1134
1138
  };
1135
1139
 
1136
1140
  // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
1137
- var dxGridCellIndexToSheetCellAddress = (index) => {
1138
- const [colStr, rowStr] = index.split(",");
1139
- return {
1140
- col: parseInt(colStr),
1141
- row: parseInt(rowStr)
1142
- };
1143
- };
1144
1141
  var createDxGridColumns = (model) => {
1145
1142
  return model.sheet.columns.reduce((acc, columnId, numericIndex) => {
1146
1143
  if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {
@@ -1347,7 +1344,7 @@ var sheetColDefault = {
1347
1344
  }
1348
1345
  };
1349
1346
  var GridSheet = () => {
1350
- const { t } = useTranslation2(SHEET_PLUGIN);
1347
+ const { t } = useTranslation3(SHEET_PLUGIN);
1351
1348
  const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } = useSheetContext();
1352
1349
  const [dxGrid, setDxGrid] = useState4(null);
1353
1350
  const [extraplanarFocus, setExtraplanarFocus] = useState4(null);
@@ -1399,7 +1396,7 @@ var GridSheet = () => {
1399
1396
  ]);
1400
1397
  const handleBlur = useCallback4((value) => {
1401
1398
  if (value !== void 0) {
1402
- model.setValue(dxGridCellIndexToSheetCellAddress(editing.index), value);
1399
+ model.setValue(parseCellIndex(editing.index), value);
1403
1400
  }
1404
1401
  }, [
1405
1402
  model,
@@ -1600,21 +1597,20 @@ var GridSheet = () => {
1600
1597
  editing
1601
1598
  ]);
1602
1599
  const getCellContent = useCallback4((index) => {
1603
- const cell = dxGridCellIndexToSheetCellAddress(index);
1604
- return model.getCellText(cell);
1600
+ return model.getCellText(parseCellIndex(index));
1605
1601
  }, [
1606
1602
  model
1607
1603
  ]);
1608
1604
  useUpdateFocusedCellOnThreadSelection(dxGrid);
1609
1605
  useSelectThreadOnCellFocus();
1610
- return /* @__PURE__ */ React4.createElement("div", {
1606
+ return /* @__PURE__ */ React5.createElement("div", {
1611
1607
  role: "none",
1612
1608
  className: "relative min-bs-0"
1613
- }, /* @__PURE__ */ React4.createElement(GridCellEditor, {
1609
+ }, /* @__PURE__ */ React5.createElement(GridCellEditor, {
1614
1610
  getCellContent,
1615
1611
  extension,
1616
1612
  onBlur: handleBlur
1617
- }), /* @__PURE__ */ React4.createElement(Grid2.Content, {
1613
+ }), /* @__PURE__ */ React5.createElement(Grid2.Content, {
1618
1614
  initialCells,
1619
1615
  limitColumns: DEFAULT_COLUMNS,
1620
1616
  limitRows: DEFAULT_ROWS,
@@ -1634,32 +1630,35 @@ var GridSheet = () => {
1634
1630
  className: "[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:border-bs [&_.dx-grid]:absolute [&_.dx-grid]:inset-0 [&_.dx-grid]:border-separator",
1635
1631
  activeRefs,
1636
1632
  ref: setDxGrid
1637
- }), /* @__PURE__ */ React4.createElement(DropdownMenu.Root, {
1633
+ }), /* @__PURE__ */ React5.createElement(DropdownMenu.Root, {
1638
1634
  modal: false,
1639
1635
  open: !!contextMenuOpen,
1640
1636
  onOpenChange: (nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)
1641
- }, /* @__PURE__ */ React4.createElement(DropdownMenu.VirtualTrigger, {
1637
+ }, /* @__PURE__ */ React5.createElement(DropdownMenu.VirtualTrigger, {
1642
1638
  virtualRef: contextMenuAnchorRef
1643
- }), /* @__PURE__ */ React4.createElement(DropdownMenu.Content, {
1639
+ }), /* @__PURE__ */ React5.createElement(DropdownMenu.Content, {
1644
1640
  side: contextMenuAxis === "col" ? "bottom" : "right",
1645
1641
  sideOffset: 4,
1646
1642
  collisionPadding: 8
1647
- }, /* @__PURE__ */ React4.createElement(DropdownMenu.Viewport, null, /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1648
- onClick: () => handleAxisMenuAction("insert-before")
1649
- }, /* @__PURE__ */ React4.createElement(Icon, {
1643
+ }, /* @__PURE__ */ React5.createElement(DropdownMenu.Viewport, null, /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
1644
+ onClick: () => handleAxisMenuAction("insert-before"),
1645
+ "data-testid": `grid.${contextMenuAxis}.insert-before`
1646
+ }, /* @__PURE__ */ React5.createElement(Icon, {
1650
1647
  size: 5,
1651
1648
  icon: contextMenuAxis === "col" ? "ph--columns-plus-left--regular" : "ph--rows-plus-top--regular"
1652
- }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} before label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1653
- onClick: () => handleAxisMenuAction("insert-after")
1654
- }, /* @__PURE__ */ React4.createElement(Icon, {
1649
+ }), /* @__PURE__ */ React5.createElement("span", null, t(`add ${contextMenuAxis} before label`))), /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
1650
+ onClick: () => handleAxisMenuAction("insert-after"),
1651
+ "data-testid": `grid.${contextMenuAxis}.insert-after`
1652
+ }, /* @__PURE__ */ React5.createElement(Icon, {
1655
1653
  size: 5,
1656
1654
  icon: contextMenuAxis === "col" ? "ph--columns-plus-right--regular" : "ph--rows-plus-bottom--regular"
1657
- }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} after label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1658
- onClick: () => handleAxisMenuAction("drop")
1659
- }, /* @__PURE__ */ React4.createElement(Icon, {
1655
+ }), /* @__PURE__ */ React5.createElement("span", null, t(`add ${contextMenuAxis} after label`))), /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
1656
+ onClick: () => handleAxisMenuAction("drop"),
1657
+ "data-testid": `grid.${contextMenuAxis}.drop`
1658
+ }, /* @__PURE__ */ React5.createElement(Icon, {
1660
1659
  size: 5,
1661
1660
  icon: "ph--backspace--regular"
1662
- }), /* @__PURE__ */ React4.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ React4.createElement(DropdownMenu.Arrow, null))));
1661
+ }), /* @__PURE__ */ React5.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ React5.createElement(DropdownMenu.Arrow, null))));
1663
1662
  };
1664
1663
 
1665
1664
  export {
@@ -1670,7 +1669,7 @@ export {
1670
1669
  useSheetContext,
1671
1670
  SheetProvider,
1672
1671
  GridSheet,
1673
- RangeList,
1672
+ SheetObjectSettings,
1674
1673
  SheetContainer
1675
1674
  };
1676
- //# sourceMappingURL=chunk-QHQFM7LV.mjs.map
1675
+ //# sourceMappingURL=chunk-E5WQ7U7G.mjs.map