@dxos/plugin-sheet 0.6.12-main.78ddbdf → 0.6.12-main.89e9959

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 (160) hide show
  1. package/dist/lib/browser/{SheetContainer-V4GCCZTX.mjs → SheetContainer-LG77O4RM.mjs} +14 -13
  2. package/dist/lib/browser/SheetContainer-LG77O4RM.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-U2JHW3L6.mjs → chunk-CHQAW4F4.mjs} +206 -53
  4. package/dist/lib/browser/chunk-CHQAW4F4.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-6ZMQVB4Z.mjs → chunk-GSV5QNLD.mjs} +220 -177
  6. package/dist/lib/browser/chunk-GSV5QNLD.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-T3NJFTD4.mjs → chunk-WZMOZKQZ.mjs} +2 -2
  8. package/dist/lib/browser/{chunk-T3NJFTD4.mjs.map → chunk-WZMOZKQZ.mjs.map} +3 -3
  9. package/dist/lib/browser/graph-M4IQ76QX.mjs +33 -0
  10. package/dist/lib/browser/index.mjs +45 -21
  11. package/dist/lib/browser/index.mjs.map +4 -4
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/types.mjs +1 -1
  14. package/dist/lib/node/{SheetContainer-3ZY7MPWJ.cjs → SheetContainer-OZ7DHH4L.cjs} +21 -20
  15. package/dist/lib/node/SheetContainer-OZ7DHH4L.cjs.map +7 -0
  16. package/dist/lib/node/{chunk-OTTD7FBK.cjs → chunk-5FTFZL5W.cjs} +224 -70
  17. package/dist/lib/node/chunk-5FTFZL5W.cjs.map +7 -0
  18. package/dist/lib/node/{chunk-DD6FIXWC.cjs → chunk-5XPK2V4A.cjs} +222 -175
  19. package/dist/lib/node/chunk-5XPK2V4A.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-Q3HBHPRL.cjs → chunk-AOP42UAA.cjs} +5 -5
  21. package/dist/lib/node/{chunk-Q3HBHPRL.cjs.map → chunk-AOP42UAA.cjs.map} +3 -3
  22. package/dist/lib/node/graph-Q3N2X26H.cjs +55 -0
  23. package/dist/lib/node/graph-Q3N2X26H.cjs.map +7 -0
  24. package/dist/lib/node/index.cjs +51 -30
  25. package/dist/lib/node/index.cjs.map +4 -4
  26. package/dist/lib/node/meta.json +1 -1
  27. package/dist/lib/node/types.cjs +8 -8
  28. package/dist/lib/node/types.cjs.map +1 -1
  29. package/dist/lib/node-esm/{SheetContainer-PXSJX6XK.mjs → SheetContainer-4XS2G25Z.mjs} +14 -13
  30. package/dist/lib/node-esm/SheetContainer-4XS2G25Z.mjs.map +7 -0
  31. package/dist/lib/node-esm/{chunk-D6KU5MI7.mjs → chunk-5WPZCXNS.mjs} +220 -177
  32. package/dist/lib/node-esm/chunk-5WPZCXNS.mjs.map +7 -0
  33. package/dist/lib/node-esm/{chunk-7HVSOTGA.mjs → chunk-KK3XL37M.mjs} +206 -53
  34. package/dist/lib/node-esm/chunk-KK3XL37M.mjs.map +7 -0
  35. package/dist/lib/node-esm/{chunk-BMNA27EX.mjs → chunk-RR2AO4SM.mjs} +2 -2
  36. package/dist/lib/node-esm/{chunk-BMNA27EX.mjs.map → chunk-RR2AO4SM.mjs.map} +3 -3
  37. package/dist/lib/node-esm/graph-SMPUMOV2.mjs +34 -0
  38. package/dist/lib/node-esm/index.mjs +45 -21
  39. package/dist/lib/node-esm/index.mjs.map +4 -4
  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/CellEditor/CellEditor.stories.d.ts.map +1 -1
  44. package/dist/types/src/components/CellEditor/extension.d.ts.map +1 -1
  45. package/dist/types/src/components/GridSheet/GridSheet.d.ts +3 -3
  46. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  47. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +1 -1
  48. package/dist/types/src/components/GridSheet/util.d.ts +9 -0
  49. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  50. package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -1
  51. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +1 -1
  52. package/dist/types/src/components/Sheet/sheet-context.d.ts +3 -3
  53. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +1 -1
  54. package/dist/types/src/components/SheetContainer.d.ts +1 -1
  55. package/dist/types/src/components/SheetContainer.d.ts.map +1 -1
  56. package/dist/types/src/components/index.d.ts +1 -1
  57. package/dist/types/src/components/index.d.ts.map +1 -1
  58. package/dist/types/src/defs/types.d.ts.map +1 -1
  59. package/dist/types/src/defs/util.d.ts +1 -1
  60. package/dist/types/src/defs/util.d.ts.map +1 -1
  61. package/dist/types/src/extensions/compute.d.ts +3 -2
  62. package/dist/types/src/extensions/compute.d.ts.map +1 -1
  63. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
  64. package/dist/types/src/graph/compute-graph-registry.d.ts +34 -0
  65. package/dist/types/src/graph/compute-graph-registry.d.ts.map +1 -0
  66. package/dist/types/src/graph/compute-graph.d.ts +17 -34
  67. package/dist/types/src/graph/compute-graph.d.ts.map +1 -1
  68. package/dist/types/src/graph/compute-graph.stories.d.ts.map +1 -1
  69. package/dist/types/src/graph/compute-graph.test.d.ts +2 -0
  70. package/dist/types/src/graph/compute-graph.test.d.ts.map +1 -0
  71. package/dist/types/src/graph/compute-node.d.ts +9 -2
  72. package/dist/types/src/graph/compute-node.d.ts.map +1 -1
  73. package/dist/types/src/graph/{async-function.d.ts → functions/async-function.d.ts} +13 -4
  74. package/dist/types/src/graph/functions/async-function.d.ts.map +1 -0
  75. package/dist/types/src/graph/functions/edge-function.d.ts +21 -0
  76. package/dist/types/src/graph/functions/edge-function.d.ts.map +1 -0
  77. package/dist/types/src/graph/functions/function-defs.d.ts.map +1 -0
  78. package/dist/types/src/graph/functions/index.d.ts +4 -0
  79. package/dist/types/src/graph/functions/index.d.ts.map +1 -0
  80. package/dist/types/src/graph/index.d.ts +2 -1
  81. package/dist/types/src/graph/index.d.ts.map +1 -1
  82. package/dist/types/src/graph/testing/index.d.ts +3 -0
  83. package/dist/types/src/graph/testing/index.d.ts.map +1 -0
  84. package/dist/types/src/graph/testing/test-builder.d.ts +15 -0
  85. package/dist/types/src/graph/testing/test-builder.d.ts.map +1 -0
  86. package/dist/types/src/graph/testing/test-plugin.d.ts +36 -0
  87. package/dist/types/src/graph/testing/test-plugin.d.ts.map +1 -0
  88. package/dist/types/src/hooks/useComputeGraph.d.ts.map +1 -1
  89. package/dist/types/src/hooks/useSheetModel.d.ts +2 -2
  90. package/dist/types/src/hooks/useSheetModel.d.ts.map +1 -1
  91. package/dist/types/src/model/sheet-model.d.ts +3 -3
  92. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  93. package/dist/types/src/model/sheet-model.test.d.ts +2 -0
  94. package/dist/types/src/model/sheet-model.test.d.ts.map +1 -0
  95. package/dist/types/src/testing/testing.d.ts +4 -5
  96. package/dist/types/src/testing/testing.d.ts.map +1 -1
  97. package/dist/types/src/types.d.ts +4 -3
  98. package/dist/types/src/types.d.ts.map +1 -1
  99. package/package.json +40 -39
  100. package/src/SheetPlugin.tsx +19 -15
  101. package/src/components/CellEditor/CellEditor.stories.tsx +2 -3
  102. package/src/components/CellEditor/extension.test.ts +0 -1
  103. package/src/components/CellEditor/extension.ts +4 -3
  104. package/src/components/GridSheet/GridSheet.stories.tsx +3 -3
  105. package/src/components/GridSheet/GridSheet.tsx +26 -8
  106. package/src/components/GridSheet/util.ts +61 -21
  107. package/src/components/Sheet/Sheet.stories.tsx +21 -20
  108. package/src/components/Sheet/Sheet.tsx +30 -14
  109. package/src/components/Sheet/sheet-context.tsx +4 -4
  110. package/src/components/SheetContainer.tsx +13 -15
  111. package/src/defs/types.ts +1 -0
  112. package/src/defs/util.ts +19 -3
  113. package/src/extensions/compute.stories.tsx +20 -20
  114. package/src/extensions/compute.ts +91 -42
  115. package/src/graph/compute-graph-registry.ts +90 -0
  116. package/src/graph/compute-graph.stories.tsx +4 -3
  117. package/src/graph/compute-graph.test.ts +87 -0
  118. package/src/graph/compute-graph.ts +73 -121
  119. package/src/graph/compute-node.ts +17 -5
  120. package/src/graph/{async-function.ts → functions/async-function.ts} +23 -15
  121. package/src/graph/{edge-function.ts → functions/edge-function.ts} +14 -13
  122. package/src/graph/functions/index.ts +7 -0
  123. package/src/graph/hyperformula.test.ts +1 -2
  124. package/src/graph/index.ts +2 -1
  125. package/src/graph/testing/index.ts +6 -0
  126. package/src/graph/testing/test-builder.ts +54 -0
  127. package/src/graph/{custom-function.ts → testing/test-plugin.ts} +43 -9
  128. package/src/hooks/hooks.stories.tsx +3 -3
  129. package/src/hooks/useComputeGraph.ts +9 -1
  130. package/src/hooks/useSheetModel.ts +4 -7
  131. package/src/model/sheet-model.test.ts +59 -0
  132. package/src/model/sheet-model.ts +47 -30
  133. package/src/testing/testing.tsx +17 -15
  134. package/src/types.ts +3 -3
  135. package/dist/lib/browser/SheetContainer-V4GCCZTX.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-6ZMQVB4Z.mjs.map +0 -7
  137. package/dist/lib/browser/chunk-U2JHW3L6.mjs.map +0 -7
  138. package/dist/lib/browser/graph-T27BOBOV.mjs +0 -21
  139. package/dist/lib/node/SheetContainer-3ZY7MPWJ.cjs.map +0 -7
  140. package/dist/lib/node/chunk-DD6FIXWC.cjs.map +0 -7
  141. package/dist/lib/node/chunk-OTTD7FBK.cjs.map +0 -7
  142. package/dist/lib/node/graph-SPKGX7W4.cjs +0 -43
  143. package/dist/lib/node/graph-SPKGX7W4.cjs.map +0 -7
  144. package/dist/lib/node-esm/SheetContainer-PXSJX6XK.mjs.map +0 -7
  145. package/dist/lib/node-esm/chunk-7HVSOTGA.mjs.map +0 -7
  146. package/dist/lib/node-esm/chunk-D6KU5MI7.mjs.map +0 -7
  147. package/dist/lib/node-esm/graph-U67IO4UC.mjs +0 -22
  148. package/dist/types/src/graph/async-function.d.ts.map +0 -1
  149. package/dist/types/src/graph/compute-graph.browser.test.d.ts +0 -2
  150. package/dist/types/src/graph/compute-graph.browser.test.d.ts.map +0 -1
  151. package/dist/types/src/graph/custom-function.d.ts +0 -21
  152. package/dist/types/src/graph/custom-function.d.ts.map +0 -1
  153. package/dist/types/src/graph/edge-function.d.ts +0 -20
  154. package/dist/types/src/graph/edge-function.d.ts.map +0 -1
  155. package/dist/types/src/graph/function-defs.d.ts.map +0 -1
  156. package/src/graph/compute-graph.browser.test.ts +0 -104
  157. /package/dist/lib/browser/{graph-T27BOBOV.mjs.map → graph-M4IQ76QX.mjs.map} +0 -0
  158. /package/dist/lib/node-esm/{graph-U67IO4UC.mjs.map → graph-SMPUMOV2.mjs.map} +0 -0
  159. /package/dist/types/src/graph/{function-defs.d.ts → functions/function-defs.d.ts} +0 -0
  160. /package/src/graph/{function-defs.ts → functions/function-defs.ts} +0 -0
