@dxos/plugin-sheet 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (215) hide show
  1. package/dist/lib/browser/SheetContainer-J72HS2FI.mjs +397 -0
  2. package/dist/lib/browser/SheetContainer-J72HS2FI.mjs.map +7 -0
  3. package/dist/lib/browser/anchor-sort-LLO7PZKF.mjs +23 -0
  4. package/dist/lib/browser/anchor-sort-LLO7PZKF.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-7VEWYJJN.mjs → chunk-IFLWVS2V.mjs} +5 -5
  6. package/dist/lib/browser/chunk-IFLWVS2V.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-KE3AKN5W.mjs +397 -0
  8. package/dist/lib/browser/chunk-KE3AKN5W.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-S27QJYTN.mjs +1473 -0
  10. package/dist/lib/browser/chunk-S27QJYTN.mjs.map +7 -0
  11. package/dist/lib/browser/compute-graph-registry-RC5L7RE4.mjs +21 -0
  12. package/dist/lib/browser/compute-graph-registry-RC5L7RE4.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +68 -78
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/markdown-D2T2DOVX.mjs +29 -0
  16. package/dist/lib/browser/markdown-D2T2DOVX.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/operation-resolver-YDOW72CN.mjs +79 -0
  19. package/dist/lib/browser/operation-resolver-YDOW72CN.mjs.map +7 -0
  20. package/dist/lib/browser/{react-surface-F3VQPGDV.mjs → react-surface-JIYVFH42.mjs} +17 -19
  21. package/dist/lib/browser/react-surface-JIYVFH42.mjs.map +7 -0
  22. package/dist/lib/browser/types/index.mjs +5 -2
  23. package/dist/lib/node-esm/SheetContainer-OGSSDOZU.mjs +398 -0
  24. package/dist/lib/node-esm/SheetContainer-OGSSDOZU.mjs.map +7 -0
  25. package/dist/lib/node-esm/anchor-sort-OX5I2YOW.mjs +24 -0
  26. package/dist/lib/node-esm/anchor-sort-OX5I2YOW.mjs.map +7 -0
  27. package/dist/lib/node-esm/chunk-6J5L47IB.mjs +398 -0
  28. package/dist/lib/node-esm/chunk-6J5L47IB.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-4QV4AGWK.mjs → chunk-PPOYR7DK.mjs} +5 -5
  30. package/dist/lib/node-esm/chunk-PPOYR7DK.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-Y4V6HVHO.mjs +1474 -0
  32. package/dist/lib/node-esm/chunk-Y4V6HVHO.mjs.map +7 -0
  33. package/dist/lib/node-esm/compute-graph-registry-ZGXVLVGD.mjs +22 -0
  34. package/dist/lib/node-esm/compute-graph-registry-ZGXVLVGD.mjs.map +7 -0
  35. package/dist/lib/node-esm/index.mjs +68 -78
  36. package/dist/lib/node-esm/index.mjs.map +4 -4
  37. package/dist/lib/node-esm/markdown-PTV72DLO.mjs +30 -0
  38. package/dist/lib/node-esm/markdown-PTV72DLO.mjs.map +7 -0
  39. package/dist/lib/node-esm/meta.json +1 -1
  40. package/dist/lib/node-esm/operation-resolver-Q63VQBVA.mjs +80 -0
  41. package/dist/lib/node-esm/operation-resolver-Q63VQBVA.mjs.map +7 -0
  42. package/dist/lib/node-esm/{react-surface-GGX76V2Y.mjs → react-surface-SWRZSZVR.mjs} +17 -19
  43. package/dist/lib/node-esm/react-surface-SWRZSZVR.mjs.map +7 -0
  44. package/dist/lib/node-esm/types/index.mjs +5 -2
  45. package/dist/types/src/SheetPlugin.d.ts +2 -1
  46. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +5 -0
  48. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +1 -0
  49. package/dist/types/src/capabilities/anchor-sort/index.d.ts +3 -0
  50. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts +5 -0
  52. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts.map +1 -0
  53. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts +3 -0
  54. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts.map +1 -0
  55. package/dist/types/src/capabilities/index.d.ts +5 -9
  56. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  57. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  58. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  60. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  62. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  64. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  68. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  69. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  70. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +1 -0
  71. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  72. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts +1 -1
  73. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -1
  74. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  75. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
  76. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +4 -5
  77. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  78. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +3 -1
  79. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  81. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +2 -0
  82. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/SheetToolbar/align.d.ts +12 -19
  84. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -1
  85. package/dist/types/src/components/SheetToolbar/style.d.ts +12 -18
  86. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -1
  87. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +14 -1
  88. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
  89. package/dist/types/src/components/index.d.ts +1 -1
  90. package/dist/types/src/components/index.d.ts.map +1 -1
  91. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
  92. package/dist/types/src/extensions/editor/sheet-extension.d.ts.map +1 -1
  93. package/dist/types/src/index.d.ts +1 -1
  94. package/dist/types/src/index.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 +2 -2
  97. package/dist/types/src/meta.d.ts.map +1 -1
  98. package/dist/types/src/model/sheet-model.d.ts +2 -2
  99. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  100. package/dist/types/src/serializer.d.ts.map +1 -1
  101. package/dist/types/src/testing/testing.d.ts +14 -14
  102. package/dist/types/src/translations.d.ts +1 -0
  103. package/dist/types/src/translations.d.ts.map +1 -1
  104. package/dist/types/src/types/Sheet.d.ts +40 -34
  105. package/dist/types/src/types/Sheet.d.ts.map +1 -1
  106. package/dist/types/src/types/capabilities.d.ts +6 -0
  107. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  108. package/dist/types/src/types/index.d.ts +1 -0
  109. package/dist/types/src/types/index.d.ts.map +1 -1
  110. package/dist/types/src/types/types.d.ts +91 -65
  111. package/dist/types/src/types/types.d.ts.map +1 -1
  112. package/dist/types/src/types/util.d.ts +2 -1
  113. package/dist/types/src/types/util.d.ts.map +1 -1
  114. package/dist/types/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +75 -68
  116. package/src/SheetPlugin.tsx +40 -62
  117. package/src/capabilities/anchor-sort/anchor-sort.ts +26 -0
  118. package/src/capabilities/anchor-sort/index.ts +7 -0
  119. package/src/capabilities/compute-graph-registry/compute-graph-registry.ts +27 -0
  120. package/src/capabilities/compute-graph-registry/index.ts +7 -0
  121. package/src/capabilities/index.ts +5 -9
  122. package/src/capabilities/markdown/index.ts +7 -0
  123. package/src/capabilities/markdown/markdown.ts +30 -0
  124. package/src/capabilities/operation-resolver/index.ts +7 -0
  125. package/src/capabilities/operation-resolver/operation-resolver.ts +77 -0
  126. package/src/capabilities/react-surface/index.ts +7 -0
  127. package/src/capabilities/react-surface/react-surface.tsx +43 -0
  128. package/src/components/ComputeGraph/compute-graph.stories.tsx +1 -1
  129. package/src/components/FunctionEditor/FunctionEditor.tsx +2 -2
  130. package/src/components/GridSheet/GridSheet.stories.tsx +2 -2
  131. package/src/components/GridSheet/GridSheet.tsx +40 -30
  132. package/src/components/GridSheet/SheetCellEditor.stories.tsx +7 -4
  133. package/src/components/GridSheet/util.ts +11 -5
  134. package/src/components/RangeList/RangeList.tsx +5 -2
  135. package/src/components/SheetContainer/SheetContainer.stories.tsx +44 -21
  136. package/src/components/SheetContainer/SheetContainer.tsx +29 -21
  137. package/src/components/SheetContext/SheetContext.tsx +6 -6
  138. package/src/components/SheetToolbar/SheetToolbar.tsx +36 -22
  139. package/src/components/SheetToolbar/align.ts +41 -16
  140. package/src/components/SheetToolbar/style.ts +45 -15
  141. package/src/components/SheetToolbar/useToolbarState.ts +22 -5
  142. package/src/extensions/compute.stories.tsx +17 -8
  143. package/src/extensions/compute.ts +1 -1
  144. package/src/extensions/editor/sheet-extension.ts +7 -4
  145. package/src/index.ts +1 -1
  146. package/src/integrations/thread-ranges.ts +38 -48
  147. package/src/meta.ts +2 -2
  148. package/src/model/sheet-model.ts +75 -45
  149. package/src/playwright/playwright.config.ts +1 -1
  150. package/src/playwright/sheet.spec.ts +1 -0
  151. package/src/sanity.test.ts +1 -1
  152. package/src/serializer.ts +1 -1
  153. package/src/translations.ts +1 -0
  154. package/src/types/Sheet.ts +23 -29
  155. package/src/{capabilities → types}/capabilities.ts +2 -2
  156. package/src/types/index.ts +1 -0
  157. package/src/types/types.ts +81 -37
  158. package/src/types/util.ts +2 -1
  159. package/dist/lib/browser/SheetContainer-GTINUSNB.mjs +0 -349
  160. package/dist/lib/browser/SheetContainer-GTINUSNB.mjs.map +0 -7
  161. package/dist/lib/browser/anchor-sort-R5CB37J7.mjs +0 -24
  162. package/dist/lib/browser/anchor-sort-R5CB37J7.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-73AV3NH6.mjs +0 -15
  164. package/dist/lib/browser/chunk-73AV3NH6.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-7VEWYJJN.mjs.map +0 -7
  166. package/dist/lib/browser/chunk-DVJ3QW3F.mjs +0 -907
  167. package/dist/lib/browser/chunk-DVJ3QW3F.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-FWFAAGXL.mjs +0 -28
  169. package/dist/lib/browser/chunk-FWFAAGXL.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-LS6D4GG7.mjs +0 -850
  171. package/dist/lib/browser/chunk-LS6D4GG7.mjs.map +0 -7
  172. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs +0 -21
  173. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs.map +0 -7
  174. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs +0 -56
  175. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs.map +0 -7
  176. package/dist/lib/browser/markdown-B6VKYY2S.mjs +0 -26
  177. package/dist/lib/browser/markdown-B6VKYY2S.mjs.map +0 -7
  178. package/dist/lib/browser/react-surface-F3VQPGDV.mjs.map +0 -7
  179. package/dist/lib/node-esm/SheetContainer-PW4KNZME.mjs +0 -350
  180. package/dist/lib/node-esm/SheetContainer-PW4KNZME.mjs.map +0 -7
  181. package/dist/lib/node-esm/anchor-sort-HEND452H.mjs +0 -25
  182. package/dist/lib/node-esm/anchor-sort-HEND452H.mjs.map +0 -7
  183. package/dist/lib/node-esm/chunk-44YTKTMP.mjs +0 -16
  184. package/dist/lib/node-esm/chunk-44YTKTMP.mjs.map +0 -7
  185. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs +0 -908
  186. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs.map +0 -7
  187. package/dist/lib/node-esm/chunk-4QV4AGWK.mjs.map +0 -7
  188. package/dist/lib/node-esm/chunk-HILDMVPL.mjs +0 -29
  189. package/dist/lib/node-esm/chunk-HILDMVPL.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-LYUIM3QG.mjs +0 -851
  191. package/dist/lib/node-esm/chunk-LYUIM3QG.mjs.map +0 -7
  192. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs +0 -22
  193. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs.map +0 -7
  194. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs +0 -57
  195. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs.map +0 -7
  196. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs +0 -27
  197. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs.map +0 -7
  198. package/dist/lib/node-esm/react-surface-GGX76V2Y.mjs.map +0 -7
  199. package/dist/types/src/capabilities/anchor-sort.d.ts +0 -6
  200. package/dist/types/src/capabilities/anchor-sort.d.ts.map +0 -1
  201. package/dist/types/src/capabilities/capabilities.d.ts +0 -5
  202. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  203. package/dist/types/src/capabilities/compute-graph-registry.d.ts +0 -4
  204. package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +0 -1
  205. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  206. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  207. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  208. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  209. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  210. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  211. package/src/capabilities/anchor-sort.ts +0 -22
  212. package/src/capabilities/compute-graph-registry.ts +0 -23
  213. package/src/capabilities/intent-resolver.ts +0 -38
  214. package/src/capabilities/markdown.ts +0 -23
  215. package/src/capabilities/react-surface.tsx +0 -40
