@dxos/plugin-sheet 0.7.5-main.9d2a38b → 0.7.5-main.e94eead

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 (157) hide show
  1. package/dist/lib/browser/{SheetContainer-CM4CO3DC.mjs → SheetContainer-EDJA5L2H.mjs} +5 -5
  2. package/dist/lib/browser/{chunk-FOO6NGBM.mjs → chunk-DN6QF7VV.mjs} +6 -1
  3. package/dist/lib/browser/{chunk-FOO6NGBM.mjs.map → chunk-DN6QF7VV.mjs.map} +2 -2
  4. package/dist/lib/browser/chunk-GAFHJBCU.mjs +18 -0
  5. package/dist/lib/browser/chunk-GAFHJBCU.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-PW25VUP6.mjs → chunk-LXHRT3CC.mjs} +2 -2
  7. package/dist/lib/browser/{chunk-T3IVPMRX.mjs → chunk-OOSRC36N.mjs} +2 -2
  8. package/dist/lib/browser/{chunk-H23JW3DX.mjs → chunk-UGSCCRPW.mjs} +28 -20
  9. package/dist/lib/browser/chunk-UGSCCRPW.mjs.map +7 -0
  10. package/dist/lib/browser/{compute-graph-registry-XH6B2SWG.mjs → compute-graph-registry-EGPD4HEX.mjs} +3 -3
  11. package/dist/lib/browser/index.mjs +28 -36
  12. package/dist/lib/browser/index.mjs.map +3 -3
  13. package/dist/lib/browser/intent-resolver-6S2RMLQF.mjs +56 -0
  14. package/dist/lib/browser/intent-resolver-6S2RMLQF.mjs.map +7 -0
  15. package/dist/lib/browser/{markdown-IKG5FNCA.mjs → markdown-EJU2M7EE.mjs} +4 -4
  16. package/dist/lib/browser/meta.json +1 -1
  17. package/dist/lib/browser/{react-surface-URRC3AFC.mjs → react-surface-24GOYR7J.mjs} +20 -11
  18. package/dist/lib/browser/react-surface-24GOYR7J.mjs.map +7 -0
  19. package/dist/lib/browser/{thread-YX6KBQNQ.mjs → thread-7ZWW5EA7.mjs} +3 -3
  20. package/dist/lib/browser/types/index.mjs +2 -2
  21. package/dist/lib/node/{SheetContainer-TJ3JQLWM.cjs → SheetContainer-B77HHBOC.cjs} +37 -37
  22. package/dist/lib/node/{chunk-E3RXOEL6.cjs → chunk-4LSYTNS4.cjs} +6 -6
  23. package/dist/lib/node/{chunk-NLDXUFDG.cjs → chunk-MLU6KRQN.cjs} +9 -6
  24. package/dist/lib/node/chunk-MLU6KRQN.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-P4KSGZSS.cjs → chunk-SQZEJPZ7.cjs} +9 -4
  26. package/dist/lib/node/{chunk-P4KSGZSS.cjs.map → chunk-SQZEJPZ7.cjs.map} +2 -2
  27. package/dist/lib/node/{chunk-ZPWW4LPY.cjs → chunk-VMJK5QN4.cjs} +41 -33
  28. package/dist/lib/node/chunk-VMJK5QN4.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-FU5K66DS.cjs → chunk-ZV2RS3QH.cjs} +6 -6
  30. package/dist/lib/node/{compute-graph-registry-ORGTIE5M.cjs → compute-graph-registry-GJK5H264.cjs} +7 -7
  31. package/dist/lib/node/index.cjs +43 -51
  32. package/dist/lib/node/index.cjs.map +3 -3
  33. package/dist/lib/node/intent-resolver-I25V7SBT.cjs +69 -0
  34. package/dist/lib/node/intent-resolver-I25V7SBT.cjs.map +7 -0
  35. package/dist/lib/node/{markdown-EUUL3Q36.cjs → markdown-SQHC4EGJ.cjs} +9 -9
  36. package/dist/lib/node/meta.json +1 -1
  37. package/dist/lib/node/{react-surface-IQN5JKSS.cjs → react-surface-6BJQU2XB.cjs} +24 -18
  38. package/dist/lib/node/react-surface-6BJQU2XB.cjs.map +7 -0
  39. package/dist/lib/node/{thread-VBPS23P2.cjs → thread-DRNYTR6M.cjs} +8 -8
  40. package/dist/lib/node/types/index.cjs +30 -30
  41. package/dist/lib/node/types/index.cjs.map +1 -1
  42. package/dist/lib/node-esm/{SheetContainer-QEEFORIC.mjs → SheetContainer-KXWIQCP4.mjs} +5 -5
  43. package/dist/lib/node-esm/{chunk-OXD6RBFF.mjs → chunk-3PA7XGUK.mjs} +28 -20
  44. package/dist/lib/node-esm/chunk-3PA7XGUK.mjs.map +7 -0
  45. package/dist/lib/node-esm/{chunk-PTOI45NK.mjs → chunk-7TL2H7LA.mjs} +6 -1
  46. package/dist/lib/node-esm/{chunk-PTOI45NK.mjs.map → chunk-7TL2H7LA.mjs.map} +2 -2
  47. package/dist/lib/node-esm/{chunk-NSVUOAI6.mjs → chunk-HPAMZ6SP.mjs} +2 -2
  48. package/dist/lib/node-esm/chunk-RTZXXOS2.mjs +20 -0
  49. package/dist/lib/node-esm/chunk-RTZXXOS2.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-KCXK5UM6.mjs → chunk-SX3S7UKU.mjs} +2 -2
  51. package/dist/lib/node-esm/{compute-graph-registry-JH2FRHLD.mjs → compute-graph-registry-3F5JCYEN.mjs} +3 -3
  52. package/dist/lib/node-esm/index.mjs +28 -36
  53. package/dist/lib/node-esm/index.mjs.map +3 -3
  54. package/dist/lib/node-esm/intent-resolver-IPRSINII.mjs +57 -0
  55. package/dist/lib/node-esm/intent-resolver-IPRSINII.mjs.map +7 -0
  56. package/dist/lib/node-esm/{markdown-D2ZMN7LR.mjs → markdown-UXKP45S3.mjs} +4 -4
  57. package/dist/lib/node-esm/meta.json +1 -1
  58. package/dist/lib/node-esm/{react-surface-XJIX5G3I.mjs → react-surface-YGNWYLVN.mjs} +20 -11
  59. package/dist/lib/node-esm/react-surface-YGNWYLVN.mjs.map +7 -0
  60. package/dist/lib/node-esm/{thread-HSJD3SR6.mjs → thread-6T5VXPAF.mjs} +3 -3
  61. package/dist/lib/node-esm/types/index.mjs +2 -2
  62. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  63. package/dist/types/src/capabilities/index.d.ts +8 -13
  64. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  67. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  68. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +1 -1
  69. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -1
  70. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +1 -2
  71. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +1 -1
  72. package/dist/types/src/components/GridSheet/GridSheet.d.ts +1 -2
  73. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  74. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +1 -2
  75. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts +1 -2
  77. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -1
  78. package/dist/types/src/components/RangeList/RangeList.d.ts +1 -2
  79. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
  80. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +1 -2
  81. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  82. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +2 -3
  83. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  84. package/dist/types/src/components/SheetContext/SheetContext.d.ts +2 -2
  85. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -1
  86. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +2 -2
  87. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  88. package/dist/types/src/components/SheetToolbar/align.d.ts +1 -1
  89. package/dist/types/src/components/SheetToolbar/style.d.ts +1 -1
  90. package/dist/types/src/components/index.d.ts +2 -2
  91. package/dist/types/src/components/index.d.ts.map +1 -1
  92. package/dist/types/src/extensions/compute.stories.d.ts +2 -3
  93. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
  94. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -1
  95. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  96. package/dist/types/src/meta.d.ts +1 -0
  97. package/dist/types/src/meta.d.ts.map +1 -1
  98. package/dist/types/src/types/schema.d.ts +14 -14
  99. package/dist/types/src/types/schema.d.ts.map +1 -1
  100. package/package.json +46 -45
  101. package/src/SheetPlugin.tsx +22 -32
  102. package/src/capabilities/index.ts +0 -1
  103. package/src/capabilities/intent-resolver.ts +24 -15
  104. package/src/capabilities/react-surface.tsx +12 -5
  105. package/src/components/GridSheet/util.ts +1 -1
  106. package/src/components/SheetContainer/SheetContainer.stories.tsx +5 -2
  107. package/src/extensions/compute.stories.tsx +2 -2
  108. package/src/extensions/editor/extension.ts +2 -0
  109. package/src/integrations/thread-ranges.ts +21 -10
  110. package/src/meta.ts +3 -1
  111. package/dist/lib/browser/chunk-H23JW3DX.mjs.map +0 -7
  112. package/dist/lib/browser/chunk-K6EUYKWT.mjs +0 -15
  113. package/dist/lib/browser/chunk-K6EUYKWT.mjs.map +0 -7
  114. package/dist/lib/browser/intent-resolver-Q7DTHAM5.mjs +0 -47
  115. package/dist/lib/browser/intent-resolver-Q7DTHAM5.mjs.map +0 -7
  116. package/dist/lib/browser/react-context-JG43577H.mjs +0 -28
  117. package/dist/lib/browser/react-context-JG43577H.mjs.map +0 -7
  118. package/dist/lib/browser/react-surface-URRC3AFC.mjs.map +0 -7
  119. package/dist/lib/node/chunk-NLDXUFDG.cjs.map +0 -7
  120. package/dist/lib/node/chunk-ZPWW4LPY.cjs.map +0 -7
  121. package/dist/lib/node/intent-resolver-ZUDJJUFG.cjs +0 -60
  122. package/dist/lib/node/intent-resolver-ZUDJJUFG.cjs.map +0 -7
  123. package/dist/lib/node/react-context-OOH5QFE2.cjs +0 -50
  124. package/dist/lib/node/react-context-OOH5QFE2.cjs.map +0 -7
  125. package/dist/lib/node/react-surface-IQN5JKSS.cjs.map +0 -7
  126. package/dist/lib/node-esm/chunk-FMOVRTS4.mjs +0 -17
  127. package/dist/lib/node-esm/chunk-FMOVRTS4.mjs.map +0 -7
  128. package/dist/lib/node-esm/chunk-OXD6RBFF.mjs.map +0 -7
  129. package/dist/lib/node-esm/intent-resolver-IF64RN7B.mjs +0 -48
  130. package/dist/lib/node-esm/intent-resolver-IF64RN7B.mjs.map +0 -7
  131. package/dist/lib/node-esm/react-context-CJVSLO74.mjs +0 -29
  132. package/dist/lib/node-esm/react-context-CJVSLO74.mjs.map +0 -7
  133. package/dist/lib/node-esm/react-surface-XJIX5G3I.mjs.map +0 -7
  134. package/dist/types/src/capabilities/react-context.d.ts +0 -8
  135. package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
  136. package/dist/types/src/testing/playwright/playwright.config.d.ts +0 -3
  137. package/dist/types/src/testing/playwright/playwright.config.d.ts.map +0 -1
  138. package/src/capabilities/react-context.tsx +0 -20
  139. /package/dist/lib/browser/{SheetContainer-CM4CO3DC.mjs.map → SheetContainer-EDJA5L2H.mjs.map} +0 -0
  140. /package/dist/lib/browser/{chunk-PW25VUP6.mjs.map → chunk-LXHRT3CC.mjs.map} +0 -0
  141. /package/dist/lib/browser/{chunk-T3IVPMRX.mjs.map → chunk-OOSRC36N.mjs.map} +0 -0
  142. /package/dist/lib/browser/{compute-graph-registry-XH6B2SWG.mjs.map → compute-graph-registry-EGPD4HEX.mjs.map} +0 -0
  143. /package/dist/lib/browser/{markdown-IKG5FNCA.mjs.map → markdown-EJU2M7EE.mjs.map} +0 -0
  144. /package/dist/lib/browser/{thread-YX6KBQNQ.mjs.map → thread-7ZWW5EA7.mjs.map} +0 -0
  145. /package/dist/lib/node/{SheetContainer-TJ3JQLWM.cjs.map → SheetContainer-B77HHBOC.cjs.map} +0 -0
  146. /package/dist/lib/node/{chunk-E3RXOEL6.cjs.map → chunk-4LSYTNS4.cjs.map} +0 -0
  147. /package/dist/lib/node/{chunk-FU5K66DS.cjs.map → chunk-ZV2RS3QH.cjs.map} +0 -0
  148. /package/dist/lib/node/{compute-graph-registry-ORGTIE5M.cjs.map → compute-graph-registry-GJK5H264.cjs.map} +0 -0
  149. /package/dist/lib/node/{markdown-EUUL3Q36.cjs.map → markdown-SQHC4EGJ.cjs.map} +0 -0
  150. /package/dist/lib/node/{thread-VBPS23P2.cjs.map → thread-DRNYTR6M.cjs.map} +0 -0
  151. /package/dist/lib/node-esm/{SheetContainer-QEEFORIC.mjs.map → SheetContainer-KXWIQCP4.mjs.map} +0 -0
  152. /package/dist/lib/node-esm/{chunk-NSVUOAI6.mjs.map → chunk-HPAMZ6SP.mjs.map} +0 -0
  153. /package/dist/lib/node-esm/{chunk-KCXK5UM6.mjs.map → chunk-SX3S7UKU.mjs.map} +0 -0
  154. /package/dist/lib/node-esm/{compute-graph-registry-JH2FRHLD.mjs.map → compute-graph-registry-3F5JCYEN.mjs.map} +0 -0
  155. /package/dist/lib/node-esm/{markdown-D2ZMN7LR.mjs.map → markdown-UXKP45S3.mjs.map} +0 -0
  156. /package/dist/lib/node-esm/{thread-HSJD3SR6.mjs.map → thread-6T5VXPAF.mjs.map} +0 -0
  157. /package/src/testing/playwright/{playwright.config.ts → playwright.config.cts} +0 -0