@@ -2,18 +2,18 @@ import {
2
2
  Sheet,
3
3
  addressToIndex,
4
4
  useSheetContext
5
- } from "./chunk-U2JHW3L6.mjs";
6
- import "./chunk-T3NJFTD4.mjs";
5
+ } from "./chunk-CHQAW4F4.mjs";
6
+ import "./chunk-WZMOZKQZ.mjs";
7
7
  import {
8
8
  SHEET_PLUGIN
9
9
  } from "./chunk-QILRZNE5.mjs";
10
- import "./chunk-6ZMQVB4Z.mjs";
10
+ import "./chunk-GSV5QNLD.mjs";
11
11
 
12
12
  // packages/plugins/plugin-sheet/src/components/SheetContainer.tsx
13
13
  import React3, { useCallback } from "react";
14
14
  import { useIntentDispatcher } from "@dxos/app-framework";
15
15
  import { fullyQualifiedId } from "@dxos/react-client/echo";
16
- import { useIsDirectlyAttended } from "@dxos/react-ui-attention";
16
+ import { useAttendableAttributes, useAttention } from "@dxos/react-ui-attention";
17
17
  import { focusRing, mx } from "@dxos/react-ui-theme";
18
18
 
19
19
  // packages/plugins/plugin-sheet/src/components/Toolbar/Toolbar.tsx