@@ -0,0 +1,397 @@
1
+ import {
2
+ GridSheet,
3
+ SheetProvider,
4
+ useComputeGraph,
5
+ useSheetContext
6
+ } from "./chunk-S27QJYTN.mjs";
7
+ import "./chunk-IFLWVS2V.mjs";
8
+ import {
9
+ alignKey,
10
+ mapFormulaIndicesToRefs,
11
+ meta,
12
+ rangeFromIndex,
13
+ rangeToIndex
14
+ } from "./chunk-KE3AKN5W.mjs";
15
+
16
+ // src/components/SheetContainer/SheetContainer.tsx
17
+ import React3, { Fragment } from "react";
18
+ import { Obj as Obj3 } from "@dxos/echo";
19
+ import { Layout } from "@dxos/react-ui-mosaic";
20
+
21
+ // src/components/FunctionEditor/FunctionEditor.tsx
22
+ import React from "react";
23
+ import { addressToA1Notation, isFormula, rangeToA1Notation } from "@dxos/compute";
24
+ import { Icon } from "@dxos/react-ui";
25
+ var FunctionEditor = () => {
26
+ const { model, cursor, range } = useSheetContext();
27
+ let value;
28
+ let formula = false;
29
+ if (cursor) {
30
+ value = model.getCellValue(cursor);
31
+ if (isFormula(value)) {
32
+ value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));
33
+ formula = true;
34
+ } else if (value != null) {
35
+ value = String(value);
36
+ }
37
+ }
38
+ return /* @__PURE__ */ React.createElement("div", {
39
+ className: "flex shrink-0 justify-between items-center pli-4 plb-1 text-sm bg-toolbarSurface border-bs !border-subduedSeparator"
40
+ }, /* @__PURE__ */ React.createElement("div", {
41
+ className: "flex gap-4 items-center"
42
+ }, /* @__PURE__ */ React.createElement("div", {
43
+ className: "flex is-16 items-center font-mono"
44
+ }, range && rangeToA1Notation(range) || cursor && addressToA1Notation(cursor)), /* @__PURE__ */ React.createElement("div", {
45
+ className: "flex gap-2 items-center"
46
+ }, /* @__PURE__ */ React.createElement(Icon, {
47
+ icon: "ph--function--regular",
48
+ classNames: [
49
+ "text-greenText",
50
+ formula ? "visible" : "invisible"
51
+ ]
52
+ }), /* @__PURE__ */ React.createElement("span", {
53
+ className: "font-mono"
54
+ }, value))));
55
+ };
56
+
57
+ // src/components/SheetToolbar/SheetToolbar.tsx
58
+ import { Atom as Atom2, RegistryContext as RegistryContext4 } from "@effect-atom/atom-react";
59
+ import React2, { useContext as useContext4, useMemo as useMemo2 } from "react";
60
+ import { useAppGraph } from "@dxos/app-framework/react";
61
+ import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from "@dxos/react-ui-menu";
62
+
63
+ // src/components/SheetToolbar/align.ts
64
+ import { RegistryContext } from "@effect-atom/atom-react";
65
+ import { useContext, useEffect } from "react";
66
+ import { inRange } from "@dxos/compute";
67
+ import { Obj } from "@dxos/echo";
68
+ import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
69
+ var aligns = {
70
+ start: "ph--text-align-left--regular",
71
+ center: "ph--text-align-center--regular",
72
+ end: "ph--text-align-right--regular"
73
+ };
74
+ var useAlignState = (stateAtom) => {
75
+ const registry = useContext(RegistryContext);
76
+ const { cursor, model } = useSheetContext();
77
+ useEffect(() => {
78
+ const alignValue = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor))?.value : void 0;
79
+ const prev = registry.get(stateAtom);
80
+ registry.set(stateAtom, {
81
+ ...prev,
82
+ [alignKey]: alignValue
83
+ });
84
+ }, [
85
+ cursor,
86
+ model.sheet,
87
+ registry,
88
+ stateAtom
89
+ ]);
90
+ };
91
+ var createAlignGroupAction = (value) => createMenuItemGroup("align", {
92
+ label: [
93
+ "align label",
94
+ {
95
+ ns: meta.id
96
+ }
97
+ ],
98
+ variant: "toggleGroup",
99
+ selectCardinality: "single",
100
+ value: `${alignKey}--${value}`
101
+ });
102
+ var createAlignActions = ({ model, state, stateAtom, registry, cursorFallbackRange }) => Object.entries(aligns).map(([alignValue, icon]) => {
103
+ return createMenuAction(`${alignKey}--${alignValue}`, () => {
104
+ if (!cursorFallbackRange) {
105
+ return;
106
+ }
107
+ const index = model.sheet.ranges?.findIndex((range) => range.key === alignKey && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
108
+ const nextRangeEntity = {
109
+ range: rangeToIndex(model.sheet, cursorFallbackRange),
110
+ key: alignKey,
111
+ value: alignValue
112
+ };
113
+ const currentState = registry.get(stateAtom);
114
+ if (index < 0) {
115
+ Obj.change(model.sheet, (s) => {
116
+ s.ranges?.push(nextRangeEntity);
117
+ });
118
+ registry.set(stateAtom, {
119
+ ...currentState,
120
+ [alignKey]: nextRangeEntity.value
121
+ });
122
+ } else if (model.sheet.ranges[index].value === nextRangeEntity.value) {
123
+ Obj.change(model.sheet, (s) => {
124
+ s.ranges?.splice(index, 1);
125
+ });
126
+ registry.set(stateAtom, {
127
+ ...currentState,
128
+ [alignKey]: void 0
129
+ });
130
+ } else {
131
+ Obj.change(model.sheet, (s) => {
132
+ s.ranges?.splice(index, 1, nextRangeEntity);
133
+ });
134
+ registry.set(stateAtom, {
135
+ ...currentState,
136
+ [alignKey]: nextRangeEntity.value
137
+ });
138
+ }
139
+ }, {
140
+ key: alignKey,
141
+ value: alignValue,
142
+ checked: state[alignKey] === alignValue,
143
+ label: [
144
+ `range value ${alignValue} label`,
145
+ {
146
+ ns: meta.id
147
+ }
148
+ ],
149
+ icon,
150
+ testId: `grid.toolbar.${alignKey}.${alignValue}`
151
+ });
152
+ });
153
+ var createAlign = (context) => {
154
+ const alignGroup = createAlignGroupAction(context.state[alignKey]);
155
+ const alignActions = createAlignActions(context);
156
+ return {
157
+ nodes: [
158
+ alignGroup,
159
+ ...alignActions
160
+ ],
161
+ edges: [
162
+ {
163
+ source: "root",
164
+ target: "align"
165
+ },
166
+ ...alignActions.map(({ id }) => ({
167
+ source: alignGroup.id,
168
+ target: id
169
+ }))
170
+ ]
171
+ };
172
+ };
173
+
174
+ // src/components/SheetToolbar/style.ts
175
+ import { RegistryContext as RegistryContext2 } from "@effect-atom/atom-react";
176
+ import { useContext as useContext2, useEffect as useEffect2 } from "react";
177
+ import { inRange as inRange2 } from "@dxos/compute";
178
+ import { Obj as Obj2 } from "@dxos/echo";
179
+ import { createMenuAction as createMenuAction2, createMenuItemGroup as createMenuItemGroup2 } from "@dxos/react-ui-menu";
180
+ var styles = {
181
+ highlight: "ph--highlighter--regular",
182
+ softwrap: "ph--paragraph--regular"
183
+ };
184
+ var useStyleState = (stateAtom) => {
185
+ const registry = useContext2(RegistryContext2);
186
+ const { cursorFallbackRange, model } = useSheetContext();
187
+ useEffect2(() => {
188
+ let highlight = false;
189
+ let softwrap = false;
190
+ if (cursorFallbackRange && model.sheet.ranges) {
191
+ model.sheet.ranges.filter(({ range, key }) => key === "style" && inRange2(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).forEach(({ value }) => {
192
+ if (value === "highlight") {
193
+ highlight = true;
194
+ }
195
+ if (value === "softwrap") {
196
+ softwrap = true;
197
+ }
198
+ });
199
+ }
200
+ const prev = registry.get(stateAtom);
201
+ registry.set(stateAtom, {
202
+ ...prev,
203
+ highlight,
204
+ softwrap
205
+ });
206
+ }, [
207
+ cursorFallbackRange,
208
+ model.sheet,
209
+ registry,
210
+ stateAtom
211
+ ]);
212
+ };
213
+ var createStyleGroup = (state) => {
214
+ return createMenuItemGroup2("style", {
215
+ variant: "toggleGroup",
216
+ selectCardinality: "multiple",
217
+ value: Object.keys(styles).filter((key) => !!state[key]).map((styleValue) => `style--${styleValue}`)
218
+ });
219
+ };
220
+ var createStyleActions = ({ model, state, stateAtom, registry, cursorFallbackRange }) => Object.entries(styles).map(([styleValue, icon]) => {
221
+ return createMenuAction2(`style--${styleValue}`, () => {
222
+ if (!cursorFallbackRange) {
223
+ return;
224
+ }
225
+ const index = model.sheet.ranges?.findIndex((range) => range.key === "style" && inRange2(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
226
+ const nextRangeEntity = {
227
+ range: rangeToIndex(model.sheet, cursorFallbackRange),
228
+ key: "style",
229
+ value: styleValue
230
+ };
231
+ const currentState = registry.get(stateAtom);
232
+ if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && inRange2(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).some(({ value: rangeValue }) => rangeValue === styleValue)) {
233
+ if (index >= 0) {
234
+ Obj2.change(model.sheet, (s) => {
235
+ s.ranges?.splice(index, 1);
236
+ });
237
+ }
238
+ registry.set(stateAtom, {
239
+ ...currentState,
240
+ [nextRangeEntity.value]: false
241
+ });
242
+ } else {
243
+ Obj2.change(model.sheet, (s) => {
244
+ s.ranges?.push(nextRangeEntity);
245
+ });
246
+ registry.set(stateAtom, {
247
+ ...currentState,
248
+ [nextRangeEntity.value]: true
249
+ });
250
+ }
251
+ }, {
252
+ key: "style",
253
+ value: styleValue,
254
+ icon,
255
+ label: [
256
+ `range value ${styleValue} label`,
257
+ {
258
+ ns: meta.id
259
+ }
260
+ ],
261
+ checked: !!state[styleValue]
262
+ });
263
+ });
264
+ var createStyle = (context) => {
265
+ const styleGroupAction = createStyleGroup(context.state);
266
+ const styleActions = createStyleActions(context);
267
+ return {
268
+ nodes: [
269
+ styleGroupAction,
270
+ ...styleActions
271
+ ],
272
+ edges: [
273
+ {
274
+ source: "root",
275
+ target: "style"
276
+ },
277
+ ...styleActions.map(({ id }) => ({
278
+ source: styleGroupAction.id,
279
+ target: id
280
+ }))
281
+ ]
282
+ };
283
+ };
284
+
285
+ // src/components/SheetToolbar/useToolbarState.ts
286
+ import { Atom, RegistryContext as RegistryContext3, useAtomValue } from "@effect-atom/atom-react";
287
+ import { useContext as useContext3, useMemo } from "react";
288
+ var useToolbarState = (initialState = {}) => {
289
+ return useMemo(() => Atom.make(initialState).pipe(Atom.keepAlive), []);
290
+ };
291
+
292
+ // src/components/SheetToolbar/SheetToolbar.tsx
293
+ var createToolbarActions = ({ model, stateAtom, registry, cursorFallbackRange, customActions }) => {
294
+ return Atom2.make((get) => {
295
+ const state = get(stateAtom);
296
+ const context = {
297
+ model,
298
+ state,
299
+ stateAtom,
300
+ registry,
301
+ cursorFallbackRange
302
+ };
303
+ const align = createAlign(context);
304
+ const style = createStyle(context);
305
+ const gap = createGapSeparator();
306
+ const graph = {
307
+ nodes: [
308
+ ...align.nodes,
309
+ ...style.nodes,
310
+ ...gap.nodes
311
+ ],
312
+ edges: [
313
+ ...align.edges,
314
+ ...style.edges,
315
+ ...gap.edges
316
+ ]
317
+ };
318
+ if (customActions) {
319
+ const custom = get(customActions);
320
+ graph.nodes.push(...custom.nodes);
321
+ graph.edges.push(...custom.edges);
322
+ }
323
+ return graph;
324
+ });
325
+ };
326
+ var SheetToolbar = ({ id }) => {
327
+ const { model, cursorFallbackRange } = useSheetContext();
328
+ const stateAtom = useToolbarState({});
329
+ const registry = useContext4(RegistryContext4);
330
+ useAlignState(stateAtom);
331
+ useStyleState(stateAtom);
332
+ const { graph } = useAppGraph();
333
+ const customActions = useMemo2(() => {
334
+ return Atom2.make((get) => {
335
+ const actions = get(graph.actions(id));
336
+ const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
337
+ return {
338
+ nodes,
339
+ edges: nodes.map((node) => ({
340
+ source: "root",
341
+ target: node.id
342
+ }))
343
+ };
344
+ });
345
+ }, [
346
+ graph,
347
+ id
348
+ ]);
349
+ const actionsCreator = useMemo2(() => createToolbarActions({
350
+ model,
351
+ stateAtom,
352
+ registry,
353
+ cursorFallbackRange,
354
+ customActions
355
+ }), [
356
+ model,
357
+ stateAtom,
358
+ registry,
359
+ cursorFallbackRange,
360
+ customActions
361
+ ]);
362
+ const menu = useMenuActions(actionsCreator);
363
+ return /* @__PURE__ */ React2.createElement(MenuProvider, {
364
+ ...menu,
365
+ attendableId: id
366
+ }, /* @__PURE__ */ React2.createElement(ToolbarMenu, null));
367
+ };
368
+
369
+ // src/components/SheetContainer/SheetContainer.tsx
370
+ var SheetContainer = ({ role, subject: sheet, space, ignoreAttention }) => {
371
+ const graph = useComputeGraph(space);
372
+ if (!graph) {
373
+ return null;
374
+ }
375
+ const Root = role === "section" ? Container : Fragment;
376
+ return /* @__PURE__ */ React3.createElement(SheetProvider, {
377
+ sheet,
378
+ graph,
379
+ ignoreAttention
380
+ }, /* @__PURE__ */ React3.createElement(Root, null, /* @__PURE__ */ React3.createElement(Layout.Main, {
381
+ toolbar: true,
382
+ statusbar: true
383
+ }, /* @__PURE__ */ React3.createElement(SheetToolbar, {
384
+ id: Obj3.getDXN(sheet).toString()
385
+ }), /* @__PURE__ */ React3.createElement(GridSheet, null), /* @__PURE__ */ React3.createElement(FunctionEditor, null))));
386
+ };
387
+ var Container = (props) => /* @__PURE__ */ React3.createElement(Layout.Flex, {
388
+ ...props,
389
+ classNames: "aspect-square"
390
+ });
391
+
392
+ // src/components/SheetContainer/index.ts
393
+ var SheetContainer_default = SheetContainer;
394
+ export {
395
+ SheetContainer_default as default
396
+ };
397
+ //# sourceMappingURL=SheetContainer-J72HS2FI.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/SheetContainer/SheetContainer.tsx", "../../../src/components/FunctionEditor/FunctionEditor.tsx", "../../../src/components/SheetToolbar/SheetToolbar.tsx", "../../../src/components/SheetToolbar/align.ts", "../../../src/components/SheetToolbar/style.ts", "../../../src/components/SheetToolbar/useToolbarState.ts", "../../../src/components/SheetContainer/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { Fragment } from 'react';\n\nimport { type SurfaceComponentProps } from '@dxos/app-framework/react';\nimport { Obj } from '@dxos/echo';\nimport { type Space } from '@dxos/react-client/echo';\nimport { Layout, type LayoutFlexProps } from '@dxos/react-ui-mosaic';\n\nimport { type Sheet } from '../../types';\nimport { useComputeGraph } from '../ComputeGraph';\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider } from '../SheetContext';\nimport { SheetToolbar } from '../SheetToolbar';\n\nexport type SheetContainerProps = SurfaceComponentProps<\n Sheet.Sheet,\n {\n space: Space;\n ignoreAttention?: boolean;\n }\n>;\n\nexport const SheetContainer = ({ role, subject: sheet, space, ignoreAttention }: SheetContainerProps) => {\n const graph = useComputeGraph(space);\n if (!graph) {\n return null;\n }\n\n const Root = role === 'section' ? Container : Fragment;\n\n return (\n <SheetProvider sheet={sheet} graph={graph} ignoreAttention={ignoreAttention}>\n <Root>\n <Layout.Main toolbar statusbar>\n <SheetToolbar id={Obj.getDXN(sheet).toString()} />\n <GridSheet />\n <FunctionEditor />\n </Layout.Main>\n </Root>\n </SheetProvider>\n );\n};\n\nconst Container = (props: LayoutFlexProps) => <Layout.Flex {...props} classNames='aspect-square' />;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { addressToA1Notation, isFormula, rangeToA1Notation } from '@dxos/compute';\nimport { Icon } from '@dxos/react-ui';\n\nimport { mapFormulaIndicesToRefs } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let formula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (isFormula(value)) {\n value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));\n formula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div className='flex shrink-0 justify-between items-center pli-4 plb-1 text-sm bg-toolbarSurface border-bs !border-subduedSeparator'>\n <div className='flex gap-4 items-center'>\n <div className='flex is-16 items-center font-mono'>\n {(range && rangeToA1Notation(range)) || (cursor && addressToA1Notation(cursor))}\n </div>\n <div className='flex gap-2 items-center'>\n <Icon icon='ph--function--regular' classNames={['text-greenText', formula ? 'visible' : 'invisible']} />\n <span className='font-mono'>{value}</span>\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry, RegistryContext } from '@effect-atom/atom-react';\nimport React, { type PropsWithChildren, useContext, useMemo } from 'react';\n\nimport { useAppGraph } from '@dxos/app-framework/react';\nimport { type CompleteCellRange } from '@dxos/compute';\nimport {\n type ActionGraphProps,\n MenuProvider,\n ToolbarMenu,\n createGapSeparator,\n useMenuActions,\n} from '@dxos/react-ui-menu';\n\nimport { type SheetModel } from '../../model';\nimport { useSheetContext } from '../SheetContext';\n\nimport { createAlign, useAlignState } from './align';\nimport { createStyle, useStyleState } from './style';\nimport { type ToolbarStateAtom, useToolbarState } from './useToolbarState';\n\ntype ToolbarActionsContext = {\n model: SheetModel;\n stateAtom: ToolbarStateAtom;\n registry: Registry.Registry;\n cursorFallbackRange?: CompleteCellRange;\n customActions?: Atom.Atom<ActionGraphProps>;\n};\n\nconst createToolbarActions = ({\n model,\n stateAtom,\n registry,\n cursorFallbackRange,\n customActions,\n}: ToolbarActionsContext): Atom.Atom<ActionGraphProps> => {\n return Atom.make((get) => {\n const state = get(stateAtom);\n const context = { model, state, stateAtom, registry, cursorFallbackRange };\n const align = createAlign(context);\n const style = createStyle(context);\n const gap = createGapSeparator();\n\n const graph: ActionGraphProps = {\n nodes: [...align.nodes, ...style.nodes, ...gap.nodes],\n edges: [...align.edges, ...style.edges, ...gap.edges],\n };\n\n if (customActions) {\n const custom = get(customActions);\n graph.nodes.push(...custom.nodes);\n graph.edges.push(...custom.edges);\n }\n\n return graph;\n });\n};\n\nexport type SheetToolbarProps = PropsWithChildren<{ id: string }>;\n\nexport const SheetToolbar = ({ id }: SheetToolbarProps) => {\n const { model, cursorFallbackRange } = useSheetContext();\n const stateAtom = useToolbarState({});\n const registry = useContext(RegistryContext);\n useAlignState(stateAtom);\n useStyleState(stateAtom);\n\n const { graph } = useAppGraph();\n const customActions = useMemo(() => {\n return Atom.make((get) => {\n const actions = get(graph.actions(id));\n const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');\n return {\n nodes,\n edges: nodes.map((node) => ({ source: 'root', target: node.id })),\n };\n });\n }, [graph, id]);\n\n const actionsCreator = useMemo(\n () => createToolbarActions({ model, stateAtom, registry, cursorFallbackRange, customActions }),\n [model, stateAtom, registry, cursorFallbackRange, customActions],\n );\n const menu = useMenuActions(actionsCreator);\n\n return (\n <MenuProvider {...menu} attendableId={id}>\n <ToolbarMenu />\n </MenuProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Registry, RegistryContext } from '@effect-atom/atom-react';\nimport { useContext, useEffect } from 'react';\n\nimport { type CompleteCellRange, inRange } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport {\n type ActionGraphProps,\n type ToolbarMenuActionGroupProperties,\n createMenuAction,\n createMenuItemGroup,\n} from '@dxos/react-ui-menu';\n\nimport { meta } from '../../meta';\nimport { type SheetModel } from '../../model';\nimport { type AlignKey, type AlignValue, alignKey, rangeFromIndex, rangeToIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nimport { type ToolbarState, type ToolbarStateAtom } from './useToolbarState';\n\nexport type AlignAction = { key: AlignKey; value: AlignValue };\n\nexport type AlignState = { [alignKey]: AlignValue | undefined };\n\nconst aligns: Record<AlignValue, string> = {\n start: 'ph--text-align-left--regular',\n center: 'ph--text-align-center--regular',\n end: 'ph--text-align-right--regular',\n};\n\nexport const useAlignState = (stateAtom: ToolbarStateAtom) => {\n const registry = useContext(RegistryContext);\n const { cursor, model } = useSheetContext();\n useEffect(() => {\n // TODO(thure): Can this O(n) call be memoized?\n const alignValue = (\n cursor\n ? model.sheet.ranges?.findLast(\n ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),\n )?.value\n : undefined\n ) as AlignValue | undefined;\n const prev = registry.get(stateAtom);\n registry.set(stateAtom, { ...prev, [alignKey]: alignValue });\n }, [cursor, model.sheet, registry, stateAtom]);\n};\n\nconst createAlignGroupAction = (value?: AlignValue) =>\n createMenuItemGroup('align', {\n label: ['align label', { ns: meta.id }],\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value: `${alignKey}--${value}`,\n } as ToolbarMenuActionGroupProperties);\n\ntype AlignActionsContext = {\n model: SheetModel;\n state: ToolbarState;\n stateAtom: ToolbarStateAtom;\n registry: Registry.Registry;\n cursorFallbackRange?: CompleteCellRange;\n};\n\nconst createAlignActions = ({ model, state, stateAtom, registry, cursorFallbackRange }: AlignActionsContext) =>\n Object.entries(aligns).map(([alignValue, icon]) => {\n return createMenuAction<AlignAction>(\n `${alignKey}--${alignValue}`,\n () => {\n if (!cursorFallbackRange) {\n return;\n }\n const index =\n model.sheet.ranges?.findIndex(\n (range) =>\n range.key === alignKey && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: alignKey,\n value: alignValue as AlignValue,\n };\n const currentState = registry.get(stateAtom);\n if (index < 0) {\n Obj.change(model.sheet, (s) => {\n s.ranges?.push(nextRangeEntity);\n });\n registry.set(stateAtom, { ...currentState, [alignKey]: nextRangeEntity.value });\n } else if (model.sheet.ranges![index].value === nextRangeEntity.value) {\n Obj.change(model.sheet, (s) => {\n s.ranges?.splice(index, 1);\n });\n registry.set(stateAtom, { ...currentState, [alignKey]: undefined });\n } else {\n Obj.change(model.sheet, (s) => {\n s.ranges?.splice(index, 1, nextRangeEntity);\n });\n registry.set(stateAtom, { ...currentState, [alignKey]: nextRangeEntity.value });\n }\n },\n {\n key: alignKey,\n value: alignValue as AlignValue,\n checked: state[alignKey] === alignValue,\n label: [`range value ${alignValue} label`, { ns: meta.id }],\n icon,\n testId: `grid.toolbar.${alignKey}.${alignValue}`,\n },\n );\n });\n\nexport const createAlign = (context: AlignActionsContext): ActionGraphProps => {\n const alignGroup = createAlignGroupAction(context.state[alignKey]);\n const alignActions = createAlignActions(context);\n return {\n nodes: [alignGroup, ...alignActions],\n edges: [\n { source: 'root', target: 'align' },\n ...alignActions.map(({ id }) => ({ source: alignGroup.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Registry, RegistryContext } from '@effect-atom/atom-react';\nimport { useContext, useEffect } from 'react';\n\nimport { type CompleteCellRange, inRange } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport {\n type ActionGraphProps,\n type ToolbarMenuActionGroupProperties,\n createMenuAction,\n createMenuItemGroup,\n} from '@dxos/react-ui-menu';\n\nimport { meta } from '../../meta';\nimport { type SheetModel } from '../../model';\nimport { type StyleKey, type StyleValue, rangeFromIndex, rangeToIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nimport { type ToolbarState, type ToolbarStateAtom } from './useToolbarState';\n\nexport type StyleState = Partial<Record<StyleValue, boolean>>;\n\nexport type StyleAction = { key: StyleKey; value: StyleValue };\n\nconst styles: Record<StyleValue, string> = {\n highlight: 'ph--highlighter--regular',\n softwrap: 'ph--paragraph--regular',\n};\n\nexport const useStyleState = (stateAtom: ToolbarStateAtom) => {\n const registry = useContext(RegistryContext);\n const { cursorFallbackRange, model } = useSheetContext();\n\n useEffect(() => {\n let highlight = false;\n let softwrap = false;\n if (cursorFallbackRange && model.sheet.ranges) {\n model.sheet.ranges\n .filter(\n ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .forEach(({ value }) => {\n if (value === 'highlight') {\n highlight = true;\n }\n if (value === 'softwrap') {\n softwrap = true;\n }\n });\n }\n const prev = registry.get(stateAtom);\n registry.set(stateAtom, { ...prev, highlight, softwrap });\n }, [cursorFallbackRange, model.sheet, registry, stateAtom]);\n};\n\nconst createStyleGroup = (state: StyleState) => {\n return createMenuItemGroup('style', {\n variant: 'toggleGroup',\n selectCardinality: 'multiple',\n value: Object.keys(styles)\n .filter((key) => !!state[key as StyleValue])\n .map((styleValue) => `style--${styleValue}`),\n } as ToolbarMenuActionGroupProperties);\n};\n\ntype StyleActionsContext = {\n model: SheetModel;\n state: ToolbarState;\n stateAtom: ToolbarStateAtom;\n registry: Registry.Registry;\n cursorFallbackRange?: CompleteCellRange;\n};\n\nconst createStyleActions = ({ model, state, stateAtom, registry, cursorFallbackRange }: StyleActionsContext) =>\n Object.entries(styles).map(([styleValue, icon]) => {\n return createMenuAction<StyleAction>(\n `style--${styleValue}`,\n () => {\n if (!cursorFallbackRange) {\n return;\n }\n const index =\n model.sheet.ranges?.findIndex(\n (range) =>\n range.key === 'style' && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: 'style',\n value: styleValue as StyleValue,\n };\n const currentState = registry.get(stateAtom);\n if (\n model.sheet.ranges\n .filter(\n ({ range, key: rangeKey }) =>\n rangeKey === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .some(({ value: rangeValue }) => rangeValue === styleValue)\n ) {\n // this value should be unset\n if (index >= 0) {\n Obj.change(model.sheet, (s) => {\n s.ranges?.splice(index, 1);\n });\n }\n registry.set(stateAtom, { ...currentState, [nextRangeEntity.value]: false });\n } else {\n Obj.change(model.sheet, (s) => {\n s.ranges?.push(nextRangeEntity);\n });\n registry.set(stateAtom, { ...currentState, [nextRangeEntity.value]: true });\n }\n },\n {\n key: 'style',\n value: styleValue as StyleValue,\n icon,\n label: [`range value ${styleValue} label`, { ns: meta.id }],\n checked: !!state[styleValue as StyleValue],\n },\n );\n });\n\nexport const createStyle = (context: StyleActionsContext): ActionGraphProps => {\n const styleGroupAction = createStyleGroup(context.state);\n const styleActions = createStyleActions(context);\n return {\n nodes: [styleGroupAction, ...styleActions],\n edges: [\n { source: 'root', target: 'style' },\n ...styleActions.map(({ id }) => ({ source: styleGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry, RegistryContext, useAtomValue } from '@effect-atom/atom-react';\nimport { useContext, useMemo } from 'react';\n\nimport { type AlignState } from './align';\nimport { type StyleState } from './style';\n\nexport type ToolbarState = Partial<StyleState & AlignState>;\nexport type ToolbarStateAtom = Atom.Writable<ToolbarState>;\n\n/**\n * Creates a reactive toolbar state Atom.\n */\nexport const useToolbarState = (initialState: ToolbarState = {}): ToolbarStateAtom => {\n return useMemo(() => Atom.make<ToolbarState>(initialState).pipe(Atom.keepAlive), []);\n};\n\n/**\n * Hook to read the current toolbar state value.\n */\nexport const useToolbarStateValue = (stateAtom: ToolbarStateAtom): ToolbarState => {\n return useAtomValue(stateAtom);\n};\n\n/**\n * Hook to get the registry for updating toolbar state.\n */\nexport const useToolbarStateRegistry = (): Registry.Registry => {\n return useContext(RegistryContext);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { SheetContainer } from './SheetContainer';\n\nexport default SheetContainer;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "Fragment", "Obj", "Layout", "React", "addressToA1Notation", "isFormula", "rangeToA1Notation", "Icon", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "Atom", "RegistryContext", "React", "useContext", "useMemo", "useAppGraph", "MenuProvider", "ToolbarMenu", "createGapSeparator", "useMenuActions", "RegistryContext", "useContext", "useEffect", "inRange", "Obj", "createMenuAction", "createMenuItemGroup", "aligns", "start", "center", "end", "useAlignState", "stateAtom", "registry", "useContext", "RegistryContext", "cursor", "model", "useSheetContext", "useEffect", "alignValue", "sheet", "ranges", "findLast", "range", "key", "alignKey", "inRange", "rangeFromIndex", "value", "undefined", "prev", "get", "set", "createAlignGroupAction", "createMenuItemGroup", "label", "ns", "meta", "id", "variant", "selectCardinality", "createAlignActions", "state", "cursorFallbackRange", "Object", "entries", "map", "icon", "createMenuAction", "index", "findIndex", "from", "nextRangeEntity", "rangeToIndex", "currentState", "Obj", "change", "s", "push", "splice", "checked", "testId", "createAlign", "context", "alignGroup", "alignActions", "nodes", "edges", "source", "target", "RegistryContext", "useContext", "useEffect", "inRange", "Obj", "createMenuAction", "createMenuItemGroup", "styles", "highlight", "softwrap", "useStyleState", "stateAtom", "registry", "useContext", "RegistryContext", "cursorFallbackRange", "model", "useSheetContext", "useEffect", "sheet", "ranges", "filter", "range", "key", "inRange", "rangeFromIndex", "from", "forEach", "value", "prev", "get", "set", "createStyleGroup", "state", "createMenuItemGroup", "variant", "selectCardinality", "Object", "keys", "map", "styleValue", "createStyleActions", "entries", "icon", "createMenuAction", "index", "findIndex", "nextRangeEntity", "rangeToIndex", "currentState", "rangeKey", "some", "rangeValue", "Obj", "change", "s", "splice", "push", "label", "ns", "meta", "id", "checked", "createStyle", "context", "styleGroupAction", "styleActions", "nodes", "edges", "source", "target", "Atom", "RegistryContext", "useAtomValue", "useContext", "useMemo", "useToolbarState", "initialState", "useMemo", "Atom", "make", "pipe", "keepAlive", "createToolbarActions", "model", "stateAtom", "registry", "cursorFallbackRange", "customActions", "Atom", "make", "get", "state", "context", "align", "createAlign", "style", "createStyle", "gap", "createGapSeparator", "graph", "nodes", "edges", "custom", "push", "SheetToolbar", "id", "useSheetContext", "useToolbarState", "useContext", "RegistryContext", "useAlignState", "useStyleState", "useAppGraph", "useMemo", "actions", "filter", "action", "properties", "disposition", "map", "node", "source", "target", "actionsCreator", "menu", "useMenuActions", "React", "MenuProvider", "attendableId", "ToolbarMenu", "SheetContainer", "role", "subject", "sheet", "space", "ignoreAttention", "graph", "useComputeGraph", "Root", "Container", "Fragment", "React", "SheetProvider", "Layout", "Main", "toolbar", "statusbar", "SheetToolbar", "id", "Obj", "getDXN", "toString", "GridSheet", "FunctionEditor", "props", "Flex", "classNames", "SheetContainer"]
7
+ }
@@ -0,0 +1,23 @@
1
+ import {
2
+ Sheet_exports,
3
+ compareIndexPositions
4
+ } from "./chunk-KE3AKN5W.mjs";
5
+
6
+ // src/capabilities/anchor-sort/anchor-sort.ts
7
+ import * as Effect from "effect/Effect";
8
+ import { Capability, Common } from "@dxos/app-framework";
9
+ import { Relation } from "@dxos/echo";
10
+ var anchor_sort_default = Capability.makeModule(() => Effect.succeed(Capability.contributes(Common.Capability.AnchorSort, {
11
+ key: Sheet_exports.Sheet.typename,
12
+ sort: (anchorA, anchorB) => {
13
+ const sheet = Relation.getTarget(anchorA);
14
+ if (sheet !== Relation.getTarget(anchorB)) {
15
+ return 0;
16
+ }
17
+ return !anchorA.anchor || !anchorB.anchor ? 0 : compareIndexPositions(sheet, anchorA.anchor, anchorB.anchor);
18
+ }
19
+ })));
20
+ export {
21
+ anchor_sort_default as default
22
+ };
23
+ //# sourceMappingURL=anchor-sort-LLO7PZKF.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/anchor-sort/anchor-sort.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Relation } from '@dxos/echo';\n\nimport { Sheet, compareIndexPositions } from '../../types';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(Common.Capability.AnchorSort, {\n key: Sheet.Sheet.typename,\n sort: (anchorA, anchorB) => {\n const sheet = Relation.getTarget(anchorA) as Sheet.Sheet;\n if (sheet !== Relation.getTarget(anchorB)) {\n return 0;\n }\n\n return !anchorA.anchor || !anchorB.anchor ? 0 : compareIndexPositions(sheet, anchorA.anchor, anchorB.anchor);\n },\n }),\n ),\n);\n"],
5
+ "mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,gBAAgB;AAIzB,IAAA,sBAAeC,WAAWC,WAAW,MAC5BC,eACLF,WAAWG,YAAYC,OAAOJ,WAAWK,YAAY;EACnDC,KAAKC,cAAMA,MAAMC;EACjBC,MAAM,CAACC,SAASC,YAAAA;AACd,UAAMC,QAAQC,SAASC,UAAUJ,OAAAA;AACjC,QAAIE,UAAUC,SAASC,UAAUH,OAAAA,GAAU;AACzC,aAAO;IACT;AAEA,WAAO,CAACD,QAAQK,UAAU,CAACJ,QAAQI,SAAS,IAAIC,sBAAsBJ,OAAOF,QAAQK,QAAQJ,QAAQI,MAAM;EAC7G;AACF,CAAA,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "Common", "Relation", "Capability", "makeModule", "succeed", "contributes", "Common", "AnchorSort", "key", "Sheet", "typename", "sort", "anchorA", "anchorB", "sheet", "Relation", "getTarget", "anchor", "compareIndexPositions"]
7
+ }
@@ -5,7 +5,7 @@ import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view
5
5
  import { debounce } from "@dxos/async";
6
6
  import { createSheetName } from "@dxos/compute";
7
7
  import { invariant } from "@dxos/invariant";
8
- import { documentId, singleValueFacet } from "@dxos/react-ui-editor";
8
+ import { documentId, singleValueFacet } from "@dxos/ui-editor";
9
9
  var updateAllDecorations = StateEffect.define();
10
10
  var computeGraphFacet = singleValueFacet();
11
11
 
@@ -16,8 +16,8 @@ import { ViewPlugin as ViewPlugin2, keymap } from "@codemirror/view";
16
16
  import { tags } from "@lezer/highlight";
17
17
  import { spreadsheet } from "codemirror-lang-spreadsheet";
18
18
  import { RANGE_NOTATION } from "@dxos/compute";
19
- import { singleValueFacet as singleValueFacet2 } from "@dxos/react-ui-editor";
20
- import { mx } from "@dxos/react-ui-theme";
19
+ import { singleValueFacet as singleValueFacet2 } from "@dxos/ui-editor";
20
+ import { mx } from "@dxos/ui-theme";
21
21
  var highlightStyles = HighlightStyle.define([
22
22
  // Function.
23
23
  {
@@ -127,7 +127,7 @@ var sheetExtension = ({ debug, functions = [] }) => {
127
127
  activateOnTyping: true,
128
128
  closeOnBlur: !debug,
129
129
  icons: false,
130
- tooltipClass: () => mx("!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]", "[&>ul>li[aria-selected]]:!bg-accentSurface", "border-separator")
130
+ tooltipClass: () => mx("!-left-[1px] !top-[33px] !-m-0 border !border-bs-0 [&>ul]:!min-w-[198px]", "[&>ul>li[aria-selected]]:!bg-accentSurface", "border-separator")
131
131
  }),
132
132
  keymap.of([
133
133
  {
@@ -231,4 +231,4 @@ export {
231
231
  sheetExtension,
232
232
  rangeExtension
233
233
  };
234
- //# sourceMappingURL=chunk-7VEWYJJN.mjs.map
234
+ //# sourceMappingURL=chunk-IFLWVS2V.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/extensions/compute.ts", "../../../src/extensions/editor/sheet-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 CleanupFn, debounce } from '@dxos/async';\nimport {\n type CellAddress,\n type CellScalarValue,\n type ComputeGraph,\n type ComputeNode,\n createSheetName,\n} from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { documentId, singleValueFacet } from '@dxos/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 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?: CleanupFn;\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): HTMLDivElement {\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/ui-editor';\nimport { mx } from '@dxos/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({\n idiom: 'en-US',\n decimalSeparator: '.',\n });\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-bs-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": "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",
6
+ "names": ["syntaxTree", "RangeSetBuilder", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "debounce", "createSheetName", "invariant", "documentId", "singleValueFacet", "updateAllDecorations", "StateEffect", "define", "computeGraphFacet", "singleValueFacet", "acceptCompletion", "autocompletion", "completionStatus", "startCompletion", "HighlightStyle", "syntaxHighlighting", "ViewPlugin", "keymap", "tags", "spreadsheet", "RANGE_NOTATION", "singleValueFacet", "mx", "highlightStyles", "HighlightStyle", "define", "tag", "tags", "name", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "singleValueFacet", "sheetExtension", "debug", "functions", "extension", "language", "spreadsheet", "idiom", "decimalSeparator", "createCompletion", "section", "description", "syntax", "find", "value", "label", "info", "root", "document", "createElement", "className", "title", "innerText", "appendChild", "detail", "apply", "view", "completion", "from", "to", "insertParens", "state", "doc", "toString", "length", "dispatch", "update", "changes", "insert", "selection", "anchor", "of", "data", "autocomplete", "context", "match", "matchBefore", "text", "toUpperCase", "explicit", "options", "filter", "startsWith", "map", "syntaxHighlighting", "autocompletion", "aboveCursor", "defaultKeymap", "activateOnTyping", "closeOnBlur", "icons", "tooltipClass", "mx", "keymap", "key", "run", "completionStatus", "acceptCompletion", "startCompletion", "rangeExtension", "onInit", "onStateChange", "activeRange", "notifier", "setRange", "range", "focus", "ViewPlugin", "fromClass", "_view", "ranges", "undefined", "facet", "topNode", "parser", "parse", "visitTree", "type", "str", "sliceString", "RANGE_NOTATION", "test", "node", "callback", "child", "firstChild", "nextSibling"]
7
+ }