@@ -27,8 +27,8 @@ import {
27
27
  rangeFromIndex,
28
28
  rangeToIndex,
29
29
  styleKey
30
- } from "../chunk-T3IVPMRX.mjs";
31
- import "../chunk-K6EUYKWT.mjs";
30
+ } from "../chunk-OOSRC36N.mjs";
31
+ import "../chunk-GAFHJBCU.mjs";
32
32
  export {
33
33
  ApiError,
34
34
  CellValue,
@@ -26,15 +26,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var SheetContainer_TJ3JQLWM_exports = {};
30
- __export(SheetContainer_TJ3JQLWM_exports, {
29
+ var SheetContainer_B77HHBOC_exports = {};
30
+ __export(SheetContainer_B77HHBOC_exports, {
31
31
  default: () => SheetContainer_default
32
32
  });
33
- module.exports = __toCommonJS(SheetContainer_TJ3JQLWM_exports);
34
- var import_chunk_ZPWW4LPY = require("./chunk-ZPWW4LPY.cjs");
35
- var import_chunk_E3RXOEL6 = require("./chunk-E3RXOEL6.cjs");
36
- var import_chunk_P4KSGZSS = require("./chunk-P4KSGZSS.cjs");
37
- var import_chunk_NLDXUFDG = require("./chunk-NLDXUFDG.cjs");
33
+ module.exports = __toCommonJS(SheetContainer_B77HHBOC_exports);
34
+ var import_chunk_VMJK5QN4 = require("./chunk-VMJK5QN4.cjs");
35
+ var import_chunk_SQZEJPZ7 = require("./chunk-SQZEJPZ7.cjs");
36
+ var import_chunk_4LSYTNS4 = require("./chunk-4LSYTNS4.cjs");
37
+ var import_chunk_MLU6KRQN = require("./chunk-MLU6KRQN.cjs");
38
38
  var import_react = __toESM(require("react"));
39
39
  var import_echo = require("@dxos/react-client/echo");
40
40
  var import_react_ui_stack = require("@dxos/react-ui-stack");
@@ -59,13 +59,13 @@ var import_types = require("@dxos/plugin-thread/types");
59
59
  var import_react8 = require("react");
60
60
  var import_live_object2 = require("@dxos/live-object");
61
61
  var FunctionEditor = () => {
62
- const { model, cursor, range } = (0, import_chunk_ZPWW4LPY.useSheetContext)();
62
+ const { model, cursor, range } = (0, import_chunk_VMJK5QN4.useSheetContext)();
63
63
  let value;
64
64
  let formula = false;
65
65
  if (cursor) {
66
66
  value = model.getCellValue(cursor);
67
67
  if ((0, import_compute.isFormula)(value)) {
68
- value = model.graph.mapFunctionBindingFromId((0, import_chunk_E3RXOEL6.mapFormulaIndicesToRefs)(model.sheet, value));
68
+ value = model.graph.mapFunctionBindingFromId((0, import_chunk_4LSYTNS4.mapFormulaIndicesToRefs)(model.sheet, value));
69
69
  formula = true;
70
70
  } else if (value != null) {
71
71
  value = String(value);
@@ -95,9 +95,9 @@ var aligns = {
95
95
  end: "ph--text-align-right--regular"
96
96
  };
97
97
  var useAlignState = (state) => {
98
- const { cursor, model } = (0, import_chunk_ZPWW4LPY.useSheetContext)();
98
+ const { cursor, model } = (0, import_chunk_VMJK5QN4.useSheetContext)();
99
99
  (0, import_react4.useEffect)(() => {
100
- state[import_chunk_E3RXOEL6.alignKey] = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === import_chunk_E3RXOEL6.alignKey && (0, import_compute2.inRange)((0, import_chunk_E3RXOEL6.rangeFromIndex)(model.sheet, range), cursor))?.value : void 0;
100
+ state[import_chunk_4LSYTNS4.alignKey] = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === import_chunk_4LSYTNS4.alignKey && (0, import_compute2.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), cursor))?.value : void 0;
101
101
  }, [
102
102
  cursor,
103
103
  model.sheet
@@ -107,29 +107,29 @@ var createAlignGroupAction = (value) => (0, import_react_ui_menu2.createMenuItem
107
107
  label: [
108
108
  "align label",
109
109
  {
110
- ns: import_chunk_NLDXUFDG.SHEET_PLUGIN
110
+ ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
111
111
  }
112
112
  ],
113
113
  variant: "toggleGroup",
114
114
  selectCardinality: "single",
115
- value: `${import_chunk_E3RXOEL6.alignKey}--${value}`
115
+ value: `${import_chunk_4LSYTNS4.alignKey}--${value}`
116
116
  });
117
117
  var createAlignActions = (value) => Object.entries(aligns).map(([alignValue, icon]) => {
118
- return (0, import_react_ui_menu2.createMenuAction)(`${import_chunk_E3RXOEL6.alignKey}--${alignValue}`, {
119
- key: import_chunk_E3RXOEL6.alignKey,
118
+ return (0, import_react_ui_menu2.createMenuAction)(`${import_chunk_4LSYTNS4.alignKey}--${alignValue}`, {
119
+ key: import_chunk_4LSYTNS4.alignKey,
120
120
  value: alignValue,
121
121
  checked: value === alignValue,
122
122
  label: [
123
123
  `range value ${alignValue} label`,
124
124
  {
125
- ns: import_chunk_NLDXUFDG.SHEET_PLUGIN
125
+ ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
126
126
  }
127
127
  ],
128
128
  icon,
129
- testId: `grid.toolbar.${import_chunk_E3RXOEL6.alignKey}.${alignValue}`
129
+ testId: `grid.toolbar.${import_chunk_4LSYTNS4.alignKey}.${alignValue}`
130
130
  });
131
131
  });
132
- var createAlign = ({ [import_chunk_E3RXOEL6.alignKey]: alignValue }) => {
132
+ var createAlign = ({ [import_chunk_4LSYTNS4.alignKey]: alignValue }) => {
133
133
  const alignGroup = createAlignGroupAction(alignValue);
134
134
  const alignActions = createAlignActions(alignValue);
135
135
  return {
@@ -150,12 +150,12 @@ var createAlign = ({ [import_chunk_E3RXOEL6.alignKey]: alignValue }) => {
150
150
  };
151
151
  };
152
152
  var useCommentState = (state) => {
153
- const { cursorFallbackRange, model } = (0, import_chunk_ZPWW4LPY.useSheetContext)();
153
+ const { cursorFallbackRange, model } = (0, import_chunk_VMJK5QN4.useSheetContext)();
154
154
  const overlapsCommentAnchor = (0, import_react5.useMemo)(() => import_live_object.RefArray.allResolvedTargets(model.sheet.threads ?? []).filter((thread) => thread.status !== "resolved").some((thread) => {
155
155
  if (!cursorFallbackRange) {
156
156
  return false;
157
157
  }
158
- return (0, import_chunk_E3RXOEL6.rangeToIndex)(model.sheet, cursorFallbackRange) === thread.anchor;
158
+ return (0, import_chunk_4LSYTNS4.rangeToIndex)(model.sheet, cursorFallbackRange) === thread.anchor;
159
159
  }), [
160
160
  cursorFallbackRange,
161
161
  model.sheet
@@ -168,13 +168,13 @@ var useCommentState = (state) => {
168
168
  ]);
169
169
  };
170
170
  var createCommentAction = (state) => (0, import_react_ui_menu3.createMenuAction)("comment", {
171
- key: import_chunk_E3RXOEL6.commentKey,
171
+ key: import_chunk_4LSYTNS4.commentKey,
172
172
  testId: "editor.toolbar.comment",
173
173
  icon: "ph--chat-text--regular",
174
174
  label: [
175
175
  `${state.commentEnabled} label`,
176
176
  {
177
- ns: import_chunk_NLDXUFDG.SHEET_PLUGIN
177
+ ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
178
178
  }
179
179
  ],
180
180
  disabled: state.commentEnabled !== "comment"
@@ -195,12 +195,12 @@ var styles = {
195
195
  softwrap: "ph--paragraph--regular"
196
196
  };
197
197
  var useStyleState = (state) => {
198
- const { cursorFallbackRange, model } = (0, import_chunk_ZPWW4LPY.useSheetContext)();
198
+ const { cursorFallbackRange, model } = (0, import_chunk_VMJK5QN4.useSheetContext)();
199
199
  (0, import_react6.useEffect)(() => {
200
200
  state.highlight = false;
201
201
  state.softwrap = false;
202
202
  if (cursorFallbackRange && model.sheet.ranges) {
203
- model.sheet.ranges.filter(({ range, key }) => key === "style" && (0, import_compute3.inRange)((0, import_chunk_E3RXOEL6.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).forEach(({ value }) => {
203
+ model.sheet.ranges.filter(({ range, key }) => key === "style" && (0, import_compute3.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).forEach(({ value }) => {
204
204
  state[value] = true;
205
205
  });
206
206
  }
@@ -224,7 +224,7 @@ var createStyleActions = (state) => Object.entries(styles).map(([styleValue, ico
224
224
  label: [
225
225
  `range value ${styleValue} label`,
226
226
  {
227
- ns: import_chunk_NLDXUFDG.SHEET_PLUGIN
227
+ ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
228
228
  }
229
229
  ],
230
230
  checked: !!state[styleValue]
@@ -251,14 +251,14 @@ var createStyle = (state) => {
251
251
  };
252
252
  };
253
253
  var useToolbarAction = (state) => {
254
- const { model, cursorFallbackRange, cursor } = (0, import_chunk_ZPWW4LPY.useSheetContext)();
254
+ const { model, cursorFallbackRange, cursor } = (0, import_chunk_VMJK5QN4.useSheetContext)();
255
255
  const { dispatchPromise: dispatch } = (0, import_app_framework.useIntentDispatcher)();
256
256
  return (0, import_react7.useCallback)((action) => {
257
257
  const { key, value } = action.properties;
258
258
  if (cursorFallbackRange) {
259
- const index = model.sheet.ranges?.findIndex((range) => range.key === key && (0, import_compute4.inRange)((0, import_chunk_E3RXOEL6.rangeFromIndex)(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
259
+ const index = model.sheet.ranges?.findIndex((range) => range.key === key && (0, import_compute4.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
260
260
  const nextRangeEntity = {
261
- range: (0, import_chunk_E3RXOEL6.rangeToIndex)(model.sheet, cursorFallbackRange),
261
+ range: (0, import_chunk_4LSYTNS4.rangeToIndex)(model.sheet, cursorFallbackRange),
262
262
  key,
263
263
  value
264
264
  };
@@ -266,17 +266,17 @@ var useToolbarAction = (state) => {
266
266
  case "alignment":
267
267
  if (index < 0) {
268
268
  model.sheet.ranges?.push(nextRangeEntity);
269
- state[import_chunk_E3RXOEL6.alignKey] = value;
269
+ state[import_chunk_4LSYTNS4.alignKey] = value;
270
270
  } else if (model.sheet.ranges[index].value === value) {
271
271
  model.sheet.ranges?.splice(index, 1);
272
- state[import_chunk_E3RXOEL6.alignKey] = void 0;
272
+ state[import_chunk_4LSYTNS4.alignKey] = void 0;
273
273
  } else {
274
274
  model.sheet.ranges?.splice(index, 1, nextRangeEntity);
275
- state[import_chunk_E3RXOEL6.alignKey] = value;
275
+ state[import_chunk_4LSYTNS4.alignKey] = value;
276
276
  }
277
277
  break;
278
278
  case "style":
279
- if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && (0, import_compute4.inRange)((0, import_chunk_E3RXOEL6.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).some(({ value: rangeValue }) => rangeValue === value)) {
279
+ if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && (0, import_compute4.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).some(({ value: rangeValue }) => rangeValue === value)) {
280
280
  if (index >= 0) {
281
281
  model.sheet.ranges?.splice(index, 1);
282
282
  }
@@ -289,7 +289,7 @@ var useToolbarAction = (state) => {
289
289
  case "comment": {
290
290
  const cellContent = model.getCellText(cursorFallbackRange.from);
291
291
  void dispatch((0, import_app_framework.createIntent)(import_types.ThreadAction.Create, {
292
- cursor: (0, import_chunk_ZPWW4LPY.completeCellRangeToThreadCursor)(cursorFallbackRange),
292
+ cursor: (0, import_chunk_VMJK5QN4.completeCellRangeToThreadCursor)(cursorFallbackRange),
293
293
  name: cellContent,
294
294
  subject: model.sheet
295
295
  }));
@@ -345,8 +345,8 @@ var SheetToolbar = ({ attendableId, classNames }) => {
345
345
  }));
346
346
  };
347
347
  var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
348
- const graph = (0, import_chunk_ZPWW4LPY.useComputeGraph)(space);
349
- return graph ? /* @__PURE__ */ import_react.default.createElement(import_chunk_ZPWW4LPY.SheetProvider, {
348
+ const graph = (0, import_chunk_VMJK5QN4.useComputeGraph)(space);
349
+ return graph ? /* @__PURE__ */ import_react.default.createElement(import_chunk_VMJK5QN4.SheetProvider, {
350
350
  sheet,
351
351
  graph,
352
352
  ignoreAttention
@@ -358,7 +358,7 @@ var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
358
358
  }
359
359
  }, /* @__PURE__ */ import_react.default.createElement(SheetToolbar, {
360
360
  attendableId: (0, import_echo.fullyQualifiedId)(sheet)
361
- }), /* @__PURE__ */ import_react.default.createElement(import_chunk_ZPWW4LPY.GridSheet, null), /* @__PURE__ */ import_react.default.createElement(FunctionEditor, null))) : null;
361
+ }), /* @__PURE__ */ import_react.default.createElement(import_chunk_VMJK5QN4.GridSheet, null), /* @__PURE__ */ import_react.default.createElement(FunctionEditor, null))) : null;
362
362
  };
363
363
  var SheetContainer_default = SheetContainer;
364
- //# sourceMappingURL=SheetContainer-TJ3JQLWM.cjs.map
364
+ //# sourceMappingURL=SheetContainer-B77HHBOC.cjs.map
@@ -16,8 +16,8 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_E3RXOEL6_exports = {};
20
- __export(chunk_E3RXOEL6_exports, {
19
+ var chunk_4LSYTNS4_exports = {};
20
+ __export(chunk_4LSYTNS4_exports, {
21
21
  ApiError: () => ApiError,
22
22
  CellValue: () => CellValue,
23
23
  DEFAULT_COLS: () => DEFAULT_COLS,
@@ -48,8 +48,8 @@ __export(chunk_E3RXOEL6_exports, {
48
48
  styleKey: () => styleKey,
49
49
  useSheetModel: () => useSheetModel
50
50
  });
51
- module.exports = __toCommonJS(chunk_E3RXOEL6_exports);
52
- var import_chunk_NLDXUFDG = require("./chunk-NLDXUFDG.cjs");
51
+ module.exports = __toCommonJS(chunk_4LSYTNS4_exports);
52
+ var import_chunk_MLU6KRQN = require("./chunk-MLU6KRQN.cjs");
53
53
  var import_echo_schema = require("@dxos/echo-schema");
54
54
  var import_types = require("@dxos/plugin-space/types");
55
55
  var import_echo_schema2 = require("@dxos/echo-schema");
@@ -732,7 +732,7 @@ var useSheetModel = (graph, sheet, { readonly } = {}) => {
732
732
  };
733
733
  var SheetAction;
734
734
  (function(SheetAction2) {
735
- const SHEET_ACTION = `${import_chunk_NLDXUFDG.SHEET_PLUGIN}/action`;
735
+ const SHEET_ACTION = `${import_chunk_MLU6KRQN.SHEET_PLUGIN}/action`;
736
736
  class Create extends import_echo_schema2.S.TaggedClass()(`${SHEET_ACTION}/create`, {
737
737
  input: import_echo_schema2.S.Struct({
738
738
  name: import_echo_schema2.S.optional(import_echo_schema2.S.String)
@@ -932,4 +932,4 @@ var mapFormulaIndicesToRefs = (sheet, formula) => {
932
932
  styleKey,
933
933
  useSheetModel
934
934
  });
935
- //# sourceMappingURL=chunk-E3RXOEL6.cjs.map
935
+ //# sourceMappingURL=chunk-4LSYTNS4.cjs.map
@@ -16,23 +16,26 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_NLDXUFDG_exports = {};
20
- __export(chunk_NLDXUFDG_exports, {
19
+ var chunk_MLU6KRQN_exports = {};
20
+ __export(chunk_MLU6KRQN_exports, {
21
21
  SHEET_PLUGIN: () => SHEET_PLUGIN,
22
22
  meta: () => meta
23
23
  });
24
- module.exports = __toCommonJS(chunk_NLDXUFDG_exports);
24
+ module.exports = __toCommonJS(chunk_MLU6KRQN_exports);
25
25
  var SHEET_PLUGIN = "dxos.org/plugin/sheet";
26
26
  var meta = {
27
27
  id: SHEET_PLUGIN,
28
28
  name: "Sheet",
29
- description: "A simple spreadsheet plugin.",
29
+ description: "Sheets in Composer are simple spreadsheets which allow you to leverage custom functions inside of cell grids. Leverage more than 400 pre-built formulas like Sum, Average, Count, Max, Min along with many others. You can also deploy your own custom functions using the Scripts plugin. ",
30
30
  icon: "ph--grid-nine--regular",
31
- source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet"
31
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet",
32
+ screenshots: [
33
+ "https://dxos.network/plugin-details-sheet-dark.png"
34
+ ]
32
35
  };
33
36
  // Annotate the CommonJS export names for ESM import in node:
34
37
  0 && (module.exports = {
35
38
  SHEET_PLUGIN,
36
39
  meta
37
40
  });
38
- //# sourceMappingURL=chunk-NLDXUFDG.cjs.map
41
+ //# sourceMappingURL=chunk-MLU6KRQN.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const SHEET_PLUGIN = 'dxos.org/plugin/sheet';\n\nexport const meta = {\n id: SHEET_PLUGIN,\n name: 'Sheet',\n description:\n 'Sheets in Composer are simple spreadsheets which allow you to leverage custom functions inside of cell grids. Leverage more than 400 pre-built formulas like Sum, Average, Count, Max, Min along with many others. You can also deploy your own custom functions using the Scripts plugin. ',\n icon: 'ph--grid-nine--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet',\n screenshots: ['https://dxos.network/plugin-details-sheet-dark.png'],\n} satisfies PluginMeta;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAMA,eAAe;AAErB,IAAMC,OAAO;EAClBC,IAAIF;EACJG,MAAM;EACNC,aACE;EACFC,MAAM;EACNC,QAAQ;EACRC,aAAa;IAAC;;AAChB;",
6
+ "names": ["SHEET_PLUGIN", "meta", "id", "name", "description", "icon", "source", "screenshots"]
7
+ }
@@ -16,13 +16,13 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_P4KSGZSS_exports = {};
20
- __export(chunk_P4KSGZSS_exports, {
19
+ var chunk_SQZEJPZ7_exports = {};
20
+ __export(chunk_SQZEJPZ7_exports, {
21
21
  computeGraphFacet: () => computeGraphFacet,
22
22
  rangeExtension: () => rangeExtension,
23
23
  sheetExtension: () => sheetExtension
24
24
  });
25
- module.exports = __toCommonJS(chunk_P4KSGZSS_exports);
25
+ module.exports = __toCommonJS(chunk_SQZEJPZ7_exports);
26
26
  var import_language = require("@codemirror/language");
27
27
  var import_state = require("@codemirror/state");
28
28
  var import_view = require("@codemirror/view");
@@ -223,6 +223,11 @@ var rangeExtension = ({ onInit, onStateChange }) => {
223
223
  from: 1,
224
224
  to: str.length + 1
225
225
  };
226
+ } else {
227
+ activeRange = {
228
+ from: str.length + 1,
229
+ to: str.length + 1
230
+ };
226
231
  }
227
232
  }
228
233
  onStateChange?.({
@@ -248,4 +253,4 @@ var visitTree = (node, callback) => {
248
253
  rangeExtension,
249
254
  sheetExtension
250
255
  });
251
- //# sourceMappingURL=chunk-P4KSGZSS.cjs.map
256
+ //# sourceMappingURL=chunk-SQZEJPZ7.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/extensions/compute.ts", "../../../src/extensions/editor/extension.ts"],
4
- "sourcesContent": ["//\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 {\n createSheetName,\n type CellAddress,\n type CellScalarValue,\n type ComputeGraph,\n type ComputeNode,\n} from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { documentId, singleValueFacet } from '@dxos/react-ui-editor';\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 { type FunctionDefinition } from '@dxos/compute';\nimport { RANGE_NOTATION } from '@dxos/compute';\nimport { singleValueFacet } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//\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 {\n createSheetName,\n type CellAddress,\n type CellScalarValue,\n type ComputeGraph,\n type ComputeNode,\n} from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { documentId, singleValueFacet } from '@dxos/react-ui-editor';\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 { type FunctionDefinition } from '@dxos/compute';\nimport { RANGE_NOTATION } from '@dxos/compute';\nimport { singleValueFacet } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\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 } else {\n activeRange = { from: str.length + 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"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,sBAA2B;AAC3B,mBAQO;AACP,kBAA+D;AAE/D,mBAAmD;AACnD,qBAMO;AACP,uBAA0B;AAC1B,6BAA6C;ACrB7C,0BAQO;AACP,IAAAA,mBAAkE;AAElE,IAAAC,eAAqE;AAErE,uBAAqB;AACrB,yCAA4B;AAG5B,IAAAC,kBAA+B;AAC/B,IAAAC,0BAAiC;AACjC,4BAAmB;ADOnB,IAAMC,uBAAuBC,yBAAYC,OAAM;AAExC,IAAMC,wBAAoBC,yCAAAA;ACDjC,IAAMC,kBAAkBC,gCAAeJ,OAAO;;EAE5C;IACEK,KAAKC,sBAAKC;IACVC,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKG;IACVD,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKI;IACVF,OAAO;EACT;EACA;IACEH,KAAKC,sBAAKK;IACVH,OAAO;EACT;EACA;IACEH,KAAKC,sBAAKM;IACVJ,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKO;IACVL,OAAO;EACT;CACD;AAED,IAAMM,oBAAgBZ,wBAAAA,kBAAAA;AAcf,IAAMa,iBAAiB,CAAC,EAAEC,OAAOC,YAAY,CAAA,EAAE,MAAyB;AAC7E,QAAM,EAAEC,WAAWC,SAAQ,QAAKC,gDAAY;IAAEC,OAAO;IAASC,kBAAkB;EAAI,CAAA;AAEpF,QAAMC,mBAAmB,CAAChB,SAAAA;AACxB,UAAM,EAAEiB,UAAU,UAAUC,aAAaC,OAAM,IAAKT,UAAUU,KAAK,CAACC,UAAUA,MAAMrB,SAASA,IAAAA,KAAS,CAAC;AAEvG,WAAO;MACLiB;MACAK,OAAOtB;MACPuB,MAAM,MAAA;AACJ,YAAI,CAACL,eAAe,CAACC,QAAQ;AAC3B,iBAAO;QACT;AAGA,cAAMK,OAAOC,SAASC,cAAc,KAAA;AACpCF,aAAKG,YAAY;AAEjB,cAAMC,QAAQH,SAASC,cAAc,IAAA;AACrCE,cAAMC,YAAY7B;AAClB4B,cAAMD,YAAY;AAClBH,aAAKM,YAAYF,KAAAA;AAEjB,YAAIV,aAAa;AACf,gBAAMK,OAAOE,SAASC,cAAc,GAAA;AACpCH,eAAKM,YAAYX;AACjBK,eAAKI,YAAY;AACjBH,eAAKM,YAAYP,IAAAA;QACnB;AAEA,YAAIJ,QAAQ;AACV,gBAAMY,SAASN,SAASC,cAAc,KAAA;AACtCK,iBAAOF,YAAYV;AACnBY,iBAAOJ,YAAY;AACnBH,eAAKM,YAAYC,MAAAA;QACnB;AAEA,eAAOP;MACT;MACAQ,OAAO,CAACC,MAAMC,YAAYC,MAAMC,OAAAA;AAC9B,cAAMC,eAAeD,OAAOH,KAAKK,MAAMC,IAAIC,SAAQ,EAAGC;AACtDR,aAAKS,SACHT,KAAKK,MAAMK,OAAO;UAChBC,SAAS;YACPT;YACAC;YACAS,QAAQX,WAAWZ,SAASe,eAAe,OAAO;UACpD;UACAS,WAAW;YACTC,QAAQZ,OAAOD,WAAWZ,MAAMmB,SAAS;UAC3C;QACF,CAAA,CAAA;MAEJ;IACF;EACF;AAEA,SAAO;IACL9B;IACAJ,cAAcyC,GAAGpC,QAAAA;IACjBA,SAASqC,KAAKD,GAAG;MACfE,cAAc,CAACC,YAAAA;AACb,YAAIA,QAAQb,MAAMC,IAAIC,SAAQ,EAAG,CAAA,MAAO,KAAK;AAC3C,iBAAO;QACT;AACA,cAAMY,QAAQD,QAAQE,YAAY,KAAA;AAClC,YAAI,CAACD,SAASA,MAAMjB,SAASiB,MAAMhB,IAAI;AACrC,iBAAO;QACT;AAEA,cAAMkB,OAAOF,MAAME,KAAKC,YAAW;AACnC,YAAI,CAACJ,QAAQK,YAAYJ,MAAME,KAAKb,SAAS,GAAG;AAC9C,iBAAO;QACT;AAEA,eAAO;UACLN,MAAMiB,MAAMjB;UACZsB,SACE/C,WAAWgD,OAAO,CAAC,EAAE1D,KAAI,MAAOA,KAAK2D,WAAWL,IAAAA,CAAAA,EAAOM,IAAI,CAAC,EAAE5D,KAAI,MAAOgB,iBAAiBhB,IAAAA,CAAAA,KAAU,CAAA;QACxG;MACF;IACF,CAAA;QAEA6D,qCAAmBjE,eAAAA;QACnBkE,oCAAe;MACbC,aAAa;MACbC,eAAe;MACfC,kBAAkB;MAClBC,aAAa,CAACzD;MACd0D,OAAO;MACPC,cAAc,UACZC,0BACE,2EACA,8CACA,kBAAA;IAEN,CAAA;IACAC,oBAAOtB,GAAG;MACR;QACEuB,KAAK;QACLC,KAAK,CAACvC,SAAAA;AACJ,qBAAOwC,sCAAiBxC,KAAKK,KAAK,MAAM,eAAWoC,sCAAiBzC,IAAAA,QAAQ0C,qCAAgB1C,IAAAA;QAC9F;MACF;KACD;;AAeL;AAwBO,IAAM2C,iBAAiB,CAAC,EAAEC,QAAQC,cAAa,MAAyB;AAC7E,MAAI7C;AACJ,MAAI8C;AAGJ,QAAMC,WAA4B;IAChCC,UAAU,CAACC,UAAAA;AACT,UAAIH,aAAa;AACf9C,aAAKS,SACHT,KAAKK,MAAMK,OAAO;UAChBC,SAAS;YAAE,GAAGmC;YAAalC,QAAQqC,MAAM1C,SAAQ;UAAG;UACpDM,WAAW;YAAEC,QAAQgC,YAAY5C,OAAO+C,MAAMzC;UAAO;QACvD,CAAA,CAAA;MAEJ;AAEAR,WAAKkD,MAAK;IACZ;EACF;AAEA,SAAOC,aAAAA,WAAWC,UAChB,MAAA;IACEC,YAAYC,OAAmB;AAC7BtD,aAAOsD;AACPV,eAASG,QAAAA;IACX;IAEArC,OAAOV,OAAkB;AACvB,YAAM,EAAEc,OAAM,IAAKd,MAAKK,MAAMQ,UAAU0C,OAAO,CAAA;AAG/CT,oBAAcU;AACd,YAAM7E,WAAWqB,MAAKK,MAAMoD,MAAMnF,aAAAA;AAClC,YAAM,EAAEoF,QAAO,IAAK/E,SAASgF,OAAOC,MAAM5D,MAAKK,MAAMC,IAAIC,SAAQ,CAAA;AACjEsD,gBAAUH,SAAS,CAAC,EAAEI,MAAM5D,MAAMC,GAAE,MAAE;AACpC,YAAID,QAAQY,UAAUX,MAAMW,QAAQ;AAClC,kBAAQgD,KAAK/F,MAAI;YACf,KAAK;AAEH+E,4BAAc;gBAAE5C,MAAMC;gBAAIA;cAAG;AAC7B;YAEF,KAAK;AAEH2C,4BAAc;gBAAE5C;gBAAMC,IAAID;cAAK;AAC/B;YAEF,KAAK;YACL,KAAK;AACH4C,4BAAc;gBAAE5C;gBAAMC;cAAG;AACzB,qBAAO;UACX;QACF;AAEA,eAAO;MACT,CAAA;AAGA,UAAI,CAAC2C,eAAe9C,MAAKK,MAAMC,IAAIC,SAAQ,EAAG,CAAA,MAAO,KAAK;AACxD,cAAMwD,MAAM/D,MAAKK,MAAMC,IAAI0D,YAAY,CAAA;AACvC,YAAIC,+BAAeC,KAAKH,GAAAA,GAAM;AAC5BjB,wBAAc;YAAE5C,MAAM;YAAGC,IAAI4D,IAAIvD,SAAS;UAAE;QAC9C,OAAO;AACLsC,wBAAc;YAAE5C,MAAM6D,IAAIvD,SAAS;YAAGL,IAAI4D,IAAIvD,SAAS;UAAE;QAC3D;MACF;AAEAqC,sBAAgB;QACdC,aAAaA,cAAc9C,MAAKK,MAAMC,IAAI0D,YAAYlB,YAAY5C,MAAM4C,YAAY3C,EAAE,IAAIqD;MAC5F,CAAA;IACF;EACF,CAAA;AAEJ;AAKA,IAAMK,YAAY,CAACM,MAAkBC,aAAAA;AACnC,MAAIA,SAASD,IAAAA,GAAO;AAClB,WAAO;EACT;AAEA,WAASE,QAAQF,KAAKG,YAAYD,UAAU,MAAMA,QAAQA,MAAME,aAAa;AAC3E,QAAIV,UAAUQ,OAAOD,QAAAA,GAAW;AAC9B,aAAO;IACT;EACF;AAEA,SAAO;AACT;",
6
6
  "names": ["import_language", "import_view", "import_compute", "import_react_ui_editor", "updateAllDecorations", "StateEffect", "define", "computeGraphFacet", "singleValueFacet", "highlightStyles", "HighlightStyle", "tag", "tags", "name", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "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"]
7
7
  }
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_ZPWW4LPY_exports = {};
30
- __export(chunk_ZPWW4LPY_exports, {
29
+ var chunk_VMJK5QN4_exports = {};
30
+ __export(chunk_VMJK5QN4_exports, {
31
31
  ComputeGraphContextProvider: () => ComputeGraphContextProvider,
32
32
  GridSheet: () => GridSheet,
33
33
  RangeList: () => RangeList,
@@ -37,10 +37,10 @@ __export(chunk_ZPWW4LPY_exports, {
37
37
  useComputeGraph: () => useComputeGraph,
38
38
  useSheetContext: () => useSheetContext
39
39
  });
40
- module.exports = __toCommonJS(chunk_ZPWW4LPY_exports);
41
- var import_chunk_E3RXOEL6 = require("./chunk-E3RXOEL6.cjs");
42
- var import_chunk_P4KSGZSS = require("./chunk-P4KSGZSS.cjs");
43
- var import_chunk_NLDXUFDG = require("./chunk-NLDXUFDG.cjs");
40
+ module.exports = __toCommonJS(chunk_VMJK5QN4_exports);
41
+ var import_chunk_SQZEJPZ7 = require("./chunk-SQZEJPZ7.cjs");
42
+ var import_chunk_4LSYTNS4 = require("./chunk-4LSYTNS4.cjs");
43
+ var import_chunk_MLU6KRQN = require("./chunk-MLU6KRQN.cjs");
44
44
  var import_react = __toESM(require("react"));
45
45
  var import_debug = require("@dxos/debug");
46
46
  var import_react_hooks = require("@dxos/react-hooks");
@@ -67,6 +67,7 @@ var import_react6 = require("react");
67
67
  var import_app_framework2 = require("@dxos/app-framework");
68
68
  var import_async = require("@dxos/async");
69
69
  var import_compute4 = require("@dxos/compute");
70
+ var import_echo_schema2 = require("@dxos/echo-schema");
70
71
  var import_types = require("@dxos/plugin-thread/types");
71
72
  var import_echo2 = require("@dxos/react-client/echo");
72
73
  var import_react7 = __toESM(require("react"));
@@ -96,7 +97,7 @@ var useComputeGraph = (space) => {
96
97
  return graph;
97
98
  };
98
99
  var RangeList = ({ sheet }) => {
99
- const { t } = (0, import_react_ui.useTranslation)(import_chunk_NLDXUFDG.SHEET_PLUGIN);
100
+ const { t } = (0, import_react_ui.useTranslation)(import_chunk_MLU6KRQN.SHEET_PLUGIN);
100
101
  const handleSelectRange = (range) => {
101
102
  };
102
103
  const handleDeleteRange = (0, import_react2.useCallback)((range) => {
@@ -109,7 +110,7 @@ var RangeList = ({ sheet }) => {
109
110
  className: "p-2 text-sm font-semibold"
110
111
  }, t("range list heading")), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.Root, {
111
112
  items: sheet.ranges,
112
- isItem: import_echo_schema.S.is(import_chunk_E3RXOEL6.Range)
113
+ isItem: import_echo_schema.S.is(import_chunk_4LSYTNS4.Range)
113
114
  }, ({ items: ranges }) => ranges.map((range, i) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.Item, {
114
115
  key: i,
115
116
  item: range,
@@ -120,7 +121,7 @@ var RangeList = ({ sheet }) => {
120
121
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemDragHandle, null), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemTitle, {
121
122
  onClick: () => handleSelectRange(range)
122
123
  }, t("range title", {
123
- position: (0, import_compute.rangeToA1Notation)((0, import_chunk_E3RXOEL6.rangeFromIndex)(sheet, range.range)),
124
+ position: (0, import_compute.rangeToA1Notation)((0, import_chunk_4LSYTNS4.rangeFromIndex)(sheet, range.range)),
124
125
  key: t(`range key ${range.key} label`),
125
126
  value: t(`range value ${range.value} label`)
126
127
  })), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemDeleteButton, {
@@ -150,21 +151,28 @@ var parseThreadAnchorAsCellRange = (cursor) => {
150
151
  };
151
152
  var useUpdateFocusedCellOnThreadSelection = (grid) => {
152
153
  const { model, setActiveRefs } = useSheetContext();
153
- const scrollIntoViewResolver = (0, import_react6.useMemo)(() => (0, import_app_framework2.createResolver)(import_app_framework2.LayoutAction.ScrollIntoView, ({ cursor, ref }) => {
154
- setActiveRefs(ref);
155
- const range = parseThreadAnchorAsCellRange(cursor);
156
- range && grid?.setFocus({
157
- ...range.to,
158
- plane: "grid"
159
- }, true);
160
- }, {
161
- disposition: "hoist",
162
- filter: (data) => data.id === (0, import_echo2.fullyQualifiedId)(model.sheet) && !!data.cursor
154
+ const scrollIntoViewResolver = (0, import_react6.useMemo)(() => (0, import_app_framework2.createResolver)({
155
+ intent: import_app_framework2.LayoutAction.ScrollIntoView,
156
+ position: "hoist",
157
+ filter: (data) => {
158
+ if (!import_echo_schema2.S.is(import_app_framework2.LayoutAction.ScrollIntoView.fields.input)(data)) {
159
+ return false;
160
+ }
161
+ return data.subject === (0, import_echo2.fullyQualifiedId)(model.sheet) && !!data.options?.cursor;
162
+ },
163
+ resolve: ({ options: { cursor, ref } }) => {
164
+ setActiveRefs(ref);
165
+ const range = parseThreadAnchorAsCellRange(cursor);
166
+ range && grid?.setFocus({
167
+ ...range.to,
168
+ plane: "grid"
169
+ }, true);
170
+ }
163
171
  }), [
164
172
  model.sheet,
165
173
  setActiveRefs
166
174
  ]);
167
- (0, import_app_framework2.useIntentResolver)(import_chunk_NLDXUFDG.SHEET_PLUGIN, scrollIntoViewResolver);
175
+ (0, import_app_framework2.useIntentResolver)(import_chunk_MLU6KRQN.SHEET_PLUGIN, scrollIntoViewResolver);
168
176
  };
169
177
  var useSelectThreadOnCellFocus = () => {
170
178
  const { model, cursor } = useSheetContext();
@@ -241,7 +249,7 @@ var projectCellProps = (model, col, row) => {
241
249
  row
242
250
  };
243
251
  const rawValue = model.getValue(address);
244
- const ranges = model.sheet.ranges?.filter(({ range }) => (0, import_compute3.inRange)((0, import_chunk_E3RXOEL6.rangeFromIndex)(model.sheet, range), address));
252
+ const ranges = model.sheet.ranges?.filter(({ range }) => (0, import_compute3.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), address));
245
253
  const threadRefs = model.sheet.threads?.filter((thread) => {
246
254
  const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target.anchor);
247
255
  return thread && range ? (0, import_compute3.inRange)(range, address) : false;
@@ -249,7 +257,7 @@ var projectCellProps = (model, col, row) => {
249
257
  const description = model.getValueDescription(address);
250
258
  const type = description?.type;
251
259
  const format = description?.format;
252
- const classNames = ranges?.map(import_chunk_E3RXOEL6.cellClassNameForRange).reverse();
260
+ const classNames = ranges?.map(import_chunk_4LSYTNS4.cellClassNameForRange).reverse();
253
261
  return {
254
262
  value: (0, import_react_ui_form.parseValue)({
255
263
  type,
@@ -282,7 +290,7 @@ var gridCellGetter = (model) => {
282
290
  };
283
291
  var rowLabelCell = (row) => ({
284
292
  value: (0, import_react_ui_grid2.rowToA1Notation)(row),
285
- className: "text-end !pie-1 text-subdued",
293
+ className: "text-end pie-1 text-subdued",
286
294
  resizeHandle: "row"
287
295
  });
288
296
  var colLabelCell = (col) => ({
@@ -427,7 +435,7 @@ var SheetProviderImpl = ({ model, onInfo, ignoreAttention, children, __gridScope
427
435
  }, children);
428
436
  };
429
437
  var SheetProvider = ({ children, graph, sheet, readonly, ignoreAttention, onInfo }) => {
430
- const model = (0, import_chunk_E3RXOEL6.useSheetModel)(graph, sheet, {
438
+ const model = (0, import_chunk_4LSYTNS4.useSheetModel)(graph, sheet, {
431
439
  readonly
432
440
  });
433
441
  return !model ? null : /* @__PURE__ */ import_react7.default.createElement(import_react_ui_grid3.Grid.Root, {
@@ -483,7 +491,7 @@ var sheetColDefault = {
483
491
  }
484
492
  };
485
493
  var GridSheet = () => {
486
- const { t } = (0, import_react_ui2.useTranslation)(import_chunk_NLDXUFDG.SHEET_PLUGIN);
494
+ const { t } = (0, import_react_ui2.useTranslation)(import_chunk_MLU6KRQN.SHEET_PLUGIN);
487
495
  const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } = useSheetContext();
488
496
  const [dxGrid, setDxGrid] = (0, import_react4.useState)(null);
489
497
  const [extraplanarFocus, setExtraplanarFocus] = (0, import_react4.useState)(null);
@@ -686,13 +694,13 @@ var GridSheet = () => {
686
694
  switch (operation) {
687
695
  case "insert-before":
688
696
  case "insert-after":
689
- return dispatch((0, import_app_framework.createIntent)(import_chunk_E3RXOEL6.SheetAction.InsertAxis, {
697
+ return dispatch((0, import_app_framework.createIntent)(import_chunk_4LSYTNS4.SheetAction.InsertAxis, {
690
698
  model,
691
699
  axis: contextMenuAxis,
692
700
  index: contextMenuOpen[contextMenuAxis] + (operation === "insert-before" ? 0 : 1)
693
701
  }));
694
702
  case "drop":
695
- return dispatch((0, import_app_framework.createIntent)(import_chunk_E3RXOEL6.SheetAction.DropAxis, {
703
+ return dispatch((0, import_app_framework.createIntent)(import_chunk_4LSYTNS4.SheetAction.DropAxis, {
696
704
  model,
697
705
  axis: contextMenuAxis,
698
706
  axisIndex: model.sheet[contextMenuAxis === "row" ? "rows" : "columns"][contextMenuOpen[contextMenuAxis]]
@@ -712,10 +720,10 @@ var GridSheet = () => {
712
720
  onNav: handleClose
713
721
  }
714
722
  }),
715
- (0, import_chunk_P4KSGZSS.sheetExtension)({
723
+ (0, import_chunk_SQZEJPZ7.sheetExtension)({
716
724
  functions: model.graph.getFunctions()
717
725
  }),
718
- (0, import_chunk_P4KSGZSS.rangeExtension)({
726
+ (0, import_chunk_SQZEJPZ7.rangeExtension)({
719
727
  onInit: (fn) => rangeController.current = fn,
720
728
  onStateChange: (state) => {
721
729
  if (dxGrid) {
@@ -744,8 +752,8 @@ var GridSheet = () => {
744
752
  onBlur: handleBlur
745
753
  }), /* @__PURE__ */ import_react4.default.createElement(import_react_ui_grid.Grid.Content, {
746
754
  initialCells,
747
- limitColumns: import_chunk_E3RXOEL6.DEFAULT_COLS,
748
- limitRows: import_chunk_E3RXOEL6.DEFAULT_ROWS,
755
+ limitColumns: import_chunk_4LSYTNS4.DEFAULT_COLS,
756
+ limitRows: import_chunk_4LSYTNS4.DEFAULT_ROWS,
749
757
  columns,
750
758
  rows,
751
759
  onAxisResize: handleAxisResize,
@@ -792,7 +800,7 @@ var GridSheet = () => {
792
800
  icon: "ph--backspace--regular"
793
801
  }), /* @__PURE__ */ import_react4.default.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Arrow, null))));
794
802
  };
795
- var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-TJ3JQLWM.cjs"));
803
+ var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-B77HHBOC.cjs"));
796
804
  // Annotate the CommonJS export names for ESM import in node:
797
805
  0 && (module.exports = {
798
806
  ComputeGraphContextProvider,
@@ -804,4 +812,4 @@ var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-TJ3J
804
812
  useComputeGraph,
805
813
  useSheetContext
806
814
  });
807
- //# sourceMappingURL=chunk-ZPWW4LPY.cjs.map
815
+ //# sourceMappingURL=chunk-VMJK5QN4.cjs.map