@@ -209,12 +209,12 @@ var Toolbar = {
209
209
  };
210
210
 
211
211
  // packages/plugins/plugin-sheet/src/components/SheetContainer.tsx
212
- var attentionFragment = mx("group-focus-within/editor:attention-surface group-[[aria-current]]/editor:attention-surface", "group-focus-within/editor:border-separator");
213
212
  var sectionToolbarLayout = "bs-[--rail-action] bg-[--sticky-bg] sticky block-start-0 __-block-start-px transition-opacity";
214
- var SheetContainer = ({ sheet, space, role }) => {
213
+ var SheetContainer = ({ graph, sheet, role }) => {
215
214
  const dispatch = useIntentDispatcher();
216
215
  const id = fullyQualifiedId(sheet);
217
- const isDirectlyAttended = useIsDirectlyAttended(id);
216
+ const attendableAttrs = useAttendableAttributes(id);
217
+ const { hasAttention } = useAttention(id);
218
218
  const handleAction = useCallback((action) => {
219
219
  switch (action.type) {
220
220
  case "comment": {
@@ -234,9 +234,10 @@ var SheetContainer = ({ sheet, space, role }) => {
234
234
  ]);
235
235
  return /* @__PURE__ */ React3.createElement("div", {
236
236
  role: "none",
237
- className: role === "article" ? "row-span-2 grid grid-rows-subgrid" : void 0
237
+ className: role === "article" ? "row-span-2 grid grid-rows-subgrid" : void 0,
238
+ ...role === "article" && attendableAttrs
238
239
  }, /* @__PURE__ */ React3.createElement(Sheet.Root, {
239
- space,
240
+ graph,
240
241
  sheet
241
242
  }, /* @__PURE__ */ React3.createElement("div", {
242
243
  role: "none",
@@ -245,12 +246,12 @@ var SheetContainer = ({ sheet, space, role }) => {
245
246
  onAction: handleAction,
246
247
  classNames: mx(role === "section" ? [
247
248
  "z-[2] group-focus-within/section:visible",
248
- !isDirectlyAttended && "invisible",
249
+ !hasAttention && "invisible",
249
250
  sectionToolbarLayout
250
- ] : "group-focus-within/editor:border-separator group-[[aria-current]]/editor:border-separator")
251
+ ] : "attention-surface")
251
252
  }, /* @__PURE__ */ React3.createElement(Toolbar.Separator, null), /* @__PURE__ */ React3.createElement(Toolbar.Actions, null))), /* @__PURE__ */ React3.createElement("div", {
252
253
  role: "none",
253
- className: mx(role === "section" && "aspect-square border-is border-bs border-be border-separator", role === "article" && "flex is-full overflow-hidden focus-visible:ring-inset row-span-1 data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2 border-bs border-separator", focusRing, attentionFragment)
254
+ className: mx(role === "section" && "aspect-square border-is border-bs border-be border-separator", role === "article" && "flex is-full overflow-hidden focus-visible:ring-inset row-span-1 data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2 border-bs border-separator attention-surface", focusRing)
254
255
  }, /* @__PURE__ */ React3.createElement(Sheet.Main, null))));
255
256
  };
256
257
  var SheetContainer_default = SheetContainer;
@@ -258,4 +259,4 @@ export {
258
259
  SheetContainer_default as default,
259
260
  sectionToolbarLayout
260
261
  };
261
- //# sourceMappingURL=SheetContainer-V4GCCZTX.mjs.map
262
+ //# sourceMappingURL=SheetContainer-LG77O4RM.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/SheetContainer.tsx", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/Toolbar/common.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useAttendableAttributes, useAttention } from '@dxos/react-ui-attention';\nimport { focusRing, mx } from '@dxos/react-ui-theme';\n\nimport { Sheet, type SheetRootProps } from './Sheet';\nimport { Toolbar, type ToolbarAction } from './Toolbar';\n\n// TODO(Zan): Factor out, copied this from MarkdownPlugin.\nexport const sectionToolbarLayout =\n 'bs-[--rail-action] bg-[--sticky-bg] sticky block-start-0 __-block-start-px transition-opacity';\n\nconst SheetContainer = ({ graph, sheet, role }: SheetRootProps & { role?: string }) => {\n const dispatch = useIntentDispatcher();\n\n const id = fullyQualifiedId(sheet);\n const attendableAttrs = useAttendableAttributes(id);\n const { hasAttention } = useAttention(id);\n\n // TODO(Zan): Centralise the toolbar action handler. Current implementation in stories.\n const handleAction = useCallback(\n (action: ToolbarAction) => {\n switch (action.type) {\n case 'comment': {\n // TODO(Zan): We shouldn't hardcode the action ID.\n void dispatch({\n action: 'dxos.org/plugin/thread/action/create',\n data: {\n cursor: action.anchor,\n name: action.cellContent,\n subject: sheet,\n },\n });\n }\n }\n },\n [sheet, dispatch],\n );\n\n return (\n <div\n role='none'\n className={role === 'article' ? 'row-span-2 grid grid-rows-subgrid' : undefined}\n {...(role === 'article' && attendableAttrs)}\n >\n <Sheet.Root graph={graph} sheet={sheet}>\n <div role='none' className={mx('flex flex-0 justify-center overflow-x-auto')}>\n <Toolbar.Root\n onAction={handleAction}\n classNames={mx(\n role === 'section'\n ? ['z-[2] group-focus-within/section:visible', !hasAttention && 'invisible', sectionToolbarLayout]\n : 'attention-surface',\n )}\n >\n {/* TODO(Zan): Restore some of this functionality */}\n {/* <Toolbar.Styles /> */}\n {/* <Toolbar.Format /> */}\n {/* <Toolbar.Alignment /> */}\n <Toolbar.Separator />\n <Toolbar.Actions />\n </Toolbar.Root>\n </div>\n <div\n role='none'\n className={mx(\n role === 'section' && 'aspect-square border-is border-bs border-be border-separator',\n role === 'article' &&\n 'flex is-full overflow-hidden focus-visible:ring-inset row-span-1 data-[toolbar=disabled]:pbs-2 data-[toolbar=disabled]:row-span-2 border-bs border-separator attention-surface',\n focusRing,\n )}\n >\n <Sheet.Main />\n </div>\n </Sheet.Root>\n </div>\n );\n};\n\nexport default SheetContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n type Icon,\n Calendar,\n ChatText,\n CurrencyDollar,\n Eraser,\n HighlighterCircle,\n TextAlignCenter,\n TextAlignLeft,\n TextAlignRight,\n} from '@phosphor-icons/react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren } from 'react';\n\nimport {\n DensityProvider,\n ElevationProvider,\n Toolbar as NaturalToolbar,\n type ThemedClassName,\n useTranslation,\n} from '@dxos/react-ui';\nimport { nonNullable } from '@dxos/util';\n\nimport { ToolbarButton, ToolbarSeparator, ToolbarToggleButton } from './common';\nimport { addressToIndex } from '../../defs';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type Formatting } from '../../types';\nimport { useSheetContext } from '../Sheet/sheet-context';\n\n//\n// Root\n//\n\nexport type ToolbarAction =\n | { type: 'clear' }\n | { type: 'highlight' }\n | { type: 'left' }\n | { type: 'center' }\n | { type: 'right' }\n | { type: 'date' }\n | { type: 'currency' }\n | { type: 'comment'; anchor: string; cellContent?: string };\n\nexport type ToolbarActionType = ToolbarAction['type'];\n\nexport type ToolbarActionHandler = (action: ToolbarAction) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n onAction?: ToolbarActionHandler;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<ToolbarProps>('Toolbar');\n\nconst ToolbarRoot = ({ children, onAction, classNames }: ToolbarProps) => {\n return (\n <ToolbarContextProvider onAction={onAction}>\n <DensityProvider density='fine'>\n <ElevationProvider elevation='chrome'>\n <NaturalToolbar.Root classNames={['is-full shrink-0 overflow-x-auto overflow-y-hidden p-1', classNames]}>\n {children}\n </NaturalToolbar.Root>\n </ElevationProvider>\n </DensityProvider>\n </ToolbarContextProvider>\n );\n};\n\n// TODO(burdon): Generalize.\n// TODO(burdon): Detect and display current state.\ntype ButtonProps = {\n type: ToolbarActionType;\n Icon: Icon;\n getState: (state: Formatting) => boolean;\n disabled?: (state: Formatting) => boolean;\n};\n\n//\n// Alignment\n//\n\nconst formatOptions: ButtonProps[] = [\n { type: 'date', Icon: Calendar, getState: (state) => false },\n { type: 'currency', Icon: CurrencyDollar, getState: (state) => false },\n];\n\nconst Format = () => {\n const { onAction } = useToolbarContext('Format');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n // value={cellStyles.filter(({ getState }) => state && getState(state)).map(({ type }) => type)}\n >\n {formatOptions.map(({ type, getState, Icon }) => (\n <ToolbarToggleButton\n key={type}\n value={type}\n Icon={Icon}\n // disabled={state?.blockType === 'codeblock'}\n // onClick={state ? () => onAction?.({ type, data: !getState(state) }) : undefined}\n onClick={() => onAction?.({ type: type as Exclude<typeof type, 'comment'> })}\n >\n {t(`toolbar ${type} label`)}\n </ToolbarToggleButton>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nconst alignmentOptions: ButtonProps[] = [\n { type: 'left', Icon: TextAlignLeft, getState: (state) => false },\n { type: 'center', Icon: TextAlignCenter, getState: (state) => false },\n { type: 'right', Icon: TextAlignRight, getState: (state) => false },\n];\n\nconst Alignment = () => {\n const { onAction } = useToolbarContext('Alignment');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n // value={cellStyles.filter(({ getState }) => state && getState(state)).map(({ type }) => type)}\n >\n {alignmentOptions.map(({ type, getState, Icon }) => (\n <ToolbarToggleButton\n key={type}\n value={type}\n Icon={Icon}\n // disabled={state?.blockType === 'codeblock'}\n // onClick={state ? () => onAction?.({ type, data: !getState(state) }) : undefined}\n onClick={() => onAction?.({ type: type as Exclude<typeof type, 'comment'> })}\n >\n {t(`toolbar ${type} label`)}\n </ToolbarToggleButton>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nconst styleOptions: ButtonProps[] = [\n { type: 'clear', Icon: Eraser, getState: (state) => false },\n { type: 'highlight', Icon: HighlighterCircle, getState: (state) => false },\n];\n\nconst Styles = () => {\n const { onAction } = useToolbarContext('Alignment');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n // value={cellStyles.filter(({ getState }) => state && getState(state)).map(({ type }) => type)}\n >\n {styleOptions.map(({ type, getState, Icon }) => (\n <ToolbarToggleButton\n key={type}\n value={type}\n Icon={Icon}\n // disabled={state?.blockType === 'codeblock'}\n // onClick={state ? () => onAction?.({ type, data: !getState(state) }) : undefined}\n onClick={() => onAction?.({ type: type as Exclude<typeof type, 'comment'> })}\n >\n {t(`toolbar ${type} label`)}\n </ToolbarToggleButton>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\n//\n// Actions\n//\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { cursor, range, model } = useSheetContext();\n const { t } = useTranslation(SHEET_PLUGIN);\n\n const overlapsCommentAnchor = (model.sheet.threads ?? [])\n .filter(nonNullable)\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursor) {\n return false;\n }\n return addressToIndex(model.sheet, cursor) === thread.anchor;\n });\n\n const hasCursor = !!cursor;\n const cursorOnly = hasCursor && !range && !overlapsCommentAnchor;\n\n const tooltipLabelKey = !hasCursor\n ? 'no cursor label'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment label'\n : range\n ? 'comment ranges not supported label'\n : 'comment label';\n\n return (\n <ToolbarButton\n value='comment'\n Icon={ChatText}\n data-testid='editor.toolbar.comment'\n onClick={() => {\n if (!cursor) {\n return;\n }\n return onAction?.({\n type: 'comment',\n anchor: addressToIndex(model.sheet, cursor),\n cellContent: model.getCellText(cursor),\n });\n }}\n disabled={!cursorOnly || overlapsCommentAnchor}\n >\n {t(tooltipLabelKey)}\n </ToolbarButton>\n );\n};\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Separator: ToolbarSeparator,\n Alignment,\n Format,\n Styles,\n Actions,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Icon } from '@phosphor-icons/react';\nimport React from 'react';\n\nimport {\n Toolbar as NaturalToolbar,\n Tooltip,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n} from '@dxos/react-ui';\nimport { getSize } from '@dxos/react-ui-theme';\n\n// TODO(burdon): Factor out in common with react-ui-editor.\n\nexport const iconStyles = getSize(5);\nexport const buttonStyles = 'min-bs-0 p-2';\nexport const tooltipProps = { side: 'top' as const, classNames: 'z-10' };\n\nexport const ToolbarSeparator = () => <div role='separator' className='grow' />;\n\n//\n// ToolbarButton\n//\n\ntype ToolbarButtonProps = NaturalToolbarButtonProps & { Icon: Icon };\n\nexport const ToolbarButton = ({ Icon, children, ...props }: ToolbarButtonProps) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' {...props} classNames={buttonStyles}>\n <Icon className={iconStyles} />\n <span className='sr-only'>{children}</span>\n </NaturalToolbar.Button>\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// ToolbarToggleButton\n//\n\nexport type ToolbarToggleButtonProps = NaturalToolbarToggleGroupItemProps & { Icon: Icon };\n\nexport const ToolbarToggleButton = ({ Icon, children, ...props }: ToolbarToggleButtonProps) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.ToggleGroupItem variant='ghost' {...props} classNames={buttonStyles}>\n <Icon className={iconStyles} />\n <span className='sr-only'>{children}</span>\n </NaturalToolbar.ToggleGroupItem>\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"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useIntentDispatcher", "fullyQualifiedId", "useAttendableAttributes", "useAttention", "focusRing", "mx", "Calendar", "ChatText", "CurrencyDollar", "Eraser", "HighlighterCircle", "TextAlignCenter", "TextAlignLeft", "TextAlignRight", "createContext", "React", "DensityProvider", "ElevationProvider", "Toolbar", "NaturalToolbar", "useTranslation", "nonNullable", "React", "Toolbar", "NaturalToolbar", "Tooltip", "getSize", "iconStyles", "getSize", "buttonStyles", "tooltipProps", "side", "classNames", "ToolbarSeparator", "div", "role", "className", "ToolbarButton", "Icon", "children", "props", "Tooltip", "Root", "Trigger", "asChild", "NaturalToolbar", "Button", "variant", "span", "Portal", "Content", "Arrow", "ToolbarToggleButton", "ToggleGroupItem", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "children", "onAction", "classNames", "React", "DensityProvider", "density", "ElevationProvider", "elevation", "NaturalToolbar", "Root", "formatOptions", "type", "Icon", "Calendar", "getState", "state", "CurrencyDollar", "Format", "t", "useTranslation", "SHEET_PLUGIN", "ToggleGroup", "map", "ToolbarToggleButton", "key", "value", "onClick", "alignmentOptions", "TextAlignLeft", "TextAlignCenter", "TextAlignRight", "Alignment", "styleOptions", "Eraser", "HighlighterCircle", "Styles", "Actions", "cursor", "range", "model", "useSheetContext", "overlapsCommentAnchor", "sheet", "threads", "filter", "nonNullable", "thread", "status", "some", "addressToIndex", "anchor", "hasCursor", "cursorOnly", "tooltipLabelKey", "ToolbarButton", "ChatText", "data-testid", "cellContent", "getCellText", "disabled", "Toolbar", "Separator", "ToolbarSeparator", "sectionToolbarLayout", "SheetContainer", "graph", "sheet", "role", "dispatch", "useIntentDispatcher", "id", "fullyQualifiedId", "attendableAttrs", "useAttendableAttributes", "hasAttention", "useAttention", "handleAction", "useCallback", "action", "type", "data", "cursor", "anchor", "name", "cellContent", "subject", "React", "div", "className", "undefined", "Sheet", "Root", "mx", "Toolbar", "onAction", "classNames", "Separator", "Actions", "focusRing", "Main"]
7
+ }
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  SheetType,
3
3
  ValueTypeEnum
4
- } from "./chunk-T3NJFTD4.mjs";
4
+ } from "./chunk-WZMOZKQZ.mjs";
5
5
  import {
6
6
  SHEET_PLUGIN
7
7
  } from "./chunk-QILRZNE5.mjs";
8
8
  import {
9
9
  createSheetName
10
- } from "./chunk-6ZMQVB4Z.mjs";
10
+ } from "./chunk-GSV5QNLD.mjs";
11
11
 
12
12
  // packages/plugins/plugin-sheet/src/components/Sheet/Sheet.tsx
13
13
  import { DndContext, DragOverlay, KeyboardSensor, MouseSensor, TouchSensor, useDraggable, useDroppable, useSensor, useSensors } from "@dnd-kit/core";
@@ -21,7 +21,7 @@ import { useResizeDetector } from "react-resize-detector";
21
21
  import { debounce as debounce2 } from "@dxos/async";
22
22
  import { fullyQualifiedId as fullyQualifiedId2, createDocAccessor } from "@dxos/client/echo";
23
23
  import { log as log2 } from "@dxos/log";
24
- import { createAttendableAttributes, useHasAttention } from "@dxos/react-ui-attention";
24
+ import { ATTENABLE_ATTRIBUTE, useAttendableAttributes, useAttention, useAttentionPath } from "@dxos/react-ui-attention";
25
25
  import { mx as mx2 } from "@dxos/react-ui-theme";
26
26
 
27
27
  // packages/plugins/plugin-sheet/src/components/Sheet/grid.ts
@@ -56,7 +56,7 @@ var addressFromA1Notation = (ref) => {
56
56
  const match = ref.match(/([A-Z]+)(\d+)/);
57
57
  invariant(match, `Invalid notation: ${ref}`, {
58
58
  F: __dxlog_file,
59
- L: 39,
59
+ L: 40,
60
60
  S: void 0,
61
61
  A: [
62
62
  "match",
@@ -131,9 +131,9 @@ var initialize = (sheet, { rows = DEFAULT_ROWS, columns = DEFAULT_COLUMNS } = {}
131
131
  insertIndices(sheet.columns, 0, columns, MAX_COLUMNS);
132
132
  }
133
133
  };
134
- var createSheet = ({ title, ...size } = {}) => {
134
+ var createSheet = ({ name, cells, ...size } = {}) => {
135
135
  const sheet = create(SheetType, {
136
- title,
136
+ name,
137
137
  cells: {},
138
138
  rows: [],
139
139
  columns: [],
@@ -142,6 +142,14 @@ var createSheet = ({ title, ...size } = {}) => {
142
142
  formatting: {}
143
143
  });
144
144
  initialize(sheet, size);
145
+ if (cells) {
146
+ Object.entries(cells).forEach(([key, { value }]) => {
147
+ const idx = addressToIndex(sheet, addressFromA1Notation(key));
148
+ sheet.cells[idx] = {
149
+ value
150
+ };
151
+ });
152
+ }
145
153
  return sheet;
146
154
  };
147
155
  var addressToIndex = (sheet, cell) => {
@@ -536,15 +544,22 @@ var ComputeGraphContextProvider = ({ registry, children }) => {
536
544
  };
537
545
 
538
546
  // packages/plugins/plugin-sheet/src/components/index.ts
539
- var SheetContainer = React2.lazy(() => import("./SheetContainer-V4GCCZTX.mjs"));
547
+ var SheetContainer = React2.lazy(() => import("./SheetContainer-LG77O4RM.mjs"));
540
548
 
541
549
  // packages/plugins/plugin-sheet/src/hooks/useComputeGraph.ts
542
550
  var useComputeGraph = (space) => {
543
551
  const { registry } = useContext(ComputeGraphContext) ?? raise(new Error("Missing ComputeGraphContext"));
544
- return useAsyncState(async () => space && registry.getOrCreateGraph(space), [
552
+ const [graph] = useAsyncState(async () => {
553
+ if (space) {
554
+ const graph2 = registry.getOrCreateGraph(space);
555
+ await graph2.open();
556
+ return graph2;
557
+ }
558
+ }, [
545
559
  space,
546
560
  registry
547
561
  ]);
562
+ return graph;
548
563
  };
549
564
 
550
565
  // packages/plugins/plugin-sheet/src/hooks/useFormattingModel.ts
@@ -664,6 +679,7 @@ var FormattingModel = class {
664
679
  // packages/plugins/plugin-sheet/src/model/sheet-model.ts
665
680
  import { Event } from "@dxos/async";
666
681
  import { Resource } from "@dxos/context";
682
+ import { getTypename } from "@dxos/echo-schema";
667
683
  import { invariant as invariant2 } from "@dxos/invariant";
668
684
  import { PublicKey } from "@dxos/keys";
669
685
  import { log } from "@dxos/log";
@@ -702,8 +718,6 @@ var SheetModel = class extends Resource {
702
718
  this._options = _options;
703
719
  this.id = `model-${PublicKey.random().truncate()}`;
704
720
  this.update = new Event();
705
- this._node = this._graph.getOrCreateNode(createSheetName(this._sheet.id));
706
- this.reset();
707
721
  }
708
722
  get graph() {
709
723
  return this._graph;
@@ -728,14 +742,19 @@ var SheetModel = class extends Resource {
728
742
  id: this.id
729
743
  }, {
730
744
  F: __dxlog_file2,
731
- L: 105,
745
+ L: 104,
732
746
  S: this,
733
747
  C: (f, a) => f(...a)
734
748
  });
735
749
  initialize(this._sheet);
736
- this.reset();
737
- const unsubscribe = this._graph.update.on(() => this.update.emit());
750
+ this._node = this._graph.getOrCreateNode(createSheetName({
751
+ type: getTypename(this._sheet),
752
+ id: this._sheet.id
753
+ }));
754
+ await this._node.open();
755
+ const unsubscribe = this._node.update.on((event) => this.update.emit(event));
738
756
  this._ctx.onDispose(unsubscribe);
757
+ this.reset();
739
758
  }
740
759
  /**
741
760
  * Update engine.
@@ -743,13 +762,31 @@ var SheetModel = class extends Resource {
743
762
  * @deprecated
744
763
  */
745
764
  reset() {
746
- this._node.hf.clearSheet(this._node.sheetId);
765
+ invariant2(this._node, void 0, {
766
+ F: __dxlog_file2,
767
+ L: 124,
768
+ S: this,
769
+ A: [
770
+ "this._node",
771
+ ""
772
+ ]
773
+ });
774
+ this._node.graph.hf.clearSheet(this._node.sheetId);
747
775
  Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
776
+ invariant2(this._node, void 0, {
777
+ F: __dxlog_file2,
778
+ L: 127,
779
+ S: this,
780
+ A: [
781
+ "this._node",
782
+ ""
783
+ ]
784
+ });
748
785
  const { col, row } = addressFromIndex(this._sheet, key);
749
786
  if (typeof value === "string" && value.charAt(0) === "=") {
750
787
  value = this._graph.mapFormulaToNative(this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value)));
751
788
  }
752
- this._node.hf.setCellContents({
789
+ this._node.graph.hf.setCellContents({
753
790
  sheet: this._node.sheetId,
754
791
  row,
755
792
  col
@@ -764,7 +801,7 @@ var SheetModel = class extends Resource {
764
801
  */
765
802
  // TODO(burdon): Remove.
766
803
  recalculate() {
767
- this._node.hf.rebuildAndRecalculate();
804
+ this._node?.graph.hf.rebuildAndRecalculate();
768
805
  }
769
806
  insertRows(i, n = 1) {
770
807
  insertIndices(this._sheet.rows, i, n, MAX_ROWS);
@@ -782,27 +819,63 @@ var SheetModel = class extends Resource {
782
819
  * Clear range of values.
783
820
  */
784
821
  clear(range) {
822
+ invariant2(this._node, void 0, {
823
+ F: __dxlog_file2,
824
+ L: 169,
825
+ S: this,
826
+ A: [
827
+ "this._node",
828
+ ""
829
+ ]
830
+ });
785
831
  const topLeft = getTopLeft(range);
786
832
  const values = this._iterRange(range, () => null);
787
- this._node.hf.setCellContents(toSimpleCellAddress(this._node.sheetId, topLeft), values);
833
+ this._node.graph.hf.setCellContents(toSimpleCellAddress(this._node.sheetId, topLeft), values);
788
834
  this._iterRange(range, (cell) => {
789
835
  const idx = addressToIndex(this._sheet, cell);
790
836
  delete this._sheet.cells[idx];
791
837
  });
792
838
  }
793
839
  cut(range) {
794
- this._node.hf.cut(toModelRange(this._node.sheetId, range));
840
+ invariant2(this._node, void 0, {
841
+ F: __dxlog_file2,
842
+ L: 180,
843
+ S: this,
844
+ A: [
845
+ "this._node",
846
+ ""
847
+ ]
848
+ });
849
+ this._node.graph.hf.cut(toModelRange(this._node.sheetId, range));
795
850
  this._iterRange(range, (cell) => {
796
851
  const idx = addressToIndex(this._sheet, cell);
797
852
  delete this._sheet.cells[idx];
798
853
  });
799
854
  }
800
855
  copy(range) {
801
- this._node.hf.copy(toModelRange(this._node.sheetId, range));
856
+ invariant2(this._node, void 0, {
857
+ F: __dxlog_file2,
858
+ L: 189,
859
+ S: this,
860
+ A: [
861
+ "this._node",
862
+ ""
863
+ ]
864
+ });
865
+ this._node.graph.hf.copy(toModelRange(this._node.sheetId, range));
802
866
  }
803
867
  paste(cell) {
804
- if (!this._node.hf.isClipboardEmpty()) {
805
- const changes = this._node.hf.paste(toSimpleCellAddress(this._node.sheetId, cell));
868
+ invariant2(this._node, void 0, {
869
+ F: __dxlog_file2,
870
+ L: 194,
871
+ S: this,
872
+ A: [
873
+ "this._node",
874
+ ""
875
+ ]
876
+ });
877
+ if (!this._node.graph.hf.isClipboardEmpty()) {
878
+ const changes = this._node.graph.hf.paste(toSimpleCellAddress(this._node.sheetId, cell));
806
879
  for (const change of changes) {
807
880
  if (change instanceof ExportedCellChange) {
808
881
  const { address, newValue } = change;
@@ -819,15 +892,31 @@ var SheetModel = class extends Resource {
819
892
  }
820
893
  // TODO(burdon): Display undo/redo state.
821
894
  undo() {
822
- if (this._node.hf.isThereSomethingToUndo()) {
823
- this._node.hf.undo();
824
- this.update.emit();
895
+ invariant2(this._node, void 0, {
896
+ F: __dxlog_file2,
897
+ L: 209,
898
+ S: this,
899
+ A: [
900
+ "this._node",
901
+ ""
902
+ ]
903
+ });
904
+ if (this._node.graph.hf.isThereSomethingToUndo()) {
905
+ this._node.graph.hf.undo();
825
906
  }
826
907
  }
827
908
  redo() {
828
- if (this._node.hf.isThereSomethingToRedo()) {
829
- this._node.hf.redo();
830
- this.update.emit();
909
+ invariant2(this._node, void 0, {
910
+ F: __dxlog_file2,
911
+ L: 217,
912
+ S: this,
913
+ A: [
914
+ "this._node",
915
+ ""
916
+ ]
917
+ });
918
+ if (this._node.graph.hf.isThereSomethingToRedo()) {
919
+ this._node.graph.hf.redo();
831
920
  }
832
921
  }
833
922
  /**
@@ -861,7 +950,16 @@ var SheetModel = class extends Resource {
861
950
  * Gets the regular or computed value from the engine.
862
951
  */
863
952
  getValue(cell) {
864
- const value = this._node.hf.getCellValue(toSimpleCellAddress(this._node.sheetId, cell));
953
+ invariant2(this._node, void 0, {
954
+ F: __dxlog_file2,
955
+ L: 260,
956
+ S: this,
957
+ A: [
958
+ "this._node",
959
+ ""
960
+ ]
961
+ });
962
+ const value = this._node.graph.hf.getCellValue(toSimpleCellAddress(this._node.sheetId, cell));
865
963
  if (value instanceof DetailedCellError) {
866
964
  return value.toString();
867
965
  }
@@ -871,14 +969,32 @@ var SheetModel = class extends Resource {
871
969
  * Get value type.
872
970
  */
873
971
  getValueType(cell) {
972
+ invariant2(this._node, void 0, {
973
+ F: __dxlog_file2,
974
+ L: 273,
975
+ S: this,
976
+ A: [
977
+ "this._node",
978
+ ""
979
+ ]
980
+ });
874
981
  const addr = toSimpleCellAddress(this._node.sheetId, cell);
875
- const type = this._node.hf.getCellValueDetailedType(addr);
982
+ const type = this._node.graph.hf.getCellValueDetailedType(addr);
876
983
  return typeMap[type];
877
984
  }
878
985
  /**
879
986
  * Sets the value, updating the sheet and engine.
880
987
  */
881
988
  setValue(cell, value) {
989
+ invariant2(this._node, void 0, {
990
+ F: __dxlog_file2,
991
+ L: 283,
992
+ S: this,
993
+ A: [
994
+ "this._node",
995
+ ""
996
+ ]
997
+ });
882
998
  if (this._options.readonly) {
883
999
  throw new ReadonlyException();
884
1000
  }
@@ -894,7 +1010,7 @@ var SheetModel = class extends Resource {
894
1010
  if (refresh) {
895
1011
  this.reset();
896
1012
  }
897
- this._node.hf.setCellContents({
1013
+ this._node.graph.hf.setCellContents({
898
1014
  sheet: this._node.sheetId,
899
1015
  row: cell.row,
900
1016
  col: cell.col
@@ -969,7 +1085,7 @@ var SheetModel = class extends Resource {
969
1085
  mapFormulaRefsToIndices(formula) {
970
1086
  invariant2(formula.charAt(0) === "=", void 0, {
971
1087
  F: __dxlog_file2,
972
- L: 358,
1088
+ L: 372,
973
1089
  S: this,
974
1090
  A: [
975
1091
  "formula.charAt(0) === '='",
@@ -986,7 +1102,7 @@ var SheetModel = class extends Resource {
986
1102
  mapFormulaIndicesToRefs(formula) {
987
1103
  invariant2(formula.charAt(0) === "=", void 0, {
988
1104
  F: __dxlog_file2,
989
- L: 368,
1105
+ L: 382,
990
1106
  S: this,
991
1107
  A: [
992
1108
  "formula.charAt(0) === '='",
@@ -1010,13 +1126,40 @@ var SheetModel = class extends Resource {
1010
1126
  return new Date(year, month - 1, day, hours, minutes, seconds);
1011
1127
  }
1012
1128
  toDateTime(num) {
1013
- return this._node.hf.numberToDateTime(num);
1129
+ invariant2(this._node, void 0, {
1130
+ F: __dxlog_file2,
1131
+ L: 403,
1132
+ S: this,
1133
+ A: [
1134
+ "this._node",
1135
+ ""
1136
+ ]
1137
+ });
1138
+ return this._node.graph.hf.numberToDateTime(num);
1014
1139
  }
1015
1140
  toDate(num) {
1016
- return this._node.hf.numberToDate(num);
1141
+ invariant2(this._node, void 0, {
1142
+ F: __dxlog_file2,
1143
+ L: 408,
1144
+ S: this,
1145
+ A: [
1146
+ "this._node",
1147
+ ""
1148
+ ]
1149
+ });
1150
+ return this._node.graph.hf.numberToDate(num);
1017
1151
  }
1018
1152
  toTime(num) {
1019
- return this._node.hf.numberToTime(num);
1153
+ invariant2(this._node, void 0, {
1154
+ F: __dxlog_file2,
1155
+ L: 413,
1156
+ S: this,
1157
+ A: [
1158
+ "this._node",
1159
+ ""
1160
+ ]
1161
+ });
1162
+ return this._node.graph.hf.numberToTime(num);
1020
1163
  }
1021
1164
  };
1022
1165
 
@@ -1029,11 +1172,10 @@ var useFormattingModel = (model) => {
1029
1172
 
1030
1173
  // packages/plugins/plugin-sheet/src/hooks/useSheetModel.ts
1031
1174
  import { useEffect as useEffect2, useState as useState3 } from "react";
1032
- var useSheetModel = (space, sheet, { readonly } = {}) => {
1033
- const graph = useComputeGraph(space);
1175
+ var useSheetModel = (graph, sheet, { readonly } = {}) => {
1034
1176
  const [model, setModel] = useState3();
1035
1177
  useEffect2(() => {
1036
- if (!space || !graph || !sheet) {
1178
+ if (!graph || !sheet) {
1037
1179
  return;
1038
1180
  }
1039
1181
  let model2;
@@ -1049,9 +1191,8 @@ var useSheetModel = (space, sheet, { readonly } = {}) => {
1049
1191
  void model2?.close();
1050
1192
  };
1051
1193
  }, [
1052
- space,
1053
- sheet,
1054
1194
  graph,
1195
+ sheet,
1055
1196
  readonly
1056
1197
  ]);
1057
1198
  return model;
@@ -1073,8 +1214,8 @@ var useSheetContext = () => {
1073
1214
  });
1074
1215
  return context;
1075
1216
  };
1076
- var SheetContextProvider = ({ children, sheet, space, readonly, onInfo }) => {
1077
- const model = useSheetModel(space, sheet, {
1217
+ var SheetContextProvider = ({ children, graph, sheet, readonly, onInfo }) => {
1218
+ const model = useSheetModel(graph, sheet, {
1078
1219
  readonly
1079
1220
  });
1080
1221
  const formatting = useFormattingModel(model);
@@ -1456,10 +1597,10 @@ var CellEditor = ({ value, extension, autoFocus, onBlur, variant = "legacy", box
1456
1597
  // packages/plugins/plugin-sheet/src/components/CellEditor/extension.ts
1457
1598
  import { acceptCompletion, autocompletion, completionStatus, startCompletion } from "@codemirror/autocomplete";
1458
1599
  import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
1459
- import { Facet } from "@codemirror/state";
1460
1600
  import { ViewPlugin, keymap as keymap2 } from "@codemirror/view";
1461
1601
  import { tags } from "@lezer/highlight";
1462
1602
  import { spreadsheet } from "codemirror-lang-spreadsheet";
1603
+ import { singleValueFacet } from "@dxos/react-ui-editor/state";
1463
1604
  import { mx } from "@dxos/react-ui-theme";
1464
1605
  var highlightStyles = HighlightStyle.define([
1465
1606
  // Function.
@@ -1491,7 +1632,7 @@ var highlightStyles = HighlightStyle.define([
1491
1632
  class: "text-unAccent"
1492
1633
  }
1493
1634
  ]);
1494
- var languageFacet = Facet.define();
1635
+ var languageFacet = singleValueFacet();
1495
1636
  var sheetExtension = ({ functions = [] }) => {
1496
1637
  const { extension, language } = spreadsheet({
1497
1638
  idiom: "en-US",
@@ -1608,7 +1749,7 @@ var rangeExtension = (onInit) => {
1608
1749
  update(view2) {
1609
1750
  const { anchor } = view2.state.selection.ranges[0];
1610
1751
  activeRange = void 0;
1611
- const [language] = view2.state.facet(languageFacet);
1752
+ const language = view2.state.facet(languageFacet);
1612
1753
  const { topNode } = language.parser.parse(view2.state.doc.toString());
1613
1754
  visitTree(topNode, ({ type, from, to }) => {
1614
1755
  if (from <= anchor && to >= anchor) {
@@ -2172,7 +2313,7 @@ var SheetGrid = /* @__PURE__ */ forwardRef(({ size, rows, columns, rowSizes, col
2172
2313
  id: model.id
2173
2314
  }, {
2174
2315
  F: __dxlog_file4,
2175
- L: 737,
2316
+ L: 738,
2176
2317
  S: void 0,
2177
2318
  C: (f, a) => f(...a)
2178
2319
  });
@@ -2290,8 +2431,7 @@ var SheetGrid = /* @__PURE__ */ forwardRef(({ size, rows, columns, rowSizes, col
2290
2431
  columnSizes
2291
2432
  });
2292
2433
  const id = fullyQualifiedId2(model.sheet);
2293
- const attendableAttrs = createAttendableAttributes(id);
2294
- const hasAttention = useHasAttention(id);
2434
+ const { hasAttention } = useAttention(id);
2295
2435
  return /* @__PURE__ */ React6.createElement("div", {
2296
2436
  ref: containerRef,
2297
2437
  role: "grid",
@@ -2378,13 +2518,25 @@ var SheetGrid = /* @__PURE__ */ forwardRef(({ size, rows, columns, rowSizes, col
2378
2518
  }
2379
2519
  });
2380
2520
  });
2381
- }))), /* @__PURE__ */ createPortal(/* @__PURE__ */ React6.createElement("input", {
2521
+ }))), /* @__PURE__ */ createPortal(/* @__PURE__ */ React6.createElement(SheetInput, {
2382
2522
  ref: inputRef,
2383
- autoFocus: true,
2523
+ id,
2524
+ onKeyDown: handleKeyDown
2525
+ }), document.body));
2526
+ });
2527
+ var SheetInput = /* @__PURE__ */ forwardRef(({ id, onKeyDown }, forwardedRef) => {
2528
+ const path = useAttentionPath();
2529
+ const attendableAttrs = useAttendableAttributes(id);
2530
+ return path.toReversed().reduce((acc, part) => {
2531
+ return /* @__PURE__ */ React6.createElement("div", {
2532
+ [ATTENABLE_ATTRIBUTE]: part
2533
+ }, acc);
2534
+ }, /* @__PURE__ */ React6.createElement("input", {
2535
+ ref: forwardedRef,
2384
2536
  className: "absolute w-[1px] h-[1px] bg-transparent outline-none border-none caret-transparent",
2385
- onKeyDown: handleKeyDown,
2537
+ onKeyDown,
2386
2538
  ...attendableAttrs
2387
- }), document.body));
2539
+ }));
2388
2540
  });
2389
2541
  var SelectionOverlay = ({ root }) => {
2390
2542
  const { range } = useSheetContext();
@@ -2545,8 +2697,9 @@ export {
2545
2697
  createSheet,
2546
2698
  addressToIndex,
2547
2699
  compareIndexPositions,
2700
+ useComputeGraph,
2548
2701
  useSheetContext,
2549
2702
  Sheet,
2550
2703
  SheetContainer
2551
2704
  };
2552
- //# sourceMappingURL=chunk-U2JHW3L6.mjs.map
2705
+ //# sourceMappingURL=chunk-CHQAW4F4.mjs.map