@dou-ui/sheet 0.0.0-stage → 0.1.0-alpha.0

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 (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/dist/cell-types.js +20 -0
  4. package/dist/cell-types.js.map +1 -0
  5. package/dist/code/code-formula-bar.js +6 -0
  6. package/dist/code/code-formula-bar.js.map +1 -0
  7. package/dist/code/code-formula-bar.vue_vue_type_script_setup_true_lang.js +192 -0
  8. package/dist/code/code-formula-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  9. package/dist/code/index.js +12 -0
  10. package/dist/code/index.js.map +1 -0
  11. package/dist/code/language.js +51 -0
  12. package/dist/code/language.js.map +1 -0
  13. package/dist/code/style.d.ts +1 -0
  14. package/dist/code/style.js +2 -0
  15. package/dist/collaboration/anchor.js +143 -0
  16. package/dist/collaboration/anchor.js.map +1 -0
  17. package/dist/collaboration/index.js +770 -0
  18. package/dist/collaboration/index.js.map +1 -0
  19. package/dist/collaboration/peers.js +87 -0
  20. package/dist/collaboration/peers.js.map +1 -0
  21. package/dist/collaboration/shared.js +450 -0
  22. package/dist/collaboration/shared.js.map +1 -0
  23. package/dist/components/cell-panel.js +6 -0
  24. package/dist/components/cell-panel.js.map +1 -0
  25. package/dist/components/cell-panel.vue_vue_type_script_setup_true_lang.js +70 -0
  26. package/dist/components/cell-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  27. package/dist/components/cell-renders.js +40 -0
  28. package/dist/components/cell-renders.js.map +1 -0
  29. package/dist/components/date-panel.js +6 -0
  30. package/dist/components/date-panel.js.map +1 -0
  31. package/dist/components/date-panel.vue_vue_type_script_setup_true_lang.js +48 -0
  32. package/dist/components/date-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  33. package/dist/components/filter-panel.js +6 -0
  34. package/dist/components/filter-panel.js.map +1 -0
  35. package/dist/components/filter-panel.vue_vue_type_script_setup_true_lang.js +259 -0
  36. package/dist/components/filter-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  37. package/dist/components/format-dialog.js +6 -0
  38. package/dist/components/format-dialog.js.map +1 -0
  39. package/dist/components/format-dialog.vue_vue_type_script_setup_true_lang.js +432 -0
  40. package/dist/components/format-dialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  41. package/dist/components/format-list.js +6 -0
  42. package/dist/components/format-list.js.map +1 -0
  43. package/dist/components/format-list.vue_vue_type_script_setup_true_lang.js +187 -0
  44. package/dist/components/format-list.vue_vue_type_script_setup_true_lang.js.map +1 -0
  45. package/dist/components/format-presets.js +97 -0
  46. package/dist/components/format-presets.js.map +1 -0
  47. package/dist/components/option-panel.js +6 -0
  48. package/dist/components/option-panel.js.map +1 -0
  49. package/dist/components/option-panel.vue_vue_type_script_setup_true_lang.js +117 -0
  50. package/dist/components/option-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  51. package/dist/components/sheet-comment.js +6 -0
  52. package/dist/components/sheet-comment.js.map +1 -0
  53. package/dist/components/sheet-comment.vue_vue_type_script_setup_true_lang.js +104 -0
  54. package/dist/components/sheet-comment.vue_vue_type_script_setup_true_lang.js.map +1 -0
  55. package/dist/components/sheet-formula-bar.js +6 -0
  56. package/dist/components/sheet-formula-bar.js.map +1 -0
  57. package/dist/components/sheet-formula-bar.vue_vue_type_script_setup_true_lang.js +124 -0
  58. package/dist/components/sheet-formula-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  59. package/dist/components/sheet-link.js +6 -0
  60. package/dist/components/sheet-link.js.map +1 -0
  61. package/dist/components/sheet-link.vue_vue_type_script_setup_true_lang.js +249 -0
  62. package/dist/components/sheet-link.vue_vue_type_script_setup_true_lang.js.map +1 -0
  63. package/dist/components/sheet-menu.js +6 -0
  64. package/dist/components/sheet-menu.js.map +1 -0
  65. package/dist/components/sheet-menu.vue_vue_type_script_setup_true_lang.js +115 -0
  66. package/dist/components/sheet-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  67. package/dist/components/sheet-name-box.js +6 -0
  68. package/dist/components/sheet-name-box.js.map +1 -0
  69. package/dist/components/sheet-name-box.vue_vue_type_script_setup_true_lang.js +91 -0
  70. package/dist/components/sheet-name-box.vue_vue_type_script_setup_true_lang.js.map +1 -0
  71. package/dist/components/sheet-note.js +6 -0
  72. package/dist/components/sheet-note.js.map +1 -0
  73. package/dist/components/sheet-note.vue_vue_type_script_setup_true_lang.js +146 -0
  74. package/dist/components/sheet-note.vue_vue_type_script_setup_true_lang.js.map +1 -0
  75. package/dist/components/sheet-outline.js +6 -0
  76. package/dist/components/sheet-outline.js.map +1 -0
  77. package/dist/components/sheet-outline.vue_vue_type_script_setup_true_lang.js +237 -0
  78. package/dist/components/sheet-outline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  79. package/dist/components/sheet-tabs.js +6 -0
  80. package/dist/components/sheet-tabs.js.map +1 -0
  81. package/dist/components/sheet-tabs.vue_vue_type_script_setup_true_lang.js +487 -0
  82. package/dist/components/sheet-tabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
  83. package/dist/components/sheet-toolbar.js +6 -0
  84. package/dist/components/sheet-toolbar.js.map +1 -0
  85. package/dist/components/sheet-toolbar.vue_vue_type_script_setup_true_lang.js +1562 -0
  86. package/dist/components/sheet-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  87. package/dist/components/validation-dialog.js +6 -0
  88. package/dist/components/validation-dialog.js.map +1 -0
  89. package/dist/components/validation-dialog.vue_vue_type_script_setup_true_lang.js +370 -0
  90. package/dist/components/validation-dialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  91. package/dist/context.js +12 -0
  92. package/dist/context.js.map +1 -0
  93. package/dist/core/address.js +256 -0
  94. package/dist/core/address.js.map +1 -0
  95. package/dist/core/axis.js +72 -0
  96. package/dist/core/axis.js.map +1 -0
  97. package/dist/core/cell-type.js +30 -0
  98. package/dist/core/cell-type.js.map +1 -0
  99. package/dist/core/clipboard.js +141 -0
  100. package/dist/core/clipboard.js.map +1 -0
  101. package/dist/core/commands.js +63 -0
  102. package/dist/core/commands.js.map +1 -0
  103. package/dist/core/comments.js +74 -0
  104. package/dist/core/comments.js.map +1 -0
  105. package/dist/core/conditional.js +362 -0
  106. package/dist/core/conditional.js.map +1 -0
  107. package/dist/core/csv.js +191 -0
  108. package/dist/core/csv.js.map +1 -0
  109. package/dist/core/data.js +118 -0
  110. package/dist/core/data.js.map +1 -0
  111. package/dist/core/document.js +187 -0
  112. package/dist/core/document.js.map +1 -0
  113. package/dist/core/extension.js +60 -0
  114. package/dist/core/extension.js.map +1 -0
  115. package/dist/core/file.js +336 -0
  116. package/dist/core/file.js.map +1 -0
  117. package/dist/core/fill.js +153 -0
  118. package/dist/core/fill.js.map +1 -0
  119. package/dist/core/find.js +42 -0
  120. package/dist/core/find.js.map +1 -0
  121. package/dist/core/format.js +404 -0
  122. package/dist/core/format.js.map +1 -0
  123. package/dist/core/group.js +134 -0
  124. package/dist/core/group.js.map +1 -0
  125. package/dist/core/history.js +68 -0
  126. package/dist/core/history.js.map +1 -0
  127. package/dist/core/index.js +17 -0
  128. package/dist/core/link.js +34 -0
  129. package/dist/core/link.js.map +1 -0
  130. package/dist/core/merge.js +105 -0
  131. package/dist/core/merge.js.map +1 -0
  132. package/dist/core/model.js +48 -0
  133. package/dist/core/model.js.map +1 -0
  134. package/dist/core/nav.js +44 -0
  135. package/dist/core/nav.js.map +1 -0
  136. package/dist/core/paint.js +106 -0
  137. package/dist/core/paint.js.map +1 -0
  138. package/dist/core/plain-cell-types.js +54 -0
  139. package/dist/core/plain-cell-types.js.map +1 -0
  140. package/dist/core/protect.js +246 -0
  141. package/dist/core/protect.js.map +1 -0
  142. package/dist/core/selection.js +37 -0
  143. package/dist/core/selection.js.map +1 -0
  144. package/dist/core/transaction.js +1582 -0
  145. package/dist/core/transaction.js.map +1 -0
  146. package/dist/core/validation.js +135 -0
  147. package/dist/core/validation.js.map +1 -0
  148. package/dist/core/versions.js +161 -0
  149. package/dist/core/versions.js.map +1 -0
  150. package/dist/export/color.js +36 -0
  151. package/dist/export/color.js.map +1 -0
  152. package/dist/export/draw.js +316 -0
  153. package/dist/export/draw.js.map +1 -0
  154. package/dist/export/index.js +390 -0
  155. package/dist/export/index.js.map +1 -0
  156. package/dist/formula/edit.js +210 -0
  157. package/dist/formula/edit.js.map +1 -0
  158. package/dist/formula/engine.js +526 -0
  159. package/dist/formula/engine.js.map +1 -0
  160. package/dist/formula/error.js +39 -0
  161. package/dist/formula/error.js.map +1 -0
  162. package/dist/formula/functions.js +1493 -0
  163. package/dist/formula/functions.js.map +1 -0
  164. package/dist/formula/help.js +408 -0
  165. package/dist/formula/help.js.map +1 -0
  166. package/dist/formula/index.js +7 -0
  167. package/dist/formula/parse.js +369 -0
  168. package/dist/formula/parse.js.map +1 -0
  169. package/dist/formula/values.js +123 -0
  170. package/dist/formula/values.js.map +1 -0
  171. package/dist/formulas.js +30 -0
  172. package/dist/formulas.js.map +1 -0
  173. package/dist/index.js +39 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/locale.js +1312 -0
  176. package/dist/locale.js.map +1 -0
  177. package/dist/sheet.js +6 -0
  178. package/dist/sheet.js.map +1 -0
  179. package/dist/sheet.vue_vue_type_script_setup_true_lang.js +7166 -0
  180. package/dist/sheet.vue_vue_type_script_setup_true_lang.js.map +1 -0
  181. package/dist/style.css +1 -0
  182. package/dist/style.d.ts +1 -0
  183. package/dist/style.js +17 -0
  184. package/dist/types/cell-types.d.ts +2 -0
  185. package/dist/types/code/code-formula-bar.vue.d.ts +3 -0
  186. package/dist/types/code/index.d.ts +12 -0
  187. package/dist/types/code/language.d.ts +13 -0
  188. package/dist/types/collaboration/anchor.d.ts +65 -0
  189. package/dist/types/collaboration/index.d.ts +59 -0
  190. package/dist/types/collaboration/peers.d.ts +21 -0
  191. package/dist/types/collaboration/shared.d.ts +75 -0
  192. package/dist/types/components/cell-panel.vue.d.ts +20 -0
  193. package/dist/types/components/cell-renders.d.ts +9 -0
  194. package/dist/types/components/date-panel.vue.d.ts +9 -0
  195. package/dist/types/components/filter-panel.vue.d.ts +21 -0
  196. package/dist/types/components/format-dialog.vue.d.ts +24 -0
  197. package/dist/types/components/format-list.vue.d.ts +25 -0
  198. package/dist/types/components/format-presets.d.ts +30 -0
  199. package/dist/types/components/option-panel.vue.d.ts +13 -0
  200. package/dist/types/components/sheet-comment.vue.d.ts +29 -0
  201. package/dist/types/components/sheet-formula-bar.vue.d.ts +3 -0
  202. package/dist/types/components/sheet-link.vue.d.ts +32 -0
  203. package/dist/types/components/sheet-menu.vue.d.ts +20 -0
  204. package/dist/types/components/sheet-name-box.vue.d.ts +3 -0
  205. package/dist/types/components/sheet-note.vue.d.ts +22 -0
  206. package/dist/types/components/sheet-outline.vue.d.ts +36 -0
  207. package/dist/types/components/sheet-tabs.vue.d.ts +9 -0
  208. package/dist/types/components/sheet-toolbar.vue.d.ts +11 -0
  209. package/dist/types/components/validation-dialog.vue.d.ts +25 -0
  210. package/dist/types/context.d.ts +189 -0
  211. package/dist/types/core/address.d.ts +109 -0
  212. package/dist/types/core/axis.d.ts +23 -0
  213. package/dist/types/core/cell-type.d.ts +157 -0
  214. package/dist/types/core/clipboard.d.ts +48 -0
  215. package/dist/types/core/commands.d.ts +76 -0
  216. package/dist/types/core/comments.d.ts +22 -0
  217. package/dist/types/core/conditional.d.ts +114 -0
  218. package/dist/types/core/csv.d.ts +93 -0
  219. package/dist/types/core/data.d.ts +26 -0
  220. package/dist/types/core/document.d.ts +49 -0
  221. package/dist/types/core/extension.d.ts +177 -0
  222. package/dist/types/core/file.d.ts +301 -0
  223. package/dist/types/core/fill.d.ts +23 -0
  224. package/dist/types/core/find.d.ts +39 -0
  225. package/dist/types/core/format.d.ts +47 -0
  226. package/dist/types/core/group.d.ts +76 -0
  227. package/dist/types/core/history.d.ts +27 -0
  228. package/dist/types/core/index.d.ts +33 -0
  229. package/dist/types/core/link.d.ts +14 -0
  230. package/dist/types/core/merge.d.ts +26 -0
  231. package/dist/types/core/model.d.ts +363 -0
  232. package/dist/types/core/nav.d.ts +15 -0
  233. package/dist/types/core/paint.d.ts +19 -0
  234. package/dist/types/core/plain-cell-types.d.ts +6 -0
  235. package/dist/types/core/protect.d.ts +34 -0
  236. package/dist/types/core/selection.d.ts +25 -0
  237. package/dist/types/core/transaction.d.ts +470 -0
  238. package/dist/types/core/validation.d.ts +55 -0
  239. package/dist/types/core/versions.d.ts +38 -0
  240. package/dist/types/export/color.d.ts +7 -0
  241. package/dist/types/export/draw.d.ts +98 -0
  242. package/dist/types/export/index.d.ts +47 -0
  243. package/dist/types/formula/edit.d.ts +62 -0
  244. package/dist/types/formula/engine.d.ts +99 -0
  245. package/dist/types/formula/error.d.ts +30 -0
  246. package/dist/types/formula/functions.d.ts +62 -0
  247. package/dist/types/formula/help.d.ts +12 -0
  248. package/dist/types/formula/index.d.ts +13 -0
  249. package/dist/types/formula/parse.d.ts +92 -0
  250. package/dist/types/formula/values.d.ts +65 -0
  251. package/dist/types/formulas.d.ts +32 -0
  252. package/dist/types/index.d.ts +225 -0
  253. package/dist/types/locale.d.ts +531 -0
  254. package/dist/types/sheet.vue.d.ts +60 -0
  255. package/dist/types/types.d.ts +498 -0
  256. package/dist/types/use-comments.d.ts +47 -0
  257. package/dist/types/use-messages.d.ts +7 -0
  258. package/dist/use-comments.js +130 -0
  259. package/dist/use-comments.js.map +1 -0
  260. package/dist/use-messages.js +29 -0
  261. package/dist/use-messages.js.map +1 -0
  262. package/package.json +93 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createElementVNode","_normalizeStyle","_createCommentVNode","_createBlock","SheetOutline","_unref","_createVNode","_withCtx","_Fragment","_renderList","_resolveDynamicComponent","_toDisplayString","_isMemoSame","_mergeProps","_withModifiers","_createTextVNode","FilterPanel","CellPanel","SheetLink","SheetNote","SheetComment","SheetMenu"],"sources":["../src/sheet.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n DouFindReplace,\n DouPopover,\n DouToggle,\n DouTooltip,\n downloadBlob,\n useApplePlatform,\n holdPointer,\n isComposing,\n matchesHotkey,\n useLocale,\n useElementSize,\n type PointerHold,\n type VirtualElement,\n} from 'dou-ui'\nimport {\n BoldIcon,\n ChevronDownIcon,\n PrinterIcon,\n ClipboardPasteIcon,\n DecimalDecreaseIcon,\n DecimalIncreaseIcon,\n ItalicIcon,\n RedoIcon,\n StrikethroughIcon,\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextValignBottomIcon,\n TextValignMiddleIcon,\n TextValignTopIcon,\n TypeXIcon,\n LockIcon,\n LockKeyholeIcon,\n UnlockIcon,\n ShieldLockIcon,\n LinkIcon,\n UnlinkIcon,\n ExternalLinkIcon,\n UnderlineIcon,\n UndoIcon,\n WrapTextIcon,\n ColumnGroupIcon,\n ColumnInsertLeftIcon,\n ColumnInsertRightIcon,\n ColumnRemoveIcon,\n ColumnUngroupIcon,\n CopyIcon,\n EraserIcon,\n MessageCircleIcon,\n MessagePlusIcon,\n MessagesIcon,\n MessageTextIcon,\n MessageXIcon,\n EyeIcon,\n EyeOffIcon,\n CellsMergeIcon,\n FilterIcon,\n FilterXIcon,\n FoldVerticalIcon,\n PlusIcon,\n RowGroupIcon,\n RowInsertBottomIcon,\n RowInsertTopIcon,\n RowRemoveIcon,\n RowUngroupIcon,\n ScissorsIcon,\n SortAscendingIcon,\n SortDescendingIcon,\n SortIcon,\n CellsSplitIcon,\n TrashIcon,\n UnfoldVerticalIcon,\n fileIconOf,\n FunctionIcon,\n LayersIcon,\n LetterCaseIcon,\n ReplaceIcon,\n SearchIcon,\n WholeWordIcon,\n} from '@dou-ui/icons'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n shallowRef,\n toRaw,\n useId,\n watch,\n} from 'vue'\nimport {\n boundsOf,\n columnName,\n shiftFormula,\n renameReferencesAll,\n formatCell,\n formatRange,\n inBounds,\n parseCell,\n parseRange,\n splitSheet,\n type SheetBounds,\n type SheetCellTarget,\n type SheetPoint,\n type SheetRange,\n} from './core/address'\nimport { formatClip, parseClip, type SheetClip } from './core/clipboard'\nimport { fillContinues, type SheetFillMode } from './core/fill'\nimport { SheetAxis } from './core/axis'\nimport { readWorkbook } from './core/document'\nimport { mergesOf, type SheetMerges } from './core/merge'\nimport { groupRange, groupsOf, SheetGroups, OUTLINE_LANE, type SheetGroupLines } from './core/group'\nimport SheetComment from './components/sheet-comment.vue'\nimport SheetNote from './components/sheet-note.vue'\nimport SheetLink from './components/sheet-link.vue'\nimport SheetOutline from './components/sheet-outline.vue'\nimport {\n alignOf,\n changeDecimals,\n fitNumber,\n formatValue,\n inputText,\n parseInput,\n type SheetInput,\n} from './core/format'\nimport { createCommands, labelOf, mergeCommands, type SheetCommand } from './core/commands'\nimport { SheetHistory, type SheetHistoryView } from './core/history'\nimport { keepCommentAnchors, sheetCommentAnchors } from './core/comments'\nimport { diffWorkbooks, restoreWorkbook, type SheetCellChange } from './core/versions'\nimport { SheetFormulaEngine } from './formula/engine'\nimport {\n argNameAt,\n callAt,\n canPointAt,\n formulaParts,\n formulaReferences,\n nameAt,\n partClass,\n} from './formula/edit'\nimport type { SheetFunction } from './formula/functions'\nimport { isSheetError, type SheetErrorCode } from './formula/error'\nimport { shownValue } from './formula/values'\nimport {\n cellOf,\n colCountOf,\n compactCell,\n isBlank,\n rowCountOf,\n valueOf,\n type SheetCell,\n type SheetCellInput,\n type SheetData,\n type SheetFilterRule,\n type SheetSortOrder,\n type SheetStyle,\n type SheetTypeSetup,\n type SheetValue,\n type SheetWorkbook,\n} from './core/model'\nimport { movePoint, stepIndex, type SheetDirection } from './core/nav'\nimport { compareForSort, isEmptyValue, meetsRule, textCollator } from './core/data'\nimport { layStyle, SheetLooks, type SheetLook } from './core/conditional'\nimport { textOn } from './core/paint'\nimport FilterPanel from './components/filter-panel.vue'\nimport {\n clampPoint,\n clampSelection,\n sameSelection,\n selectCell,\n type SheetSelection,\n} from './core/selection'\nimport {\n movedIndex,\n SheetTransaction,\n sheetKey,\n type SheetAxisName,\n type SheetRef,\n type SheetStylePatch,\n type SheetTransactionMeta,\n} from './core/transaction'\nimport { checkProtection, isLocked, protectionOf } from './core/protect'\nimport { isTypedLink, linkTarget, type SheetLinkTarget } from './core/link'\nimport SheetMenu from './components/sheet-menu.vue'\nimport CellPanel from './components/cell-panel.vue'\nimport { builtinCellTypes } from './cell-types'\nimport { sheetContextKey, type SheetContext, type SheetEditInputOptions } from './context'\nimport {\n resolveCellType,\n type SheetCellType,\n type SheetDrawContext,\n type SheetResolvedType,\n} from './core/cell-type'\nimport { ruleMessage, SheetChecks } from './core/validation'\nimport {\n cellMatcher,\n foundFrom,\n replaceInText,\n type SheetSearchQuery,\n type SheetMatch,\n} from './core/find'\nimport {\n resolveSheetExtensions,\n type ResolvedSheetExtensions,\n type SheetHistoryHandler,\n type SheetUpdate,\n} from './core/extension'\nimport { format } from './locale'\nimport { useSheetMessages } from './use-messages'\nimport { useSheetComments } from './use-comments'\nimport { sheetToCSV, type SheetCSVWriteOptions } from './core/csv'\nimport { createSheetExport, type SheetExportTarget } from './export'\nimport {\n createFileSource,\n csvExporter,\n csvImporter,\n defineSheetExporter,\n exporterInfo,\n findImporter,\n importerInfo,\n mergeFileHandlers,\n reasonOf,\n scopeFor,\n toBlob,\n type SheetExporter,\n type SheetFileSource,\n type SheetImporter,\n type SheetImportResult,\n} from './core/file'\nimport type {\n SheetEmits,\n SheetExportOptions,\n SheetExportFileOptions,\n SheetImageOptions,\n SheetImportEvent,\n SheetImportMode,\n SheetFileErrorEvent,\n SheetImportFileOptions,\n SheetSaveFileOptions,\n SheetSlots,\n SheetExpose,\n SheetInvalidCell,\n SheetMenuContext,\n SheetMenuItem,\n SheetLinkOpenEvent,\n SheetPasteEvent,\n SheetProps,\n} from './types'\n\ndefineOptions({ name: 'DouSheet' })\n\nconst props = withDefaults(defineProps<SheetProps>(), {\n selection: undefined,\n activeSheet: undefined,\n readonly: false,\n rowHeight: 28,\n colWidth: 96,\n headers: true,\n outline: true,\n gridlines: true,\n historyDepth: 100,\n ariaLabel: undefined,\n messages: undefined,\n menu: undefined,\n extensions: () => [],\n fileDrop: false,\n comments: undefined,\n author: undefined,\n activeComment: undefined,\n commentable: true,\n compare: undefined,\n})\nconst emit = defineEmits<SheetEmits>()\ndefineSlots<SheetSlots>()\n/** Nothing can be changed: read-only, or showing what changed since an older version. */\nconst viewOnly = computed(() => props.readonly || !!props.compare)\n\nconst messages = useSheetMessages(() => props.messages)\nconst { locale, t: common } = useLocale()\n/** The language weekdays are named in. */\nconst lang = computed(() => locale.value.name)\nconst uid = useId()\n\nconst root = ref<HTMLElement>()\nconst viewport = ref<HTMLElement>()\nconst editor = ref<HTMLTextAreaElement>()\n\n// The document ---------------------------------------------------------------------------\n\n/*\n * The latest workbook. With `v-model` the prop only catches up when the\n * parent renders again, so changes made in the same tick build on this.\n */\nconst doc = shallowRef(readWorkbook(toRaw(props.modelValue)))\n/** The last workbook sent out; anything else coming in is a new document. */\nlet sent = doc.value\nconst history = new SheetHistory(props.historyDepth)\nconst canUndo = ref(false)\nconst canRedo = ref(false)\n\nwatch(\n // read past a deep `ref()`: going through its proxies costs more than the grid itself\n () => readWorkbook(toRaw(props.modelValue)),\n (value) => {\n if (value === doc.value) return\n const before = doc.value\n doc.value = value\n if (engine.doc !== value) engine.load(value)\n if (value !== sent) {\n // replaced from outside: the history no longer fits it\n history.clear()\n syncHistory()\n updated(before, value, null)\n }\n },\n)\n\nconst sheetState = ref(props.activeSheet ?? 0)\nwatch(\n () => props.activeSheet,\n (value) => {\n if (value != null) sheetState.value = value\n },\n)\nconst sheetIndex = computed(() =>\n Math.max(0, Math.min(doc.value.sheets.length - 1, sheetState.value)),\n)\n\nconst EMPTY_SHEET: SheetData = { name: '', cells: [] }\nconst NO_SIZES: Record<number, number> = {}\nconst sheet = computed(() => doc.value.sheets[sheetIndex.value] ?? EMPTY_SHEET)\n\n// Extensions and cell types --------------------------------------------------------------\n\n// an equal list written again in a template keeps what was resolved, and the setups with it\nconst resolved = computed((old?: ResolvedSheetExtensions) => {\n const next = resolveSheetExtensions(props.extensions)\n const same =\n old &&\n old.extensions.length === next.extensions.length &&\n old.extensions.every((e, i) => e === next.extensions[i])\n return same ? old : next\n})\n/** Cell types by name: the built-in ones, then the extensions', the first named winning. */\nconst cellTypes = computed(() => {\n const map = new Map<string, SheetCellType>()\n for (const type of builtinCellTypes) map.set(type.name, type)\n const added = new Set<string>()\n for (const type of resolved.value.cellTypes) {\n if (added.has(type.name)) continue\n added.add(type.name)\n map.set(type.name, type)\n }\n return map\n})\n\n// Formulas -------------------------------------------------------------------------------\n\nconst newEngine = () =>\n new SheetFormulaEngine(doc.value, { functions: resolved.value.functions, locale: lang.value })\n/** Works out the formulas of the workbook as cells show them, and follows every change. */\nlet engine = newEngine()\n/** Goes up when the engine is made again, for other functions or another language. */\nconst engineId = shallowRef(0)\nwatch([() => resolved.value.functions, lang], () => {\n engine = newEngine()\n engineId.value++\n})\n/** A cell of the sheet shown as it comes to: its formula's result, or its value. */\nconst resultAt = (row: number, col: number) => engine.result(sheetKey(sheet.value), row, col)\n/** What a cell of the sheet shown comes to: its formula's result, or its value. */\nconst valueAt = (row: number, col: number) =>\n shownValue(valueOf(sheet.value.cells[row]?.[col]), resultAt, row, col)\n/** What a cell of any sheet comes to. */\nfunction valueIn(data: SheetData) {\n if (data === sheet.value) return valueAt\n const key = sheetKey(data)\n const result = (row: number, col: number) => engine.result(key, row, col)\n return (row: number, col: number) => shownValue(valueOf(data.cells[row]?.[col]), result, row, col)\n}\n\n// Conditional formats ------------------------------------------------------------------------\n\n/**\n * The looks the conditional formats of the sheet shown give its cells,\n * worked out again after every change: a rule can depend on any cell.\n */\nconst looks = computed<SheetLooks>((previous) => {\n // results change with any cell of the workbook\n void doc.value\n void engineId.value\n return looksOf(sheet.value, previous)\n})\n/** The looks the conditional formats of a sheet give its cells. */\nfunction looksOf(data: SheetData, previous?: SheetLooks) {\n const key = sheetKey(data)\n return new SheetLooks(\n data.conditionalFormats,\n {\n valueAt: valueIn(data),\n textAt: (row, col) => cellText(data.cells[row]?.[col], { sheet: key, row, col }),\n evaluate: (formula) => engine.evaluate(formula, key),\n // a large range is read again only when one of its cells changed\n cellStamp: (row, col) => {\n const input = data.cells[row]?.[col]\n const value = valueOf(input)\n return typeof value === 'string' && value.startsWith('=')\n ? engine.result(key, row, col)\n : input\n },\n styles: doc.value.styles,\n size: { rows: rowCountOf(data), cols: colCountOf(data) },\n lang: lang.value,\n },\n previous,\n )\n}\n/** What a row's conditional looks are, for `v-memo`: rules can look past the row. */\nfunction looksKey(row: number) {\n const l = looks.value\n if (l.empty) return ''\n let key = ''\n for (const [left, right] of l.spansIn(row))\n for (const list of [frozenColList.value, bodyCols.value])\n for (const col of list)\n if (col >= left && col <= right) key += `${col}:${l.lookAt(row, col)?.key ?? ''};`\n return key\n}\n/** Compiled styles of cells with a conditional look, by the cell's style and the look. */\nconst lookStyles = computed(() => {\n void styleCache.value\n return new Map<string, ReturnType<typeof compileStyle>>()\n})\nfunction lookStyle(name: string | undefined, look: SheetLook) {\n const key = `${name ?? ''}\\u0000${look.key}`\n let compiled = lookStyles.value.get(key)\n if (!compiled) {\n const own = name ? doc.value.styles?.[name] : undefined\n compiled = compileStyle(look.style ? layStyle(own, look.style) : (own ?? {}))\n lookStyles.value.set(key, compiled)\n }\n return compiled\n}\n/** The CSS that draws a look's bar. */\nconst barCss = (bar: NonNullable<SheetLook['bar']>) =>\n `--dou-sheet-bar-from:${(bar.from * 100).toFixed(2)}%;--dou-sheet-bar-to:${(bar.to * 100).toFixed(2)}%;--dou-sheet-bar-color:${bar.color};`\n\n// Data validation --------------------------------------------------------------------------\n\n/** The rules of a sheet, reading its cells as they come to. */\nfunction checksOf(data: SheetData) {\n const key = sheetKey(data)\n const result = (row: number, col: number) => engine.result(key, row, col)\n return new SheetChecks(data.validations, {\n valueAt: (row, col) => shownValue(valueOf(data.cells[row]?.[col]), result, row, col),\n textAt: (row, col) => cellText(data.cells[row]?.[col], { sheet: key, row, col }),\n evaluate: (formula) => engine.evaluate(formula, key),\n listAt: (reference) => listValues(reference, data),\n size: { rows: rowCountOf(data), cols: colCountOf(data) },\n lang: lang.value,\n })\n}\n/** The rules of the sheet shown, made again after every change: a list or formula can read any cell. */\nconst checks = computed(() => {\n void doc.value\n void engineId.value\n return checksOf(sheet.value)\n})\n/** What a row's marks depend on beyond its own cells, for `v-memo`. */\nfunction checksKey(row: number) {\n const c = checks.value\n return c.empty || !c.readsOthersIn(row) ? 0 : c\n}\n\n/** The cells whose values break a rule, on every sheet or on one. */\nfunction findInvalid(target?: SheetRef): SheetInvalidCell[] {\n const found: SheetInvalidCell[] = []\n const at = target == null ? -1 : indexOfSheet(target)\n doc.value.sheets.forEach((data, index) => {\n if ((target != null && index !== at) || !data.validations?.length) return\n const list = [...checksOf(data).broken()]\n list.sort((a, b) => a.row - b.row || a.col - b.col)\n for (const { row, col, rule } of list)\n found.push({\n sheet: data.name,\n cell: formatCell({ row, col }),\n rule,\n message: ruleMessage(rule, messages.value),\n })\n })\n return found\n}\n\n/** The values of the cells a list refers to, such as `'=$H$2:$H$9'` or `'=城市!A2:A20'`. */\nfunction listValues(reference: string, from: SheetData): SheetValue[] {\n const { sheet: name, ref: cells } = splitSheet(reference.replace(/^=/, '').trim())\n const data = name == null ? from : doc.value.sheets.find((s) => s.name === name)\n const range = data && parseRange(cells)\n if (!data || !range) return []\n const key = sheetKey(data)\n const result = (row: number, col: number) => engine.result(key, row, col)\n const b = boundsOf(range)\n const bottom = Math.min(b.bottom, rowCountOf(data) - 1, b.top + 999)\n const right = Math.min(b.right, colCountOf(data) - 1)\n const values: SheetValue[] = []\n for (let row = b.top; row <= bottom; row++)\n for (let col = b.left; col <= right; col++) {\n const value = shownValue(valueOf(data.cells[row]?.[col]), result, row, col)\n if (!isSheetError(value)) values.push(value as SheetValue)\n }\n return values\n}\n\n/**\n * The select type for the cells of a list rule: plain text, as typed, or\n * soft tags when an option has a tone. A rule's own check marks values\n * that aren't options, so the type's is left out.\n */\nconst listTypes = computed(() => {\n const picker = cellTypes.value.get('select')\n return (\n picker && {\n plain: { ...picker, render: undefined, valid: undefined } as SheetCellType,\n tagged: { ...picker, valid: undefined } as SheetCellType,\n }\n )\n})\nconst listSetups = new WeakMap<object, SheetResolvedType>()\nfunction listTypeAt(\n row: number,\n col: number,\n c: SheetChecks = checks.value,\n): SheetResolvedType | undefined {\n const types = listTypes.value\n if (c.empty || !types) return undefined\n const options = c.optionsAt(row, col)\n if (!options) return undefined\n let listed = listSetups.get(options)\n if (!listed) {\n const toned = options.some((o) => typeof o === 'object' && o != null && 'tone' in o && o.tone)\n listed = {\n name: 'select',\n definition: toned ? types.tagged : types.plain,\n setup: { type: 'select', options, plain: !toned },\n }\n listSetups.set(options, listed)\n }\n return listed\n}\n\n// Filtering --------------------------------------------------------------------------------\n\n/** The filter's range on the sheet shown, kept inside it. */\nconst filterBounds = computed(() => filterBoundsOf(sheet.value))\n/** A sheet's filter range, kept inside it. */\nfunction filterBoundsOf(data: SheetData) {\n const range = data.filter && parseRange(data.filter.range)\n if (!range) return null\n const b = boundsOf(range)\n const bottom = Math.min(b.bottom, rowCountOf(data) - 1)\n const right = Math.min(b.right, colCountOf(data) - 1)\n return b.top > bottom || b.left > right ? null : { ...b, bottom, right }\n}\n\n/**\n * The rows of the filter's range that its rules hide, but for column\n * `skip`'s rule; on the sheet shown, or on `data`.\n */\nfunction rowsFilteredOut(skip?: number, data = sheet.value) {\n const out = new Set<number>()\n const f = data.filter\n const b = data === sheet.value ? filterBounds.value : filterBoundsOf(data)\n if (!f?.columns || !b) return out\n const collator = textCollator(lang.value)\n const rules = Object.entries(f.columns)\n .map(([key, rule]) => ({ col: Number(key), rule }))\n .filter(({ col }) => col !== skip && col >= b.left && col <= b.right)\n if (!rules.length) return out\n const { cells } = data\n const valueOfCell = valueIn(data)\n const key = sheetKey(data)\n for (let row = b.top + 1; row <= b.bottom; row++) {\n for (const { col, rule } of rules) {\n const value = valueOfCell(row, col)\n const text = isEmptyValue(value) ? '' : cellText(cells[row]?.[col], { sheet: key, row, col })\n if (!meetsRule(rule, value, text, collator)) {\n out.add(row)\n break\n }\n }\n }\n return out\n}\n\n/*\n * The rows the filter hides. Worked out when the filter changes, not on\n * every edit: a row that stops matching while being edited stays shown\n * until the filter is applied again, so it doesn't vanish under the cursor.\n */\nconst filteredRows = shallowRef<ReadonlySet<number>>(new Set())\n/** What the filter says, on which sheet, with which engine: changes only when one of them does. */\nconst filterKey = computed(\n () => `${sheetIndex.value}:${engineId.value}:${JSON.stringify(sheet.value.filter ?? null)}`,\n)\nwatch(filterKey, () => (filteredRows.value = rowsFilteredOut()), {\n immediate: true,\n // at once, so what a change of the filter shows can be read out right after it\n flush: 'sync',\n})\n/**\n * Groups folded on a read-only grid: there they fold for this view alone,\n * by sheet and range, and the data stays as it is.\n */\nconst viewFolds = shallowRef<ReadonlyMap<string, boolean>>(new Map())\nwatch(\n () => viewOnly.value,\n () => (viewFolds.value = new Map()),\n)\nconst foldKey = (data: SheetData, range: string) => `${sheetKey(data)}\\u0000${range}`\n\n/** A sheet's groups as shown, with the folds of a read-only view. */\nfunction shownGroupsOf(data: SheetData) {\n const folds = viewFolds.value\n if (!folds.size || !data.groups?.length) return groupsOf(data)\n return new SheetGroups(data.groups, (g) => folds.get(foldKey(data, g.range)) ?? !!g.collapsed)\n}\nconst groups = computed(() => shownGroupsOf(sheet.value))\n\n/** Sizes with every line of `hidden` at 0. */\nfunction hideIn(sizes: Record<number, number>, ...hidden: ReadonlySet<number>[]) {\n if (hidden.every((set) => !set.size)) return sizes\n const out: Record<number, number> = { ...sizes }\n for (const set of hidden) for (const line of set) out[line] = 0\n return out\n}\n\n/** The row heights drawn: the sheet's, and 0 for the rows a filter or a folded group hides. */\nconst shownRowSizes = computed(() =>\n hideIn(sheet.value.rowSizes ?? NO_SIZES, filteredRows.value, groups.value.rows.hidden),\n)\n/** The column widths drawn: the sheet's, and 0 for the columns of folded groups. */\nconst shownColSizes = computed(() =>\n hideIn(sheet.value.colSizes ?? NO_SIZES, groups.value.cols.hidden),\n)\n\n/** The filter buttons on the headings shown: one per column of the range. */\nconst filterButtons = computed(() => {\n const b = filterBounds.value\n const f = sheet.value.filter\n if (!b || !f) return []\n const out: {\n col: number\n x: number\n y: number\n active: boolean\n sorted?: SheetSortOrder\n label: string\n }[] = []\n for (let col = b.left; col <= b.right; col++) {\n if (cols.value.hidden(col)) continue\n const rect = visibleRect({ row: b.top, col })\n if (!rect || rect.x + rect.width - 22 < headerWidth.value) continue\n const heading =\n cellText(sheet.value.cells[b.top]?.[col], { row: b.top, col }) || columnName(col)\n out.push({\n col,\n // a heading cut off by the view's edge has its button at the edge\n x: Math.min(rect.x + rect.width, viewWidth.value),\n y: rect.y + rect.height / 2,\n active: !!f.columns?.[col],\n sorted: f.sorted?.col === col ? f.sorted.order : undefined,\n label: format(messages.value.filter.button, { column: heading }),\n })\n }\n return out\n})\n\n/** The column whose filter panel is open. */\nconst filterOpen = ref<number | null>(null)\n// Escape hands focus back to the filter button, which is out of the tab\n// order; send it on to the grid so arrow keys and Alt+↓ go on working.\nwatch(filterOpen, (now) => {\n if (now != null) return\n void nextTick(() => {\n if (\n (document.activeElement as HTMLElement | null)?.classList.contains('dou-sheet__filter-button')\n )\n focusGrid()\n })\n})\n\n/**\n * A column's values as they show, each once, in sorted order, from the rows\n * the other columns keep; and whether most of them are numbers.\n */\nconst filterValues = computed(() => {\n const col = filterOpen.value\n const b = filterBounds.value\n if (col == null || !b) return { values: [] as string[], numeric: false }\n const others = rowsFilteredOut(col)\n let numbers = 0\n let filled = 0\n const seen = new Map<string, unknown>()\n const cells = sheet.value.cells\n for (let row = b.top + 1; row <= b.bottom; row++) {\n if (others.has(row) || sheet.value.rowSizes?.[row] === 0) continue\n const value = valueAt(row, col)\n const empty = isEmptyValue(value)\n if (!empty) filled++\n if (typeof value === 'number') numbers++\n const text = empty ? '' : cellText(cells[row]?.[col], { row, col })\n if (!seen.has(text)) seen.set(text, value)\n }\n const collator = textCollator(lang.value)\n // oxlint-disable-next-line unicorn/no-array-sort -- sorts a fresh array\n const values = [...seen.keys()].sort((x, y) => {\n if (!x || !y) return x ? -1 : y ? 1 : 0\n return compareForSort(seen.get(x), seen.get(y), collator)\n })\n return { values, numeric: filled > 0 && numbers * 2 > filled }\n})\n\nfunction filterHeading(col: number) {\n const b = filterBounds.value\n if (!b) return columnName(col)\n return cellText(sheet.value.cells[b.top]?.[col], { row: b.top, col }) || columnName(col)\n}\n\n/** Sets a column's filter rule and says how many rows show now. */\nfunction applyFilter(col: number, rule: SheetFilterRule | undefined) {\n filterOpen.value = null\n transact((tr) => tr.filterColumn(col, rule), { action: 'filter' })\n const b = filterBounds.value\n if (!b) return\n const total = b.bottom - b.top\n announce(\n format(messages.value.filter.applied, {\n column: filterHeading(col),\n shown: total - filteredRows.value.size,\n total,\n }),\n )\n focusGrid()\n}\n\n/**\n * Sorts rows: `range` by column `col`, the heading row kept in place when\n * `header`. Ranges with merged cells are not sorted.\n */\nfunction sortBy(range: SheetBounds, col: number, order: SheetSortOrder, header: boolean) {\n const m = messages.value.filter\n if (merges.value.touching({ ...range, top: range.top + (header ? 1 : 0) }).length) {\n announce(m.mergedSort)\n showNotice(m.mergedSort)\n return false\n }\n const inFilter = sheet.value.filter && filterBounds.value && sameBounds(filterBounds.value, range)\n transact(\n (tr) => {\n tr.sortRange(range, [{ col, order }], { header, valueAt, lang: lang.value })\n if (inFilter) tr.markSorted({ col, order })\n },\n { action: 'sort' },\n )\n const heading = header\n ? cellText(sheet.value.cells[range.top]?.[col], { row: range.top, col })\n : ''\n announce(format(m.sorted, { column: heading || columnName(col) }))\n return true\n}\n\nfunction sortFilterColumn(col: number, order: SheetSortOrder) {\n filterOpen.value = null\n const b = filterBounds.value\n if (b) sortBy(b, col, order, true)\n focusGrid()\n}\n\n/**\n * The block of filled cells around a cell, as far as filled cells reach in\n * every direction; where sorting and filtering go when one cell is selected.\n */\nfunction regionAround(point: SheetPoint): SheetBounds {\n const cells = sheet.value.cells\n const filled = (row: number, col: number) => !isBlank(cells[row]?.[col])\n const b = { top: point.row, left: point.col, bottom: point.row, right: point.col }\n const lastRow = rowCount.value - 1\n const lastCol = colCount.value - 1\n const rowHas = (row: number) => {\n for (let col = Math.max(0, b.left - 1); col <= Math.min(lastCol, b.right + 1); col++)\n if (filled(row, col)) return true\n return false\n }\n const colHas = (col: number) => {\n for (let row = Math.max(0, b.top - 1); row <= Math.min(lastRow, b.bottom + 1); row++)\n if (filled(row, col)) return true\n return false\n }\n let grew = true\n while (grew) {\n grew = false\n if (b.top > 0 && rowHas(b.top - 1)) {\n b.top--\n grew = true\n }\n if (b.bottom < lastRow && rowHas(b.bottom + 1)) {\n b.bottom++\n grew = true\n }\n if (b.left > 0 && colHas(b.left - 1)) {\n b.left--\n grew = true\n }\n if (b.right < lastCol && colHas(b.right + 1)) {\n b.right++\n grew = true\n }\n }\n return b\n}\n\n/** Whether a block's first row reads as headings: all text, over a row with something else. */\nfunction hasHeadings(b: SheetBounds) {\n if (b.bottom - b.top < 1) return false\n let other = false\n for (let col = b.left; col <= b.right; col++) {\n const head = valueAt(b.top, col)\n if (typeof head !== 'string' || head === '') return false\n const below = valueAt(b.top + 1, col)\n if (typeof below !== 'string') other = true\n }\n return other\n}\n\n/**\n * Sorts by the active cell's column: the selected rows when more than one\n * is selected, else the filter's rows, else the block of cells around it.\n */\nfunction sortSelection(order: SheetSortOrder) {\n const { col } = active.value\n const sel = lastBounds()\n if (sel.bottom > sel.top) return sortBy(sel, col, order, false)\n const f = filterBounds.value\n if (f && inBounds(f, active.value.row, col)) return sortBy(f, col, order, true)\n const region = regionAround(active.value)\n if (region.bottom === region.top) {\n announce(messages.value.filter.nothingToSort)\n showNotice(messages.value.filter.nothingToSort)\n return false\n }\n return sortBy(region, col, order, hasHeadings(region))\n}\n\n/** Puts a filter on the selection (or the block around the active cell), or takes it off. */\nfunction toggleFilter() {\n const m = messages.value.filter\n if (sheet.value.filter) {\n filterOpen.value = null\n transact((tr) => tr.setFilter(null), { action: 'filter' })\n announce(m.removed)\n return\n }\n const sel = lastBounds()\n const b = sel.bottom > sel.top ? sel : regionAround(active.value)\n transact((tr) => tr.setFilter(b), { action: 'filter' })\n announce(format(m.added, { range: rangeName(b) }))\n}\n\n/** Clears every column's filter rule, showing all the rows again. */\nfunction clearFilters() {\n const f = sheet.value.filter\n if (!f?.columns) return\n transact(\n (tr) => {\n for (const key of Object.keys(f.columns!)) tr.filterColumn(Number(key), undefined)\n },\n { action: 'filter' },\n )\n announce(messages.value.filter.removed)\n}\n\n/** Opens the filter panel of the active cell's column, from its heading. */\nfunction openFilterAtActive() {\n const b = filterBounds.value\n const { row, col } = active.value\n if (!b || row !== b.top || col < b.left || col > b.right) return false\n filterOpen.value = col\n return true\n}\n/** When a row's results last changed, for `v-memo`. */\nconst resultsOf = (row: number) => engine.rowVersion(sheetKey(sheet.value), row)\n/** The type of a cell of the sheet shown; a cell with a list rule and no type of its own picks from the list. */\nfunction typeAt(row: number, col: number): SheetResolvedType | undefined {\n const input = sheet.value.cells[row]?.[col]\n if (input != null && typeof input === 'object' && input.type)\n return resolveCellType(input, doc.value, cellTypes.value)\n return listTypeAt(row, col)\n}\nconst rowCount = computed(() => rowCountOf(sheet.value))\nconst colCount = computed(() => colCountOf(sheet.value))\n\n/** An axis that is built again only when its count, size or changed sizes do. */\nfunction useAxis(read: () => [count: number, base: number, sizes: Record<number, number>]) {\n let last: SheetAxis | undefined\n return computed(() => {\n const [count, base, sizes] = read()\n if (last && last.count === count && last.base === base && last.sizes === sizes) return last\n return (last = new SheetAxis(count, base, sizes))\n })\n}\n/** A row or column whose edge is being dragged, drawn at its new size until let go. */\nconst sizing = shallowRef<{ axis: SheetAxisName; index: number; size: number } | null>(null)\nfunction sizesOf(axis: SheetAxisName, sizes: Record<number, number>) {\n const s = sizing.value\n return s && s.axis === axis ? { ...sizes, [s.index]: s.size } : sizes\n}\nconst rows = useAxis(() => [rowCount.value, props.rowHeight, sizesOf('row', shownRowSizes.value)])\nconst cols = useAxis(() => [colCount.value, props.colWidth, sizesOf('col', shownColSizes.value)])\n\nconst styleCache = computed(() => {\n const cache = new Map<string, { cls: string; css: string; align: boolean }>()\n for (const [name, style] of Object.entries(doc.value.styles ?? {}))\n cache.set(name, compileStyle(style))\n return cache\n})\n\nfunction compileStyle(style: SheetStyle) {\n const cls: string[] = []\n let css = ''\n if (style.bold) cls.push('is-bold')\n if (style.italic) cls.push('is-italic')\n if (style.underline || style.strike)\n css += `text-decoration-line:${[style.underline && 'underline', style.strike && 'line-through'].filter(Boolean).join(' ')};`\n if (style.color) css += `color:${style.color};`\n else if (style.tone) cls.push(`is-tone-${style.tone}`)\n else if (style.background) {\n // the theme's text on a background that doesn't follow it may not read: a dark page's light text on white\n const ink = textOn(style.background)\n if (ink) css += `color:${ink};`\n }\n if (style.background) css += `background-color:${style.background};`\n else if (style.fill) cls.push(`is-fill-${style.fill}`)\n if (style.align) cls.push(`is-align-${style.align}`)\n if (style.valign) cls.push(`is-valign-${style.valign}`)\n if (style.wrap) cls.push('is-wrap')\n return { cls: cls.join(' '), css, align: style.align != null }\n}\n\n// Layout ---------------------------------------------------------------------------------\n\nconst { width: viewWidth, height: viewHeight } = useElementSize(viewport, {\n initial: { width: 960, height: 480 },\n})\nconst scroll = shallowRef({ top: 0, left: 0 })\n\nfunction onScroll() {\n const el = viewport.value\n if (!el) return\n if (el.scrollTop === scroll.value.top && el.scrollLeft === scroll.value.left) return\n scroll.value = { top: el.scrollTop, left: el.scrollLeft }\n // a note read in passing goes with the cell; one being written follows it\n if (noteShown.value) hideNote()\n}\n\n/** Wide enough for the longest row number. */\nconst headerWidth = computed(() =>\n props.headers ? Math.max(40, String(rowCount.value).length * 8 + 16) : 0,\n)\nconst headerHeight = computed(() => (props.headers ? props.rowHeight : 0))\n/** The outlines of the groups: a lane per depth, and one for the level buttons by the headers. */\nconst outlineSize = (depth: number) =>\n depth && props.outline ? (depth + (props.headers ? 1 : 0)) * OUTLINE_LANE : 0\nconst rowOutline = computed(() => outlineSize(groups.value.rows.depth))\nconst colOutline = computed(() => outlineSize(groups.value.cols.depth))\n\n/**\n * Whether the line before is hidden, marked between the headers; lines a\n * folded group hides have its button instead.\n */\nfunction afterHidden(axis: SheetAxisName, line: number) {\n const lines = axis === 'row' ? rows.value : cols.value\n return line > 0 && lines.hidden(line - 1) && !groups.value.axis(axis).hidden.has(line - 1)\n}\n\n/** Wheeling over an outline scrolls the grid. */\nfunction onOutlineWheel(event: WheelEvent) {\n const el = viewport.value\n if (!el) return\n event.preventDefault()\n el.scrollBy({ left: event.deltaX, top: event.deltaY })\n}\nconst frozen = computed(() => ({\n rows: Math.max(0, Math.min(rowCount.value, sheet.value.freeze?.rows ?? 0)),\n cols: Math.max(0, Math.min(colCount.value, sheet.value.freeze?.cols ?? 0)),\n}))\nconst frozenHeight = computed(() => rows.value.offset(frozen.value.rows))\nconst frozenWidth = computed(() => cols.value.offset(frozen.value.cols))\nconst totalWidth = computed(() => headerWidth.value + cols.value.total)\nconst bodyHeight = computed(() => rows.value.total - frozenHeight.value)\n\n/** Rows past the edge of the view still drawn, so a quick scroll doesn't show gaps. */\nconst OVERSCAN = 4\n\n/** The items of `axis` from `from` to `to` (inclusive) that aren't hidden. */\nfunction shown(axis: SheetAxis, from: number, to: number) {\n const list: number[] = []\n for (let i = from; i <= to; i++) if (!axis.hidden(i)) list.push(i)\n return list\n}\n\nconst frozenRowList = computed(() => shown(rows.value, 0, frozen.value.rows - 1))\nconst frozenColList = computed(() => shown(cols.value, 0, frozen.value.cols - 1))\n\n/** The same list as before when nothing in it changed, so what depends on it stays put. */\nconst keep = (list: number[], previous: number[] | undefined) =>\n previous && previous.length === list.length && previous.every((item, i) => item === list[i])\n ? previous\n : list\n\nconst bodyRows = computed<number[]>((previous) => {\n const axis = rows.value\n const start = frozen.value.rows\n if (start >= axis.count) return []\n const top = frozenHeight.value + scroll.value.top\n const bottom = scroll.value.top + viewHeight.value - headerHeight.value\n const from = Math.max(start, axis.indexAt(top) - OVERSCAN)\n const list = shown(axis, from, Math.min(axis.count - 1, axis.indexAt(bottom) + OVERSCAN))\n return keep(list, previous)\n})\n\nconst bodyCols = computed<number[]>((previous) => {\n const axis = cols.value\n const start = frozen.value.cols\n if (start >= axis.count) return []\n const left = frozenWidth.value + scroll.value.left\n const right = scroll.value.left + viewWidth.value - headerWidth.value\n const from = Math.max(start, axis.indexAt(left) - 2)\n return keep(shown(axis, from, Math.min(axis.count - 1, axis.indexAt(right) + 2)), previous)\n})\n\n// Selection ------------------------------------------------------------------------------\n\nconst selection = shallowRef<SheetSelection>(props.selection ?? selectCell({ row: 0, col: 0 }))\nwatch(\n () => props.selection,\n (value) => {\n if (value && !sameSelection(value, selection.value)) selection.value = value\n },\n)\n// a sheet that shrank keeps the selection on it\nwatch([rowCount, colCount], ([rowsNow, colsNow]) => {\n const next = clampSelection(selection.value, rowsNow, colsNow)\n if (!sameSelection(next, selection.value)) setSelection(next)\n})\n\nconst selectedBounds = computed(() => selection.value.ranges.map(boundsOf))\n\n/**\n * A selection grown to take in the merged cells it touches, with the\n * keyboard on a merged cell's top left cell. Each range keeps the corner\n * it started from.\n */\nfunction fitMerges(sel: SheetSelection): SheetSelection {\n const m = mergesOf(sheet.value)\n if (!m.size) return sel\n let changed = false\n const ranges = sel.ranges.map((range) => {\n const b = boundsOf(range)\n const grown = m.expand(b)\n if (\n grown === b ||\n (grown.top === b.top &&\n grown.left === b.left &&\n grown.bottom === b.bottom &&\n grown.right === b.right)\n )\n return range\n changed = true\n const down = range.end.row >= range.start.row\n const across = range.end.col >= range.start.col\n return {\n start: { row: down ? grown.top : grown.bottom, col: across ? grown.left : grown.right },\n end: { row: down ? grown.bottom : grown.top, col: across ? grown.right : grown.left },\n }\n })\n const active = m.anchor(sel.active)\n if (active !== sel.active) changed = true\n return changed ? { active, ranges } : sel\n}\nconst active = computed(() => selection.value.active)\n\nfunction setSelection(given: SheetSelection) {\n const next = fitMerges(given)\n if (sameSelection(next, selection.value)) return\n selection.value = next\n emit('update:selection', next)\n}\n\n/** Columns (or rows) any range covers, and the ones a range covers from end to end. */\nconst headerMarks = computed(() => {\n const colsMarked = new Set<number>()\n const rowsMarked = new Set<number>()\n const colsFull = new Set<number>()\n const rowsFull = new Set<number>()\n const visibleCols = [...frozenColList.value, ...bodyCols.value]\n const visibleRows = [...frozenRowList.value, ...bodyRows.value]\n for (const b of selectedBounds.value) {\n const wholeCols = b.top === 0 && b.bottom === rowCount.value - 1\n const wholeRows = b.left === 0 && b.right === colCount.value - 1\n for (const c of visibleCols)\n if (c >= b.left && c <= b.right) {\n colsMarked.add(c)\n if (wholeCols) colsFull.add(c)\n }\n for (const r of visibleRows)\n if (r >= b.top && r <= b.bottom) {\n rowsMarked.add(r)\n if (wholeRows) rowsFull.add(r)\n }\n }\n return { colsMarked, rowsMarked, colsFull, rowsFull }\n})\n\nconst focused = ref(false)\n\n// Cells ----------------------------------------------------------------------------------\n\ninterface CellView {\n col: number\n text: string\n cls: string\n css: string\n key?: string\n /** The cell the keyboard is on gets the grid's active id. */\n id?: string\n /** A cell type's own content, drawn instead of the text. */\n render?: SheetCellType['render']\n props?: Record<string, unknown>\n /** A cell type's own content in pictures of the sheet, as SVG markup. */\n draw?: (draw: SheetDrawContext) => string\n /** What screen readers read for a cell type's own content. */\n label?: string\n /** Why the value doesn't fit the cell's type; shown on hover and read out. */\n problem?: string\n /** Whether the value breaks its type or a rule, which a corner mark shows. */\n invalid?: boolean\n /** The cell's note, which the other corner's mark shows. */\n note?: string\n /** Whether the cell has a thread to show, which a mark under the note's shows. */\n comment?: boolean\n /** Comparing with an older version: what the cell held then, in words. */\n was?: string\n /** Left out for screen readers: a cell under a merge, or a merge's piece in another pane. */\n hidden?: boolean\n rowspan?: number\n colspan?: number\n}\n\n/**\n * The width of a digit in the grid's font, for fitting numbers into\n * narrow cells; measured once the grid is in the page.\n */\nconst digitWidth = ref(0)\n\nfunction measureDigits() {\n const el = root.value\n const context = el && document.createElement('canvas').getContext('2d')\n if (!el || !context) return\n const font = getComputedStyle(el)\n context.font = `${font.fontWeight} ${font.fontSize} ${font.fontFamily}`\n digitWidth.value = context.measureText('0123456789').width / 10\n}\n\nonMounted(() => {\n measureDigits()\n // a web font that comes in later is wider or narrower\n void document.fonts?.ready.then(measureDigits)\n})\n\nconst merges = computed(() => mergesOf(sheet.value))\n// a selection given from outside, or one a new merge now cuts through, grows over the merges\nwatch(\n [merges, selection],\n () => {\n const next = fitMerges(selection.value)\n if (next !== selection.value) setSelection(next)\n },\n { immediate: true },\n)\n\n/** Where the cells drawn are: a sheet's key, its looks, rules and merges, and whether the selection shows. */\ninterface CellsOn {\n key: string | number\n looks: SheetLooks\n checks: SheetChecks\n merges: SheetMerges\n marks: boolean\n}\nconst shownCells = computed<CellsOn>(() => ({\n key: sheetKey(sheet.value),\n looks: looks.value,\n checks: checks.value,\n merges: merges.value,\n marks: true,\n}))\n\n/**\n * A cell as drawn. `span` is the merge it shows, for the merged cell\n * itself; the cells a merge covers are drawn empty and see-through, and\n * the merged cell is drawn over them.\n */\nfunction cellView(\n row: number,\n col: number,\n line: SheetData['cells'][number],\n width: number,\n span?: SheetBounds,\n on: CellsOn = shownCells.value,\n): CellView {\n if (!span && on.merges.size && on.merges.at(row, col))\n return { col, text: '', cls: 'dou-sheet__cell is-covered', css: '', hidden: true }\n const input = line?.[col]\n let cls = 'dou-sheet__cell'\n let css = ''\n let text = ''\n let render: CellView['render']\n let renderProps: CellView['props']\n let drawBox: CellView['draw']\n let label: string | undefined\n let problem: string | undefined\n let invalid = false\n const look = on.looks.lookAt(row, col)\n if (look?.bar) {\n cls += ' has-bar'\n css += barCss(look.bar)\n }\n if (input != null && input !== '') {\n const cell = typeof input === 'object' ? input : null\n let value = cell ? (cell.value ?? null) : (input as SheetValue)\n let error = false\n let link = cell?.link\n if (typeof value === 'string' && value.startsWith('=')) {\n const result = engine.result(on.key, row, col)\n error = isSheetError(result)\n value = isSheetError(result) ? result.code : result\n link ??= engine.link(on.key, row, col)\n }\n if (link && !error && linkTarget(link)) cls += ' is-link'\n const typed = cell?.type\n ? resolveCellType(cell, doc.value, cellTypes.value)\n : listTypeAt(row, col, on.checks)\n text = error\n ? (value as string)\n : (typed?.definition.format?.(value, typed.setup) ??\n formatValue(value, cell?.format, lang.value))\n // a number without a format fits the cell, as far as its digits allow\n if (typeof value === 'number' && !cell?.format && !typed?.definition.format && digitWidth.value)\n text = fitNumber(value, Math.max(1, Math.floor((width - 16) / digitWidth.value)))\n const style = look\n ? lookStyle(cell?.style, look)\n : cell?.style\n ? styleCache.value.get(cell.style)\n : undefined\n if (style) {\n if (style.cls) cls += ` ${style.cls}`\n css += style.css\n }\n // an error shows in the middle, as `TRUE` and `FALSE` do\n const align = style?.align\n ? 'left'\n : error\n ? 'center'\n : (typed?.definition.align ?? alignOf(value))\n if (error) {\n cls += ' is-error'\n problem = messages.value.errors[value as SheetErrorCode]\n }\n if (align !== 'left') cls += ` is-align-${align}`\n if (typed) {\n const { definition, setup } = typed\n cls += ` is-type-${definition.name}`\n const fits =\n !definition.valid || value == null || value === ''\n ? true\n : definition.valid(value, setup, messages.value)\n if (fits !== true) {\n cls += ' is-invalid'\n invalid = true\n problem = typeof fits === 'string' && fits ? fits : messages.value.invalid\n }\n if (definition.render) {\n render = definition.render\n renderProps = { value, text, setup, readonly: viewOnly.value }\n label = cellText(input, { sheet: on.key, row, col })\n }\n // pictures only, where the grid draws the component; errors and empty cells show as text\n if (definition.draw && !on.marks && !error && value != null && value !== '') {\n const draw = definition.draw\n const drawn = value\n drawBox = (context) => draw(drawn, setup, context)\n }\n }\n if (!problem) {\n const c = on.checks\n const rule = c.empty ? undefined : c.ruleAt(row, col)\n if (rule && !c.fits(row, col, value, text)) {\n cls += ' is-invalid'\n invalid = true\n problem = ruleMessage(rule, messages.value)\n }\n }\n } else if (look?.style) {\n // an empty cell takes on a look too, such as a fill for blanks\n const style = lookStyle(undefined, look)\n if (style.cls) cls += ` ${style.cls}`\n css += style.css\n }\n const bottom = span ? span.bottom : row\n const right = span ? span.right : col\n // the selection, on the grid only\n if (on.marks) {\n for (const b of selectedBounds.value) {\n if (!inBounds(b, row, col)) continue\n if (!cls.includes(' is-selected')) cls += ' is-selected'\n if (row === b.top) cls += ' is-edge-top'\n if (bottom === b.bottom) cls += ' is-edge-bottom'\n if (col === b.left) cls += ' is-edge-left'\n if (right === b.right) cls += ' is-edge-right'\n }\n if (row === active.value.row && col === active.value.col) cls += ' is-active'\n }\n const view: CellView = { col, text, cls, css }\n if (render) {\n view.render = render\n view.props = renderProps\n view.label = label\n }\n if (drawBox) view.draw = drawBox\n if (problem) view.problem = problem\n if (invalid) view.invalid = true\n if (input && typeof input === 'object') {\n if (input.note) view.note = input.note\n if (input.comment && comments.isOpen(comments.byId.value.get(input.comment)))\n view.comment = true\n }\n // comparing with an older version: what the cell held then\n const changed = compared.value?.get(`${row}:${col}`)\n if (changed) {\n view.cls += ' is-changed'\n view.was = wasText(changed)\n }\n return view\n}\n\nfunction rowCells(row: number, list: number[]): CellView[] {\n const line = sheet.value.cells[row]\n const axis = cols.value\n const x0 = headerWidth.value\n const edgeCol = frozen.value.cols - 1\n const views = list.map((col) => {\n const width = axis.size(col)\n const view = cellView(row, col, line, width)\n view.css = `width:${width}px;left:${x0 + axis.offset(col)}px;${view.css}`\n if (col === edgeCol) view.cls += ' is-freeze-edge'\n if (row === active.value.row && col === active.value.col && !view.cls.includes('is-covered'))\n view.id = activeId.value\n return view\n })\n if (merges.value.size) addMergedCells(row, list, views)\n return views\n}\n\n/**\n * The first of `list` (sorted) from `from` to `to`, or `-1`: where a\n * merged cell is drawn when its own top left cell is out of view.\n */\nfunction firstIn(list: readonly number[], from: number, to: number) {\n for (const i of list) {\n if (i > to) return -1\n if (i >= from) return i\n }\n return -1\n}\n\n/**\n * Adds the merged cells drawn from this row and these columns. A merge is\n * drawn once in each pane it reaches, from its first row and column drawn\n * there, so it shows even when its top left cell has scrolled away. In a\n * frozen pane it stops at the pane's edge; the text goes in the pane with\n * the merge's top left cell.\n */\nfunction addMergedCells(row: number, list: number[], views: CellView[]) {\n const f = frozen.value\n const frozenCols = list === frozenColList.value\n const rowList = row < f.rows ? frozenRowList.value : bodyRows.value\n const r = rows.value\n const c = cols.value\n const x0 = headerWidth.value\n for (const m of merges.value.inRow(row)) {\n const paneTop = row < f.rows ? m.top : Math.max(m.top, f.rows)\n if (firstIn(rowList, paneTop, m.bottom) !== row) continue\n const paneLeft = frozenCols ? m.left : Math.max(m.left, f.cols)\n const paneRight = frozenCols ? Math.min(m.right, f.cols - 1) : m.right\n if (paneLeft > paneRight || firstIn(list, paneLeft, paneRight) === -1) continue\n const right = frozenCols ? paneRight : m.right\n const bottom = row < f.rows ? Math.min(m.bottom, f.rows - 1) : m.bottom\n const width = c.offset(right + 1) - c.offset(m.left)\n const height = r.offset(bottom + 1) - r.offset(m.top)\n const anchor = sheet.value.cells[m.top]\n const view = cellView(m.top, m.left, anchor, width, m)\n // the text shows once, in the pane holding the top left cell\n const home = !((!frozenCols && m.left < f.cols) || (row >= f.rows && m.top < f.rows))\n if (home) {\n view.rowspan = m.bottom - m.top + 1\n view.colspan = m.right - m.left + 1\n } else {\n view.text = ''\n view.render = undefined\n view.hidden = true\n }\n // the note's mark is in the top right corner of the whole merge\n if (right !== m.right || paneTop !== m.top) {\n view.note = undefined\n view.comment = undefined\n }\n view.cls += ' is-merged'\n view.key = `m${m.left}`\n if (home && active.value.row === m.top && active.value.col === m.left) view.id = activeId.value\n if (right >= f.cols - 1 && m.left < f.cols && frozenCols) view.cls += ' is-freeze-edge'\n const top = r.offset(m.top) - r.offset(row)\n const left = x0 + c.offset(m.left)\n view.css = frozenCols\n ? `width:${width}px;height:${height}px;left:${left}px;margin-top:${top}px;margin-right:${-width}px;${view.css}`\n : `width:${width}px;height:${height}px;left:${left}px;top:${top}px;${view.css}`\n // in the frozen columns it sits in the flow, just before the cells it covers\n const at = frozenCols ? views.findIndex((v) => v.col === m.left) : views.length\n views.splice(at === -1 ? views.length : at, 0, view)\n }\n}\n\n/** What a row's merged cells depend on beyond the row itself, for `v-memo`. */\nfunction mergeKey(row: number) {\n if (!merges.value.size) return ''\n let key = ''\n for (const m of merges.value.inRow(row))\n key += `${m.top},${m.left}:${rowId(sheet.value.cells[m.top])}:${resultsOf(m.top)}:${rowMarks(m.top)}|${rowMarks(m.bottom)};`\n return key ? `${key}${bodyRows.value[0]}` : ''\n}\n\nconst rowIds = new WeakMap<object, number>()\nlet lastRowId = 0\nfunction rowId(line: SheetData['cells'][number]) {\n if (!line) return 0\n let id = rowIds.get(line)\n if (id == null) rowIds.set(line, (id = ++lastRowId))\n return id\n}\n\n/*\n * A row is drawn again only when its cells, its part of the selection or\n * the layout change, so scrolling down draws just the rows coming in.\n */\nconst memoBase = computed(() => [\n merges.value,\n rows.value,\n cols.value,\n bodyCols.value,\n frozenColList.value,\n headerWidth.value,\n frozenHeight.value,\n styleCache.value,\n lang.value,\n digitWidth.value,\n engineId.value,\n doc.value.types,\n cellTypes.value,\n viewOnly.value,\n // which threads show a mark\n comments.byId.value,\n compared.value,\n])\n\n/** The selection as it touches one row. */\nfunction rowMarks(row: number) {\n let key = ''\n for (const b of selectedBounds.value)\n if (row >= b.top && row <= b.bottom)\n key += `${b.left},${b.right},${+(row === b.top)}${+(row === b.bottom)};`\n if (row === active.value.row) key += `@${active.value.col}`\n return key\n}\n\nconst cellId = (row: number, col: number) => `${uid}-${row}-${col}`\nconst activeId = computed(() => cellId(active.value.row, active.value.col))\n\n/** What the cell the keyboard is on reads as. */\nconst activeLabel = computed(() => {\n const { row, col } = active.value\n // a result can change with any cell of the workbook\n void doc.value\n void engineId.value\n const text = cellText(sheet.value.cells[row]?.[col], { row, col })\n return format(messages.value.cell, {\n cell: formatCell(active.value),\n value: text || messages.value.empty,\n })\n})\n\n// Scrolling into view --------------------------------------------------------------------\n\nfunction scrollToPoint(point: SheetPoint) {\n const el = viewport.value\n if (!el) return\n const { row, col } = point\n if (row >= frozen.value.rows) {\n const top = rows.value.offset(row) - frozenHeight.value\n const bottom = rows.value.offset(row + 1) - frozenHeight.value\n const view = el.clientHeight - headerHeight.value - frozenHeight.value\n if (top < el.scrollTop) el.scrollTop = top\n else if (bottom > el.scrollTop + view) el.scrollTop = Math.min(top, bottom - view)\n }\n if (col >= frozen.value.cols) {\n const left = cols.value.offset(col) - frozenWidth.value\n const right = cols.value.offset(col + 1) - frozenWidth.value\n const view = el.clientWidth - headerWidth.value - frozenWidth.value\n if (left < el.scrollLeft) el.scrollLeft = left\n else if (right > el.scrollLeft + view) el.scrollLeft = Math.min(left, right - view)\n }\n onScroll()\n}\n\n/** Where a cell is in the view, in px from its top left corner. */\nfunction cellRect(point: SheetPoint) {\n // a merged cell is as big as its merge\n const span = merges.value.cell(point)\n const { top: row, left: col } = span\n let x = headerWidth.value + cols.value.offset(col)\n let y = headerHeight.value + rows.value.offset(row)\n if (col >= frozen.value.cols) x -= scroll.value.left\n if (row >= frozen.value.rows) y -= scroll.value.top\n return {\n x,\n y,\n width: cols.value.offset(span.right + 1) - cols.value.offset(col),\n height: rows.value.offset(span.bottom + 1) - rows.value.offset(row),\n }\n}\n\n// Changes --------------------------------------------------------------------------------\n\nconst sheetSize = () => ({ rows: rowCount.value, cols: colCount.value })\n\nconst view = (): SheetHistoryView => ({ sheet: sheetKey(sheet.value), selection: selection.value })\n\n/** An extension's history, used instead of the grid's own. */\nlet customFor: unknown\nlet custom: SheetHistoryHandler | null = null\nfunction customHistory() {\n const make = resolved.value.history\n if (make !== customFor) {\n customFor = make\n custom = make ? make(context) : null\n }\n return custom\n}\n\nfunction syncHistory() {\n const handler = customHistory()\n canUndo.value = handler ? handler.canUndo() : history.canUndo\n canRedo.value = handler ? handler.canRedo() : history.canRedo\n}\n\n/**\n * Keeps the cell being edited on its cell when a change, such as another\n * person's, inserts, deletes or moves lines around it; stops the edit\n * when its cell is gone.\n */\nfunction followEdit(tr: SheetTransaction) {\n const e = editing.value\n const was = e && tr.before.sheets[e.sheet]\n if (!e || !was) return\n const key = sheetKey(was)\n let { row, col } = e\n for (const step of tr.steps) {\n if (step.type === 'removeSheet' && step.sheet === key) return cancelEdit()\n if (\n (step.type !== 'insertLines' && step.type !== 'removeLines' && step.type !== 'moveLines') ||\n step.sheet !== key\n )\n continue\n const n = step.axis === 'row' ? row : col\n let next = n\n if (step.type === 'insertLines') next = n >= step.index ? n + step.count : n\n else if (step.type === 'removeLines') {\n if (n >= step.index && n < step.index + step.count) return cancelEdit()\n next = n >= step.index + step.count ? n - step.count : n\n } else next = movedIndex(step.from, step.count, step.to)(n)\n if (step.axis === 'row') row = next\n else col = next\n }\n // a sheet without an id is known by its name, which a rename changes\n const at = tr.doc.sheets.findIndex((s) => sheetKey(s) === key)\n const index = at === -1 ? e.sheet : at\n if (row !== e.row || col !== e.col || index !== e.sheet)\n editing.value = { ...e, sheet: index, row, col }\n}\n\nfunction apply(tr: SheetTransaction) {\n followEdit(tr)\n const was = tr.before.sheets[sheetIndex.value]\n engine.update(tr)\n doc.value = tr.doc\n sent = tr.doc\n emit('update:modelValue', tr.doc)\n emit('transaction', tr)\n if (was && tr.doc.sheets[sheetIndex.value] !== was) followSheet(tr, sheetKey(was))\n updated(tr.before, tr.doc, tr)\n}\n\n/** Tells the extensions' `update` of a change, the workbook already updated. */\nfunction updated(before: SheetWorkbook, after: SheetWorkbook, tr: SheetTransaction | null) {\n const hooks = resolved.value.updates\n if (!hooks.length) return\n const update: SheetUpdate = { before, doc: after, transaction: tr }\n for (const hook of hooks) hook(update, context)\n}\n\n/**\n * Keeps the sheet shown after sheets were added, removed or moved: the same\n * sheet where it went, or the one now in its place when it was removed.\n */\nfunction followSheet(tr: SheetTransaction, key: string) {\n const sheets = tr.doc.sheets\n const at = sheets.findIndex((s) => sheetKey(s) === key)\n if (at !== -1) return setSheet(at)\n const removed = tr.steps.some((step) => step.type === 'removeSheet' && step.sheet === key)\n if (removed) setSheet(Math.min(sheetIndex.value, sheets.length - 1))\n // renamed: still the sheet shown, under another key\n else renamed = true\n}\nlet renamed = false\n\n/**\n * Cancels a change to what is protected, after the extensions had their\n * say. Changes kept out of the history, such as other people's, go ahead.\n */\nfunction holdProtection(tr: SheetTransaction) {\n if (tr.meta.protection === false || tr.meta.history === false) return\n const check = checkProtection(tr)\n if (!check) return\n tr.cancel(messages.value.protect.refused[check.reason])\n if (check.row != null && check.col != null && check.sheet === sheetKey(sheet.value))\n scrollToPoint({ row: check.row, col: check.col })\n}\n\nfunction transact(\n run: (tr: SheetTransaction) => void,\n meta?: SheetTransactionMeta,\n before: SheetHistoryView = view(),\n /** Leave the copied range marked, as pasting a copy does. */\n keepMark = false,\n /** Made by the app's code, not by someone using the grid: `readonly` doesn't stop it. */\n fromCode = false,\n) {\n // a change kept out of the history, such as another person's, still reaches a read-only grid;\n // comparing, nothing but restoring changes it, not even code\n if (meta?.history !== false && ((props.readonly && !fromCode) || (props.compare && !restoring)))\n return null\n const tr = new SheetTransaction(doc.value, sheetIndex.value)\n tr.setMeta({ action: 'api', ...meta })\n run(tr)\n if (!tr.changed) return null\n for (const hook of [...resolved.value.transactions, holdProtection]) {\n hook(tr, context)\n if (tr.cancelled) {\n emit('transactionCancel', tr)\n showNotice(tr.cancelReason ?? messages.value.changeCancelled)\n // what the caller says next, such as \"pasted\", would be wrong\n refusing = true\n void nextTick(() => (refusing = false))\n return null\n }\n }\n if (!keepMark) clipMark.value = null\n apply(tr)\n if (!customHistory()) history.record(tr, before, view())\n syncHistory()\n return tr\n}\n\n/**\n * `transact` for code: gives the transaction whatever came of it, so code\n * reads `tr.changed` and `tr.cancelled` as with the other editors.\n * `fromCode`: called by the app's code, which `readonly` doesn't stop.\n */\nfunction transactFor(\n run: (tr: SheetTransaction) => void,\n meta?: SheetTransactionMeta,\n fromCode = false,\n) {\n let made: SheetTransaction | undefined\n transact(\n (tr) => {\n made = tr\n run(tr)\n },\n meta,\n view(),\n false,\n fromCode,\n )\n if (made) return made\n // refused by a read-only grid before it ran: cancelled, so the caller can tell\n return new SheetTransaction(doc.value, sheetIndex.value)\n .setMeta({ action: 'api', ...meta })\n .cancel(messages.value.readonly)\n}\n\n/** `fromCode`: called by the app's code, which `readonly` doesn't stop; comparing does. */\nfunction travel(direction: 'undo' | 'redo', fromCode = false) {\n if ((props.readonly && !fromCode) || props.compare) return false\n const handler = customHistory()\n if (handler) {\n const travelled = handler[direction]()\n syncHistory()\n if (travelled) announce(messages.value[direction === 'undo' ? 'undone' : 'redone'])\n return travelled\n }\n const anchors = sheetCommentAnchors(doc.value)\n const result = direction === 'undo' ? history.undo(doc.value) : history.redo(doc.value)\n syncHistory()\n if (!result) return false\n // threads stay on their cells: putting them on isn't a change to undo\n keepCommentAnchors(anchors, result.tr)\n result.tr.setMeta({ action: direction })\n apply(result.tr)\n const at = doc.value.sheets.findIndex((s) => sheetKey(s) === result.view.sheet)\n if (at !== -1) setSheet(at)\n setSelection(result.view.selection)\n scrollToPoint(result.view.selection.active)\n announce(messages.value[direction === 'undo' ? 'undone' : 'redone'])\n return true\n}\n\nfunction setSheet(index: number) {\n if (index === sheetState.value) return\n sheetState.value = index\n emit('update:activeSheet', index)\n}\n\n/** The index of a sheet, by index, `id` or name; `-1` when there is none. */\nfunction indexOfSheet(target: SheetRef) {\n const sheets = doc.value.sheets\n if (typeof target === 'number') return target >= 0 && target < sheets.length ? target : -1\n return sheets.findIndex((s) => s.id === target || (s.id == null && s.name === target))\n}\n\n/** Shows a sheet, by index, `id` or name. */\nfunction showSheet(target: SheetRef) {\n const at = indexOfSheet(target)\n if (at === -1) return false\n if (editing.value) commitEdit(undefined, true)\n setSheet(at)\n return true\n}\n\n/*\n * Each sheet keeps where it was left, its selection and scroll, and gets\n * them back when it shows again; a sheet not seen yet starts at A1.\n */\nconst sheetViews = new Map<string, { selection: SheetSelection; top: number; left: number }>()\nwatch(\n () => sheetKey(sheet.value),\n (key, old) => {\n if (renamed) {\n renamed = false\n return\n }\n sheetViews.set(old, { selection: selection.value, ...scroll.value })\n if (editing.value) cancelEdit()\n const back = sheetViews.get(key)\n setSelection(back?.selection ?? selectCell({ row: 0, col: 0 }))\n const top = back?.top ?? 0\n const leftBy = back?.left ?? 0\n scroll.value = { top, left: leftBy }\n void nextTick(() => {\n const el = viewport.value\n if (!el) return\n el.scrollTop = top\n el.scrollLeft = leftBy\n })\n },\n)\n\n// Editing --------------------------------------------------------------------------------\n\n/**\n * The cell being edited. `enter` started by typing: the arrow keys finish it\n * and move on. `edit` started with F2 or a double click: they move the caret.\n */\nconst editing = shallowRef<{\n sheet: number\n row: number\n col: number\n mode: 'enter' | 'edit'\n} | null>(null)\nconst editorSize = shallowRef({ width: 0, height: 0 })\nlet measure: CanvasRenderingContext2D | null | undefined\n/** What is typed in the editor, and whether anything was typed since it opened. */\nconst editText = ref('')\nconst editTyped = ref(false)\n/** The value of the cell being edited, as it was. */\nconst editValue = shallowRef<SheetValue>(null)\n/** Whether editing began with a finger: a type's panel then shows without the keyboard over it. */\nconst editByTouch = ref(false)\n/** Where the caret is in the text being edited. */\nconst editCaret = ref(0)\n/** Other inputs that edit the cell too, such as the formula bar's. */\nconst editInputs = new Map<HTMLTextAreaElement | HTMLInputElement, SheetEditInputOptions>()\n/** Whether an input shows the text and caret itself, from `editor.text` and `editor.caret`. */\nconst managed = (el: HTMLTextAreaElement | HTMLInputElement | undefined) =>\n !!el && !!editInputs.get(el)?.managed\n/** The input the edit is typed in: one of `editInputs` while it has focus, else the cell's editor. */\nfunction editInput(): HTMLTextAreaElement | HTMLInputElement | undefined {\n const el = document.activeElement\n if (el && editInputs.has(el as HTMLTextAreaElement)) return el as HTMLTextAreaElement\n return editor.value\n}\n/** Whether a formula is being edited, so references are marked and can be pointed at. */\nconst formulaEdit = computed(() => !!editing.value && editText.value.startsWith('='))\n/** The references of the formula being edited, each with its color. */\nconst refMarks = computed(() => (formulaEdit.value ? formulaReferences(editText.value) : []))\n/**\n * The reference the arrow keys or the pointer wrote last: moving on\n * replaces it, so pointing at another cell changes it instead of adding one.\n */\nconst pointing = shallowRef<{\n start: number\n end: number\n anchor: SheetPoint\n point: SheetPoint\n} | null>(null)\nconst panel = shallowRef<InstanceType<typeof CellPanel> | null>(null)\n/** The type of the cell being edited, when it has a panel to show under it. */\nconst panelType = computed(() => {\n const e = editing.value\n if (!e || e.sheet !== sheetIndex.value) return undefined\n const typed = typeAt(e.row, e.col)\n return typed?.definition.panel ? typed : undefined\n})\n\n/** The protection of the sheet shown, `null` when it has none. */\nconst protection = computed(() => protectionOf(sheet.value))\n/**\n * Whether paste and fill write only what cells hold, keeping their look: on a\n * protected sheet whose locked cells' format is kept, so an unlocked cell\n * doesn't take a locked one's style.\n */\nconst keepsLook = computed(() => !!protection.value && !protection.value.formatCells)\n\n/** Whether a cell can't be changed: its sheet is protected and the cell is locked. */\nfunction lockedAt(point: SheetPoint) {\n if (!protection.value) return false\n return isLocked(cellOf(sheet.value.cells[point.row]?.[point.col]), doc.value)\n}\n\nfunction beginEdit(mode: 'enter' | 'edit', text?: string) {\n if (viewOnly.value) {\n announce(messages.value.readonly)\n return false\n }\n if (lockedAt(active.value)) {\n showNotice(messages.value.protect.refused.cell)\n return false\n }\n const el = editor.value\n if (!el) return false\n const point = active.value\n scrollToPoint(point)\n editing.value = { sheet: sheetIndex.value, ...point, mode }\n editValue.value = valueOf(sheet.value.cells[point.row]?.[point.col])\n editTyped.value = false\n editByTouch.value = lastPointer === 'touch'\n if (text != null) el.value = text\n editText.value = el.value\n // typing in the formula bar keeps the focus there\n const owner = editInput()\n if (owner === el && document.activeElement !== el) el.focus({ preventScroll: true })\n if (text != null) el.setSelectionRange(el.value.length, el.value.length)\n editCaret.value = managed(owner)\n ? editText.value.length\n : (owner?.selectionStart ?? el.selectionStart)\n pointing.value = null\n fitEditor()\n return true\n}\n\n/** Changes the text being edited and puts the caret at `caret`, in every input that edits. */\nfunction setEditText(text: string, caret = text.length) {\n const el = editor.value\n if (el && el.value !== text) el.value = text\n editText.value = text\n editTyped.value = true\n editCaret.value = caret\n const input = editInput()\n if (input && !managed(input)) {\n if (input.value !== text) input.value = text\n if (input.selectionStart !== caret || input.selectionEnd !== caret)\n input.setSelectionRange(caret, caret)\n }\n fitEditor()\n void nextTick(syncMirror)\n}\n\n/** Keeps the caret's position, after keys or a click moved it. */\nfunction syncCaret() {\n const input = editInput()\n if (editing.value && input && !managed(input))\n editCaret.value = input.selectionStart ?? editText.value.length\n syncMirror()\n}\n\n/**\n * Writes a reference to the cells from `anchor` to `point` at the caret, or\n * in place of the one pointed at before. Only where a reference can go.\n */\nfunction pointTo(anchor: SheetPoint, point: SheetPoint) {\n const text = editText.value\n const p = pointing.value\n if (!p && !canPointAt(text, editCaret.value)) return false\n const name = formatRange({ start: anchor, end: point })\n const start = p ? p.start : editCaret.value\n const end = p ? p.end : editCaret.value\n pointing.value = { start, end: start + name.length, anchor, point }\n setEditText(text.slice(0, start) + name + text.slice(end), start + name.length)\n scrollToPoint(point)\n return true\n}\n\n/** Whether a press on a cell would point at it, instead of finishing the edit. */\nconst pointable = () =>\n formulaEdit.value && (!!pointing.value || canPointAt(editText.value, editCaret.value))\n\nfunction cancelEdit() {\n editing.value = null\n editText.value = ''\n editTyped.value = false\n editCaret.value = 0\n pointing.value = null\n assistShut.value = null\n if (editor.value) editor.value.value = ''\n}\n\n/**\n * Writes what was typed into the cell, then moves on when told which way.\n * A value a strict rule refuses isn't written: the edit stays open, or,\n * when `leaving` it (a press elsewhere, the focus going), is dropped.\n */\nfunction commitEdit(move?: SheetDirection, leaving = false) {\n const e = editing.value\n if (!e) return\n const text = editor.value?.value ?? ''\n const typed = e.sheet === sheetIndex.value ? typeAt(e.row, e.col) : undefined\n const parsed = typed?.definition.parse?.(text, typed.setup) ?? parseInput(text)\n const refused = e.sheet === sheetIndex.value && refusal(e.row, e.col, parsed)\n if (refused) {\n showNotice(format(messages.value.validation.refused, { message: refused }))\n if (leaving) cancelEdit()\n return\n }\n cancelEdit()\n const before = { sheet: sheetKey(doc.value.sheets[e.sheet]!), selection: selection.value }\n if (move) moveActive(move)\n const changed = transact(\n (tr) => {\n const at = { sheet: e.sheet, row: e.row, col: e.col }\n const old = cellOf(tr.getCell(at))\n const value = parsed.value\n tr.updateCell(at, {\n value: value ?? undefined,\n format: old?.format ?? parsed.format,\n link: typedLink(old, value),\n })\n },\n { action: 'input' },\n before,\n )\n if (changed) announceChange(e)\n}\n\n/** Why a strict rule refuses a typed value for a cell, or `''` when it doesn't. */\nfunction refusal(\n row: number,\n col: number,\n parsed: { value?: SheetValue; format?: string },\n data = sheet.value,\n c = checks.value,\n) {\n const rule = c.empty ? undefined : c.ruleAt(row, col)\n const value = parsed.value ?? null\n // a formula's result is checked once it is worked out, and marked\n if (!rule || rule.strict === false || (typeof value === 'string' && value.startsWith('=')))\n return ''\n const old = cellOf(data.cells[row]?.[col])\n const text = formatValue(value, old?.format ?? parsed.format, lang.value)\n return c.fits(row, col, value, text) ? '' : ruleMessage(rule, messages.value)\n}\n\n/** Says what a cell now holds. */\nfunction announceChange(at: { sheet: number; row: number; col: number }) {\n const cell = doc.value.sheets[at.sheet]?.cells[at.row]?.[at.col]\n const value = cellText(cell, at) || messages.value.empty\n announce(format(messages.value.changed, { cell: formatCell(at), value }))\n}\n\n/** A cell's value as it reads: its text, or whether it is checked. */\nfunction cellText(\n input: SheetCellInput,\n at?: { sheet?: number | string; row: number; col: number },\n) {\n const value = at\n ? shownValue(\n valueOf(input),\n (row, col) => engine.result(at.sheet ?? sheetKey(sheet.value), row, col),\n at.row,\n at.col,\n )\n : valueOf(input)\n const cell = cellOf(input)\n const typed = cell?.type ? resolveCellType(cell, doc.value, cellTypes.value) : undefined\n if (typed?.definition.toggle)\n return value === true ? messages.value.checked : messages.value.unchecked\n return (\n typed?.definition.format?.(value, typed.setup) ?? formatValue(value, cell?.format, lang.value)\n )\n}\n\n/** Writes a value picked in a cell type's panel and finishes editing. */\nfunction pickValue(value: SheetValue) {\n const e = editing.value\n if (!e) return\n cancelEdit()\n const changed = transact(\n (tr) => tr.updateCell({ sheet: e.sheet, row: e.row, col: e.col }, { value }),\n { action: 'input' },\n )\n if (changed) announceChange(e)\n focusGrid()\n}\n\n/**\n * Switches the cells of a type with a `toggle`: one cell, or every selected\n * one of the active cell's type. Those all become the same: what their\n * shared value switches to, or, when they differ, what an empty cell does.\n */\nfunction toggleCells(only?: SheetPoint) {\n const at = only ?? active.value\n const typed = typeAt(at.row, at.col)\n const toggle = typed?.definition.toggle\n if (!typed || !toggle) return false\n if (viewOnly.value) {\n announce(messages.value.readonly)\n return true\n }\n const points: SheetPoint[] = []\n if (only) points.push(only)\n else {\n const cells = sheet.value.cells\n const seen = new Set<string>()\n for (const b of selectedBounds.value)\n for (let row = b.top; row <= Math.min(b.bottom, cells.length - 1); row++) {\n const line = cells[row]\n if (!line) continue\n for (let col = b.left; col <= Math.min(b.right, line.length - 1); col++) {\n const key = `${row}:${col}`\n if (seen.has(key) || typeAt(row, col)?.definition !== typed.definition) continue\n seen.add(key)\n points.push({ row, col })\n }\n }\n }\n const values = points.map((p) => valueOf(sheet.value.cells[p.row]?.[p.col]))\n const same = values.every((value) => value === values[0])\n const next = toggle(same ? (values[0] ?? null) : null, typed.setup)\n const changed = transact(\n (tr) => {\n for (const point of points) tr.updateCell(point, { value: next })\n },\n { action: 'input' },\n )\n if (changed) announceChange({ sheet: sheetIndex.value, ...at })\n return true\n}\n\n/** The text a cell's editor starts with: what its type gives, or the value as typed. */\nfunction editTextAt(row: number, col: number) {\n const value = valueOf(sheet.value.cells[row]?.[col])\n const typed = typeAt(row, col)\n if (!typed) return inputText(value)\n const { definition, setup } = typed\n const text = definition.edit\n ? definition.edit(value, setup)\n : value == null\n ? undefined\n : definition.format?.(value, setup)\n return text ?? inputText(value)\n}\n\n/** Edits the active cell when its type has a panel, which then shows. */\nfunction openPanel() {\n const { row, col } = active.value\n if (!typeAt(row, col)?.definition.panel) return false\n beginEdit('edit', editTextAt(row, col))\n return true\n}\n\n/**\n * Where the active cell's panel button goes: on its right edge, while it\n * isn't edited or dragged from. A finger that only touches down keeps it:\n * iPhones drop the tap's click when something shows up during the tap.\n */\nconst panelButton = computed(() => {\n if (viewOnly.value || editing.value || drag.value?.started) return null\n const { row, col } = active.value\n if (!typeAt(row, col)?.definition.panel) return null\n const rect = visibleRect(active.value)\n return rect && { x: rect.x + rect.width, y: rect.y + rect.height / 2 }\n})\n\n/** Edits the active cell, or switches it when its type toggles. */\nfunction editActive() {\n if (toggleCells()) return\n const { row, col } = active.value\n beginEdit('edit', editTextAt(row, col))\n}\n\n/** Grows the editor to fit its text, up to the edge of the view. */\nfunction fitEditor() {\n const el = editor.value\n const e = editing.value\n if (!el || !e) return\n const rect = cellRect(e)\n const maxWidth = Math.max(rect.width, viewWidth.value - rect.x)\n const maxHeight = Math.max(rect.height, viewHeight.value - rect.y)\n const line = sheet.value.cells[e.row]?.[e.col]\n const style = cellOf(line)?.style\n if (style && doc.value.styles?.[style]?.wrap) {\n el.style.height = '0px'\n const height = Math.min(maxHeight, Math.max(rect.height, el.scrollHeight))\n el.style.height = ''\n editorSize.value = { width: rect.width, height }\n return\n }\n measure ??= document.createElement('canvas').getContext('2d')\n const lines = el.value.split('\\n')\n let widest = 0\n if (measure) {\n const font = getComputedStyle(el)\n measure.font = `${font.fontStyle} ${font.fontWeight} ${font.fontSize} ${font.fontFamily}`\n for (const text of lines) widest = Math.max(widest, measure.measureText(text).width)\n }\n const lineHeight = Number.parseFloat(getComputedStyle(el).lineHeight) || 20\n editorSize.value = {\n width: Math.min(maxWidth, Math.max(rect.width, Math.ceil(widest) + 20)),\n height: Math.min(maxHeight, Math.max(rect.height, lines.length * lineHeight + 8)),\n }\n}\n\nconst inputStyle = computed(() => {\n const point = editing.value ?? active.value\n const rect = cellRect(point)\n if (!editing.value) {\n // kept inside the view, so typing never scrolls anything\n const x = Math.max(0, Math.min(rect.x, viewWidth.value - rect.width))\n const y = Math.max(0, Math.min(rect.y, viewHeight.value - rect.height))\n return `left:${x}px;top:${y}px;width:${rect.width}px;height:${rect.height}px`\n }\n const { width, height } = editorSize.value\n // over the active cell's ring, which covers the grid lines around it\n return `left:${rect.x - 1}px;top:${rect.y - 1}px;width:${Math.max(width, rect.width) + 1}px;height:${Math.max(height, rect.height) + 1}px`\n})\n\nconst editorClass = computed(() => {\n const e = editing.value\n if (!e) return ''\n const line = sheet.value.cells[e.row]?.[e.col]\n const name = cellOf(line)?.style\n return name ? (styleCache.value.get(name)?.cls ?? '') : ''\n})\n\nfunction onInput() {\n if (!editing.value) {\n // typing on a selected cell starts editing it with what was typed\n if (!beginEdit('enter')) {\n if (editor.value) editor.value.value = ''\n return\n }\n }\n editText.value = editor.value?.value ?? ''\n editTyped.value = true\n editCaret.value = editor.value?.selectionStart ?? editText.value.length\n // typing ends pointing: the next cell pointed at is a new reference\n pointing.value = null\n fitEditor()\n syncMirror()\n}\n\n/** What another input that edits typed, as `useSheet().editor.input`. */\nfunction inputFrom(text: string, caret = text.length) {\n if (!editing.value && !beginEdit('edit')) return false\n pointing.value = null\n setEditText(text, caret)\n return true\n}\n\nfunction onCompositionStart() {\n if (!editing.value && !beginEdit('enter') && editor.value) editor.value.value = ''\n}\n\nfunction onInputBlur(event: FocusEvent) {\n focused.value = false\n // switching windows, or to the formula bar, keeps the edit open\n if (editInputs.has(event.relatedTarget as HTMLTextAreaElement)) return\n if (editing.value && document.hasFocus()) commitEdit(undefined, true)\n}\n\n// Keys -----------------------------------------------------------------------------------\n\n/**\n * Where the keys entered the merged cell that's active, so leaving it keeps\n * to the same column (or row) instead of the merge's first.\n */\nlet entered: { point: SheetPoint; selection: SheetSelection } | undefined\n\nfunction moveActive(direction: SheetDirection, jump = false) {\n // out of a merged cell from its far side\n const span = merges.value.cell(active.value)\n // only while the selection is still the one the keys made\n const track =\n entered &&\n entered.selection === selection.value &&\n merges.value.at(entered.point.row, entered.point.col) === span\n ? entered.point\n : active.value\n const from = {\n row: direction === 'down' ? span.bottom : direction === 'up' ? span.top : track.row,\n col: direction === 'right' ? span.right : direction === 'left' ? span.left : track.col,\n }\n const next = movePoint(from, direction, axes(), filled, jump)\n select(selectCell(next))\n entered = merges.value.at(next.row, next.col)\n ? { point: next, selection: selection.value }\n : undefined\n}\n\nconst axes = () => ({ rows: rows.value, cols: cols.value })\nconst filled = (row: number, col: number) => !isBlank(sheet.value.cells[row]?.[col])\n\n/** Moves within the selected range (Enter and Tab), wrapping at its edges. */\nfunction moveWithin(direction: 'down' | 'up' | 'right' | 'left') {\n const sel = selection.value\n const range = sel.ranges[sel.ranges.length - 1]!\n const b = boundsOf(range)\n if (b.top === b.bottom && b.left === b.right) return moveActive(direction)\n const step = direction === 'down' || direction === 'right' ? 1 : -1\n let { row, col } = sel.active\n const vertical = direction === 'down' || direction === 'up'\n const width = b.right - b.left + 1\n const height = b.bottom - b.top + 1\n // the cells of the range as one list, by columns (vertical) or rows\n let index = vertical\n ? (col - b.left) * height + (row - b.top)\n : (row - b.top) * width + (col - b.left)\n const count = width * height\n index = (index + step + count) % count\n if (vertical) {\n col = b.left + Math.floor(index / height)\n row = b.top + (index % height)\n } else {\n row = b.top + Math.floor(index / width)\n col = b.left + (index % width)\n }\n setSelection({ active: { row, col }, ranges: sel.ranges })\n scrollToPoint({ row, col })\n announce(activeLabel.value)\n}\n\n/** Moves the far corner of the last range, as Shift with an arrow does. */\nfunction extend(direction: SheetDirection, jump: boolean) {\n const sel = selection.value\n const last = sel.ranges[sel.ranges.length - 1]!\n const end = movePoint(last.end, direction, axes(), filled, jump)\n const ranges = [...sel.ranges.slice(0, -1), { start: last.start, end }]\n setSelection({ active: sel.active, ranges })\n scrollToPoint(end)\n announceRange()\n}\n\nfunction announceRange() {\n const range = selection.value.ranges[selection.value.ranges.length - 1]!\n const b = boundsOf(range)\n const count = (b.bottom - b.top + 1) * (b.right - b.left + 1)\n announce(\n count > 1\n ? format(messages.value.selected, { range: formatRange(range, sheetSize()), count })\n : activeLabel.value,\n )\n}\n\n/** The rows that fit in the view, for Page Up and Page Down. */\nconst pageRows = () =>\n Math.max(\n 1,\n Math.floor((viewHeight.value - headerHeight.value - frozenHeight.value) / props.rowHeight) - 1,\n )\n\nfunction onKeydown(event: KeyboardEvent) {\n if (isComposing(event) || inCommentCard(event.target)) return\n const e = editing.value\n if (e) return editKey(event, e.mode)\n for (const keymap of keymaps.value)\n for (const combo in keymap) {\n if (!matchesHotkey(event, combo)) continue\n const handler = keymap[combo]!\n if ((typeof handler === 'string' ? commands.run(handler) : handler(event)) !== false)\n return event.preventDefault()\n }\n const mod = event.ctrlKey || event.metaKey\n const key = event.key\n const arrow = ARROWS[key]\n // Alt + ↓ opens a cell type's panel, such as the list to pick from\n if (key === 'ArrowDown' && event.altKey && !mod && openPanel()) return event.preventDefault()\n // and on a filter's heading, its filter panel\n if (key === 'ArrowDown' && event.altKey && !mod && openFilterAtActive())\n return event.preventDefault()\n // with nothing to open it does nothing, rather than scroll the page\n if ((key === 'ArrowDown' || key === 'ArrowUp') && event.altKey) return event.preventDefault()\n // Alt + Shift + → groups the selected rows (or whole columns), ← takes them out\n if ((key === 'ArrowRight' || key === 'ArrowLeft') && event.altKey && event.shiftKey && !mod) {\n event.preventDefault()\n if (viewOnly.value) return announce(messages.value.readonly)\n return groupSelected(groupAxis(), key === 'ArrowRight')\n }\n if (arrow && !event.altKey) {\n event.preventDefault()\n if (event.shiftKey) return extend(arrow, mod)\n return moveActive(arrow, mod)\n }\n // Ctrl + PageUp / PageDown: the sheet before or after\n if (event.ctrlKey && !event.shiftKey && (key === 'PageUp' || key === 'PageDown')) {\n event.preventDefault()\n const at = sheetIndex.value + (key === 'PageUp' ? -1 : 1)\n if (at < 0 || at >= doc.value.sheets.length) return\n showSheet(at)\n return announce(format(messages.value.sheetShown, { name: doc.value.sheets[at]!.name }))\n }\n // the thread about the cell, or the box to start one\n if (matchesHotkey(event, 'mod+alt+m')) return done(event, comment())\n if (matchesHotkey(event, 'mod+z')) return done(event, commands.run('undo'))\n if (matchesHotkey(event, 'mod+shift+z') || matchesHotkey(event, 'mod+y'))\n return done(event, commands.run('redo'))\n if (matchesHotkey(event, 'mod+a')) return done(event, selectAll())\n if (matchesHotkey(event, 'mod+shift+l')) return keyCommand(event, 'filter')\n for (const [hotkey, name] of STYLE_KEYS)\n if (matchesHotkey(event, hotkey)) return keyCommand(event, name)\n if (matchesHotkey(event, 'mod+\\\\')) return keyCommand(event, 'clear')\n if (matchesHotkey(event, 'mod+f')) return keyCommand(event, 'find')\n if (matchesHotkey(event, replaceKey())) return keyCommand(event, 'replace')\n if (matchesHotkey(event, 'f3') || matchesHotkey(event, 'mod+g'))\n return keyCommand(event, 'find.next')\n if (matchesHotkey(event, 'shift+f3') || matchesHotkey(event, 'mod+shift+g'))\n return keyCommand(event, 'find.previous')\n if (matchesHotkey(event, 'mod+k')) {\n event.preventDefault()\n return editLink()\n }\n if (matchesHotkey(event, 'mod+d') || matchesHotkey(event, 'mod+r')) {\n event.preventDefault()\n if (viewOnly.value) return announce(messages.value.readonly)\n return fillFromEdge(key.toLowerCase() === 'd' ? 'down' : 'right')\n }\n if (key === 'ContextMenu' || (key === 'F10' && event.shiftKey)) {\n event.preventDefault()\n return openMenuAtActive()\n }\n // with whole rows (or columns) selected: insert before them, or delete them\n if (mod && !event.altKey && (key === '-' || key === '+' || key === '=')) {\n const b = lastBounds()\n const axis = whole(b, 'row') ? 'row' : whole(b, 'col') ? 'col' : null\n if (!axis || (key === '=' && !event.shiftKey)) return\n event.preventDefault()\n if (viewOnly.value) return announce(messages.value.readonly)\n return key === '-' ? deleteLines(axis) : insertLines(axis, false)\n }\n switch (key) {\n case 'Escape':\n if (linkCard.value) {\n // the link card goes, as any overlay does, until another cell is active\n event.preventDefault()\n linkDismissed.value = pointKey(linkCard.value)\n }\n if (clipMark.value) {\n event.preventDefault()\n clipMark.value = null\n } else if (closeFind()) event.preventDefault()\n return\n case 'Enter':\n if (mod || event.altKey) return\n event.preventDefault()\n return moveWithin(event.shiftKey ? 'up' : 'down')\n case 'Tab':\n if (mod || event.altKey) return\n event.preventDefault()\n return moveWithin(event.shiftKey ? 'left' : 'right')\n case 'F2':\n event.preventDefault()\n // Shift + F2 writes the cell's note\n if (event.shiftKey) return editNote()\n return editActive()\n case 'Delete':\n case 'Backspace':\n event.preventDefault()\n return clearSelection()\n case 'Home': {\n event.preventDefault()\n const to = { row: mod ? 0 : active.value.row, col: 0 }\n return select(selectCell(clampPoint(to, rowCount.value, colCount.value)))\n }\n case 'End': {\n event.preventDefault()\n return select(selectCell(mod ? lastFilled() : endOfRow(active.value.row)))\n }\n case 'PageDown':\n case 'PageUp': {\n event.preventDefault()\n let { row } = active.value\n for (let i = pageRows(); i > 0; i--)\n row = stepIndex(rows.value, row, key === 'PageDown' ? 1 : -1)\n return select(selectCell({ row, col: active.value.col }))\n }\n case ' ':\n if (!event.shiftKey && !mod && !event.altKey && toggleCells()) return event.preventDefault()\n if (event.shiftKey && !mod) return done(event, selectLines('row'))\n if (mod && !event.shiftKey) return done(event, selectLines('col'))\n return\n }\n}\n\nconst ARROWS: Record<string, SheetDirection> = {\n ArrowUp: 'up',\n ArrowDown: 'down',\n ArrowLeft: 'left',\n ArrowRight: 'right',\n}\n\n/** A key of a built-in command: runs it, or says the grid is read-only. */\nfunction keyCommand(event: KeyboardEvent, name: string) {\n event.preventDefault()\n if (!commands.can(name)) {\n if (viewOnly.value) announce(messages.value.readonly)\n return\n }\n commands.run(name)\n}\n\nfunction done(event: KeyboardEvent, handled: unknown) {\n if (handled !== false) event.preventDefault()\n}\n\nfunction editKey(event: KeyboardEvent, mode: 'enter' | 'edit') {\n // a cell type's panel gets the keys first, such as the arrows in a list\n if (panel.value?.onKey(event)) return event.preventDefault()\n const key = event.key\n const list = assist.value?.kind === 'list' ? assist.value : null\n if (list && !event.altKey && !event.ctrlKey && !event.metaKey) {\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault()\n const step = key === 'ArrowDown' ? 1 : -1\n assistIndex.value = (assistIndex.value + step + list.items.length) % list.items.length\n return\n }\n if (key === 'Tab' || key === 'Enter') {\n event.preventDefault()\n return completeName(list.items[assistIndex.value]!)\n }\n if (key === 'Escape') {\n event.preventDefault()\n assistShut.value = editText.value\n return\n }\n }\n if (key === 'Escape') {\n event.preventDefault()\n cancelEdit()\n return\n }\n if (key === 'Enter' && event.altKey) {\n // a new line inside the cell\n event.preventDefault()\n const el = editor.value!\n el.setRangeText('\\n', el.selectionStart, el.selectionEnd, 'end')\n fitEditor()\n return\n }\n if (key === 'Enter') {\n event.preventDefault()\n return commitEdit(event.shiftKey ? 'up' : 'down')\n }\n if (key === 'Tab') {\n event.preventDefault()\n return commitEdit(event.shiftKey ? 'left' : 'right')\n }\n if (key === 'F2') {\n event.preventDefault()\n editing.value = { ...editing.value!, mode: mode === 'enter' ? 'edit' : 'enter' }\n return\n }\n const arrow = ARROWS[key]\n const plain = !event.ctrlKey && !event.metaKey && !event.altKey\n if (arrow && mode === 'enter' && plain && pointable()) {\n // in a formula, where a reference can go, the arrows point at cells\n event.preventDefault()\n const e = editing.value!\n const p = pointing.value\n const from = p ? p.point : { row: e.row, col: e.col }\n const next = movePoint(from, arrow, axes(), filled, false)\n pointTo(event.shiftKey ? (p?.anchor ?? from) : next, next)\n return\n }\n if (arrow && mode === 'enter' && !event.shiftKey && !event.ctrlKey && !event.metaKey) {\n event.preventDefault()\n return commitEdit(arrow)\n }\n}\n\n// Formula help: the functions to pick from while typing a name, and what a call takes --------\n\n/** The functions formulas can call, by name. */\nconst functionList = computed(() => {\n void engineId.value\n return engine.functionList()\n})\n/** What a function takes and does: its own words, or the built-in help in the grid's language. */\n/** The functions used most, in the order the list shows them before the rest. */\nconst COMMON = [\n 'SUM',\n 'AVERAGE',\n 'IF',\n 'COUNT',\n 'MAX',\n 'MIN',\n 'ROUND',\n 'SUMIF',\n 'COUNTIF',\n 'IFERROR',\n 'VLOOKUP',\n 'XLOOKUP',\n 'AND',\n 'OR',\n 'CONCAT',\n 'TODAY',\n]\nconst rankOf = (name: string) => {\n const at = COMMON.indexOf(name)\n return at === -1 ? COMMON.length : at\n}\nfunction helpOf(fn: SheetFunction) {\n const name = fn.name.toUpperCase()\n const own = messages.value.functions[name]\n return {\n name,\n args: fn.args ?? own?.args ?? [],\n description: fn.description ?? own?.description ?? '',\n }\n}\n/** The text the list was closed at with Escape; it stays closed until the text changes. */\nconst assistShut = ref<string | null>(null)\nconst assistIndex = ref(0)\nconst assistId = `${uid}-assist`\n\n/**\n * What shows under the input while a formula is typed: the functions whose\n * names start with what is typed, or the arguments of the call the caret is in.\n */\nconst assist = computed(() => {\n if (!formulaEdit.value) return null\n const text = editText.value\n const caret = editCaret.value\n const name = assistShut.value === text ? null : nameAt(text, caret)\n if (name) {\n const prefix = name.text.toUpperCase()\n const items = functionList.value\n .filter((fn) => fn.name.toUpperCase().startsWith(prefix))\n .map(helpOf)\n // the functions used most come first, so Tab after `=SU` writes SUM\n items.sort((a, b) => rankOf(a.name) - rankOf(b.name))\n if (items.length) return { kind: 'list' as const, ...name, items }\n }\n const call = callAt(text, caret)\n const fn = call && functionList.value.find((f) => f.name.toUpperCase() === call.name)\n if (!call || !fn) return null\n const help = helpOf(fn)\n return { kind: 'hint' as const, ...help, arg: argNameAt(help.args, call.arg, call.count) }\n})\nwatch(\n () => (assist.value?.kind === 'list' ? `${assist.value.start}:${assist.value.text}` : ''),\n () => (assistIndex.value = 0),\n)\nwatch(assistIndex, (index) => {\n void nextTick(() =>\n document.getElementById(`${assistId}-${index}`)?.scrollIntoView({ block: 'nearest' }),\n )\n})\n\n/** Writes a function's name and its `(` over the name being typed. */\nfunction completeName(item: { name: string }) {\n const list = assist.value\n if (list?.kind !== 'list') return\n const text = editText.value\n const insert = `${item.name}(`\n setEditText(text.slice(0, list.start) + insert + text.slice(list.end), list.start + insert.length)\n}\n\n/**\n * Where the formula help shows: under the input being typed in, or above it\n * near the bottom of the window. Fixed, so a formula bar outside the grid has it too.\n */\nconst assistStyle = computed(() => {\n const e = editing.value\n if (!assist.value || !e) return ''\n void editText.value\n void scroll.value\n const input = editInput()\n let box: { left: number; top: number; bottom: number } | undefined\n if (input && input !== editor.value)\n box = (editInputs.get(input)?.anchor ?? input).getBoundingClientRect()\n else {\n const base = (editor.value?.offsetParent ?? root.value)?.getBoundingClientRect()\n if (!base) return ''\n const rect = cellRect(e)\n const top = base.top + rect.y - 1\n box = {\n left: base.left + rect.x - 1,\n top,\n bottom: top + Math.max(editorSize.value.height, rect.height) + 1,\n }\n }\n const room = window.innerHeight - box.bottom\n const left = Math.max(8, Math.min(box.left, window.innerWidth - 328))\n return room < 200 && box.top > room\n ? `left:${left}px;bottom:${window.innerHeight - box.top + 4}px`\n : `left:${left}px;top:${box.bottom + 4}px`\n})\n\n// The formula as it is typed, with its references in their colors, drawn under the editor's text\n\nconst mirror = ref<HTMLElement>()\nconst mirrorParts = computed(() =>\n formulaEdit.value ? formulaParts(editText.value, refMarks.value) : [],\n)\nfunction syncMirror() {\n const el = editor.value\n const m = mirror.value\n if (!el || !m) return\n m.scrollLeft = el.scrollLeft\n m.scrollTop = el.scrollTop\n}\n\n/** The references of the formula being edited that are on the sheet shown, as boxes over the grid. */\nconst refRects = computed(() => {\n const name = sheet.value.name.toLowerCase()\n const seen = new Set<string>()\n const out: { rect: ViewRect; color: number; key: string }[] = []\n const lastRow = rowCount.value - 1\n const lastCol = colCount.value - 1\n for (const mark of refMarks.value) {\n if (mark.sheet != null && mark.sheet.toLowerCase() !== name) continue\n const b = mark.bounds\n const key = `${b.top}:${b.left}:${b.bottom}:${b.right}`\n if (seen.has(key) || b.top > lastRow || b.left > lastCol) continue\n seen.add(key)\n const rect = rangeRect({\n top: b.top,\n left: b.left,\n bottom: Math.min(b.bottom, lastRow),\n right: Math.min(b.right, lastCol),\n })\n if (rect) out.push({ rect, color: mark.color, key })\n }\n return out\n})\n\nfunction endOfRow(row: number): SheetPoint {\n const line = sheet.value.cells[row]\n let col = (line?.length ?? 0) - 1\n while (col > 0 && isBlank(line?.[col])) col--\n return { row, col: Math.max(0, col) }\n}\n\nfunction lastFilled(): SheetPoint {\n const cells = sheet.value.cells\n let row = cells.length - 1\n while (row > 0 && !cells[row]?.some((cell) => !isBlank(cell))) row--\n let col = 0\n for (const line of cells) {\n if (!line) continue\n for (let c = line.length - 1; c > col; c--)\n if (!isBlank(line[c])) {\n col = c\n break\n }\n }\n return { row: Math.max(0, row), col }\n}\n\nfunction selectAll() {\n setSelection({\n active: active.value,\n ranges: [\n { start: { row: 0, col: 0 }, end: { row: rowCount.value - 1, col: colCount.value - 1 } },\n ],\n })\n announceRange()\n}\n\n/** Selects the rows (or columns) the last range spans, end to end. */\nfunction selectLines(kind: 'row' | 'col') {\n const sel = selection.value\n const b = boundsOf(sel.ranges[sel.ranges.length - 1]!)\n const range: SheetRange =\n kind === 'row'\n ? { start: { row: b.top, col: 0 }, end: { row: b.bottom, col: colCount.value - 1 } }\n : { start: { row: 0, col: b.left }, end: { row: rowCount.value - 1, col: b.right } }\n setSelection({ active: sel.active, ranges: [...sel.ranges.slice(0, -1), range] })\n announceRange()\n}\n\nfunction clearSelection() {\n if (viewOnly.value) return announce(messages.value.readonly)\n const ranges = selection.value.ranges\n const cleared = transact(\n (tr) => {\n for (const range of ranges) tr.clearValues(boundsOf(range))\n },\n { action: 'clear' },\n )\n if (cleared)\n announce(\n format(messages.value.cleared, {\n range: ranges.map((range) => formatRange(range, sheetSize())).join(', '),\n }),\n )\n}\n\n/** Selects, scrolls the active cell into view and reads it out. */\nfunction select(next: SheetSelection) {\n setSelection(next)\n scrollToPoint(next.active)\n announce(activeLabel.value)\n}\n\n// Ranges in the view ---------------------------------------------------------------------\n\ninterface ViewRect {\n x: number\n y: number\n width: number\n height: number\n /** Edges cut off by the view or the frozen panes, which are not drawn. */\n cut: { top: boolean; right: boolean; bottom: boolean; left: boolean }\n}\n\n/** Where a range shows in the view; `null` when none of it does. */\nfunction rangeRect(b: SheetBounds): ViewRect | null {\n const r = rows.value\n const c = cols.value\n const f = frozen.value\n const { left: sx, top: sy } = scroll.value\n const x0 = headerWidth.value\n const y0 = headerHeight.value\n const left = x0 + c.offset(b.left) - (b.left >= f.cols ? sx : 0)\n const right = x0 + c.offset(b.right + 1) - (b.right >= f.cols ? sx : 0)\n const top = y0 + r.offset(b.top) - (b.top >= f.rows ? sy : 0)\n const bottom = y0 + r.offset(b.bottom + 1) - (b.bottom >= f.rows ? sy : 0)\n // what scrolled under the frozen panes is hidden there\n const minX = b.left >= f.cols ? x0 + frozenWidth.value : x0\n const minY = b.top >= f.rows ? y0 + frozenHeight.value : y0\n const x = Math.max(left, minX)\n const y = Math.max(top, minY)\n const x2 = Math.min(right, viewWidth.value)\n const y2 = Math.min(bottom, viewHeight.value)\n if (x2 <= x || y2 <= y) return null\n return {\n x,\n y,\n width: x2 - x,\n height: y2 - y,\n cut: { left: x > left, top: y > top, right: x2 < right, bottom: y2 < bottom },\n }\n}\n\n/** The extensions' layers keep to the cells, under the headers and the outlines. */\nconst layerClip = computed(\n () => `clip-path:inset(${headerHeight.value}px 0 0 ${headerWidth.value}px)`,\n)\nconst rectStyle = (rect: ViewRect) =>\n `left:${rect.x}px;top:${rect.y}px;width:${rect.width}px;height:${rect.height}px;` +\n (['top', 'right', 'bottom', 'left'] as const)\n .filter((side) => rect.cut[side])\n .map((side) => `border-${side}-color:transparent;`)\n .join('')\n\n/** The last range of the selection, kept inside the sheet. */\nfunction lastBounds() {\n const sel = selection.value\n const b = boundsOf(sel.ranges[sel.ranges.length - 1]!)\n return {\n top: Math.max(0, b.top),\n left: Math.max(0, b.left),\n bottom: Math.min(rowCount.value - 1, b.bottom),\n right: Math.min(colCount.value - 1, b.right),\n }\n}\n\n/** Whether a range runs the whole height (`col`) or width (`row`) of the sheet. */\nconst whole = (b: SheetBounds, axis: SheetAxisName) =>\n axis === 'col'\n ? b.top === 0 && b.bottom >= rowCount.value - 1\n : b.left === 0 && b.right >= colCount.value - 1\n\nconst rangeName = (b: SheetBounds) =>\n formatRange(\n { start: { row: b.top, col: b.left }, end: { row: b.bottom, col: b.right } },\n sheetSize(),\n )\n\n// Clipboard ------------------------------------------------------------------------------\n\n/** The range last copied or cut, outlined until it is pasted (cut), edited or Escape. */\nconst clipMark = shallowRef<{ sheet: string; bounds: SheetBounds; cut: string | null } | null>(null)\nconst clipRect = computed(() => {\n const mark = clipMark.value\n return mark && mark.sheet === sheetKey(sheet.value) ? rangeRect(mark.bounds) : null\n})\n\n/** The cells of a range as a clip, up to where the sheet has data. */\nfunction clipOf(b: SheetBounds, cut: string | null): SheetClip {\n const data = sheet.value.cells\n let bottom = b.bottom\n let right = b.right\n // a whole row or column copies up to the last cell with something in it\n if (whole(b, 'col')) bottom = Math.max(b.top, Math.min(bottom, data.length - 1))\n if (whole(b, 'row')) {\n let widest = 0\n for (let r = b.top; r <= bottom; r++) widest = Math.max(widest, data[r]?.length ?? 0)\n right = Math.max(b.left, Math.min(right, widest - 1))\n }\n const cells: SheetCellInput[][] = []\n const used = new Set<string>()\n for (let r = b.top; r <= bottom; r++) {\n const line: SheetCellInput[] = []\n for (let c = b.left; c <= right; c++) {\n let cell = data[r]?.[c] ?? undefined\n // a copy leaves the cell's thread behind; a cut takes it along\n if (!cut && cell && typeof cell === 'object' && cell.comment)\n cell = compactCell({ ...cell, comment: undefined }) ?? undefined\n line.push(cell)\n const style = cellOf(cell)?.style\n if (style) used.add(style)\n }\n cells.push(line)\n }\n const styles: Record<string, SheetStyle> = {}\n for (const name of used) {\n const style = doc.value.styles?.[name]\n if (style) styles[name] = style\n }\n const clip: SheetClip = { cells, from: { row: b.top, col: b.left } }\n if (used.size) clip.styles = styles\n if (cut) clip.cut = cut\n return clip\n}\n\nlet cutCount = 0\n\n/** Puts the selection on the clipboard; returns what to write there. */\nfunction takeClip(cut: boolean) {\n const b = lastBounds()\n const id = cut ? `${uid}-${++cutCount}` : null\n const clip = clipOf(b, id)\n const height = clip.cells.length\n const width = clip.cells[0]?.length ?? 1\n const bounds = {\n top: b.top,\n left: b.left,\n bottom: b.top + height - 1,\n right: b.left + width - 1,\n }\n clipMark.value = { sheet: sheetKey(sheet.value), bounds, cut: id }\n announce(format(messages.value[cut ? 'cutDone' : 'copied'], { range: rangeName(bounds) }))\n const key = sheetKey(sheet.value)\n return formatClip(clip, {\n locale: lang.value,\n text: typedText,\n result: (row, col) => engine.result(key, b.top + row, b.left + col),\n })\n}\n\n/** A cell's text as its type shows it, such as 80% for 0.8; `undefined` for a plain cell. */\nfunction typedText(input: SheetCellInput, value: SheetValue) {\n const cell = cellOf(input)\n const typed = cell?.type ? resolveCellType(cell, doc.value, cellTypes.value) : undefined\n return typed?.definition.format?.(value, typed.setup)\n}\n\n/** A cell's value as its type writes it for other programs, such as `true` for a check; `undefined` for a plain cell. */\nfunction typedPlain(input: SheetCellInput, value: SheetValue) {\n const cell = cellOf(input)\n const typed = cell?.type ? resolveCellType(cell, doc.value, cellTypes.value) : undefined\n return typed?.definition.plain?.(value, typed.setup)\n}\n\n/** A sheet as CSV, with its cells' values (or what they show, with `text`). */\nfunction toCSV(options: SheetCSVWriteOptions & { sheet?: SheetRef } = {}) {\n const { sheet: target, ...rest } = options\n const data = doc.value.sheets[target == null ? sheetIndex.value : indexOfSheet(target)]\n if (!data) throw new RangeError(`[@dou-ui/sheet] there is no sheet \"${target}\"`)\n const key = sheetKey(data)\n return sheetToCSV(data, {\n locale: lang.value,\n cellText: typedText,\n cellPlain: typedPlain,\n result: (row, col) => engine.result(key, row, col),\n ...rest,\n })\n}\n\n// Images and printing --------------------------------------------------------------------\n\n/** What export draws: the sheet shown, or another one laid out as it would be shown. */\nfunction exportTarget(which?: SheetRef): SheetExportTarget {\n if (which == null) {\n const on: CellsOn = { ...shownCells.value, marks: false }\n return {\n data: sheet.value,\n rows: rows.value,\n cols: cols.value,\n frozen: frozen.value,\n merges: merges.value,\n cellView: (row, col, line, width, span) => cellView(row, col, line, width, span, on),\n }\n }\n const data = doc.value.sheets[indexOfSheet(which)]\n if (!data) throw new RangeError(`[@dou-ui/sheet] there is no sheet \"${which}\"`)\n if (data === sheet.value) return exportTarget()\n // another sheet, laid out as it would be shown\n const folded = shownGroupsOf(data)\n const rowSizes = hideIn(\n data.rowSizes ?? NO_SIZES,\n rowsFilteredOut(undefined, data),\n folded.rows.hidden,\n )\n const colSizes = hideIn(data.colSizes ?? NO_SIZES, folded.cols.hidden)\n const rowAxis = new SheetAxis(rowCountOf(data), props.rowHeight, rowSizes)\n const colAxis = new SheetAxis(colCountOf(data), props.colWidth, colSizes)\n const merged = mergesOf(data)\n const on: CellsOn = {\n key: sheetKey(data),\n looks: looksOf(data),\n checks: checksOf(data),\n merges: merged,\n marks: false,\n }\n return {\n data,\n rows: rowAxis,\n cols: colAxis,\n frozen: {\n rows: Math.max(0, Math.min(rowAxis.count, data.freeze?.rows ?? 0)),\n cols: Math.max(0, Math.min(colAxis.count, data.freeze?.cols ?? 0)),\n },\n merges: merged,\n cellView: (row, col, line, width, span) => cellView(row, col, line, width, span, on),\n }\n}\n\nconst { exportSVG, exportPNG, print, drawing } = createSheetExport({\n root: () => root.value,\n target: exportTarget,\n rowHeight: () => props.rowHeight,\n gridlines: () => props.gridlines,\n})\n\n// Files in and out -----------------------------------------------------------------------\n\n/** The selected cells as a range name, such as `B2:D9`. */\nconst selectionRange = () => rangeName(lastBounds())\n\n/** PNG and SVG need the grid's drawing, so they are made here rather than in `core/file`. */\nconst pngExporter = defineSheetExporter<SheetImageOptions>({\n name: 'png',\n label: (m) => m.file.png,\n extension: 'png',\n mime: 'image/png',\n scopes: ['sheet', 'selection'],\n needs: 'view',\n export: (source, options) => exportPNG({ ...options, ...imageScope(source) }),\n})\nconst svgExporter = defineSheetExporter<SheetExportOptions>({\n name: 'svg',\n label: (m) => m.file.svg,\n extension: 'svg',\n mime: 'image/svg+xml',\n scopes: ['sheet', 'selection'],\n needs: 'view',\n export: (source, options) => exportSVG({ ...options, ...imageScope(source) }),\n})\n/** The sheet and cells an image draws, from what the source exports. */\nfunction imageScope(source: SheetFileSource) {\n const { index, bounds } = source.sheets[0]!\n return {\n sheet: index,\n range: source.scope === 'selection' && bounds ? rangeName(bounds) : undefined,\n }\n}\n\nconst exporters = computed(() =>\n mergeFileHandlers(\n [csvExporter, pngExporter, svgExporter],\n resolved.value.exporters.map(({ extension, exporter }) => ({ extension, handler: exporter })),\n 'exporter',\n ),\n)\nconst importers = computed(() =>\n mergeFileHandlers<SheetImporter>(\n [csvImporter],\n resolved.value.importers.map(({ extension, importer }) => ({ extension, handler: importer })),\n 'importer',\n ),\n)\n\n/** Writes a file with an exporter, by name or itself. */\nasync function exportFile(which: string | SheetExporter, options: SheetExportFileOptions = {}) {\n const exporter = typeof which === 'string' ? exporters.value.find((e) => e.name === which) : which\n if (!exporter) throw new Error(`[@dou-ui/sheet] there is no exporter \"${String(which)}\"`)\n const scope = scopeFor(exporter, options.scope)\n const index = options.sheet == null ? sheetIndex.value : indexOfSheet(options.sheet)\n if (index === -1) throw new RangeError(`[@dou-ui/sheet] there is no sheet \"${options.sheet}\"`)\n let bounds: SheetBounds | undefined\n const asked = options.range ?? (scope === 'selection' ? selectionRange() : undefined)\n if (asked != null) {\n const parsed = parseRange(asked)\n if (!parsed) throw new RangeError(`[@dou-ui/sheet] \"${asked}\" isn't a range`)\n bounds = boundsOf(parsed)\n }\n const range = bounds ? rangeName(bounds) : undefined\n const source = createFileSource(doc.value, {\n scope,\n sheet: index,\n bounds,\n result: (key, row, col) => engine.result(key, row, col),\n evaluate: (formula, key) => engine.evaluate(formula, key),\n cellTypes: cellTypes.value,\n locale: lang.value,\n messages: messages.value,\n colWidth: props.colWidth,\n rowHeight: props.rowHeight,\n signal: options.signal,\n view:\n exporter.needs === 'view'\n ? { drawing: (o = {}) => drawing({ ...o, sheet: index, range }) }\n : undefined,\n })\n return toBlob(await exporter.export(source, options.options), exporter.mime)\n}\n\n/** The file name a toolbar export saves as: the workbook's first sheet, or the sheet exported. */\nfunction exportName(exporter: SheetExporter, asked?: SheetExportFileOptions['scope']) {\n const scope = scopeFor(exporter, asked)\n const name = (scope === 'workbook' ? doc.value.sheets[0] : sheet.value)?.name || 'sheet'\n return `${name}.${exporter.extension}`\n}\n\n/** Exports with an exporter and saves the file, as the toolbar's export menu does. */\nasync function saveFile(which: string | SheetExporter, options: SheetSaveFileOptions = {}) {\n const exporter = typeof which === 'string' ? exporters.value.find((e) => e.name === which) : which\n if (!exporter) throw new Error(`[@dou-ui/sheet] there is no exporter \"${String(which)}\"`)\n let name = options.fileName ?? `${exporter.name}.${exporter.extension}`\n let blob: Blob\n try {\n name = options.fileName ?? exportName(exporter, options.scope)\n blob = await exportFile(exporter, options)\n } catch (error) {\n const reason = reasonOf(error)\n fileFailed(\n { action: 'export', exporter: exporter.name, error },\n format(messages.value.file.exportFailed, { name, reason }),\n )\n throw error\n }\n downloadBlob(blob, name)\n announce(format(messages.value.file.exported, { name }))\n}\n\n/** Tells of a failed import or export with `file-error`, and over the grid unless a listener says it will. */\nfunction fileFailed(\n detail: Pick<SheetFileErrorEvent, 'action' | 'file' | 'exporter' | 'importer' | 'error'>,\n message: string,\n) {\n const event: SheetFileErrorEvent = {\n ...detail,\n message,\n defaultPrevented: false,\n preventDefault() {\n this.defaultPrevented = true\n },\n }\n emit('fileError', event)\n if (event.defaultPrevented) announce(message)\n else showNotice(message)\n}\n\n/** Aborted when the grid goes, so a file still being read isn't written into it. */\nconst unmounted = new AbortController()\nonBeforeUnmount(() => unmounted.abort())\n\n/** A signal aborted when any of these is. */\nfunction eitherSignal(a: AbortSignal, b?: AbortSignal) {\n if (!b) return a\n const both = new AbortController()\n const stop = () => both.abort()\n if (a.aborted || b.aborted) stop()\n a.addEventListener('abort', stop, { once: true })\n b.addEventListener('abort', stop, { once: true })\n return both.signal\n}\n\n/**\n * Reads a file into the workbook with the first importer that takes it\n * (or the one named), as one change undo takes back. Returns what was\n * read, or `null` when nothing was imported.\n */\nasync function importFile(file: Blob, options: SheetImportFileOptions = {}) {\n const name = 'name' in file ? String((file as File).name) : ''\n if (viewOnly.value) {\n showNotice(messages.value.readonly)\n return null\n }\n const signal = eitherSignal(unmounted.signal, options.signal)\n const importer =\n options.importer == null\n ? await findImporter(importers.value, file)\n : importers.value.find((i) => i.name === options.importer)\n if (!importer) {\n if (options.importer != null)\n throw new Error(`[@dou-ui/sheet] there is no importer \"${options.importer}\"`)\n fileFailed(\n { action: 'import', file, error: new Error(`[@dou-ui/sheet] no importer reads \"${name}\"`) },\n format(messages.value.file.unknownFile, { name }),\n )\n return null\n }\n const label = name || labelOf(importer.label, messages.value)\n let result: SheetImportResult\n try {\n result = await importer.import(\n file,\n { messages: messages.value, locale: lang.value, signal },\n options.options,\n )\n } catch (error) {\n if (signal.aborted) return null\n const reason = reasonOf(error)\n fileFailed(\n { action: 'import', file, importer: importer.name, error },\n format(messages.value.file.importFailed, { name: label, reason }),\n )\n throw error\n }\n if (signal.aborted) return null\n const mode = options.mode ?? 'append'\n let applied = false\n const write = () => {\n if (applied || unmounted.signal.aborted || viewOnly.value) return false\n if (!applyImport(event.book, mode)) return false\n applied = true\n announce(format(messages.value.file.imported, { name: label }))\n return true\n }\n const event: SheetImportEvent = {\n file,\n importer: importer.name,\n mode,\n book: result.book,\n warnings: result.warnings ?? [],\n defaultPrevented: false,\n preventDefault() {\n this.defaultPrevented = true\n },\n apply: write,\n }\n emit('import', event)\n // a listener may have written it already, with `apply()`\n if (!applied && (event.defaultPrevented || !write())) return null\n return { book: event.book, warnings: event.warnings }\n}\n\n/** Writes an imported workbook in: as new sheets, instead of every sheet, or at the active cell. */\nfunction applyImport(book: SheetWorkbook, mode: SheetImportMode) {\n if (!book.sheets.length) return false\n if (mode === 'insert') return insertImport(book)\n const before = doc.value.sheets.length\n const added = transact(\n (tr) => {\n if (mode === 'replace') {\n // the workbook's styles and cell types become the file's, as its sheets do\n swapNamed(tr, 'styles', book.styles)\n swapNamed(tr, 'types', book.types)\n const incoming = book.sheets.map(({ id: _id, ...data }, i) => ({\n ...data,\n name: data.name || `Sheet${i + 1}`,\n }))\n // plain steps, so formulas aren't rewritten as when a sheet is removed\n // or renamed (the new sheets may have the old names)\n const old = tr.doc.sheets.map(sheetKey)\n for (let i = old.length - 1; i > 0; i--) tr.step({ type: 'removeSheet', sheet: old[i]! })\n // the one left steps aside, as a workbook always has a sheet\n const aside = `\\u0000${old[0]}`\n tr.step({\n type: 'updateSheet',\n sheet: old[0]!,\n patch: { name: aside, id: undefined },\n })\n incoming.forEach((data, index) => tr.step({ type: 'insertSheet', index: index + 1, data }))\n tr.step({ type: 'removeSheet', sheet: aside })\n return\n }\n const styles = styleNames(tr, book.styles)\n const types = typeNames(tr, book.types)\n // sheets whose names are taken get new ones, and the file's formulas follow them\n const taken = new Set(tr.doc.sheets.map((s) => s.name))\n const moved = new Map<string, string>()\n const names = book.sheets.map((data) => {\n const base = data.name || 'Sheet'\n let name = base\n for (let n = 2; taken.has(name); n++) name = `${base} (${n})`\n taken.add(name)\n if (name !== data.name) moved.set(data.name, name)\n return name\n })\n book.sheets.forEach(({ id: _id, ...data }, i) =>\n tr.addSheet({\n ...data,\n name: names[i]!,\n cells: renameCells(data.cells, styles, types, moved),\n ...renameRules(data, styles, moved),\n }),\n )\n },\n { action: 'import' },\n )\n if (!added) return false\n showSheet(mode === 'replace' ? 0 : before)\n return true\n}\n\n/**\n * The first sheet of an imported workbook, once, from the active cell: its\n * cells with their formats, styles and types, formulas moved along as\n * when pasted.\n */\nfunction insertImport(book: SheetWorkbook) {\n // cells put in at the active cell are pasted, as far as the extensions go\n let clip: { cells: SheetData['cells']; styles?: Record<string, SheetStyle> } | null = {\n cells: book.sheets[0]!.cells,\n styles: book.styles,\n }\n if (resolved.value.pasteTransforms.length)\n clip = transformPaste({ cells: clip.cells.map((line) => line ?? []), styles: clip.styles })\n if (!clip) return false\n const cells = clip.cells\n const height = cells.length\n const width = Math.max(1, ...cells.map((line) => line?.length ?? 0))\n if (!height) return false\n const { row: top, col: left } = selection.value.active\n const changed = transact(\n (tr) => {\n const styles = styleNames(tr, clip.styles)\n const types = typeNames(tr, book.types)\n const named = renameCells(cells, styles, types, new Map())\n for (let r = 0; r < height; r++)\n for (let c = 0; c < width; c++) {\n const cell = cellOf(named[r]?.[c])\n let value = cell?.value\n if (typeof value === 'string' && value.startsWith('='))\n value = shiftFormula(value, top, left)\n const at = { row: top + r, col: left + c }\n tr.setCell(at, cell ? compactCell({ ...cell, value: value ?? undefined }) : undefined)\n }\n },\n { action: 'import' },\n view(),\n )\n if (!changed) return false\n const block = {\n top,\n left,\n bottom: top + height - 1,\n right: left + width - 1,\n }\n setSelection({\n active: { row: top, col: left },\n ranges: [boundsRange(block)],\n })\n scrollToPoint({ row: top, col: left })\n return true\n}\n\n/** Makes the workbook's named styles or cell types exactly these, removing the rest. */\nfunction swapNamed(\n tr: SheetTransaction,\n which: 'styles' | 'types',\n next: Record<string, SheetStyle> | Record<string, SheetTypeSetup> | undefined,\n) {\n const set = (name: string, value: unknown) =>\n which === 'styles'\n ? tr.setStyle(name, value as SheetStyle | undefined)\n : tr.setType(name, value as SheetTypeSetup | undefined)\n for (const name of Object.keys(tr.doc[which] ?? {})) if (!next?.[name]) set(name, undefined)\n for (const [name, value] of Object.entries(next ?? {})) set(name, value)\n}\n\n/** Gives imported cell types names that don't clash with different types of the same name. */\nfunction typeNames(tr: SheetTransaction, types: Record<string, SheetTypeSetup> | undefined) {\n const names = new Map<string, string>()\n for (const [name, setup] of Object.entries(types ?? {})) {\n const json = JSON.stringify(setup)\n let next = name\n for (let n = 2; ; n++) {\n const existing = tr.doc.types?.[next]\n if (!existing || JSON.stringify(existing) === json) break\n next = `${name} ${n}`\n }\n if (!tr.doc.types?.[next]) tr.setType(next, setup)\n names.set(name, next)\n }\n return names\n}\n\n/**\n * A sheet's conditional formats and validations with the sheets their\n * formulas and lists name, and the styles they name, changed.\n */\nfunction renameRules(data: SheetData, styles: Map<string, string>, sheets: Map<string, string>) {\n const out: Pick<SheetData, 'conditionalFormats' | 'validations'> = {}\n const formula = (text: string) => renameReferencesAll(text, sheets)\n if (data.conditionalFormats?.length)\n out.conditionalFormats = data.conditionalFormats.map((rule) => {\n let next = rule\n if ('formula' in next && formula(next.formula) !== next.formula)\n next = { ...next, formula: formula(next.formula) }\n if ('style' in next && typeof next.style === 'string') {\n const to = styles.get(next.style)\n if (to && to !== next.style) next = { ...next, style: to }\n }\n return next\n })\n if (data.validations?.length)\n out.validations = data.validations.map((rule) => {\n let next = rule\n if ('formula' in next && formula(next.formula) !== next.formula)\n next = { ...next, formula: formula(next.formula) }\n if ('list' in next && typeof next.list === 'string' && formula(next.list) !== next.list)\n next = { ...next, list: formula(next.list) }\n return next\n })\n return out\n}\n\nconst anyRenamed = (names: Map<string, string>) => [...names].some(([from, to]) => from !== to)\n\n/** Cells with their style and type names, and the sheets their formulas name, changed. */\nfunction renameCells(\n cells: SheetData['cells'],\n styles: Map<string, string>,\n types: Map<string, string>,\n sheets: Map<string, string>,\n) {\n if (!anyRenamed(styles) && !anyRenamed(types) && !sheets.size) return cells\n return cells.map((line) =>\n line?.map((input) => {\n const cell = cellOf(input)\n if (!cell) return input\n const style = cell.style && styles.get(cell.style)\n const type = cell.type && types.get(cell.type)\n const value =\n typeof cell.value === 'string' && cell.value.startsWith('=')\n ? renameReferencesAll(cell.value, sheets)\n : cell.value\n if ((!style || style === cell.style) && (!type || type === cell.type) && value === cell.value)\n return input\n return compactCell({\n ...cell,\n value,\n ...(style ? { style } : {}),\n ...(type ? { type } : {}),\n })\n }),\n )\n}\n\n/** The `accept` of a file picker for every importer. */\nconst importAccept = computed(() =>\n [...new Set(importers.value.flatMap((i) => i.accept))].join(','),\n)\n\n// a file dropped on the grid goes in at the cell it is dropped on\n/** The cell a file dragged over the grid would go in at. */\nconst dropAt = shallowRef<SheetPoint | null>(null)\nconst dropRect = computed(() => {\n const at = dropAt.value\n return at ? rangeRect({ top: at.row, left: at.col, bottom: at.row, right: at.col }) : null\n})\nfunction onDragOver(event: DragEvent) {\n if (!props.fileDrop || viewOnly.value || !event.dataTransfer?.types.includes('Files')) return\n event.preventDefault()\n event.dataTransfer.dropEffect = 'copy'\n const at = hitAt(event.clientX, event.clientY)\n const next = at.area === 'cell' ? { row: at.row, col: at.col } : null\n if (next?.row !== dropAt.value?.row || next?.col !== dropAt.value?.col) dropAt.value = next\n}\nfunction onDragLeave(event: DragEvent) {\n const to = event.relatedTarget as Node | null\n if (!to || !(event.currentTarget as Node).contains(to)) dropAt.value = null\n}\nlet warnedDrop = false\nfunction onDrop(event: DragEvent) {\n const at = dropAt.value\n dropAt.value = null\n const files = props.fileDrop && !viewOnly.value ? event.dataTransfer?.files : undefined\n const file = files?.[0]\n if (!file) return\n event.preventDefault()\n if (files.length > 1 && process.env.NODE_ENV !== 'production' && !warnedDrop) {\n warnedDrop = true\n console.warn(\n `[@dou-ui/sheet] ${files.length} files were dropped on the grid; only the first, \"${file.name}\", is imported`,\n )\n }\n if (at) select(selectCell(at))\n // a failure shows over the grid; there is no one else to tell\n importFile(file, { mode: 'insert' }).catch(() => {})\n}\n\nfunction onCopy(event: ClipboardEvent) {\n if (editing.value || !event.clipboardData || inCommentCard(event.target)) return\n event.preventDefault()\n const { text, html } = takeClip(false)\n event.clipboardData.setData('text/plain', text)\n event.clipboardData.setData('text/html', html)\n}\n\nfunction onCut(event: ClipboardEvent) {\n if (editing.value || !event.clipboardData || inCommentCard(event.target)) return\n event.preventDefault()\n if (viewOnly.value) return announce(messages.value.readonly)\n const { text, html } = takeClip(true)\n event.clipboardData.setData('text/plain', text)\n event.clipboardData.setData('text/html', html)\n}\n\nfunction onPaste(event: ClipboardEvent) {\n if (editing.value || !event.clipboardData || inCommentCard(event.target)) return\n event.preventDefault()\n const clip = parseClip({\n html: event.clipboardData.getData('text/html'),\n text: event.clipboardData.getData('text/plain'),\n })\n if (clip) paste(clip)\n}\n\n/** Copies or cuts with the clipboard API, for the menu. */\nasync function copyToClipboard(cut: boolean) {\n if (cut && viewOnly.value) return announce(messages.value.readonly)\n const { text, html } = takeClip(cut)\n try {\n if (typeof ClipboardItem !== 'undefined' && navigator.clipboard?.write) {\n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': new Blob([text], { type: 'text/plain' }),\n 'text/html': new Blob([html], { type: 'text/html' }),\n }),\n ])\n } else await navigator.clipboard.writeText(text)\n } catch {\n clipMark.value = null\n }\n}\n\n/** Pastes with the clipboard API, for the menu; says how to paste when the browser won't allow it. */\nasync function pasteFromClipboard() {\n if (viewOnly.value) return announce(messages.value.readonly)\n try {\n let html = ''\n let text = ''\n if (navigator.clipboard?.read) {\n for (const item of await navigator.clipboard.read()) {\n if (item.types.includes('text/html')) html = await (await item.getType('text/html')).text()\n if (item.types.includes('text/plain'))\n text = await (await item.getType('text/plain')).text()\n }\n } else text = await navigator.clipboard.readText()\n const clip = parseClip({ html, text })\n if (clip) paste(clip)\n } catch {\n const key = /Mac|iPhone|iPad/.test(navigator.platform) ? '⌘V' : 'Ctrl+V'\n showNotice(format(messages.value.pasteBlocked, { key }))\n }\n}\n\n/** Gives pasted styles names that don't clash with different styles of the same name. */\nfunction styleNames(tr: SheetTransaction, styles: Record<string, SheetStyle> | undefined) {\n const names = new Map<string, string>()\n for (const [name, style] of Object.entries(styles ?? {})) {\n const json = JSON.stringify(style)\n let next = name\n for (let n = 2; ; n++) {\n const existing = tr.doc.styles?.[next]\n if (!existing || JSON.stringify(existing) === json) break\n next = `${name} ${n}`\n }\n if (!tr.doc.styles?.[next]) tr.setStyle(next, style)\n names.set(name, next)\n }\n return names\n}\n\n/** `style`, or a style like it, that locks a cell as `old` was locked. */\nfunction lockedLike(tr: SheetTransaction, style: string | undefined, old: SheetCell | undefined) {\n const locked = isLocked(old, tr.doc)\n if (isLocked({ style }, tr.doc) === locked) return style\n const look: SheetStyle = { ...(style ? tr.doc.styles?.[style] : undefined) }\n if (locked) delete look.locked\n else look.locked = false\n if (!Object.keys(look).length) return undefined\n return styleNames(tr, { [style ?? 'unlocked']: look }).get(style ?? 'unlocked')\n}\n\n/** A clip as the extensions' `transformPaste` rewrite it; `null` when one stops it. */\nfunction transformPaste(clip: SheetClip) {\n let out: SheetClip | null = clip\n for (const transform of resolved.value.pasteTransforms) {\n out = transform(out, context)\n if (!out) return null\n }\n return out\n}\n\n/** Where a clip goes when pasted at the selection. */\nfunction pasteTargets(clip: SheetClip) {\n const height = clip.cells.length\n const width = Math.max(1, ...clip.cells.map((line) => line.length))\n const b = lastBounds()\n if (height === 1 && width === 1) return selection.value.ranges.map(boundsOf)\n if ((b.bottom - b.top + 1) % height === 0 && (b.right - b.left + 1) % width === 0) return [b]\n return [{ top: b.top, left: b.left, bottom: b.top + height - 1, right: b.left + width - 1 }]\n}\n\n/**\n * Pastes a clip at the selection. One cell fills every selected cell; a\n * block fills a range that is a whole number of copies of it; otherwise\n * it goes at the top left of the range. A cut moves its cells. The\n * `paste` event comes first and may change the clip or stop the paste.\n */\nfunction paste(given: SheetClip) {\n if (viewOnly.value) return announce(messages.value.readonly)\n if (!given.cells.length) return\n const transformed = transformPaste(given)\n if (!transformed?.cells.length) return\n const event: SheetPasteEvent = {\n clip: transformed,\n range: boundsRange(pasteTargets(transformed)[0]!),\n defaultPrevented: false,\n preventDefault() {\n this.defaultPrevented = true\n },\n }\n emit('paste', event)\n if (event.defaultPrevented) return\n const clip = event.clip\n const height = clip.cells.length\n if (!height) return\n const width = Math.max(1, ...clip.cells.map((line) => line.length))\n const ours = clip.from != null\n const mark = clipMark.value\n const cut = clip.cut != null && mark?.cut === clip.cut ? mark : null\n // cut cells an extension rewrote can't move as they are: the source is\n // emptied and the rewritten cells written, in the same step\n const moving = cut && transformed === given ? cut : null\n const targets = moving\n ? [\n {\n ...lastBounds(),\n bottom: lastBounds().top + height - 1,\n right: lastBounds().left + width - 1,\n },\n ]\n : pasteTargets(clip)\n const changed = transact(\n (tr) => {\n if (moving) {\n // the cells themselves move, and formulas pointing at them follow\n return void tr.moveCells(\n { ...moving.bounds, sheet: moving.sheet },\n { row: targets[0]!.top, col: targets[0]!.left },\n )\n }\n if (cut) {\n const b = cut.bounds\n for (let r = b.top; r <= b.bottom; r++)\n for (let c = b.left; c <= b.right; c++)\n tr.setCell({ row: r, col: c, sheet: cut.sheet }, undefined)\n }\n const keepLook = keepsLook.value\n const names = keepLook ? new Map<string, string>() : styleNames(tr, clip.styles)\n for (const t of targets)\n for (let r = t.top; r <= t.bottom; r++)\n for (let c = t.left; c <= t.right; c++) {\n const dr = (r - t.top) % height\n const dc = (c - t.left) % width\n const input = clip.cells[dr]?.[dc]\n const at = { row: r, col: c }\n if (!ours) {\n // text from elsewhere: the value and the format it implies, keeping the cell's style\n const cell = cellOf(input)\n const old = cellOf(tr.getCell(at))\n tr.updateCell(at, {\n value: cell?.value ?? undefined,\n format: cell?.format ?? old?.format,\n link: cell?.link ?? old?.link,\n })\n continue\n }\n const cell = cellOf(input)\n let value = cell?.value\n if (typeof value === 'string' && value.startsWith('='))\n value = shiftFormula(value, r - dr - clip.from!.row, c - dc - clip.from!.col)\n // a cell keeps its own thread, unless a cut one comes with its own\n const thread = (cut && cell?.comment) || cellOf(tr.getCell(at))?.comment\n if (keepLook) {\n // a protected sheet keeps its look: only what the cells hold is pasted\n const old = cellOf(tr.getCell(at))\n tr.setCell(\n at,\n compactCell({\n ...cell,\n value: value ?? undefined,\n style: old?.style,\n format: old?.format,\n comment: thread,\n }),\n )\n continue\n }\n let style = cell?.style ? (names.get(cell.style) ?? cell.style) : undefined\n // on a protected sheet a cell stays locked or unlocked as it was\n if (protection.value) style = lockedLike(tr, style, cellOf(tr.getCell(at)))\n tr.setCell(\n at,\n compactCell({ ...cell, value: value ?? undefined, style, comment: thread }),\n )\n }\n },\n { action: cut ? 'cut' : 'paste' },\n view(),\n !cut,\n )\n if (cut) clipMark.value = null\n const last = targets[targets.length - 1]!\n if (targets.length === 1)\n setSelection({ active: { row: last.top, col: last.left }, ranges: [boundsRange(last)] })\n scrollToPoint({ row: last.top, col: last.left })\n if (changed) announce(format(messages.value.pasted, { range: targets.map(rangeName).join(', ') }))\n}\n\nconst boundsRange = (b: SheetBounds): SheetRange => ({\n start: { row: b.top, col: b.left },\n end: { row: b.bottom, col: b.right },\n})\n\n/** A short message over the grid, for what can't be read out alone. */\nconst notice = ref('')\nlet noticeTimer: ReturnType<typeof setTimeout> | undefined\nfunction showNotice(text: string) {\n if (refusing) return\n notice.value = text\n announce(text)\n clearTimeout(noticeTimer)\n noticeTimer = setTimeout(() => (notice.value = ''), 3200)\n}\n\n// Filling --------------------------------------------------------------------------------\n\n/** The fill handle shows at the corner of a single range that can change. */\nconst fillRect = computed(() => {\n if (viewOnly.value || editing.value || selection.value.ranges.length !== 1) return null\n if (drag.value?.mode === 'move' || sizing.value) return null\n const b = lastBounds()\n const corner = rangeRect({ top: b.bottom, left: b.right, bottom: b.bottom, right: b.right })\n if (!corner || corner.cut.right || corner.cut.bottom) return null\n return { x: corner.x + corner.width, y: corner.y + corner.height }\n})\n\n/** Where a fill drag would fill to, and the cells it would clear when dragged back in. */\nconst fillTarget = shallowRef<{ bounds: SheetBounds; clear: SheetBounds | null } | null>(null)\nconst fillPreview = computed(() => {\n const t = fillTarget.value\n return t ? rangeRect(t.bounds) : null\n})\n/** Whether Ctrl / ⌘ is held while dragging the fill handle. */\nconst fillInvert = ref(false)\n\n/**\n * What the last filled cell will show, beside the far corner of the fill,\n * found by filling the first line in a transaction that is thrown away.\n */\nconst fillHint = computed(() => {\n const target = fillTarget.value\n if (!target || target.clear) return null\n const b = lastBounds()\n const t = target.bounds\n if (t.top === b.top && t.bottom === b.bottom && t.left === b.left && t.right === b.right)\n return null\n const down = t.left === b.left && t.right === b.right\n const one = (x: SheetBounds) => (down ? { ...x, right: x.left } : { ...x, bottom: x.top })\n const end = down\n ? { row: t.bottom > b.bottom ? t.bottom : t.top, col: b.left }\n : { row: b.top, col: t.right > b.right ? t.right : t.left }\n const tr = new SheetTransaction(doc.value, sheetIndex.value)\n try {\n tr.fill(one(b), one(t), { mode: fillMode(b, t, fillInvert.value) })\n } catch {\n return null\n }\n const input = tr.doc.sheets[sheetIndex.value]!.cells[end.row]?.[end.col]\n const text = formatValue(valueOf(input), cellOf(input)?.format, lang.value)\n const rect = rangeRect({ top: end.row, left: end.col, bottom: end.row, right: end.col })\n if (!rect || !text) return null\n // near the right edge it goes on the cell's left instead\n const flip = rect.x + rect.width + 160 > viewWidth.value && rect.x > 160\n return { text, flip, x: flip ? rect.x : rect.x + rect.width, y: rect.y + rect.height / 2 }\n})\n\nconst fillClearRect = computed(() => {\n const t = fillTarget.value\n return t?.clear ? rangeRect(t.clear) : null\n})\n\n/**\n * How far from the selection's corner the handle was pressed, in px: a\n * finger lands anywhere on its larger target, and the fill follows how\n * the finger moves from there rather than where it first touched.\n */\nlet fillGrab = { x: 0, y: 0 }\n\n/** The way a fill drag is going, so the grid scrolls only that way. */\nlet fillAxis: SheetAxisName | null = null\n\n/**\n * What dragging the fill handle to a point would fill: the range grown the\n * way the pointer went further past it, or shrunk when dragged back in.\n */\nfunction fillTo(hit: Hit) {\n const b = lastBounds()\n const x = hit.x - fillGrab.x\n const y = hit.y - fillGrab.y\n const r = rows.value.indexAt(y)\n const c = cols.value.indexAt(x)\n const top = rows.value.offset(b.top)\n const bottom = rows.value.offset(b.bottom + 1)\n const left = cols.value.offset(b.left)\n const right = cols.value.offset(b.right + 1)\n const outY = y > bottom ? y - bottom : y < top ? y - top : 0\n const outX = x > right ? x - right : x < left ? x - left : 0\n fillAxis = outY === 0 && outX === 0 ? null : Math.abs(outY) >= Math.abs(outX) ? 'row' : 'col'\n if (outY === 0 && outX === 0) {\n // back inside: the cells past the pointer would be cleared\n const up = b.bottom - r\n const back = b.right - c\n if (up === 0 && back === 0) return { bounds: b, clear: null }\n if (bottom - y >= right - x)\n return up === 0\n ? { bounds: b, clear: null }\n : { bounds: { ...b, bottom: r }, clear: { ...b, top: r + 1 } }\n return back === 0\n ? { bounds: b, clear: null }\n : { bounds: { ...b, right: c }, clear: { ...b, left: c + 1 } }\n }\n if (Math.abs(outY) >= Math.abs(outX))\n return { bounds: outY > 0 ? { ...b, bottom: r } : { ...b, top: r }, clear: null }\n return { bounds: outX > 0 ? { ...b, right: c } : { ...b, left: c }, clear: null }\n}\n\n/**\n * How dragging from `b` to `t` fills: as the fill handle does on its own,\n * or with Ctrl / ⌘ held the other way, copying a run it would continue\n * and counting up a number it would copy.\n */\nfunction fillMode(b: SheetBounds, t: SheetBounds, invert: boolean): SheetFillMode {\n if (!invert) return 'auto'\n const down = t.left === b.left && t.right === b.right\n const cells = sheet.value.cells\n const [first, last] = down ? [b.left, b.right] : [b.top, b.bottom]\n for (let line = first; line <= last; line++) {\n const values = down\n ? Array.from({ length: b.bottom - b.top + 1 }, (_, i) => valueOf(cells[b.top + i]?.[line]))\n : Array.from({ length: b.right - b.left + 1 }, (_, i) => valueOf(cells[line]?.[b.left + i]))\n if (fillContinues(values)) return 'copy'\n }\n return 'series'\n}\n\n/** Fills from the selection to `target`, or clears what was dragged back over. */\nfunction finishFill(target: { bounds: SheetBounds; clear: SheetBounds | null }, invert: boolean) {\n const b = lastBounds()\n const t = target.bounds\n const same = t.top === b.top && t.bottom === b.bottom && t.left === b.left && t.right === b.right\n if (target.clear) {\n if (transact((tr) => tr.clearValues(target.clear!), { action: 'clear' }))\n announce(format(messages.value.cleared, { range: rangeName(target.clear) }))\n } else if (!same) {\n if (\n transact(\n (tr) => tr.fill(b, t, { mode: fillMode(b, t, invert), keepStyle: keepsLook.value }),\n { action: 'fill' },\n )\n )\n announce(format(messages.value.filled, { range: rangeName(t) }))\n }\n const now = selection.value.active\n setSelection({\n active: inBounds(t, now.row, now.col) ? now : { row: t.top, col: t.left },\n ranges: [{ start: { row: t.top, col: t.left }, end: { row: t.bottom, col: t.right } }],\n })\n}\n\nconst fillMeta = { action: 'fill' } as const\n\n/** Fills down (or right) from the first row (or column) of the selection, as Ctrl+D and Ctrl+R do. */\nfunction fillFromEdge(direction: 'down' | 'right') {\n const b = lastBounds()\n const source = direction === 'down' ? { ...b, bottom: b.top } : { ...b, right: b.left }\n if (direction === 'down' && b.bottom === b.top) {\n if (b.top === 0) return\n // one row: copies the row above\n source.top = source.bottom = b.top - 1\n return void transact(\n (tr) =>\n tr.fill(source, { ...b, top: b.top - 1 }, { mode: 'copy', keepStyle: keepsLook.value }),\n fillMeta,\n )\n }\n if (direction === 'right' && b.right === b.left) {\n if (b.left === 0) return\n source.left = source.right = b.left - 1\n return void transact(\n (tr) =>\n tr.fill(source, { ...b, left: b.left - 1 }, { mode: 'copy', keepStyle: keepsLook.value }),\n fillMeta,\n )\n }\n transact((tr) => tr.fill(source, b, { mode: 'copy', keepStyle: keepsLook.value }), fillMeta)\n}\n\n/** Double-clicking the fill handle fills down as far as the column beside it has data. */\nfunction fillDownToData() {\n const b = lastBounds()\n const cells = sheet.value.cells\n const beside = [b.left - 1, b.right + 1].find((c) => c >= 0 && !isBlank(cells[b.bottom + 1]?.[c]))\n if (beside == null) return\n let end = b.bottom + 1\n while (end + 1 < rowCount.value && !isBlank(cells[end + 1]?.[beside])) end++\n finishFill({ bounds: { ...b, bottom: end }, clear: null }, false)\n}\n\n// Rows and columns -----------------------------------------------------------------------\n\n/** The rows (or columns) the last range covers. */\nfunction linesOf(axis: SheetAxisName) {\n const b = lastBounds()\n return axis === 'row'\n ? { from: b.top, count: b.bottom - b.top + 1 }\n : { from: b.left, count: b.right - b.left + 1 }\n}\n\nfunction insertLines(axis: SheetAxisName, after: boolean) {\n const { from, count } = linesOf(axis)\n const at = after ? from + count : from\n const changed = transact(\n (tr) => (axis === 'row' ? tr.insertRows(at, count) : tr.insertCols(at, count)),\n { action: 'insert' },\n )\n // the selection stays where it was, on the new rows (or columns) when they went before it\n if (!changed) return\n announce(format(messages.value[axis === 'row' ? 'rowsInserted' : 'colsInserted'], { count }))\n}\n\nfunction deleteLines(axis: SheetAxisName) {\n const { from, count } = linesOf(axis)\n const changed = transact(\n (tr) => (axis === 'row' ? tr.deleteRows(from, count) : tr.deleteCols(from, count)),\n { action: 'delete' },\n )\n if (!changed) return\n const point = clampPoint(\n axis === 'row' ? { row: from, col: active.value.col } : { row: active.value.row, col: from },\n rowCount.value,\n colCount.value,\n )\n setSelection(selectCell(point))\n announce(format(messages.value[axis === 'row' ? 'rowsDeleted' : 'colsDeleted'], { count }))\n}\n\n/** Hides the selected rows (or columns), or shows the hidden ones among them. */\nfunction setHidden(axis: SheetAxisName, hide: boolean) {\n const { from, count } = linesOf(axis)\n const sizes = (axis === 'row' ? sheet.value.rowSizes : sheet.value.colSizes) ?? NO_SIZES\n transact(\n (tr) => {\n for (let i = from; i < from + count; i++)\n if (hide) tr.setSize(axis, i, 0)\n else if (sizes[i] === 0) tr.setSize(axis, i, undefined)\n },\n { action: 'hide' },\n )\n}\n\n/** Whether any of the selected rows (or columns) is hidden, or right beside them. */\nfunction hasHidden(axis: SheetAxisName) {\n const { from, count } = linesOf(axis)\n // rows a filter hides don't count: they show again with the filter\n const sizes = (axis === 'row' ? sheet.value.rowSizes : sheet.value.colSizes) ?? NO_SIZES\n const last = (axis === 'row' ? rowCount.value : colCount.value) - 1\n for (let i = Math.max(0, from - 1); i <= Math.min(last, from + count); i++)\n if (sizes[i] === 0) return true\n return false\n}\n\n/** Sets the size of a row (or column), and of every selected one when it is among them. */\nfunction resizeLines(axis: SheetAxisName, index: number, size: number | undefined) {\n const b = lastBounds()\n const selected =\n whole(b, axis) &&\n (axis === 'row' ? index >= b.top && index <= b.bottom : index >= b.left && index <= b.right)\n const lines = selected\n ? axis === 'row'\n ? { from: b.top, to: b.bottom }\n : { from: b.left, to: b.right }\n : { from: index, to: index }\n const changed = transact(\n (tr) => {\n for (let i = lines.from; i <= lines.to; i++) tr.setSize(axis, i, size)\n },\n { action: 'resize' },\n )\n if (changed && size) announce(format(messages.value.resized, { size }))\n}\n\nlet fitCanvas: CanvasRenderingContext2D | null | undefined\n\n/** The width that fits the widest text in a column, or the height that fits a row's wrapped text. */\nfunction fitSize(axis: SheetAxisName, index: number): number | undefined {\n const cells = sheet.value.cells\n const font = root.value ? getComputedStyle(root.value) : null\n if (axis === 'col') {\n fitCanvas ??= document.createElement('canvas').getContext('2d')\n if (!fitCanvas || !font) return undefined\n const plain = `${font.fontStyle} ${font.fontWeight} ${font.fontSize} ${font.fontFamily}`\n const bold = `${font.fontStyle} 600 ${font.fontSize} ${font.fontFamily}`\n let widest = 0\n for (const [row, line] of cells.entries()) {\n const input = line?.[index]\n if (isBlank(input)) continue\n const cell = cellOf(input)\n const style = cell?.style ? doc.value.styles?.[cell.style] : undefined\n fitCanvas.font = style?.bold ? bold : plain\n const value = shownValue(valueOf(input), resultAt, row, index)\n const text = formatValue(value, cell?.format, lang.value)\n for (const part of text.split('\\n'))\n widest = Math.max(widest, fitCanvas.measureText(part).width)\n }\n // the cell's padding and its grid line\n return widest ? Math.ceil(widest) + 18 : undefined\n }\n const line = cells[index]\n if (!line || !root.value) return undefined\n let tallest = 0\n const probe = document.createElement('div')\n probe.className = 'dou-sheet__probe'\n root.value.appendChild(probe)\n line.forEach((input, col) => {\n const cell = cellOf(input)\n if (isBlank(input) || !cell?.style || !doc.value.styles?.[cell.style]?.wrap) return\n probe.style.width = `${cols.value.size(col) - 16}px`\n const value = shownValue(cell.value ?? null, resultAt, index, col)\n probe.textContent = formatValue(value, cell.format, lang.value)\n tallest = Math.max(tallest, probe.offsetHeight + 9)\n })\n probe.remove()\n return tallest > props.rowHeight ? Math.ceil(tallest) : undefined\n}\n\n/** Moves the selected rows (or columns) to before line `to`. */\nfunction moveSelectedLines(axis: SheetAxisName, to: number) {\n const { from, count } = linesOf(axis)\n if (to >= from && to <= from + count) return\n const changed = transact(\n (tr) => (axis === 'row' ? tr.moveRows({ from, count }, to) : tr.moveCols({ from, count }, to)),\n { action: 'move' },\n )\n if (!changed) return\n const start = to > from ? to - count : to\n const b = lastBounds()\n const range: SheetRange =\n axis === 'row'\n ? { start: { row: start, col: b.left }, end: { row: start + count - 1, col: b.right } }\n : { start: { row: b.top, col: start }, end: { row: b.bottom, col: start + count - 1 } }\n setSelection({ active: range.start, ranges: [range] })\n announce(format(messages.value[axis === 'row' ? 'rowsMoved' : 'colsMoved'], { count }))\n}\n\n// Groups ---------------------------------------------------------------------------------\n\nconst lineName = (axis: SheetAxisName, line: number) =>\n axis === 'row' ? line + 1 : columnName(line)\n\n/** The text of a group's button, or with `after`, what is read out after pressing it. */\nfunction groupText(axis: SheetAxisName, g: SheetGroupLines, collapsed: boolean, after = false) {\n const m = messages.value.group\n const key = after\n ? axis === 'row'\n ? collapsed\n ? 'collapsedRows'\n : 'expandedRows'\n : collapsed\n ? 'collapsedCols'\n : 'expandedCols'\n : axis === 'row'\n ? collapsed\n ? 'collapseRows'\n : 'expandRows'\n : collapsed\n ? 'collapseCols'\n : 'expandCols'\n return format(m[key], { lines: linesText(axis, g) })\n}\n\n/** A group's lines, as `第 4–6 行`, `第 4 行` or `C 列`. */\nfunction linesText(axis: SheetAxisName, g: { start: number; end: number }) {\n const m = messages.value.group\n const one = g.start === g.end\n const text = axis === 'row' ? (one ? m.rowLine : m.rowLines) : one ? m.colLine : m.colLines\n return format(text, { from: lineName(axis, g.start), to: lineName(axis, g.end) })\n}\n\n/** Where the shown sheet's groups keep their headings or subtotals. */\nconst groupSummary = computed(() => sheet.value.groupSummary ?? 'before')\n\n/** Folds groups for this view alone, as a read-only grid does. */\nfunction foldInView(list: { g: SheetGroupLines; collapsed: boolean }[]) {\n const folds = new Map(viewFolds.value)\n for (const { g, collapsed } of list)\n folds.set(foldKey(sheet.value, sheet.value.groups![g.index]!.range), collapsed)\n viewFolds.value = folds\n}\n\n/** Folds a group away or shows it again. */\nfunction toggleGroup(axis: SheetAxisName, g: SheetGroupLines) {\n const collapsed = !g.collapsed\n if (viewOnly.value) foldInView([{ g, collapsed }])\n else if (\n !transact(\n (tr) => {\n const range = groupRange(axis, g.start, g.end)\n if (collapsed) tr.collapseGroup(range)\n else tr.expandGroup(range)\n },\n { action: 'group' },\n )\n )\n return\n keepActiveShown()\n announce(groupText(axis, g, collapsed, true))\n}\n\n/** Shows the groups of an axis down to a level, as the level buttons do. */\nfunction showGroupLevel(axis: SheetAxisName, level: number) {\n if (viewOnly.value)\n foldInView(groups.value.axis(axis).list.map((g) => ({ g, collapsed: g.depth >= level })))\n else transact((tr) => tr.showGroupLevel(axis, level), { action: 'group' })\n keepActiveShown()\n announce(format(messages.value.group.levelShown, { level }))\n}\n\n/** After lines fold away under the active cell, moves it to the nearest line still shown. */\nfunction keepActiveShown() {\n const { row, col } = active.value\n const r = rows.value.hidden(row) ? rows.value.visibleFrom(row, -1) : row\n const c = cols.value.hidden(col) ? cols.value.visibleFrom(col, -1) : col\n if (r !== row || c !== col) setSelection(selectCell({ row: r, col: c }))\n}\n\n/** Groups the selected rows (or columns), or takes them out of their groups. */\nfunction groupSelected(axis: SheetAxisName, group: boolean) {\n const { from, count } = linesOf(axis)\n const m = messages.value.group\n const end = from + count - 1\n // say why lines can't be grouped, before trying\n const problem = group ? groups.value.axis(axis).problem(from, end) : null\n if (problem && !groups.value.axis(axis).find(from, end)) {\n const text =\n problem === 'deep' ? m.tooDeep : format(m.crossing, { group: linesText(axis, problem.cross) })\n announce(text)\n showNotice(text)\n return\n }\n const changed = transact(\n (tr) => {\n const lines = { from, count }\n if (group) {\n if (axis === 'row') tr.groupRows(lines)\n else tr.groupCols(lines)\n } else if (axis === 'row') tr.ungroupRows(lines)\n else tr.ungroupCols(lines)\n },\n { action: 'group' },\n )\n if (!changed) return\n announce(\n group ? format(m[axis === 'row' ? 'groupedRows' : 'groupedCols'], { count }) : m.ungrouped,\n )\n}\n\n/** Rows (or columns) for the keys: columns when whole columns are selected. */\nconst groupAxis = (): SheetAxisName => (whole(lastBounds(), 'col') ? 'col' : 'row')\n\n/** The innermost group around the active cell's line, or whose button is on it. */\nfunction groupAtActive(axis: SheetAxisName) {\n const line = axis === 'row' ? active.value.row : active.value.col\n const laid = groups.value.axis(axis)\n const count = axis === 'row' ? rowCount.value : colCount.value\n return (\n laid.list.find((g) => laid.buttonLine(g, count, groupSummary.value) === line) ??\n laid.around(line).at(-1)\n )\n}\n\n/** Menu items for grouping rows (or columns), and folding the group at the active cell. */\nfunction groupItems(axis: SheetAxisName): SheetMenuItem[] {\n const m = messages.value.group\n const { from, count } = linesOf(axis)\n const laid = groups.value.axis(axis)\n const end = from + count - 1\n // the keys group rows, or columns when whole columns are selected\n const keys = groupAxis() === axis\n const out: SheetMenuItem[] = [\n {\n key: `${axis}-group`,\n label: format(m[axis === 'row' ? 'groupRows' : 'groupCols'], { count }),\n icon: axis === 'row' ? RowGroupIcon : ColumnGroupIcon,\n shortcut: keys ? 'alt+shift+ArrowRight' : undefined,\n run: () => groupSelected(axis, true),\n },\n ]\n if (laid.list.some((g) => g.start <= end && g.end >= from))\n out.push({\n key: `${axis}-ungroup`,\n label: m[axis === 'row' ? 'ungroupRows' : 'ungroupCols'],\n icon: axis === 'row' ? RowUngroupIcon : ColumnUngroupIcon,\n shortcut: keys ? 'alt+shift+ArrowLeft' : undefined,\n run: () => groupSelected(axis, false),\n })\n const at = groupAtActive(axis)\n if (at)\n out.push({\n key: `${axis}-fold`,\n label: groupText(axis, at, !at.collapsed),\n icon: at.collapsed ? UnfoldVerticalIcon : FoldVerticalIcon,\n run: () => toggleGroup(axis, at),\n })\n return out\n}\n\n// Notes ----------------------------------------------------------------------------------\n\n/** The note showing: read on hover or after a tap, or being written. */\ninterface NoteShown extends SheetPoint {\n /** What showed it: the mouse, a finger, the active cell, or writing it. */\n by: 'hover' | 'tap' | 'active' | 'edit'\n}\nconst noteShown = shallowRef<NoteShown | null>(null)\nlet noteTimer: ReturnType<typeof setTimeout> | undefined\n\n/** A cell's note; a merged cell's is on its top left cell. */\nfunction noteAt(point: SheetPoint) {\n const cell = sheet.value.cells[point.row]?.[point.col]\n return cell && typeof cell === 'object' ? cell.note : undefined\n}\n\n/**\n * What a finger tapping a cell is shown: its note, and while comparing,\n * what it held in the older version, as a pointer resting on it sees.\n */\nfunction tipAt(point: SheetPoint) {\n const change = compared.value?.get(`${point.row}:${point.col}`)\n const note = noteAt(point)\n if (!change) return note\n const text = wasText(change)\n return note ? `${text}\\n${note}` : text\n}\n\n/** The cell a note belongs to: the top left of a merge. */\nfunction noteHome(point: SheetPoint): SheetPoint {\n const span = merges.value.cell(point)\n return { row: span.top, col: span.left }\n}\n\nconst sameCell = (a: SheetPoint | null | undefined, b: SheetPoint) =>\n !!a && a.row === b.row && a.col === b.col\n\n/** Where the note's cell is on the page, for the note to sit beside. */\nconst noteAnchor: VirtualElement = {\n getBoundingClientRect() {\n const at = noteShown.value\n const el = viewport.value\n if (!at || !el) return new DOMRect()\n const box = el.getBoundingClientRect()\n const r = cellRect(at)\n return new DOMRect(\n box.left + el.clientLeft + r.x,\n box.top + el.clientTop + r.y,\n r.width,\n r.height,\n )\n },\n}\n\n/** Hides a note being read, not one being written; `after` some ms. */\nfunction hideNote(after = 0) {\n clearTimeout(noteTimer)\n if (after) noteTimer = setTimeout(hideNote, after)\n else if (noteShown.value?.by !== 'edit') noteShown.value = null\n}\n\n/** How long the pointer rests on a cell before its note shows, and leaves before it goes. */\nconst NOTE_SHOW = 300\nconst NOTE_HIDE = 200\n\n/** A mouse resting on a cell with a note shows it; moving on to another one switches at once. */\nfunction hoverNote(event: PointerEvent) {\n if (noteShown.value?.by === 'edit' || drag.value) return\n const hit = hitAt(event.clientX, event.clientY)\n const point = hit.area === 'cell' ? noteHome(hit) : null\n if (point && sameCell(noteShown.value, point)) return clearTimeout(noteTimer)\n if (!point || !noteAt(point)) {\n if (noteShown.value) hideNote(NOTE_HIDE)\n else clearTimeout(noteTimer)\n return\n }\n clearTimeout(noteTimer)\n const show = () => (noteShown.value = { ...point, by: 'hover' })\n if (noteShown.value) show()\n else noteTimer = setTimeout(show, NOTE_SHOW)\n}\n\n/** The pointer moving onto the note keeps it; leaving it lets it go. */\nfunction onNoteHover(inside: boolean) {\n onNote = inside\n if (inside) clearTimeout(noteTimer)\n else if (noteShown.value?.by === 'hover') hideNote(NOTE_HIDE)\n}\n\n/** Opens the box to write the note of a cell, the active one by default. */\nfunction editNote(at: SheetPoint = active.value) {\n if (viewOnly.value) return announce(messages.value.readonly)\n const point = noteHome(at)\n clearTimeout(noteTimer)\n scrollToPoint(point)\n noteShown.value = { ...point, by: 'edit' }\n}\n\n/** Keeps what was written; `leaving` when focus left the box for something else. */\nfunction saveNote(text: string, leaving: boolean) {\n const at = noteShown.value\n noteShown.value = null\n if (!at) return\n const before = noteAt(at) ?? ''\n const after = text.trim() ? text : ''\n if (after !== before) {\n const m = messages.value.note\n if (transact((tr) => tr.setNote(at, after || undefined), { action: 'note' }))\n announce(after ? m.saved : m.removed)\n }\n if (!leaving) focusGrid()\n}\n\nfunction cancelNote(leaving: boolean) {\n noteShown.value = null\n if (!leaving) focusGrid()\n}\n\n/** How many notes the selection holds. */\nfunction notesSelected() {\n let count = 0\n forEachSelected((point) => {\n if (noteAt(point)) count++\n })\n return count\n}\n\nfunction removeNotes() {\n if (viewOnly.value) return announce(messages.value.readonly)\n const count = notesSelected()\n if (!count) return\n const ranges = selection.value.ranges\n const m = messages.value.note\n if (\n transact(\n (tr) => {\n for (const range of ranges) tr.clearNotes(boundsOf(range))\n },\n { action: 'note' },\n )\n )\n announce(count === 1 ? m.removed : format(m.removedMany, { count }))\n}\n\n/** Menu items for the note of the active cell, and taking the selection's notes off. */\nfunction noteItems(): SheetMenuItem[] {\n const m = messages.value.note\n const has = !!noteAt(noteHome(active.value))\n const items: SheetMenuItem[] = [\n {\n key: 'note',\n label: has ? m.edit : m.add,\n icon: has ? MessageTextIcon : MessagePlusIcon,\n shortcut: 'shift+F2',\n divided: true,\n run: () => editNote(),\n },\n ]\n const count = notesSelected()\n if (count)\n items.push({\n key: 'note-remove',\n label: count === 1 ? m.remove : format(m.removeMany, { count }),\n icon: MessageXIcon,\n run: removeNotes,\n })\n return items\n}\n\n/*\n * The active cell's note shows too, after the same pause as a mouse's, so\n * moving onto a cell with the keys shows its note; it goes once another\n * cell is chosen, or the cell is being edited.\n */\nwatch(active, (point) => {\n const home = noteHome(point)\n const now = noteShown.value\n if (now?.by === 'edit' || sameCell(now, home)) return\n if (now?.by === 'active' || now?.by === 'tap') hideNote()\n if (!noteAt(home) || now?.by === 'hover') return\n clearTimeout(noteTimer)\n noteTimer = setTimeout(() => {\n if (\n !noteShown.value &&\n !editing.value &&\n focusInside() &&\n sameCell(noteHome(active.value), home)\n )\n noteShown.value = { ...home, by: 'active' }\n }, NOTE_SHOW)\n})\nwatch(editing, (on) => {\n if (on) hideNote()\n})\n\n// Links ----------------------------------------------------------------------------------\n\n/** Where a cell links to: its own `link`, or where its `HYPERLINK` formula points. */\nfunction linkAt(point: SheetPoint): string | undefined {\n const cell = cellOf(sheet.value.cells[point.row]?.[point.col])\n if (cell?.link) return cell.link\n const value = cell?.value\n if (typeof value === 'string' && value.startsWith('='))\n return engine.link(sheetKey(sheet.value), point.row, point.col)\n return undefined\n}\n\n/** Whether focus is in the grid or what it shows, for the active cell's link to show. */\nconst focusWithin = ref(false)\n/** The cell whose link is being written, or `null`. */\nconst linkEditing = shallowRef<SheetPoint | null>(null)\n\n/**\n * A cell's link after typing `value` into it: a web address typed becomes the\n * link, and a link that came from typing follows what is typed next; a link\n * given otherwise stays.\n */\nfunction typedLink(old: SheetCell | undefined, value: SheetValue | undefined) {\n if (old?.link && old.link !== old.value) return old.link\n return typeof value === 'string' && isTypedLink(value) ? value : undefined\n}\n\n/** Whether the last press was a finger: the link card then sits at the grid's foot, off the cells. */\nconst touching = ref(false)\n\n/** The cell whose link card Escape put away, until another cell is active. */\nconst linkDismissed = ref<string | null>(null)\nconst pointKey = (point: { row: number; col: number }) =>\n `${sheetIndex.value}:${point.row}:${point.col}`\nwatch(active, () => (linkDismissed.value = null))\n\n/**\n * The link card: under the active cell while it has a link and the grid\n * has focus, or the box writing a link.\n */\nconst linkCard = computed(() => {\n const at = linkEditing.value\n if (at) return { ...at, link: linkAt(at) ?? '', editing: true }\n if (!focusWithin.value || editing.value || drag.value?.started || panelType.value) return null\n if (noteShown.value?.by === 'edit') return null\n // a thread open beside the cell takes the place of its link card\n if (commentThread.value || comments.pending.value) return null\n const home = noteHome(active.value)\n if (linkDismissed.value === pointKey(home)) return null\n const link = linkAt(home)\n return link ? { ...home, link, editing: false } : null\n})\n\n/** Where the link's cell is on the page, for the card to sit under. */\nconst linkAnchor: VirtualElement = {\n getBoundingClientRect() {\n const at = linkCard.value\n const el = viewport.value\n if (!at || !el) return new DOMRect()\n const box = el.getBoundingClientRect()\n const r = cellRect(at)\n return new DOMRect(\n box.left + el.clientLeft + r.x,\n box.top + el.clientTop + r.y,\n r.width,\n r.height,\n )\n },\n}\n\n/** The text a link's box offers to change: the cell's value, or `null` for a formula. */\nfunction linkText(point: SheetPoint): string | null {\n const value = valueOf(sheet.value.cells[point.row]?.[point.col])\n if (typeof value === 'string' && value.startsWith('=')) return null\n return value == null ? '' : formatValue(value, formatAt(point), lang.value)\n}\n\n/** Whether the link of a cell can be changed. */\nconst linkEditable = (point: SheetPoint) => !viewOnly.value && !lockedAt(point)\n\n/** Opens the box to write the link of the active cell. */\nfunction editLink(at: SheetPoint = active.value) {\n if (viewOnly.value) return announce(messages.value.readonly)\n const point = noteHome(at)\n if (lockedAt(point)) return showNotice(messages.value.protect.refused.cell)\n if (editing.value) commitEdit(undefined, true)\n scrollToPoint(point)\n hideNote()\n linkEditing.value = point\n}\n\n/** Writes a link, and the text shown when the box offered it; an empty address takes the link off. */\nfunction saveLink(link: string, text: string | null, leaving: boolean) {\n const at = linkEditing.value\n linkEditing.value = null\n if (!at) return\n const m = messages.value.link\n const changed = transact(\n (tr) => {\n const old = cellOf(tr.getCell(at))\n const patch: Partial<SheetCell> = { link: link || undefined }\n if (text !== null) {\n // the text as typed, read as any cell reads it; without any, the address shows\n const typed = text.trim() ? text : link\n if (typed !== linkText(at)) patch.value = parseInput(typed).value ?? undefined\n }\n if (old?.link === patch.link && !('value' in patch)) return\n tr.updateCell(at, patch)\n },\n { action: 'link' },\n )\n if (changed) announce(link ? m.saved : m.removed)\n if (!leaving) focusGrid()\n}\n\nfunction cancelLink(leaving: boolean) {\n linkEditing.value = null\n if (!leaving) focusGrid()\n}\n\n/** Takes the links off the selected cells, keeping what they show. */\nfunction removeLinks() {\n if (viewOnly.value) return announce(messages.value.readonly)\n const points: SheetPoint[] = []\n forEachSelected((point) => {\n if (cellOf(sheet.value.cells[point.row]?.[point.col])?.link) points.push(point)\n })\n if (!points.length) return false\n const changed = transact(\n (tr) => {\n for (const point of points) tr.updateCell(point, { link: undefined })\n },\n { action: 'link' },\n )\n if (changed) announce(messages.value.link.removed)\n focusGrid()\n}\n\n/**\n * Follows a cell's link: a web address opens in a new tab; a place in the\n * workbook is shown and selected.\n */\nfunction followLink(point: SheetPoint = noteHome(active.value)) {\n const link = linkAt(point)\n const target = linkTarget(link)\n if (!link || !target) return false\n const event: SheetLinkOpenEvent = {\n link,\n target,\n cell: { sheet: sheetIndex.value, row: point.row, col: point.col },\n defaultPrevented: false,\n preventDefault() {\n this.defaultPrevented = true\n },\n }\n emit('linkOpen', event)\n if (event.defaultPrevented) return true\n if (target.kind === 'web') {\n window.open(target.href, '_blank', 'noopener,noreferrer')\n return true\n }\n if (goToLink(target)) return true\n // such as a sheet that is gone: say so rather than do nothing\n showNotice(format(messages.value.link.missing, { link }))\n return false\n}\n\nfunction goToLink(target: Extract<SheetLinkTarget, { kind: 'cell' }>) {\n const range = target.range\n const go = () => {\n setSelection({ active: range.start, ranges: [range] })\n scrollToPoint(range.start)\n focusGrid()\n announce(format(messages.value.link.jumped, { cell: rangeName(boundsOf(range)) }))\n }\n const at =\n target.sheet == null\n ? sheetIndex.value\n : doc.value.sheets.findIndex((s) => s.name === target.sheet)\n if (at === -1) return false\n if (at === sheetIndex.value) go()\n // another sheet first brings back where it was left; the link's cells come after\n else if (showSheet(at)) void nextTick(go)\n else return false\n return true\n}\n\n/** Menu items for the active cell's link, and taking the selection's links off. */\nfunction linkItems(): SheetMenuItem[] {\n const m = messages.value.link\n const home = noteHome(active.value)\n const has = !!cellOf(sheet.value.cells[home.row]?.[home.col])?.link\n const items: SheetMenuItem[] = [\n {\n key: 'link',\n label: has ? m.edit : m.add,\n icon: LinkIcon,\n shortcut: 'mod+k',\n disabled: !linkEditable(home),\n run: () => editLink(),\n },\n ]\n if (linkTarget(linkAt(home)))\n items.push({ key: 'link-open', label: m.open, icon: ExternalLinkIcon, run: () => followLink() })\n if (has)\n items.push({\n key: 'link-remove',\n label: m.remove,\n icon: UnlinkIcon,\n disabled: !linkEditable(home),\n run: () => removeLinks(),\n })\n return items\n}\n\n/** Whether focus is in the grid, or in what it shows, such as a note. */\nconst focusInside = () => !!root.value?.contains(document.activeElement)\n\n/** Whether the pointer is on the note being read. */\nlet onNote = false\nwatch(noteShown, (note) => {\n if (!note) onNote = false\n})\n\n/**\n * Escape closes a note being read, as it closes any overlay. It is the\n * grid's own Escape only when focus is in the grid or the pointer is on\n * the note; otherwise it still reaches what has focus, such as a dialog.\n */\nfunction onNoteEscape(event: KeyboardEvent) {\n if (event.key !== 'Escape' || event.isComposing || noteShown.value?.by === 'edit') return\n hideNote()\n if (!focusInside() && !onNote) return\n event.preventDefault()\n event.stopPropagation()\n}\n\n// Comments -------------------------------------------------------------------------------\n\nconst commentsProvider = computed(() => resolved.value.comments?.(context) ?? null)\nconst comments = useSheetComments({\n props,\n emit,\n provider: commentsProvider,\n doc,\n home: noteHome,\n shown: () => sheetKey(sheet.value),\n transact: (run, meta) => transact(run, meta),\n})\n\n/** The thread a cell of the sheet shown has, when it shows: known and not resolved. */\nfunction openThreadAt(point: SheetPoint) {\n const thread = comments.threadAt(point)\n return comments.isOpen(thread) ? thread : undefined\n}\n\n/** The last request to put the cursor in the card that a card took. */\nconst commentFocused = ref(0)\n\n/** The card's cell, on the sheet shown. */\nconst commentCell = computed(() => {\n const at = comments.cell.value\n return at && at.sheet === sheetKey(sheet.value) ? at : null\n})\nconst commentThread = computed(() => {\n const id = comments.active.value\n return (id && comments.byId.value.get(id)) || null\n})\n\nconst commentAnchor: VirtualElement = {\n getBoundingClientRect() {\n const at = commentCell.value\n const el = viewport.value\n if (!at || !el) return new DOMRect()\n const box = el.getBoundingClientRect()\n const r = cellRect(at)\n return new DOMRect(\n box.left + el.clientLeft + r.x,\n box.top + el.clientTop + r.y,\n r.width,\n r.height,\n )\n },\n}\n\nconst commentCard = shallowRef<InstanceType<typeof SheetComment> | null>(null)\nconst inCommentCard = (target: EventTarget | null) =>\n target instanceof Node && !!commentCard.value?.panel?.contains(target)\n\n/**\n * Opens the thread about a cell, the active one by default, or the box to\n * start one there.\n */\nfunction comment(at: SheetPoint = active.value) {\n if (!comments.enabled.value) return false\n if (editing.value) commitEdit(undefined, true)\n hideNote()\n const point = noteHome(at)\n scrollToPoint(point)\n return comments.start(point)\n}\n\n/** A thread opened from outside (`v-model:active-comment`) shows its sheet and cell. */\nwatch(\n () => comments.active.value,\n (id) => {\n const anchor = id ? comments.getAnchors()[id] : null\n if (!anchor) return\n if (anchor.sheet !== sheetKey(sheet.value)) showSheet(anchor.sheet)\n void nextTick(() => scrollToPoint(anchor))\n },\n)\n\n// another cell chosen: the card goes, as a click elsewhere in a document closes it\nwatch(active, (point) => {\n const at = comments.cell.value\n if (!at) return\n const home = noteHome(point)\n if (at.sheet !== sheetKey(sheet.value) || at.row !== home.row || at.col !== home.col)\n comments.close()\n})\n\nfunction closeComment(refocus: boolean) {\n comments.close()\n if (refocus) focusGrid()\n}\n\n// a thread resolved or removed from the card: back to the grid\nwatch(commentCell, async (now, was) => {\n if (now || !was) return\n await nextTick()\n const el = document.activeElement\n if (!el || el === document.body) focusGrid()\n})\n\n// Versions -------------------------------------------------------------------------------\n\n/** What changed since `compare`, on every sheet. */\nconst versionDiff = computed(() => (props.compare ? diffWorkbooks(props.compare, doc.value) : null))\n/** The changed cells of the sheet shown, by `row:col`. */\nconst compared = computed(() => {\n const diff = versionDiff.value\n if (!diff) return null\n const key = sheetKey(sheet.value)\n const out = new Map<string, SheetCellChange>()\n for (const change of diff.cells)\n if (change.sheet === key) out.set(`${change.row}:${change.col}`, change)\n return out\n})\n\n/** Works out the formulas of the version compared with, for what its cells showed. */\nconst compareEngine = computed(() =>\n props.compare\n ? new SheetFormulaEngine(props.compare, {\n functions: resolved.value.functions,\n locale: lang.value,\n })\n : null,\n)\n\n/** What a changed cell showed in the older version, as its cell showed it: formatted, formulas worked out. */\nfunction wasText(change: SheetCellChange) {\n const m = messages.value.compare\n const book = props.compare\n const old = compareEngine.value\n const value = old\n ? shownValue(\n valueOf(change.before),\n (row, col) => old.result(change.sheet, row, col),\n change.row,\n change.col,\n )\n : valueOf(change.before)\n if (value == null || value === '') return m.wasEmpty\n const cell = cellOf(change.before)\n const typed = cell?.type && book ? resolveCellType(cell, book, cellTypes.value) : undefined\n const text = typed?.definition.toggle\n ? value === true\n ? messages.value.checked\n : messages.value.unchecked\n : (typed?.definition.format?.(value, typed.setup) ??\n formatValue(value, cell?.format, lang.value))\n return format(m.was, { value: text })\n}\n\n/** Selects the changed cell after (or before) the active one, across the sheets. */\nfunction goToChange(step: 1 | -1) {\n const diff = versionDiff.value\n if (!diff?.cells.length) return false\n const order = new Map(doc.value.sheets.map((data, index) => [sheetKey(data), index]))\n const here = [sheetIndex.value, active.value.row, active.value.col]\n const list = diff.cells.map((change) => ({\n change,\n at: [order.get(change.sheet) ?? 0, change.row, change.col],\n }))\n // oxlint-disable-next-line unicorn/no-array-sort -- sorts a fresh array\n list.sort((a, b) => a.at[0]! - b.at[0]! || a.at[1]! - b.at[1]! || a.at[2]! - b.at[2]!)\n const from = (at: number[]) => at[0]! - here[0]! || at[1]! - here[1]! || at[2]! - here[2]!\n let target: (typeof list)[number] | undefined\n if (step === 1) target = list.find((item) => from(item.at) > 0)\n else for (const item of list) if (from(item.at) < 0) target = item\n if (!target) return false\n const { change } = target\n if (change.sheet !== sheetKey(sheet.value)) showSheet(change.sheet)\n select(selectCell({ row: change.row, col: change.col }))\n return true\n}\n\n/**\n * Brings the workbook to `book`, as one change. Like undo it isn't held by\n * protection, which it restores too, nor by `readonly`, as other calls from\n * code aren't; comparing, it is the one change allowed. Extensions can\n * still cancel it.\n */\nfunction restore(book: SheetWorkbook) {\n if (editing.value) commitEdit(undefined, true)\n restoring = true\n try {\n // called by the app's code: `readonly` doesn't stop it, as with `transact`\n const tr = transact(\n (t) => restoreWorkbook(t, book),\n { action: 'restore', protection: false },\n view(),\n false,\n true,\n )\n if (!tr) return false\n } finally {\n restoring = false\n }\n announce(messages.value.compare.restored)\n return true\n}\n/** Set while a version is restored: comparing, the grid is read-only but can still restore. */\nlet restoring = false\n\n/** Menu items for the active cell's thread. */\nfunction commentItems(): SheetMenuItem[] {\n if (!comments.enabled.value) return []\n const m = messages.value.comment\n const has = !!openThreadAt(noteHome(active.value))\n if (!has && !comments.writable.value) return []\n return [\n {\n key: 'comment',\n label: has ? m.open : m.add,\n icon: has ? MessagesIcon : MessageCircleIcon,\n shortcut: 'mod+alt+m',\n run: () => void comment(),\n },\n ]\n}\n\n/** A note shown for the active cell goes when focus leaves the grid. */\nfunction onFocusout(event: FocusEvent) {\n const next = event.relatedTarget\n if (next instanceof Node && root.value?.contains(next)) return\n focusWithin.value = false\n const by = noteShown.value?.by\n if (by === 'active' || by === 'tap') hideNote()\n}\nwatch(\n () => !!noteShown.value && noteShown.value.by !== 'edit',\n (reading) => {\n if (typeof window === 'undefined') return\n if (reading) window.addEventListener('keydown', onNoteEscape, true)\n else window.removeEventListener('keydown', onNoteEscape, true)\n },\n)\nonBeforeUnmount(() => {\n clearTimeout(noteTimer)\n if (typeof window !== 'undefined') window.removeEventListener('keydown', onNoteEscape, true)\n})\n\n/**\n * The note mark of the cell under the fill handle, drawn over the handle\n * so it isn't hidden; `null` when that cell has no note.\n */\nconst noteUnderFill = computed(() => {\n const at = fillRect.value\n if (!at) return null\n const b = lastBounds()\n const below = { row: b.bottom + 1, col: b.right }\n if (below.row >= rowCount.value || rows.value.size(below.row) <= 0) return null\n const span = merges.value.cell(below)\n if (span.top !== below.row || span.right !== b.right || !noteAt(noteHome(below))) return null\n return at\n})\n\n// Menu -----------------------------------------------------------------------------------\n\nconst menu = ref<InstanceType<typeof SheetMenu>>()\nconst menuOpen = ref(false)\nconst menuItems = shallowRef<SheetMenuItem[]>([])\n\n/**\n * The menu's items: the clipboard, then what fits where it opened. Whole\n * rows (or columns) get only row (or column) operations; a cell gets both,\n * grouped into submenus to keep the menu short.\n */\nfunction menuFor(area: SheetMenuContext['area']): SheetMenuItem[] {\n const m = messages.value\n const items: SheetMenuItem[] = [\n { key: 'cut', command: 'cut' },\n { key: 'copy', command: 'copy' },\n { key: 'paste', command: 'paste' },\n ]\n if (viewOnly.value) return items.filter((item) => item.key === 'copy')\n const rowLines = linesOf('row')\n const colLines = linesOf('col')\n const insertRows: SheetMenuItem[] = [\n {\n key: 'row-above',\n icon: RowInsertTopIcon,\n label: format(m.insertRowsAbove, { count: rowLines.count }),\n run: () => insertLines('row', false),\n },\n {\n key: 'row-below',\n icon: RowInsertBottomIcon,\n label: format(m.insertRowsBelow, { count: rowLines.count }),\n run: () => insertLines('row', true),\n },\n ]\n const insertCols: SheetMenuItem[] = [\n {\n key: 'col-left',\n icon: ColumnInsertLeftIcon,\n label: format(m.insertColsLeft, { count: colLines.count }),\n run: () => insertLines('col', false),\n },\n {\n key: 'col-right',\n icon: ColumnInsertRightIcon,\n label: format(m.insertColsRight, { count: colLines.count }),\n run: () => insertLines('col', true),\n },\n ]\n // deleting every row (or column) would leave nothing: not offered\n const deleteRows: SheetMenuItem[] =\n rowLines.count >= rowCount.value\n ? []\n : [\n {\n key: 'row-delete',\n icon: RowRemoveIcon,\n label: format(m.deleteRows, { count: rowLines.count }),\n tone: 'danger',\n run: () => deleteLines('row'),\n },\n ]\n const deleteCols: SheetMenuItem[] =\n colLines.count >= colCount.value\n ? []\n : [\n {\n key: 'col-delete',\n icon: ColumnRemoveIcon,\n label: format(m.deleteCols, { count: colLines.count }),\n tone: 'danger',\n run: () => deleteLines('col'),\n },\n ]\n const visibility = (axis: SheetAxisName): SheetMenuItem[] => {\n const count = axis === 'row' ? rowLines.count : colLines.count\n const out: SheetMenuItem[] = [\n {\n key: `${axis}-hide`,\n icon: EyeOffIcon,\n label: format(m[axis === 'row' ? 'hideRows' : 'hideCols'], { count }),\n divided: true,\n run: () => setHidden(axis, true),\n },\n ]\n if (hasHidden(axis))\n out.push({\n key: `${axis}-show`,\n icon: EyeIcon,\n label: m[axis === 'row' ? 'showRows' : 'showCols'],\n run: () => setHidden(axis, false),\n })\n return out\n }\n const clear: SheetMenuItem = {\n key: 'clear',\n label: m.clear,\n icon: EraserIcon,\n shortcut: 'Delete',\n divided: true,\n run: clearSelection,\n }\n if (area === 'row' || area === 'col') {\n const lines = area === 'row' ? [...insertRows, ...deleteRows] : [...insertCols, ...deleteCols]\n return [\n ...items,\n ...dividedFirst(lines),\n ...visibility(area),\n ...dividedFirst(groupItems(area)),\n clear,\n ]\n }\n const remove = [...deleteRows, ...deleteCols]\n return [\n ...items,\n {\n key: 'insert',\n label: m.insert,\n icon: PlusIcon,\n divided: true,\n children: [...insertRows, ...dividedFirst(insertCols)],\n },\n ...(remove.length\n ? [\n {\n key: 'delete',\n label: m.delete,\n icon: TrashIcon,\n tone: 'danger',\n children: remove,\n } as const,\n ]\n : []),\n ...mergeItems(),\n {\n key: 'group',\n label: m.group.group,\n icon: RowGroupIcon,\n children: [...groupItems('row'), ...dividedFirst(groupItems('col'))],\n },\n ...noteItems(),\n ...commentItems(),\n ...linkItems(),\n ...dataItems(),\n {\n key: 'lock',\n label: activeLocked.value ? messages.value.protect.unlock : messages.value.protect.lock,\n icon: activeLocked.value ? UnlockIcon : LockIcon,\n divided: true,\n disabled: !commands.can('lock'),\n run: () => void commands.run('lock'),\n },\n clear,\n ]\n}\n\n/** Sorting and filtering. */\nfunction dataItems(): SheetMenuItem[] {\n const m = messages.value.filter\n const items: SheetMenuItem[] = [\n {\n key: 'sort',\n label: m.sort,\n icon: SortIcon,\n divided: true,\n children: [\n {\n key: 'sort-asc',\n label: m.sortAsc,\n icon: SortAscendingIcon,\n run: () => sortSelection('asc'),\n },\n {\n key: 'sort-desc',\n label: m.sortDesc,\n icon: SortDescendingIcon,\n run: () => sortSelection('desc'),\n },\n ],\n },\n {\n key: 'filter',\n label: sheet.value.filter ? m.turnOff : m.turnOn,\n icon: sheet.value.filter ? FilterXIcon : FilterIcon,\n shortcut: 'mod+shift+l',\n run: toggleFilter,\n },\n ]\n if (sheet.value.filter?.columns)\n items.push({ key: 'filter-clear', label: m.clearAll, run: clearFilters })\n return items\n}\n\n/** Merging the selection, or splitting the merged cells in it. */\nfunction mergeItems(): SheetMenuItem[] {\n const m = messages.value\n const b = lastBounds()\n const touched = merges.value.touching(b)\n const one = touched.length === 1 && sameBounds(touched[0]!, b)\n const out: SheetMenuItem[] = []\n if (!one && (b.top !== b.bottom || b.left !== b.right) && selection.value.ranges.length === 1)\n out.push({\n key: 'merge',\n label: m.mergeCells,\n icon: CellsMergeIcon,\n divided: true,\n run: mergeSelection,\n })\n if (touched.length)\n out.push({\n key: 'unmerge',\n label: m.unmergeCells,\n icon: CellsSplitIcon,\n divided: !out.length,\n run: unmergeSelection,\n })\n return out\n}\n\nconst sameBounds = (a: SheetBounds, b: SheetBounds) =>\n a.top === b.top && a.left === b.left && a.bottom === b.bottom && a.right === b.right\n\n/** Merges the last range of the selection into one cell. */\nfunction mergeSelection() {\n const b = merges.value.expand(lastBounds())\n // the values only the top left one keeps\n let lost = 0\n for (let row = b.top; row <= b.bottom; row++)\n for (let col = b.left; col <= b.right; col++)\n if ((row !== b.top || col !== b.left) && !isBlank(sheet.value.cells[row]?.[col])) lost++\n const changed = transact((tr) => tr.mergeCells(b), { action: 'merge' })\n if (!changed) return\n setSelection(selectCell({ row: b.top, col: b.left }))\n const range = rangeName(b)\n if (lost) {\n const text = format(messages.value.mergedCleared, { range, count: lost })\n showNotice(text)\n announce(text)\n } else announce(format(messages.value.merged, { range }))\n}\n\n/** Splits the merged cells the last range of the selection touches. */\nfunction unmergeSelection() {\n const b = lastBounds()\n if (transact((tr) => tr.unmergeCells(b), { action: 'merge' }))\n announce(format(messages.value.unmerged, { range: rangeName(b) }))\n}\n\n// How the selection looks ------------------------------------------------------------------\n\nconst NO_STYLE: SheetStyle = Object.freeze({})\n\nconst STYLE_KEYS: [string, StyleToggle][] = [\n ['mod+b', 'bold'],\n ['mod+i', 'italic'],\n ['mod+u', 'underline'],\n ['mod+shift+x', 'strike'],\n]\n\n/** A cell's style, or `{}`; a merged cell has its top left cell's. */\nfunction styleAt(point: SheetPoint): SheetStyle {\n const at = merges.value.size ? merges.value.anchor(point) : point\n const name = cellOf(sheet.value.cells[at.row]?.[at.col])?.style\n return (name && doc.value.styles?.[name]) || NO_STYLE\n}\n\n/** A cell's number or date format; a merged cell has its top left cell's. */\nfunction formatAt(point: SheetPoint) {\n const at = merges.value.size ? merges.value.anchor(point) : point\n return cellOf(sheet.value.cells[at.row]?.[at.col])?.format\n}\n\n/** Runs `run` on each selected range, kept inside the sheet, as one change. */\nfunction changeSelected(run: (tr: SheetTransaction, b: SheetBounds) => void) {\n if (viewOnly.value) {\n announce(messages.value.readonly)\n return false\n }\n return !!transact(\n (tr) => {\n for (const range of selection.value.ranges) {\n const b = boundsOf(range)\n run(tr, {\n top: Math.max(0, b.top),\n left: Math.max(0, b.left),\n bottom: Math.min(rowCount.value - 1, b.bottom),\n right: Math.min(colCount.value - 1, b.right),\n })\n }\n },\n { action: 'style' },\n )\n}\n\nconst styleSelection = (patch: SheetStylePatch | null) =>\n changeSelected((tr, b) => tr.styleCells(b, patch))\n\n// Protection -----------------------------------------------------------------------------\n\n/** Whether the active cell is locked, which it is unless its style says otherwise. */\nconst activeLocked = computed(() => styleAt(active.value).locked !== false)\n\n/** Locks the selected cells, or unlocks them, for when the sheet is protected. */\nfunction lockSelection(locked: boolean) {\n if (!changeSelected((tr, b) => tr.styleCells(b, { locked: locked ? undefined : false }))) return\n const m = messages.value.protect\n announce(locked ? m.locked : m.unlocked)\n}\n\n/** Protects the sheet shown, or stops protecting it. */\nfunction toggleSheetProtection() {\n if (viewOnly.value) return announce(messages.value.readonly)\n const on = !sheet.value.protect\n const name = sheet.value.name\n if (!transact((tr) => tr.protectSheet(on), { action: 'protect' })) return\n const m = messages.value.protect\n announce(format(on ? m.sheetProtected : m.sheetUnprotected, { name }))\n}\n\n/** Protects the workbook's sheets from being added, removed, moved or renamed, or stops it. */\nfunction toggleBookProtection() {\n if (viewOnly.value) return announce(messages.value.readonly)\n const on = !doc.value.protect\n if (!transact((tr) => tr.updateBook({ protect: on || undefined }), { action: 'protect' })) return\n const m = messages.value.protect\n announce(on ? m.bookProtected : m.bookUnprotected)\n}\n\nconst formatSelection: SheetContext['formatSelection'] = (to) =>\n changeSelected((tr, b) => tr.formatCells(b, to))\n\nconst clearFormatting = () =>\n changeSelected((tr, b) => {\n tr.styleCells(b, null)\n tr.formatCells(b, undefined)\n })\n\ntype StyleToggle = 'bold' | 'italic' | 'underline' | 'strike'\n\n/** Turns bold (or another) on for the selection, or off when the active cell has it. */\nfunction toggleStyle(name: StyleToggle) {\n const on = !styleAt(active.value)[name]\n if (!styleSelection({ [name]: on || undefined })) return\n announce(\n format(on ? messages.value.styleOn : messages.value.styleOff, { name: messages.value[name] }),\n )\n}\n\n/** Whether the selection touches merged cells, and whether it could be merged. */\nconst merged = computed(() => merges.value.touching(lastBounds()).length > 0)\nconst canMerge = computed(() => {\n const b = lastBounds()\n const touched = merges.value.touching(b)\n return (\n !(touched.length === 1 && sameBounds(touched[0]!, b)) &&\n (b.top !== b.bottom || b.left !== b.right) &&\n selection.value.ranges.length === 1\n )\n})\n\n/** The items with a line above the first. */\nconst dividedFirst = (list: SheetMenuItem[]) =>\n list.map((item, i) => (i === 0 ? { ...item, divided: true } : item))\n\n/** Where the menu opens: whole rows or columns selected count as their header. */\nfunction menuArea(area: Hit['area']): SheetMenuContext['area'] {\n if (area !== 'cell') return area\n const b = lastBounds()\n if (selection.value.ranges.length === 1 && inBounds(b, active.value.row, active.value.col)) {\n const rowsAll = whole(b, 'row')\n const colsAll = whole(b, 'col')\n if (rowsAll && !colsAll) return 'row'\n if (colsAll && !rowsAll) return 'col'\n if (rowsAll && colsAll) return 'corner'\n }\n return 'cell'\n}\n\nfunction openMenu(at: Hit['area'], x: number, y: number) {\n const area = menuArea(at)\n const where = { area, selection: selection.value, sheet: sheetIndex.value }\n const own = menuFor(area).map(fromCommand)\n const added = resolved.value.menus.flatMap((items) => items(context, where)).map(fromCommand)\n const items = added.length && own.length ? [...added, ...dividedFirst(own)] : [...added, ...own]\n menuItems.value = props.menu ? props.menu(items, where).map(fromCommand) : items\n if (menuItems.value.length) menu.value?.open(x, y)\n}\n\nfunction runMenuItem(key: unknown) {\n const find = (list: SheetMenuItem[]): SheetMenuItem | undefined => {\n for (const item of list) {\n if (item.key === key) return item\n const child = item.children && find(item.children)\n if (child) return child\n }\n }\n find(menuItems.value)?.run?.()\n if (lastPointer !== 'touch') focusGrid()\n}\n\nfunction onContextMenu(event: MouseEvent) {\n // the editor keeps the browser's menu, for its text\n if (editing.value) return\n event.preventDefault()\n // a long press opens the menu when the finger lifts\n if (lastPointer === 'touch') return\n openMenu(hitAt(event.clientX, event.clientY).area, event.clientX, event.clientY)\n}\n\n/** Opens the menu at the active cell, for the menu key and Shift+F10. */\nfunction openMenuAtActive() {\n scrollToPoint(active.value)\n const rect = cellRect(active.value)\n const box = viewport.value!.getBoundingClientRect()\n openMenu('cell', box.left + rect.x + rect.width / 2, box.top + rect.y + rect.height)\n}\n\n// Pointer --------------------------------------------------------------------------------\n\ninterface Hit {\n area: 'cell' | 'col' | 'row' | 'corner'\n row: number\n col: number\n /** Where the point is in the sheet, past the headers and with scrolling, in px. */\n x: number\n y: number\n}\n\n/** What is under a point of the page; outside the grid, the nearest cell. */\nfunction hitAt(clientX: number, clientY: number): Hit {\n const el = viewport.value!\n const rect = el.getBoundingClientRect()\n const x = clientX - rect.left - el.clientLeft\n const y = clientY - rect.top - el.clientTop\n const cx = x - headerWidth.value\n const cy = y - headerHeight.value\n const sx = cx < frozenWidth.value ? cx : cx + scroll.value.left\n const sy = cy < frozenHeight.value ? cy : cy + scroll.value.top\n const col = cols.value.indexAt(sx)\n const row = rows.value.indexAt(sy)\n const inCol = cx < 0\n const inRow = cy < 0\n return {\n area: inCol && inRow ? 'corner' : inRow ? 'col' : inCol ? 'row' : 'cell',\n row,\n col,\n x: sx,\n y: sy,\n }\n}\n\n/** How close to the edge between two headers a press resizes, in px. */\nconst EDGE_GRAB = { mouse: 4, touch: 10 }\n\n/** The row (or column) whose far edge is at a point of the headers; `null` when none is. */\nfunction edgeAt(hit: Hit, touch: boolean): { axis: SheetAxisName; index: number } | null {\n if (hit.area !== 'col' && hit.area !== 'row') return null\n const axis: SheetAxisName = hit.area\n const lines = axis === 'col' ? cols.value : rows.value\n const at = axis === 'col' ? hit.x : hit.y\n const index = axis === 'col' ? hit.col : hit.row\n const grab = EDGE_GRAB[touch ? 'touch' : 'mouse']\n if (Math.abs(lines.offset(index + 1) - at) <= grab) return { axis, index }\n if (index > 0 && Math.abs(at - lines.offset(index)) <= grab) return { axis, index: index - 1 }\n return null\n}\n\n/** Whether a header is one of the rows (or columns) selected end to end, which drag to move. */\nfunction onSelectedLine(hit: Hit) {\n if (hit.area !== 'col' && hit.area !== 'row') return false\n if (selection.value.ranges.length !== 1) return false\n const b = lastBounds()\n const axis = hit.area\n return (\n whole(b, axis) &&\n (axis === 'col'\n ? hit.col >= b.left && hit.col <= b.right\n : hit.row >= b.top && hit.row <= b.bottom)\n )\n}\n\ninterface Drag {\n pointerId: number\n mode: Hit['area'] | 'fill' | 'resize' | 'move' | 'point'\n touch: boolean\n started: boolean\n /** Whether the drag changed anything, so a long press without it opens the menu. */\n moved: boolean\n x0: number\n y0: number\n clientX: number\n clientY: number\n /** Resizing: the line and its size when the press started. */\n axis?: SheetAxisName\n index?: number\n size0?: number\n /** Moving lines: where they would go. */\n to?: number\n}\n\nconst drag = shallowRef<Drag | null>(null)\nlet hold: PointerHold | undefined\nlet pressTimer: ReturnType<typeof setTimeout> | undefined\nlet frame = 0\n/** A tap, kept from `pointerup` for the `click` that follows it. */\nlet tap: Hit | null = null\nlet lastPointer: string = 'mouse'\n/** Whether the pointer rests on an edge between headers, for the cursor. */\nconst edgeHover = ref<SheetAxisName | null>(null)\n\nconst THRESHOLD = { mouse: 3, touch: 8 }\n/** How long a finger rests on a cell before dragging selects, in ms. */\nconst LONG_PRESS = 400\n/** How close to the edge a drag starts scrolling, in px. */\nconst EDGE = 32\nconst edgeSpeed = (gap: number) => (gap < EDGE ? Math.ceil(((EDGE - gap) / EDGE) * 20) : 0)\n\nfunction startDrag(event: PointerEvent, init: Partial<Drag> & Pick<Drag, 'mode' | 'started'>) {\n drag.value = {\n pointerId: event.pointerId,\n touch: event.pointerType === 'touch',\n moved: false,\n x0: event.clientX,\n y0: event.clientY,\n clientX: event.clientX,\n clientY: event.clientY,\n ...init,\n }\n hold?.release()\n hold = holdPointer(event, root.value)\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n window.addEventListener('pointercancel', onPointerCancel)\n}\n\nfunction onPointerDown(event: PointerEvent) {\n touching.value = event.pointerType === 'touch'\n const el = viewport.value\n if (!el || (event.button !== 0 && event.button !== 2)) return\n lastPointer = event.pointerType\n const rect = el.getBoundingClientRect()\n // the scrollbars\n if (\n event.clientX - rect.left - el.clientLeft >= el.clientWidth ||\n event.clientY - rect.top - el.clientTop >= el.clientHeight\n )\n return\n const hit = hitAt(event.clientX, event.clientY)\n if (editing.value && hit.area === 'cell' && event.button === 0 && pointable()) {\n // writing a formula: the cell pressed goes into it, and the input keeps the focus\n event.preventDefault()\n lastPointer = event.pointerType\n const point = { row: hit.row, col: hit.col }\n if (event.pointerType === 'touch') {\n // a finger that moves scrolls; a tap points\n startDrag(event, { mode: 'point', started: false })\n return\n }\n pointTo(event.shiftKey && pointing.value ? pointing.value.anchor : point, point)\n startDrag(event, { mode: 'point', started: true })\n frame = requestAnimationFrame(autoScroll)\n return\n }\n if (editing.value) commitEdit(undefined, true)\n const touch = event.pointerType === 'touch'\n if (event.button === 2) {\n // a right click keeps a selection it lands in\n const inside =\n hit.area === 'corner' ||\n (hit.area === 'cell' && selectedBounds.value.some((b) => inBounds(b, hit.row, hit.col))) ||\n onSelectedLine(hit)\n if (!inside) press(hit, event)\n focusGrid()\n return\n }\n const edge = viewOnly.value ? null : edgeAt(hit, touch)\n if (edge) {\n // dragging the edge between two headers resizes the row (or column) before it\n event.preventDefault()\n const lines = edge.axis === 'col' ? cols.value : rows.value\n startDrag(event, { mode: 'resize', started: true, ...edge, size0: lines.size(edge.index) })\n hold?.grab()\n focusGrid()\n return\n }\n if (!touch) {\n // keeps the focus where it is and stops text from being selected\n event.preventDefault()\n focusGrid()\n // Ctrl / ⌘ + click follows a link instead of adding the cell to the selection\n if (hit.area === 'cell' && (event.ctrlKey || event.metaKey) && !event.shiftKey) {\n const point = noteHome(hit)\n if (linkTarget(linkAt(point))) return void followLink(point)\n }\n if (\n !viewOnly.value &&\n onSelectedLine(hit) &&\n !event.shiftKey &&\n !event.ctrlKey &&\n !event.metaKey\n ) {\n // selected rows (or columns) move once dragged; a plain click still selects\n startDrag(event, { mode: 'move', started: false, axis: hit.area as SheetAxisName })\n return\n }\n press(hit, event)\n }\n startDrag(event, { mode: hit.area, started: !touch })\n if (touch) {\n pressTimer = setTimeout(() => {\n const d = drag.value\n if (!d || d.started) return\n d.started = true\n hold?.grab()\n navigator.vibrate?.(8)\n const at = hitAt(d.x0, d.y0)\n if (!viewOnly.value && onSelectedLine(at)) {\n // held on selected rows (or columns): dragging moves them\n d.mode = 'move'\n d.axis = at.area as SheetAxisName\n } else {\n // held still: select from here by dragging\n press(at, { shiftKey: false, ctrlKey: false, metaKey: false })\n }\n frame = requestAnimationFrame(autoScroll)\n }, LONG_PRESS)\n } else frame = requestAnimationFrame(autoScroll)\n}\n\n/** Pressing the fill handle starts filling at once, also with a finger. */\nfunction onFillDown(event: PointerEvent) {\n if (event.button !== 0) return\n event.preventDefault()\n event.stopPropagation()\n lastPointer = event.pointerType\n const b = lastBounds()\n const hit = hitAt(event.clientX, event.clientY)\n fillGrab = {\n x: hit.x - cols.value.offset(b.right + 1),\n y: hit.y - rows.value.offset(b.bottom + 1),\n }\n fillAxis = null\n startDrag(event, { mode: 'fill', started: true })\n hold?.grab()\n fillTarget.value = null\n frame = requestAnimationFrame(autoScroll)\n}\n\n/** Selects what a press lands on, as Shift and Ctrl / ⌘ say. */\nfunction press(hit: Hit, keys: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean }) {\n const sel = selection.value\n const last = sel.ranges[sel.ranges.length - 1]!\n const lastRow = rowCount.value - 1\n const lastCol = colCount.value - 1\n if (hit.area === 'corner') return selectAll()\n const range = (start: SheetPoint, end: SheetPoint): SheetRange =>\n hit.area === 'col'\n ? { start: { row: 0, col: start.col }, end: { row: lastRow, col: end.col } }\n : hit.area === 'row'\n ? { start: { row: start.row, col: 0 }, end: { row: end.row, col: lastCol } }\n : { start, end }\n const point = { row: hit.row, col: hit.col }\n if (keys.shiftKey) {\n setSelection({\n active: sel.active,\n ranges: [...sel.ranges.slice(0, -1), range(last.start, point)],\n })\n return\n }\n const fresh = range(point, point)\n // a whole column (or row) starts at its first cell\n setSelection({\n active:\n hit.area === 'col'\n ? { row: 0, col: hit.col }\n : hit.area === 'row'\n ? { row: hit.row, col: 0 }\n : point,\n ranges: keys.ctrlKey || keys.metaKey ? [...sel.ranges, fresh] : [fresh],\n })\n}\n\nfunction onPointerMove(event: PointerEvent) {\n const d = drag.value\n if (!d || event.pointerId !== d.pointerId) return\n d.clientX = event.clientX\n d.clientY = event.clientY\n if (d.mode === 'fill') fillInvert.value = event.ctrlKey || event.metaKey || event.altKey\n if (!d.started) {\n const far = Math.hypot(event.clientX - d.x0, event.clientY - d.y0)\n if (d.touch) {\n // a finger that moves before resting scrolls instead\n if (far > THRESHOLD.touch) stopDrag()\n return\n }\n if (far <= THRESHOLD.mouse) return\n d.started = true\n frame = requestAnimationFrame(autoScroll)\n }\n if (d.mode === 'resize') {\n const delta = d.axis === 'col' ? event.clientX - d.x0 : event.clientY - d.y0\n sizing.value = {\n axis: d.axis!,\n index: d.index!,\n size: Math.max(0, Math.round(d.size0! + delta)),\n }\n d.moved = true\n return\n }\n dragTo(hitAt(event.clientX, event.clientY))\n}\n\n/** Follows a drag to what is under the pointer. */\nfunction dragTo(hit: Hit) {\n const d = drag.value!\n if (d.mode === 'corner' || d.mode === 'resize') return\n if (d.mode === 'point') {\n const p = pointing.value\n if (p && (p.point.row !== hit.row || p.point.col !== hit.col))\n pointTo(p.anchor, { row: hit.row, col: hit.col })\n d.moved = true\n return\n }\n if (d.mode === 'fill') {\n fillTarget.value = fillTo(hit)\n d.moved = true\n return\n }\n if (d.mode === 'move') {\n // before the line under the pointer, or after it past its middle\n const axis = d.axis!\n const lines = axis === 'col' ? cols.value : rows.value\n const index = axis === 'col' ? hit.col : hit.row\n const at = axis === 'col' ? hit.x : hit.y\n const middle = lines.offset(index) + lines.size(index) / 2\n d.to = at < middle ? index : index + 1\n drag.value = { ...d }\n d.moved = true\n return\n }\n const sel = selection.value\n const last = sel.ranges[sel.ranges.length - 1]!\n const end =\n d.mode === 'col'\n ? { row: rowCount.value - 1, col: hit.col }\n : d.mode === 'row'\n ? { row: hit.row, col: colCount.value - 1 }\n : { row: hit.row, col: hit.col }\n if (end.row === last.end.row && end.col === last.end.col) return\n d.moved = true\n setSelection({\n active: sel.active,\n ranges: [...sel.ranges.slice(0, -1), { start: last.start, end }],\n })\n}\n\n/** Where lines being moved would go, as a line between headers. */\nconst moveMark = computed(() => {\n const d = drag.value\n if (d?.mode !== 'move' || !d.started || d.to == null) return null\n const { from, count } = linesOf(d.axis!)\n if (d.to >= from && d.to <= from + count) return null\n const b =\n d.axis === 'col'\n ? { top: 0, bottom: rowCount.value - 1, left: d.to, right: d.to }\n : { top: d.to, bottom: d.to, left: 0, right: colCount.value - 1 }\n const lines = d.axis === 'col' ? cols.value : rows.value\n if (d.to >= lines.count) {\n // past the last line: the far edge of the last one\n if (d.axis === 'col') b.left = b.right = lines.count - 1\n else b.top = b.bottom = lines.count - 1\n }\n const rect = rangeRect(b)\n if (!rect) return null\n const end = d.to >= lines.count\n return d.axis === 'col'\n ? { x: rect.x + (end ? rect.width : 0) - 1, y: 0, width: 2, height: viewHeight.value }\n : { x: 0, y: rect.y + (end ? rect.height : 0) - 1, width: viewWidth.value, height: 2 }\n})\n\n/** Where a row (or column) being resized ends, as a line across the grid. */\nconst sizeMark = computed(() => {\n const s = sizing.value\n if (!s) return null\n const b =\n s.axis === 'col'\n ? { top: 0, bottom: 0, left: s.index, right: s.index }\n : { top: 0, bottom: 0, left: 0, right: 0 }\n if (s.axis === 'col') {\n const rect = rangeRect(b)\n const right =\n headerWidth.value +\n cols.value.offset(s.index + 1) -\n (s.index >= frozen.value.cols ? scroll.value.left : 0)\n return rect || right > 0 ? { x: right - 1, y: 0, width: 1, height: viewHeight.value } : null\n }\n const bottom =\n headerHeight.value +\n rows.value.offset(s.index + 1) -\n (s.index >= frozen.value.rows ? scroll.value.top : 0)\n return { x: 0, y: bottom - 1, width: viewWidth.value, height: 1 }\n})\n\nfunction autoScroll() {\n const d = drag.value\n const el = viewport.value\n if (!d?.started || !el || d.mode === 'resize') return\n const rect = el.getBoundingClientRect()\n const left = rect.left + el.clientLeft + headerWidth.value + frozenWidth.value\n const top = rect.top + el.clientTop + headerHeight.value + frozenHeight.value\n const right = rect.left + el.clientLeft + el.clientWidth\n const bottom = rect.top + el.clientTop + el.clientHeight\n // a fill scrolls only the way it is going, not along an edge the finger passes near\n const across =\n d.mode === 'fill'\n ? fillAxis === 'col'\n : d.mode !== 'row' && !(d.mode === 'move' && d.axis === 'row')\n const along =\n d.mode === 'fill'\n ? fillAxis === 'row'\n : d.mode !== 'col' && !(d.mode === 'move' && d.axis === 'col')\n const dx = across ? edgeSpeed(right - d.clientX) || -edgeSpeed(d.clientX - left) : 0\n const dy = along ? edgeSpeed(bottom - d.clientY) || -edgeSpeed(d.clientY - top) : 0\n if (dx || dy) {\n el.scrollLeft += dx\n el.scrollTop += dy\n onScroll()\n dragTo(hitAt(d.clientX, d.clientY))\n }\n frame = requestAnimationFrame(autoScroll)\n}\n\nfunction onPointerUp(event: PointerEvent) {\n const d = drag.value\n if (!d || event.pointerId !== d.pointerId) return\n const invert = event.ctrlKey || event.metaKey || event.altKey\n stopDrag()\n switch (d.mode) {\n case 'resize': {\n const s = sizing.value\n sizing.value = null\n if (!s || !d.moved) return\n const base = s.axis === 'col' ? props.colWidth : props.rowHeight\n // dragged almost shut: hidden\n const size = s.size < 4 ? 0 : s.size\n resizeLines(s.axis, s.index, size === base ? undefined : size)\n return\n }\n case 'fill': {\n const target = fillTarget.value\n fillTarget.value = null\n if (target) finishFill(target, invert)\n return\n }\n case 'point':\n if (!d.started) {\n const hit = hitAt(d.x0, d.y0)\n if (hit.area === 'cell')\n pointTo({ row: hit.row, col: hit.col }, { row: hit.row, col: hit.col })\n }\n return\n case 'move':\n if (d.started && d.to != null) return moveSelectedLines(d.axis!, d.to)\n if (!d.touch) {\n // a click on a selected header selects just that one\n press(hitAt(d.x0, d.y0), { shiftKey: false, ctrlKey: false, metaKey: false })\n announceRange()\n }\n return\n }\n if (d.touch && !d.started) tap = hitAt(d.x0, d.y0)\n else if (d.touch && !d.moved) {\n // held without dragging: the menu, where the finger was\n openMenu(hitAt(d.x0, d.y0).area, d.x0, d.y0)\n return\n }\n if (d.started) announceRange()\n}\n\nfunction stopDrag() {\n clearTimeout(pressTimer)\n cancelAnimationFrame(frame)\n hold?.release()\n hold = undefined\n drag.value = null\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n window.removeEventListener('pointercancel', onPointerCancel)\n}\n\nfunction onPointerCancel() {\n sizing.value = null\n fillTarget.value = null\n stopDrag()\n}\n\n/** The cursor over the edges between headers, which resize. */\nfunction onHover(event: PointerEvent) {\n if (event.pointerType !== 'mouse' || drag.value) return\n hoverNote(event)\n if (viewOnly.value) return\n const edge = edgeAt(hitAt(event.clientX, event.clientY), false)\n edgeHover.value = edge?.axis ?? null\n}\n\nfunction onLeave() {\n edgeHover.value = null\n if (noteShown.value?.by === 'hover') hideNote(NOTE_HIDE)\n}\n\n/** A tap selects a cell; a tap on the cell already selected edits it. */\nfunction onClick(event: MouseEvent) {\n const touched = tap\n tap = null\n // a cell type's switch, such as a check box; a mouse selected its cell on the press\n const toggle = event.target instanceof Element && event.target.closest('[data-sheet-toggle]')\n const point = toggle && !event.shiftKey ? cellOfElement(toggle) : null\n if (point) {\n if (touched)\n press({ ...touched, ...point }, { shiftKey: false, ctrlKey: false, metaKey: false })\n toggleCells(point)\n focusGrid()\n return\n }\n if (!touched) {\n // a click on a cell with a thread opens it beside the cell\n if (event.shiftKey || event.ctrlKey || event.metaKey) return\n const at = hitAt(event.clientX, event.clientY)\n if (at.area === 'cell') comments.show(at)\n return\n }\n const hit = touched\n const sel = selection.value\n const single = sel.ranges.length === 1 && boundsOf(sel.ranges[0]!)\n const again =\n hit.area === 'cell' &&\n single &&\n single.top === single.bottom &&\n single.left === single.right &&\n sel.active.row === hit.row &&\n sel.active.col === hit.col\n if (again && !viewOnly.value) {\n hideNote()\n // inside the tap, so phones show their keyboard\n editActive()\n return\n }\n press(hit, { shiftKey: false, ctrlKey: false, metaKey: false })\n focusGrid()\n announce(activeLabel.value)\n const home = hit.area === 'cell' ? noteHome(hit) : null\n // tapping a cell with a thread opens it\n if (home) comments.show(home)\n if (home && openThreadAt(home)) return\n // a finger can't rest on a cell: tapping one shows its note, or what it held\n if (home && tipAt(home)) {\n clearTimeout(noteTimer)\n noteShown.value = { ...home, by: 'tap' }\n }\n}\n\n/** The cell an element is drawn in, read from the grid's row and column numbers. */\nfunction cellOfElement(el: Element): SheetPoint | null {\n const cell = el.closest('[role=\"gridcell\"]')\n const row = cell?.parentElement?.getAttribute('aria-rowindex')\n const col = cell?.getAttribute('aria-colindex')\n if (!row || !col) return null\n const first = props.headers ? 2 : 1\n // a merged cell can be drawn in a row or column after its own\n return merges.value.anchor({ row: Number(row) - first, col: Number(col) - first })\n}\n\nfunction onDblClick(event: MouseEvent) {\n const hit = hitAt(event.clientX, event.clientY)\n const edge = viewOnly.value ? null : edgeAt(hit, lastPointer === 'touch')\n if (edge) return autofit(edge.axis, edge.index)\n if (lastPointer === 'touch' || hit.area !== 'cell') return\n // the click on a switch already switched it\n if (event.target instanceof Element && event.target.closest('[data-sheet-toggle]')) return\n select(selectCell({ row: hit.row, col: hit.col }))\n editActive()\n}\n\n/** Fits a row (or column), or every selected one when it is among them, to its contents. */\nfunction autofit(axis: SheetAxisName, index: number) {\n const b = lastBounds()\n const selected =\n whole(b, axis) &&\n (axis === 'row' ? index >= b.top && index <= b.bottom : index >= b.left && index <= b.right)\n const [from, to] = selected\n ? axis === 'row'\n ? [b.top, b.bottom]\n : [b.left, b.right]\n : [index, index]\n transact(\n (tr) => {\n for (let i = from; i <= to; i++) tr.setSize(axis, i, fitSize(axis, i))\n },\n { action: 'resize' },\n )\n}\n\n/**\n * Focuses the grid: the hidden input that takes typing, so that an input\n * method can start on any cell. A finger focuses the grid itself instead,\n * so the keyboard only comes up for editing.\n */\nfunction focusGrid() {\n const target = lastPointer === 'touch' ? viewport.value : editor.value\n if (target && document.activeElement !== target) target.focus({ preventScroll: true })\n}\n\nonBeforeUnmount(stopDrag)\n\n// Announcements --------------------------------------------------------------------------\n\nconst live = ref('')\n/** Set while a cancelled change is being told of, so what follows doesn't say it was made. */\nlet refusing = false\nfunction announce(text: string) {\n if (refusing) return\n live.value = ''\n void nextTick(() => (live.value = text))\n}\nconst keysHint = `${uid}-keys`\nconst promptId = `${uid}-prompt`\n/** The active cell's rule's hint, shown under it while nothing covers it. */\n/** Width of the hint beside the active cell, at most. */\nconst HINT_WIDTH = 240\n/** The narrowest the hint gets beside the cell before it moves under it. */\nconst HINT_MIN = 160\n/** About how tall a two-line hint is, to tell whether it fits under the cell. */\nconst HINT_HEIGHT = 64\n/**\n * What the active cell's hint says: why its value doesn't fit (there is no\n * hover on touch), and its rule's prompt. It sits right of the cell, clear\n * of the cells below, or under it when there is no room.\n */\nconst prompt = computed(() => {\n if (drag.value?.started || panelType.value) return null\n const at = active.value\n const c = checks.value\n const text = c.empty ? undefined : c.ruleAt(at.row, at.col)?.prompt\n let problem: string | undefined\n if (!editing.value) {\n const here = cellView(at.row, at.col, sheet.value.cells[at.row], cols.value.size(at.col))\n if (here.invalid) problem = here.problem\n }\n if (!text && !problem) return null\n const rect = visibleRect(at)\n if (!rect) return null\n const right = rect.x + rect.width + 4\n const room = viewWidth.value - right - 8\n if (room >= HINT_MIN)\n return { text, problem, x: right, y: rect.y, width: Math.min(HINT_WIDTH, room), shift: '' }\n // Under the cell (over it near the bottom), as wide as the view allows; near\n // the right edge it lines up with the cell's right side and reaches left.\n const width = Math.min(HINT_WIDTH, viewWidth.value - 8)\n const fromLeft = rect.x + width <= viewWidth.value - 4\n const x = fromLeft ? Math.max(4, rect.x) : Math.min(rect.x + rect.width, viewWidth.value - 4)\n const below = rect.y + rect.height + 4\n const above = below + HINT_HEIGHT > viewHeight.value && rect.y - HINT_HEIGHT >= headerHeight.value\n const shift = `translate(${fromLeft ? 0 : '-100%'},${above ? '-100%' : 0})`\n return { text, problem, x, y: above ? rect.y - 4 : below, width, shift }\n})\n// Each line is its own reference, so a screen reader pauses between them.\nconst describedBy = computed(() => {\n const p = prompt.value\n if (!p) return keysHint\n let ids = keysHint\n if (p.problem) ids += ` ${promptId}-problem`\n if (p.text) ids += ` ${promptId}-text`\n return ids\n})\n\n// Extensions -----------------------------------------------------------------------------\n\n/** Where a cell is drawn now, or `null` while it is out of view. */\nfunction visibleRect(point: SheetPoint) {\n const rect = cellRect(point)\n if (\n rect.width <= 0 ||\n rect.height <= 0 ||\n rect.x + rect.width <= headerWidth.value ||\n rect.y + rect.height <= headerHeight.value ||\n rect.x >= viewWidth.value ||\n rect.y >= viewHeight.value\n )\n return null\n return rect\n}\n\nfunction forEachSelected(callback: (point: SheetPoint) => void) {\n const seen = new Set<string>()\n const m = merges.value\n for (const range of selection.value.ranges) {\n const b = boundsOf(range)\n const bottom = Math.min(b.bottom, rowCount.value - 1)\n const right = Math.min(b.right, colCount.value - 1)\n for (let row = b.top; row <= bottom; row++)\n for (let col = b.left; col <= right; col++) {\n const point = m.size ? m.anchor({ row, col }) : { row, col }\n const key = `${point.row}:${point.col}`\n if (seen.has(key)) continue\n seen.add(key)\n callback(point)\n }\n }\n}\n\n// Find and replace -------------------------------------------------------------------------\n\nconst findOpen = ref(false)\nconst findReplacing = ref(false)\nconst findQuery = ref<SheetSearchQuery>({ search: '' })\nconst findPanel = ref<InstanceType<typeof DouFindReplace>>()\n/** The matches, in order of sheet, row and column. */\nconst found = shallowRef<SheetMatch[]>([])\nconst foundCapped = ref(false)\n/** At most this many matches are kept, so a search over a huge workbook stays quick. */\nconst FIND_LIMIT = 10_000\n\n/** The rows and columns a sheet doesn't show: hidden, filtered out or folded away. */\nfunction hiddenLinesOf(data: SheetData) {\n if (data === sheet.value) return { rows: shownRowSizes.value, cols: shownColSizes.value }\n const g = shownGroupsOf(data)\n return {\n rows: hideIn(data.rowSizes ?? NO_SIZES, rowsFilteredOut(undefined, data), g.rows.hidden),\n cols: hideIn(data.colSizes ?? NO_SIZES, g.cols.hidden),\n }\n}\n\n/** A cell's text as its editor would start with it: a formula, or the value as typed. */\nfunction inputTextOf(data: SheetData, input: SheetCellInput) {\n const value = valueOf(input)\n const cell = cellOf(input)\n const typed = cell?.type ? resolveCellType(cell, doc.value, cellTypes.value) : undefined\n if (!typed) return inputText(value)\n const { definition, setup } = typed\n const text = definition.edit\n ? definition.edit(value, setup)\n : value == null\n ? undefined\n : definition.format?.(value, setup)\n return text ?? inputText(value)\n}\n\n/** Whether a cell is drawn as a switch, such as a checkbox: its value has no text to find. */\nfunction isToggle(input: SheetCellInput) {\n const cell = cellOf(input)\n return !!cell?.type && !!resolveCellType(cell, doc.value, cellTypes.value)?.definition.toggle\n}\n\n/** The cells that match a query, on the sheet shown or on every sheet, at most `limit` of them. */\nfunction findCells(query: SheetSearchQuery, limit = Infinity) {\n const test = cellMatcher(query)\n const out: SheetMatch[] = []\n if (!test) return { found: out, capped: false }\n const formulas = query.lookIn === 'formulas'\n const sheets = doc.value.sheets\n const list = query.scope === 'workbook' ? sheets.map((_, i) => i) : [sheetIndex.value]\n for (const index of list) {\n const data = sheets[index]\n if (!data) continue\n const key = sheetKey(data)\n const hidden = hiddenLinesOf(data)\n const spans = data === sheet.value ? merges.value : mergesOf(data)\n const { cells } = data\n for (let row = 0; row < cells.length; row++) {\n const line = cells[row]\n if (!line || hidden.rows[row] === 0) continue\n for (let col = 0; col < line.length; col++) {\n const input = line[col]\n if (isBlank(input) || hidden.cols[col] === 0) continue\n // the cells a merge covers don't show\n const span = spans.at(row, col)\n if (span && (span.top !== row || span.left !== col)) continue\n if (!formulas && isToggle(input)) continue\n const text = formulas ? inputTextOf(data, input) : cellText(input, { sheet: key, row, col })\n if (!test(text)) continue\n if (out.length >= limit) return { found: out, capped: true }\n out.push({ sheet: index, row, col })\n }\n }\n }\n return { found: out, capped: false }\n}\n\nlet findTimer = 0\n/** A search waits in `findTimer` for typing to pause. */\nconst findWaiting = ref(false)\n/** Whether the search waiting in `findTimer` previews its first match when it runs. */\nlet findPreview = false\nfunction runFind() {\n clearTimeout(findTimer)\n findTimer = 0\n findWaiting.value = false\n const preview = findPreview\n findPreview = false\n if (!findQuery.value.search) {\n found.value = []\n foundCapped.value = false\n return\n }\n const result = findCells(findQuery.value, FIND_LIMIT)\n found.value = result.found\n foundCapped.value = result.capped\n if (preview) previewFound()\n}\n/** Looks again a little later, so typing or a run of edits doesn't search on every change. */\nfunction scheduleFind(delay = 120, preview = false) {\n clearTimeout(findTimer)\n findPreview ||= preview\n findWaiting.value ||= preview\n findTimer = window.setTimeout(runFind, delay)\n}\nonBeforeUnmount(() => clearTimeout(findTimer))\n\n/** Goes to the first match from the active cell on, unless the active cell is one. */\nfunction previewFound() {\n if (found.value.length && currentFound.value < 0) goToFound(foundFrom(found.value, here()))\n}\n\n/** Up to this many cells are searched as each key is typed; past it, once typing stops. */\nconst FIND_AT_ONCE = 20_000\n/** About how many cells a query goes through. */\nfunction findSize(query: SheetSearchQuery) {\n const sheets = query.scope === 'workbook' ? doc.value.sheets : [sheet.value]\n let size = 0\n for (const data of sheets) size += data.cells.length * (data.cells[0]?.length ?? 1)\n return size\n}\n\nwatch(findQuery, (query, old) => {\n if (!findOpen.value) return\n const { replace: _new, ...look } = query\n const { replace: _old, ...looked } = old\n // only the replacement changed: there is nothing to look for again\n if (JSON.stringify(look) === JSON.stringify(looked)) return\n // a new search, or new options, show the first match from the active cell on, as a preview;\n // in a big workbook typing waits for a pause, so no key waits for the search\n if (query.search !== old.search && findSize(query) > FIND_AT_ONCE) scheduleFind(150, true)\n else {\n findPreview = true\n runFind()\n }\n})\n// the cells change, or another sheet shows: the matches are looked for again\nwatch([doc, engineId, sheetIndex, filteredRows, groups, viewFolds], () => {\n if (findOpen.value && findQuery.value.search) scheduleFind()\n})\n\n/** The active cell, as a place among the matches. */\nconst here = (): SheetMatch => ({ sheet: sheetIndex.value, ...active.value })\n\n/** Which match the active cell is on; `-1` when it is on none. */\nconst currentFound = computed(() => {\n const list = found.value\n const i = foundFrom(list, here())\n const f = list[i]\n return f &&\n f.sheet === sheetIndex.value &&\n f.row === active.value.row &&\n f.col === active.value.col\n ? i\n : -1\n})\n\n/** Selects a match, showing its sheet first when it is on another. */\nfunction goToFound(index: number) {\n const f = found.value[index]\n if (!f) return\n const point = { row: f.row, col: f.col }\n if (f.sheet !== sheetIndex.value) {\n showSheet(f.sheet)\n // the sheet puts back its own selection when it shows; this one comes after\n void nextTick(() => select(selectCell(point)))\n } else select(selectCell(point))\n}\n\n/** Goes to the next match; with the panel shut, or a search waiting, looks first. */\nfunction nextFound() {\n if (!findOpen.value || findTimer) runFind()\n const list = found.value\n if (!list.length) return false\n const i = currentFound.value\n goToFound(i >= 0 ? (i + 1) % list.length : foundFrom(list, here()))\n}\n\nfunction previousFound() {\n if (!findOpen.value || findTimer) runFind()\n const list = found.value\n if (!list.length) return false\n const i = currentFound.value\n const from = i >= 0 ? i : foundFrom(list, here())\n goToFound((from - 1 + list.length) % list.length)\n}\n\n/** Opens the panel, with the replace box for `replace`; a given query is put in. */\nfunction openFind(replace = false, given?: Partial<SheetSearchQuery>) {\n if (editing.value) commitEdit(undefined, true)\n if (given) findQuery.value = { ...findQuery.value, ...given }\n if ((replace || given?.replace !== undefined) && !viewOnly.value) findReplacing.value = true\n findOpen.value = true\n runFind()\n void nextTick(() => findPanel.value?.focus(replace && !viewOnly.value ? 'replace' : 'find'))\n return true\n}\n\nfunction closeFind() {\n if (!findOpen.value) return false\n clearTimeout(findTimer)\n findTimer = 0\n findWaiting.value = false\n findOpen.value = false\n focusGrid()\n return true\n}\n\n/** Why a match is left as it is when replacing; `'same'` when the replacement changes nothing. */\ntype ReplaceSkip = 'formula' | 'protected' | 'invalid' | 'shown' | 'same'\n\n/**\n * What replacing does to a cell: its new value, or why it stays. A\n * formula's result can't be replaced, only the formula with `lookIn: 'formulas'`.\n * Looking in values, the text a cell shows is tried too when what was typed\n * doesn't hold the match, as with `12.00` in a cell showing `¥12.00` for `12`;\n * the cell keeps its number format, so only text that reads back as a value\n * of the same kind can be put in.\n */\nfunction replacementAt(\n f: SheetMatch,\n checksFor: (data: SheetData) => SheetChecks,\n): { value: SheetValue; format?: string } | ReplaceSkip {\n const data = doc.value.sheets[f.sheet]!\n const input = data.cells[f.row]?.[f.col]\n const formulas = findQuery.value.lookIn === 'formulas'\n const value = valueOf(input)\n if (!formulas && typeof value === 'string' && value.startsWith('=')) return 'formula'\n // a locked cell of a protected sheet would cancel the whole change\n if (protectionOf(data) && isLocked(input, doc.value)) return 'protected'\n const cell = cellOf(input)\n const typed = cell?.type ? resolveCellType(cell, doc.value, cellTypes.value) : undefined\n const parse = (text: string) => typed?.definition.parse?.(text, typed.setup) ?? parseInput(text)\n const text = inputTextOf(data, input)\n let next = replaceInText(text, findQuery.value)\n let parsed: SheetInput\n if (next !== text) parsed = parse(next)\n else if (formulas || cellMatcher(findQuery.value)?.(text)) return 'same'\n else {\n const drawn = cellText(input, { sheet: sheetKey(data), row: f.row, col: f.col })\n next = replaceInText(drawn, findQuery.value)\n parsed = parse(next)\n const read = parsed.value ?? null\n if (next === drawn || typeof read !== typeof value || read === value) return 'shown'\n }\n if (refusal(f.row, f.col, parsed, data, checksFor(data))) return 'invalid'\n return { value: parsed.value ?? null, format: cell?.format ?? parsed.format }\n}\n\n/** Writes the replacements, as one change to undo. */\nfunction writeReplacements(list: readonly SheetMatch[]) {\n const writes: { at: SheetMatch; to: { value: SheetValue; format?: string } }[] = []\n const made = new Map<SheetData, SheetChecks>()\n const checksFor = (data: SheetData) => {\n if (data === sheet.value) return checks.value\n let c = made.get(data)\n if (!c) made.set(data, (c = checksOf(data)))\n return c\n }\n const skipped: Record<ReplaceSkip, number> = {\n formula: 0,\n protected: 0,\n invalid: 0,\n shown: 0,\n same: 0,\n }\n for (const f of list) {\n const to = replacementAt(f, checksFor)\n if (typeof to === 'string') skipped[to]++\n else writes.push({ at: f, to })\n }\n if (!writes.length) return { replaced: 0, skipped }\n transact(\n (tr) => {\n for (const { at, to } of writes)\n tr.updateCell(at, { value: to.value ?? undefined, format: to.format })\n },\n { action: 'replace' },\n )\n return { replaced: writes.length, skipped }\n}\n\n/** Says how many were replaced, and why any were left: shown as a notice then. */\nfunction tellReplaced(result: { replaced: number; skipped: Record<ReplaceSkip, number> }) {\n const m = messages.value.find\n const { formula, protected: locked, invalid, shown: onlyShown } = result.skipped\n const why = [\n formula && format(m.skippedFormula, { count: formula }),\n locked && format(m.skippedProtected, { count: locked }),\n invalid && format(m.skippedInvalid, { count: invalid }),\n onlyShown && format(m.skippedShown, { count: onlyShown }),\n ].filter(Boolean)\n const text = common('findReplace.replaced', { count: result.replaced }) + why.join('')\n if (why.length) showNotice(text)\n announce(text)\n}\n\n/** Replaces the match on the active cell and goes on to the next; first goes to one when it is on none. */\nfunction replaceFound() {\n if (viewOnly.value) return false\n const i = currentFound.value\n if (i < 0) return nextFound()\n const f = found.value[i]!\n const result = writeReplacements([f])\n if (!result.replaced && !result.skipped.same) tellReplaced(result)\n runFind()\n // on to the next match after this cell; the cell may still match, as with “a” → “aa”\n const list = found.value\n if (!list.length) return\n const after = foundFrom(list, { ...f, col: f.col + 1 })\n goToFound(after)\n}\n\n/** Replaces every match, also past those counted, as one change. */\nfunction replaceAllFound() {\n if (viewOnly.value) return false\n const list = foundCapped.value ? findCells(findQuery.value).found : found.value\n if (!list.length) return false\n tellReplaced(writeReplacements(list))\n runFind()\n}\n\n/** The matches in view, as boxes; the current one stands out. */\nconst foundRects = computed(() => {\n const list = found.value\n if (!findOpen.value || !list.length) return []\n void scroll.value\n const body = bodyRows.value\n // the matches are in order, so those below the rows drawn can stop the loop\n const lastRow = Math.max(body[body.length - 1] ?? 0, frozen.value.rows - 1)\n const current = currentFound.value\n const out: { key: string; rect: ViewRect; current: boolean }[] = []\n const index = sheetIndex.value\n for (let i = 0; i < list.length; i++) {\n const f = list[i]!\n if (f.sheet < index) continue\n if (f.sheet > index || f.row > lastRow) break\n const span = merges.value.cell(f)\n const rect = rangeRect(span)\n if (rect) out.push({ key: `${f.row}:${f.col}`, rect, current: i === current })\n }\n return out\n})\n\n/** In a narrow grid the panel sits above the cells instead of over them, so it hides none. */\nconst findDocked = computed(() => viewWidth.value > 0 && viewWidth.value < 480)\n\nconst findPanelEl = computed(() => findPanel.value?.$el as HTMLElement | undefined)\nconst { width: findPanelWidth, height: findPanelHeight } = useElementSize(findPanelEl, {\n box: 'border-box',\n})\n/**\n * The panel moves to the bottom while it would cover the current match,\n * as it would one in a frozen row, which no scrolling brings out from under it.\n */\nconst findBelow = computed(() => {\n if (findDocked.value) return false\n const rect = foundRects.value.find((f) => f.current)?.rect\n if (!rect) return false\n // the panel's place over the grid; see `.dou-sheet__find`\n const top = FIND_INSET - colOutline.value\n const right = viewWidth.value - FIND_INSET_RIGHT\n const left = right - findPanelWidth.value\n const bottom = top + findPanelHeight.value\n return (\n rect.y < bottom && rect.y + rect.height > top && rect.x < right && rect.x + rect.width > left\n )\n})\n/** How far the panel is from the top and the right of the grid, as in the style sheet. */\nconst FIND_INSET = 6\nconst FIND_INSET_RIGHT = 14\n\n/** The toggles in the find box. */\nconst findOptions = computed(() => {\n const q = findQuery.value\n const m = messages.value.find\n return [\n {\n key: 'case',\n label: common('findReplace.caseSensitive'),\n icon: LetterCaseIcon,\n pressed: !!q.caseSensitive,\n set: (on: boolean): Partial<SheetSearchQuery> => ({ caseSensitive: on }),\n },\n {\n key: 'whole',\n label: m.wholeCell,\n icon: WholeWordIcon,\n pressed: !!q.wholeCell,\n set: (on: boolean): Partial<SheetSearchQuery> => ({ wholeCell: on }),\n },\n {\n key: 'formulas',\n label: m.formulas,\n icon: FunctionIcon,\n pressed: q.lookIn === 'formulas',\n set: (on: boolean): Partial<SheetSearchQuery> => ({ lookIn: on ? 'formulas' : 'values' }),\n },\n {\n key: 'workbook',\n label: m.workbook,\n icon: LayersIcon,\n pressed: q.scope === 'workbook',\n set: (on: boolean): Partial<SheetSearchQuery> => ({ scope: on ? 'workbook' : 'sheet' }),\n },\n ]\n})\n\n// Commands ---------------------------------------------------------------------------------\n\nconst writable = () => !viewOnly.value\n// known after mounting, so a server-rendered hint matches the first client render\nconst apple = useApplePlatform()\n/** The key of `replace`: ⌘H hides the app on Apple platforms. */\nconst replaceKey = () => (apple.value ? 'mod+alt+f' : 'mod+h')\nconst styleCommand = (\n name: StyleToggle | 'wrap',\n icon: SheetCommand['icon'],\n shortcut?: string,\n): SheetCommand<boolean> => ({\n label: (m) => m[name],\n icon,\n shortcut,\n enabled: writable,\n pressed: () => !!styleAt(active.value)[name],\n // with `true` or `false` sets it; without, switches it as the key does\n run: (_, on) => {\n if (on === undefined && name !== 'wrap') return toggleStyle(name)\n return styleSelection({ [name]: (on ?? !styleAt(active.value)[name]) || undefined })\n },\n})\nconst alignCommand = (\n value: 'left' | 'center' | 'right',\n icon: SheetCommand['icon'],\n label: 'alignLeft' | 'alignCenter' | 'alignRight',\n): SheetCommand => ({\n label: (m) => m[label],\n icon,\n enabled: writable,\n pressed: () =>\n (styleAt(active.value).align ?? alignOf(valueAt(active.value.row, active.value.col))) === value,\n run: () => styleSelection({ align: value }),\n})\nconst valignCommand = (\n value: 'top' | 'middle' | 'bottom',\n icon: SheetCommand['icon'],\n label: 'alignTop' | 'alignMiddle' | 'alignBottom',\n): SheetCommand => ({\n label: (m) => m[label],\n icon,\n enabled: writable,\n pressed: () => (styleAt(active.value).valign ?? 'middle') === value,\n run: () => styleSelection({ valign: value === 'middle' ? undefined : value }),\n})\n\n/** What the sheet can do by name; the toolbar, the menu and the keys go through these. */\nconst builtinCommands: Record<string, SheetCommand> = {\n undo: {\n label: (m) => m.undo,\n icon: UndoIcon,\n shortcut: 'mod+z',\n enabled: () => writable() && canUndo.value,\n run: () => travel('undo'),\n },\n redo: {\n label: (m) => m.redo,\n icon: RedoIcon,\n shortcut: 'mod+shift+z',\n enabled: () => writable() && canRedo.value,\n run: () => travel('redo'),\n },\n cut: {\n label: (m) => m.cut,\n icon: ScissorsIcon,\n shortcut: 'mod+x',\n enabled: writable,\n run: () => copyToClipboard(true),\n },\n copy: {\n label: (m) => m.copy,\n icon: CopyIcon,\n shortcut: 'mod+c',\n run: () => copyToClipboard(false),\n },\n paste: {\n label: (m) => m.paste,\n icon: ClipboardPasteIcon,\n shortcut: 'mod+v',\n enabled: writable,\n run: () => pasteFromClipboard(),\n },\n bold: styleCommand('bold', BoldIcon, 'mod+b'),\n italic: styleCommand('italic', ItalicIcon, 'mod+i'),\n underline: styleCommand('underline', UnderlineIcon, 'mod+u'),\n strike: styleCommand('strike', StrikethroughIcon, 'mod+shift+x'),\n wrap: styleCommand('wrap', WrapTextIcon),\n 'align.left': alignCommand('left', TextAlignLeftIcon, 'alignLeft'),\n 'align.center': alignCommand('center', TextAlignCenterIcon, 'alignCenter'),\n 'align.right': alignCommand('right', TextAlignRightIcon, 'alignRight'),\n 'valign.top': valignCommand('top', TextValignTopIcon, 'alignTop'),\n 'valign.middle': valignCommand('middle', TextValignMiddleIcon, 'alignMiddle'),\n 'valign.bottom': valignCommand('bottom', TextValignBottomIcon, 'alignBottom'),\n 'decimals.more': {\n label: (m) => m.moreDecimals,\n icon: DecimalIncreaseIcon,\n enabled: writable,\n run: () => formatSelection((old, value) => changeDecimals(old, value, 1)),\n },\n 'decimals.fewer': {\n label: (m) => m.fewerDecimals,\n icon: DecimalDecreaseIcon,\n enabled: writable,\n run: () => formatSelection((old, value) => changeDecimals(old, value, -1)),\n },\n // merges the selection, or splits the merged cells it touches\n merge: {\n label: (m) => (merged.value ? m.unmergeCells : m.mergeCells),\n icon: CellsMergeIcon,\n enabled: () => writable() && (merged.value || canMerge.value),\n pressed: () => merged.value,\n run: () => (merged.value ? unmergeSelection() : mergeSelection()),\n },\n 'sort.asc': {\n label: (m) => m.filter.sortAsc,\n icon: SortAscendingIcon,\n enabled: writable,\n run: () => sortSelection('asc'),\n },\n 'sort.desc': {\n label: (m) => m.filter.sortDesc,\n icon: SortDescendingIcon,\n enabled: writable,\n run: () => sortSelection('desc'),\n },\n filter: {\n label: (m) => (sheet.value.filter ? m.filter.turnOff : m.filter.turnOn),\n icon: FilterIcon,\n shortcut: 'mod+shift+l',\n enabled: writable,\n pressed: () => !!sheet.value.filter,\n run: () => toggleFilter(),\n },\n clear: {\n label: (m) => m.clearFormatting,\n icon: TypeXIcon,\n shortcut: 'mod+\\\\',\n enabled: writable,\n run: () => {\n if (!clearFormatting()) return false\n announce(messages.value.formattingCleared)\n },\n },\n link: {\n label: (m) => m.link.add,\n icon: LinkIcon,\n shortcut: 'mod+k',\n enabled: () => linkEditable(noteHome(active.value)),\n run: () => editLink(),\n },\n 'link.open': {\n label: (m) => m.link.open,\n icon: ExternalLinkIcon,\n enabled: () => !!linkTarget(linkAt(noteHome(active.value))),\n run: () => followLink(),\n },\n 'link.remove': {\n label: (m) => m.link.remove,\n icon: UnlinkIcon,\n enabled: writable,\n run: () => removeLinks(),\n },\n // locks the selection, or unlocks it when the active cell is locked\n lock: {\n label: (m) => (activeLocked.value ? m.protect.unlock : m.protect.lock),\n icon: LockIcon,\n // cells keep their lock while the sheet is protected\n enabled: () => writable() && !protection.value,\n run: () => lockSelection(!activeLocked.value),\n },\n 'protect.sheet': {\n label: (m) => (sheet.value.protect ? m.protect.unprotectSheet : m.protect.protectSheet),\n icon: ShieldLockIcon,\n enabled: writable,\n pressed: () => !!sheet.value.protect,\n run: () => toggleSheetProtection(),\n },\n 'protect.workbook': {\n label: (m) => (doc.value.protect ? m.protect.unprotectBook : m.protect.protectBook),\n icon: LockKeyholeIcon,\n enabled: writable,\n pressed: () => !!doc.value.protect,\n run: () => toggleBookProtection(),\n },\n print: {\n label: (m) => m.print,\n icon: PrinterIcon,\n run: () => print(),\n },\n // the panel; a query given (`{ search: '…' }`) is put in it\n find: {\n label: (m) => m.find.find,\n icon: SearchIcon,\n shortcut: 'mod+f',\n run: (_, query?: Partial<SheetSearchQuery>) => openFind(false, query),\n },\n replace: {\n label: (m) => m.find.replace,\n icon: ReplaceIcon,\n // a getter: the key is known once mounted\n get shortcut() {\n return replaceKey()\n },\n enabled: writable,\n run: (_, query?: Partial<SheetSearchQuery>) => openFind(true, query),\n },\n 'find.next': {\n label: (m) => m.find.next,\n shortcut: 'f3',\n run: () => nextFound(),\n },\n 'find.previous': {\n label: (m) => m.find.previous,\n shortcut: 'shift+f3',\n run: () => previousFound(),\n },\n}\n\nconst commandMap = computed(() => mergeCommands(builtinCommands, resolved.value.commands))\nconst commands = createCommands(\n () => commandMap.value,\n () => context,\n builtinCommands,\n)\n\n/** A menu item that names a command, filled in from it. */\nfunction fromCommand(item: SheetMenuItem): SheetMenuItem {\n const children = item.children?.map(fromCommand)\n const name = item.command\n if (!name) return children ? { ...item, children } : item\n const command = commandMap.value.get(name)\n if (!command)\n throw new Error(\n `[@dou-ui/sheet] the menu item \"${item.key}\" runs no command: \"${name}\" is unknown`,\n )\n return {\n ...item,\n label: item.label ?? labelOf(command.label, messages.value),\n icon: item.icon ?? command.icon,\n shortcut: item.shortcut ?? command.shortcut,\n disabled: item.disabled ?? !commands.can(name),\n run: item.run ?? (() => void commands.run(name)),\n children,\n }\n}\n\nconst context: SheetContext = {\n doc,\n sheetIndex,\n sheet,\n selection,\n active,\n readonly: computed(() => viewOnly.value),\n focused,\n messages,\n forEachSelected,\n value: (point) => valueOf(sheet.value.cells[point.row]?.[point.col]),\n result: (point) => resultAt(point.row, point.col),\n cellType: (point) => typeAt(point.row, point.col),\n cellRect: visibleRect,\n rangeRect,\n // the toolbar, tabs and extensions' commands act for the person using the grid\n transact: (run, meta) => transactFor(run, meta),\n undo: () => travel('undo'),\n redo: () => travel('redo'),\n canUndo,\n canRedo,\n select: (target) => selectTarget(target),\n scrollTo: (target) => scrollToTarget(target),\n edit: (target) => editTarget(target),\n focus: () => focusGrid(),\n showSheet,\n toCSV,\n exportSVG,\n exportPNG,\n print,\n styleAt,\n formatAt,\n styleSelection,\n formatSelection,\n clearFormatting,\n merged,\n canMerge,\n merge: () => mergeSelection(),\n unmerge: () => unmergeSelection(),\n sort: (order) => sortSelection(order),\n filtered: computed(() => !!sheet.value.filter),\n toggleFilter,\n announce,\n commands,\n exportFile: exportFile as SheetExpose['exportFile'],\n saveFile: saveFile as SheetExpose['saveFile'],\n importFile,\n exporters: computed(() =>\n exporters.value.map((e) => {\n const info = exporterInfo(e, messages.value)\n return { ...info, icon: info.icon ?? fileIconOf(info.extension) }\n }),\n ),\n importers: computed(() => importers.value.map((i) => importerInfo(i, messages.value))),\n importAccept,\n toolbarItems: computed(() => resolved.value.toolbars.flatMap((items) => items(context))),\n editor: {\n cell: computed(() => editing.value),\n text: editText,\n caret: editCaret,\n textAt: (point) => editTextAt(point.row, point.col) ?? '',\n input: inputFrom,\n moveCaret: (caret) => {\n if (!editing.value) return\n if (caret !== editCaret.value) pointing.value = null\n editCaret.value = caret\n },\n key: (event) => {\n const e = editing.value\n if (!e || isComposing(event)) return false\n editKey(event, e.mode)\n return event.defaultPrevented\n },\n commit: (move) => {\n commitEdit(move)\n focusGrid()\n },\n cancel: () => {\n cancelEdit()\n focusGrid()\n },\n attach: (el, options = {}) => {\n editInputs.set(el, options)\n return () => editInputs.delete(el)\n },\n helpId: assistId,\n functions: functionList,\n },\n}\nprovide(sheetContextKey, context)\n\nconst keymaps = computed(() =>\n resolved.value.keymaps.map((make) => {\n const keymap = make(context)\n // a command named by a key is checked now, not when the key is first pressed\n for (const combo in keymap) {\n const handler = keymap[combo]\n if (typeof handler === 'string' && !commandMap.value.has(handler))\n throw new Error(\n `[@dou-ui/sheet] the key \"${combo}\" runs no command: \"${handler}\" is unknown`,\n )\n }\n return keymap\n }),\n)\n\nlet cleanups: (() => void)[] = []\nfunction setupExtensions() {\n // puts the commands together and reads the keys now, so a clash or a key\n // naming a command that isn't there is found at once, not on a key press\n void commandMap.value\n void keymaps.value\n for (const cleanup of cleanups) cleanup()\n cleanups = []\n for (const setup of resolved.value.setups) {\n const cleanup = setup(context)\n if (typeof cleanup === 'function') cleanups.push(cleanup)\n }\n // an extension's history may have come or gone with the list\n syncHistory()\n}\nonMounted(() => {\n setupExtensions()\n watch(resolved, setupExtensions)\n})\nonBeforeUnmount(() => {\n for (const cleanup of cleanups) cleanup()\n cleanups = []\n})\n\n// Exposed --------------------------------------------------------------------------------\n\nfunction toPoint(target: SheetCellTarget): SheetPoint | null {\n return typeof target === 'string' ? parseCell(target) : target\n}\n\nfunction selectTarget(target: string | SheetRange | SheetSelection) {\n let next: SheetSelection | null = null\n if (typeof target === 'string') {\n const range = parseRange(target)\n if (range) next = { active: range.start, ranges: [range] }\n } else if ('ranges' in target) next = target\n else next = { active: target.start, ranges: [target] }\n if (!next) return\n setSelection(clampSelection(next, rowCount.value, colCount.value))\n scrollToPoint(selection.value.active)\n}\n\nfunction scrollToTarget(target: SheetCellTarget) {\n const point = toPoint(target)\n if (point) scrollToPoint(clampPoint(point, rowCount.value, colCount.value))\n}\n\nfunction editTarget(target?: SheetCellTarget) {\n const point = target == null ? active.value : toPoint(target)\n if (!point) return\n select(selectCell(clampPoint(point, rowCount.value, colCount.value)))\n beginEdit('edit', editTextAt(active.value.row, active.value.col))\n}\n\nfunction editNoteTarget(target?: SheetCellTarget) {\n const point = target == null ? active.value : toPoint(target)\n if (!point) return\n select(selectCell(clampPoint(point, rowCount.value, colCount.value)))\n editNote()\n}\n\nfunction commentTarget(target?: SheetCellTarget) {\n const point = target == null ? active.value : toPoint(target)\n if (!point) return false\n select(selectCell(clampPoint(point, rowCount.value, colCount.value)))\n return comment()\n}\n\nfunction editLinkTarget(target?: SheetCellTarget) {\n const point = target == null ? active.value : toPoint(target)\n if (!point) return\n select(selectCell(clampPoint(point, rowCount.value, colCount.value)))\n editLink()\n}\n\ndefineExpose<SheetExpose>({\n commands,\n findCells: (query) => findCells(query).found,\n openSearch: (query) =>\n commands.run(query?.replace !== undefined && !viewOnly.value ? 'replace' : 'find', query),\n closeSearch: closeFind,\n exportFile: exportFile as SheetExpose['exportFile'],\n saveFile: saveFile as SheetExpose['saveFile'],\n importFile,\n transact: (run, meta) => transactFor(run, meta, true),\n undo: () => travel('undo', true),\n redo: () => travel('redo', true),\n get canUndo() {\n return canUndo.value\n },\n get canRedo() {\n return canRedo.value\n },\n select: selectTarget,\n scrollTo: scrollToTarget,\n edit: editTarget,\n editNote: editNoteTarget,\n editLink: editLinkTarget,\n focus: () => focusGrid(),\n showSheet,\n toCSV,\n exportSVG,\n exportPNG,\n print,\n copy: () => copyToClipboard(false),\n cut: () => copyToClipboard(true),\n paste: async (clip) => (clip ? paste(clip) : pasteFromClipboard()),\n findInvalid,\n comment: commentTarget,\n getCommentAnchors: () => comments.getAnchors(),\n restore,\n nextChange: () => goToChange(1),\n previousChange: () => goToChange(-1),\n})\n</script>\n\n<template>\n <div\n class=\"dou-sheet\"\n :class=\"{\n 'is-focused': focused,\n 'is-readonly': viewOnly,\n 'is-comparing': !!compare,\n 'is-dragging': drag?.started,\n 'has-gridlines': gridlines,\n 'is-editing': editing,\n 'is-scrolled-x': scroll.left > 0,\n 'is-scrolled-y': scroll.top > 0,\n 'has-frozen-cols': frozen.cols > 0,\n 'is-resizing-col': (drag?.mode === 'resize' && drag.axis === 'col') || edgeHover === 'col',\n 'is-resizing-row': (drag?.mode === 'resize' && drag.axis === 'row') || edgeHover === 'row',\n 'is-moving': drag?.mode === 'move' && drag.started,\n }\"\n >\n <slot name=\"header\" />\n <div class=\"dou-sheet__frame\" :style=\"`padding:${colOutline}px 0 0 ${rowOutline}px`\">\n <div\n v-if=\"rowOutline && colOutline\"\n class=\"dou-sheet__outline-corner\"\n :style=\"`width:${rowOutline}px;height:${colOutline}px`\"\n />\n <SheetOutline\n v-if=\"rowOutline\"\n axis=\"row\"\n :style=\"`top:${colOutline}px`\"\n :groups=\"groups.rows\"\n :summary=\"groupSummary\"\n :lines=\"rows\"\n :frozen=\"frozen.rows\"\n :head=\"headerHeight\"\n :scroll=\"scroll.top\"\n :view=\"viewHeight - headerHeight - frozenHeight\"\n :levels=\"headers\"\n :before=\"colOutline\"\n :label=\"(g: SheetGroupLines) => groupText('row', g, !g.collapsed)\"\n :level-label=\"(level: number) => format(messages.group.rowLevel, { level })\"\n @toggle=\"(g: SheetGroupLines) => toggleGroup('row', g)\"\n @level=\"(level: number) => showGroupLevel('row', level)\"\n @wheel=\"onOutlineWheel\"\n />\n <SheetOutline\n v-if=\"colOutline\"\n axis=\"col\"\n :style=\"`left:${rowOutline}px`\"\n :groups=\"groups.cols\"\n :summary=\"groupSummary\"\n :lines=\"cols\"\n :frozen=\"frozen.cols\"\n :head=\"headerWidth\"\n :scroll=\"scroll.left\"\n :view=\"viewWidth - headerWidth - frozenWidth\"\n :levels=\"headers\"\n :before=\"rowOutline\"\n :label=\"(g: SheetGroupLines) => groupText('col', g, !g.collapsed)\"\n :level-label=\"(level: number) => format(messages.group.colLevel, { level })\"\n @toggle=\"(g: SheetGroupLines) => toggleGroup('col', g)\"\n @level=\"(level: number) => showGroupLevel('col', level)\"\n @wheel=\"onOutlineWheel\"\n />\n <div\n v-if=\"findOpen\"\n class=\"dou-sheet__find\"\n :class=\"{ 'is-docked': findDocked, 'is-below': findBelow }\"\n >\n <DouFindReplace\n ref=\"findPanel\"\n v-model:replacing=\"findReplacing\"\n :search=\"findQuery.search\"\n :replace=\"findQuery.replace ?? ''\"\n :count=\"found.length\"\n :current=\"currentFound\"\n :capped=\"foundCapped\"\n :searching=\"findWaiting\"\n :readonly=\"viewOnly\"\n @update:search=\"findQuery = { ...findQuery, search: $event }\"\n @update:replace=\"findQuery = { ...findQuery, replace: $event }\"\n @next=\"nextFound\"\n @previous=\"previousFound\"\n @replace-one=\"replaceFound\"\n @replace-all=\"replaceAllFound\"\n @close=\"closeFind\"\n >\n <template #options>\n <DouTooltip v-for=\"option in findOptions\" :key=\"option.key\" :content=\"option.label\">\n <DouToggle\n :pressed=\"option.pressed\"\n size=\"sm\"\n :aria-label=\"option.label\"\n @update:pressed=\"(on: boolean) => (findQuery = { ...findQuery, ...option.set(on) })\"\n >\n <component :is=\"option.icon\" />\n </DouToggle>\n </DouTooltip>\n </template>\n </DouFindReplace>\n </div>\n <div\n ref=\"root\"\n class=\"dou-sheet__main\"\n @keydown=\"onKeydown\"\n @focusin=\"focusWithin = true\"\n @focusout=\"onFocusout\"\n @copy=\"onCopy\"\n @cut=\"onCut\"\n @paste=\"onPaste\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n >\n <div\n ref=\"viewport\"\n class=\"dou-sheet__viewport\"\n role=\"grid\"\n tabindex=\"-1\"\n :aria-label=\"ariaLabel ?? messages.sheet\"\n :aria-rowcount=\"rowCount + (headers ? 1 : 0)\"\n :aria-colcount=\"colCount + (headers ? 1 : 0)\"\n :aria-readonly=\"viewOnly || undefined\"\n :aria-multiselectable=\"true\"\n :aria-activedescendant=\"activeId\"\n :aria-describedby=\"describedBy\"\n @scroll=\"onScroll\"\n @pointerdown=\"onPointerDown\"\n @click=\"onClick\"\n @dblclick=\"onDblClick\"\n @contextmenu=\"onContextMenu\"\n @pointermove=\"onHover\"\n @pointerleave=\"onLeave\"\n @focus=\"focused = true\"\n @blur=\"focused = false\"\n >\n <div\n class=\"dou-sheet__head\"\n role=\"rowgroup\"\n :style=\"`width:${totalWidth}px;height:${headerHeight + frozenHeight}px`\"\n >\n <div\n v-if=\"headers\"\n class=\"dou-sheet__row is-header\"\n role=\"row\"\n aria-rowindex=\"1\"\n :style=\"`width:${totalWidth}px;height:${headerHeight}px`\"\n >\n <div\n class=\"dou-sheet__corner\"\n role=\"columnheader\"\n :aria-label=\"messages.selectAll\"\n :style=\"`width:${headerWidth}px`\"\n />\n <div\n v-for=\"col in frozenColList\"\n :key=\"col\"\n class=\"dou-sheet__col-head is-frozen\"\n :class=\"{\n 'is-freeze-edge': col === frozen.cols - 1,\n 'is-marked': headerMarks.colsMarked.has(col),\n 'is-full': headerMarks.colsFull.has(col),\n 'is-after-hidden': afterHidden('col', col),\n }\"\n role=\"columnheader\"\n :aria-colindex=\"col + 2\"\n :style=\"`width:${cols.size(col)}px;left:${headerWidth + cols.offset(col)}px`\"\n >\n {{ columnName(col) }}\n </div>\n <div\n v-for=\"col in bodyCols\"\n :key=\"col\"\n class=\"dou-sheet__col-head\"\n :class=\"{\n 'is-marked': headerMarks.colsMarked.has(col),\n 'is-full': headerMarks.colsFull.has(col),\n 'is-after-hidden': afterHidden('col', col),\n }\"\n role=\"columnheader\"\n :aria-colindex=\"col + 2\"\n :style=\"`width:${cols.size(col)}px;left:${headerWidth + cols.offset(col)}px`\"\n >\n {{ columnName(col) }}\n </div>\n </div>\n <div\n v-for=\"row in frozenRowList\"\n :key=\"row\"\n v-memo=\"[\n sheet.cells[row],\n memoBase,\n resultsOf(row),\n rowMarks(row),\n mergeKey(row),\n looksKey(row),\n sheet.validations,\n checksKey(row),\n ]\"\n class=\"dou-sheet__row is-frozen\"\n :class=\"{ 'is-freeze-edge': row === frozen.rows - 1 }\"\n role=\"row\"\n :aria-rowindex=\"row + (headers ? 2 : 1)\"\n :style=\"`width:${totalWidth}px;height:${rows.size(row)}px`\"\n >\n <div\n v-if=\"headers\"\n class=\"dou-sheet__row-head\"\n :class=\"{\n 'is-marked': headerMarks.rowsMarked.has(row),\n 'is-full': headerMarks.rowsFull.has(row),\n 'is-after-hidden': afterHidden('row', row),\n }\"\n role=\"rowheader\"\n :style=\"`width:${headerWidth}px`\"\n >\n {{ row + 1 }}\n </div>\n <div\n v-for=\"cell in rowCells(row, frozenColList)\"\n :id=\"cell.id\"\n :key=\"cell.key ?? cell.col\"\n :class=\"[cell.cls, 'is-frozen']\"\n role=\"gridcell\"\n :aria-colindex=\"cell.col + (headers ? 2 : 1)\"\n :aria-selected=\"cell.cls.includes('is-selected') || undefined\"\n :aria-hidden=\"cell.hidden || undefined\"\n :aria-rowspan=\"cell.rowspan\"\n :aria-colspan=\"cell.colspan\"\n :title=\"cell.problem ?? cell.was\"\n :aria-invalid=\"cell.invalid || undefined\"\n :style=\"cell.css\"\n >\n <template v-if=\"cell.render\">\n <span class=\"dou-sheet__content\" aria-hidden=\"true\">\n <component :is=\"cell.render\" v-bind=\"cell.props\" />\n </span>\n <span class=\"dou-sheet__sr-only\">{{ cell.label }}</span>\n </template>\n <span v-else class=\"dou-sheet__text\">{{ cell.text }}</span>\n <span v-if=\"cell.problem\" class=\"dou-sheet__sr-only\">({{ cell.problem }})</span>\n <span v-if=\"cell.was\" class=\"dou-sheet__sr-only\">({{ cell.was }})</span>\n <span v-if=\"cell.invalid\" class=\"dou-sheet__invalid\" aria-hidden=\"true\" />\n <template v-if=\"cell.note\">\n <span class=\"dou-sheet__noted\" aria-hidden=\"true\" />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n format(messages.note.cellNote, { note: cell.note })\n }}</span>\n </template>\n <template v-if=\"cell.comment\">\n <span\n class=\"dou-sheet__commented\"\n :class=\"{ 'is-below-note': cell.note }\"\n aria-hidden=\"true\"\n />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n messages.comment.cellComment\n }}</span>\n </template>\n </div>\n <div\n v-for=\"cell in rowCells(row, bodyCols)\"\n :id=\"cell.id\"\n :key=\"cell.key ?? cell.col\"\n :class=\"cell.cls\"\n role=\"gridcell\"\n :aria-colindex=\"cell.col + (headers ? 2 : 1)\"\n :aria-selected=\"cell.cls.includes('is-selected') || undefined\"\n :aria-hidden=\"cell.hidden || undefined\"\n :aria-rowspan=\"cell.rowspan\"\n :aria-colspan=\"cell.colspan\"\n :title=\"cell.problem ?? cell.was\"\n :aria-invalid=\"cell.invalid || undefined\"\n :style=\"cell.css\"\n >\n <template v-if=\"cell.render\">\n <span class=\"dou-sheet__content\" aria-hidden=\"true\">\n <component :is=\"cell.render\" v-bind=\"cell.props\" />\n </span>\n <span class=\"dou-sheet__sr-only\">{{ cell.label }}</span>\n </template>\n <span v-else class=\"dou-sheet__text\">{{ cell.text }}</span>\n <span v-if=\"cell.problem\" class=\"dou-sheet__sr-only\">({{ cell.problem }})</span>\n <span v-if=\"cell.was\" class=\"dou-sheet__sr-only\">({{ cell.was }})</span>\n <span v-if=\"cell.invalid\" class=\"dou-sheet__invalid\" aria-hidden=\"true\" />\n <template v-if=\"cell.note\">\n <span class=\"dou-sheet__noted\" aria-hidden=\"true\" />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n format(messages.note.cellNote, { note: cell.note })\n }}</span>\n </template>\n <template v-if=\"cell.comment\">\n <span\n class=\"dou-sheet__commented\"\n :class=\"{ 'is-below-note': cell.note }\"\n aria-hidden=\"true\"\n />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n messages.comment.cellComment\n }}</span>\n </template>\n </div>\n </div>\n </div>\n <div\n class=\"dou-sheet__body\"\n role=\"rowgroup\"\n :style=\"`width:${totalWidth}px;height:${bodyHeight}px`\"\n >\n <div\n v-for=\"row in bodyRows\"\n :key=\"row\"\n v-memo=\"[\n sheet.cells[row],\n memoBase,\n resultsOf(row),\n rowMarks(row),\n mergeKey(row),\n looksKey(row),\n sheet.validations,\n checksKey(row),\n ]\"\n class=\"dou-sheet__row\"\n role=\"row\"\n :aria-rowindex=\"row + (headers ? 2 : 1)\"\n :style=\"`width:${totalWidth}px;height:${rows.size(row)}px;top:${rows.offset(row) - frozenHeight}px`\"\n >\n <div\n v-if=\"headers\"\n class=\"dou-sheet__row-head\"\n :class=\"{\n 'is-marked': headerMarks.rowsMarked.has(row),\n 'is-full': headerMarks.rowsFull.has(row),\n 'is-after-hidden': afterHidden('row', row),\n }\"\n role=\"rowheader\"\n :style=\"`width:${headerWidth}px`\"\n >\n {{ row + 1 }}\n </div>\n <div\n v-for=\"cell in rowCells(row, frozenColList)\"\n :id=\"cell.id\"\n :key=\"cell.key ?? cell.col\"\n :class=\"[cell.cls, 'is-frozen']\"\n role=\"gridcell\"\n :aria-colindex=\"cell.col + (headers ? 2 : 1)\"\n :aria-selected=\"cell.cls.includes('is-selected') || undefined\"\n :aria-hidden=\"cell.hidden || undefined\"\n :aria-rowspan=\"cell.rowspan\"\n :aria-colspan=\"cell.colspan\"\n :title=\"cell.problem ?? cell.was\"\n :aria-invalid=\"cell.invalid || undefined\"\n :style=\"cell.css\"\n >\n <template v-if=\"cell.render\">\n <span class=\"dou-sheet__content\" aria-hidden=\"true\">\n <component :is=\"cell.render\" v-bind=\"cell.props\" />\n </span>\n <span class=\"dou-sheet__sr-only\">{{ cell.label }}</span>\n </template>\n <span v-else class=\"dou-sheet__text\">{{ cell.text }}</span>\n <span v-if=\"cell.problem\" class=\"dou-sheet__sr-only\">({{ cell.problem }})</span>\n <span v-if=\"cell.was\" class=\"dou-sheet__sr-only\">({{ cell.was }})</span>\n <span v-if=\"cell.invalid\" class=\"dou-sheet__invalid\" aria-hidden=\"true\" />\n <template v-if=\"cell.note\">\n <span class=\"dou-sheet__noted\" aria-hidden=\"true\" />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n format(messages.note.cellNote, { note: cell.note })\n }}</span>\n </template>\n <template v-if=\"cell.comment\">\n <span\n class=\"dou-sheet__commented\"\n :class=\"{ 'is-below-note': cell.note }\"\n aria-hidden=\"true\"\n />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n messages.comment.cellComment\n }}</span>\n </template>\n </div>\n <div\n v-for=\"cell in rowCells(row, bodyCols)\"\n :id=\"cell.id\"\n :key=\"cell.key ?? cell.col\"\n :class=\"cell.cls\"\n role=\"gridcell\"\n :aria-colindex=\"cell.col + (headers ? 2 : 1)\"\n :aria-selected=\"cell.cls.includes('is-selected') || undefined\"\n :aria-hidden=\"cell.hidden || undefined\"\n :aria-rowspan=\"cell.rowspan\"\n :aria-colspan=\"cell.colspan\"\n :title=\"cell.problem ?? cell.was\"\n :aria-invalid=\"cell.invalid || undefined\"\n :style=\"cell.css\"\n >\n <template v-if=\"cell.render\">\n <span class=\"dou-sheet__content\" aria-hidden=\"true\">\n <component :is=\"cell.render\" v-bind=\"cell.props\" />\n </span>\n <span class=\"dou-sheet__sr-only\">{{ cell.label }}</span>\n </template>\n <span v-else class=\"dou-sheet__text\">{{ cell.text }}</span>\n <span v-if=\"cell.problem\" class=\"dou-sheet__sr-only\">({{ cell.problem }})</span>\n <span v-if=\"cell.was\" class=\"dou-sheet__sr-only\">({{ cell.was }})</span>\n <span v-if=\"cell.invalid\" class=\"dou-sheet__invalid\" aria-hidden=\"true\" />\n <template v-if=\"cell.note\">\n <span class=\"dou-sheet__noted\" aria-hidden=\"true\" />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n format(messages.note.cellNote, { note: cell.note })\n }}</span>\n </template>\n <template v-if=\"cell.comment\">\n <span\n class=\"dou-sheet__commented\"\n :class=\"{ 'is-below-note': cell.note }\"\n aria-hidden=\"true\"\n />\n <span v-if=\"!cell.hidden\" class=\"dou-sheet__sr-only\">{{\n messages.comment.cellComment\n }}</span>\n </template>\n </div>\n </div>\n </div>\n </div>\n <div\n v-if=\"resolved.layers.below.length\"\n class=\"dou-sheet__layer is-below\"\n :style=\"layerClip\"\n aria-hidden=\"true\"\n >\n <component :is=\"layer\" v-for=\"(layer, i) in resolved.layers.below\" :key=\"i\" />\n </div>\n <div\n v-for=\"mark in refRects\"\n :key=\"mark.key\"\n class=\"dou-sheet__ref\"\n :class=\"`is-ref-${mark.color}`\"\n :style=\"rectStyle(mark.rect)\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"formulaEdit\"\n ref=\"mirror\"\n class=\"dou-sheet__input is-open is-mirror\"\n :class=\"editorClass\"\n :style=\"inputStyle\"\n aria-hidden=\"true\"\n >\n <span v-for=\"(part, i) in mirrorParts\" :key=\"i\" :class=\"partClass(part)\">{{\n part.text\n }}</span>\n </div>\n <textarea\n ref=\"editor\"\n class=\"dou-sheet__input\"\n :class=\"[editorClass, { 'is-open': editing, 'is-formula': formulaEdit }]\"\n :style=\"inputStyle\"\n :aria-label=\"editing ? format(messages.edit, { cell: formatCell(editing) }) : activeLabel\"\n :aria-expanded=\"panelType ? true : undefined\"\n :inputmode=\"panelType && editByTouch ? 'none' : undefined\"\n :aria-activedescendant=\"\n panel?.activeId ??\n (assist?.kind === 'list' && editInput() === editor\n ? `${assistId}-${assistIndex}`\n : undefined)\n \"\n :aria-autocomplete=\"formulaEdit ? 'list' : undefined\"\n :aria-controls=\"assist ? assistId : undefined\"\n :aria-describedby=\"describedBy\"\n :readonly=\"viewOnly\"\n autocomplete=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n rows=\"1\"\n @input=\"onInput\"\n @keyup=\"syncCaret\"\n @click=\"syncCaret\"\n @select=\"syncCaret\"\n @scroll=\"syncMirror\"\n @compositionstart=\"onCompositionStart\"\n @focus=\"focused = true\"\n @blur=\"onInputBlur\"\n />\n <div\n v-if=\"assist\"\n :id=\"assistId\"\n class=\"dou-sheet__assist\"\n :role=\"assist.kind === 'list' ? 'listbox' : 'tooltip'\"\n :aria-label=\"assist.kind === 'list' ? messages.functionList : undefined\"\n :style=\"assistStyle\"\n @pointerdown.prevent\n >\n <template v-if=\"assist.kind === 'list'\">\n <div\n v-for=\"(item, i) in assist.items\"\n :id=\"`${assistId}-${i}`\"\n :key=\"item.name\"\n class=\"dou-sheet__assist-item\"\n :class=\"{ 'is-active': i === assistIndex }\"\n role=\"option\"\n :aria-selected=\"i === assistIndex\"\n @pointerenter=\"assistIndex = i\"\n @click=\"completeName(item)\"\n >\n <span class=\"dou-sheet__assist-name\">{{ item.name }}</span>\n <span class=\"dou-sheet__assist-text\">{{ item.description }}</span>\n </div>\n </template>\n <template v-else>\n <div class=\"dou-sheet__assist-call\">\n <span class=\"dou-sheet__assist-name\">{{ assist.name }}</span\n >(<template v-for=\"(arg, i) in assist.args\" :key=\"i\"\n ><template v-if=\"i\">, </template\n ><span :class=\"{ 'is-current': i === assist.arg }\">{{ arg }}</span></template\n >)\n </div>\n <div v-if=\"assist.description\" class=\"dou-sheet__assist-text\">\n {{ assist.description }}\n </div>\n </template>\n </div>\n <div\n v-for=\"mark in foundRects\"\n :key=\"mark.key\"\n class=\"dou-sheet__found\"\n :class=\"{ 'is-current': mark.current }\"\n :style=\"rectStyle(mark.rect)\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"clipRect\"\n class=\"dou-sheet__mark\"\n :class=\"{ 'is-cut': clipMark?.cut }\"\n :style=\"rectStyle(clipRect)\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"dropRect\"\n class=\"dou-sheet__mark is-drop\"\n :style=\"rectStyle(dropRect)\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"fillPreview\"\n class=\"dou-sheet__mark is-fill\"\n :style=\"rectStyle(fillPreview)\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"fillClearRect\"\n class=\"dou-sheet__clearing\"\n :style=\"rectStyle(fillClearRect)\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"moveMark\"\n class=\"dou-sheet__guide\"\n :style=\"`left:${moveMark.x}px;top:${moveMark.y}px;width:${moveMark.width}px;height:${moveMark.height}px`\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"sizeMark\"\n class=\"dou-sheet__guide is-thin\"\n :style=\"`left:${sizeMark.x}px;top:${sizeMark.y}px;width:${sizeMark.width}px;height:${sizeMark.height}px`\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"fillRect\"\n class=\"dou-sheet__fill\"\n :class=\"{ 'is-dragging': fillTarget }\"\n :style=\"`left:${fillRect.x}px;top:${fillRect.y}px`\"\n :title=\"messages.fillHandle\"\n aria-hidden=\"true\"\n @pointerdown=\"onFillDown\"\n @dblclick.stop=\"fillDownToData\"\n />\n <span\n v-if=\"noteUnderFill\"\n class=\"dou-sheet__noted is-over-fill\"\n :style=\"`left:${noteUnderFill.x - 8}px;top:${noteUnderFill.y}px`\"\n aria-hidden=\"true\"\n />\n <div\n v-if=\"fillHint\"\n class=\"dou-sheet__fill-hint\"\n :class=\"{ 'is-flipped': fillHint.flip }\"\n :style=\"`left:${fillHint.x}px;top:${fillHint.y}px`\"\n aria-hidden=\"true\"\n >\n {{ fillHint.text }}\n </div>\n <div\n v-if=\"prompt\"\n :id=\"promptId\"\n class=\"dou-sheet__prompt\"\n :style=\"`left:${prompt.x}px;top:${prompt.y}px;max-width:${prompt.width}px;transform:${prompt.shift}`\"\n >\n <span\n v-if=\"prompt.problem\"\n :id=\"`${promptId}-problem`\"\n class=\"dou-sheet__prompt-problem\"\n >{{ prompt.problem }}</span\n >\n <span v-if=\"prompt.text\" :id=\"`${promptId}-text`\">{{ prompt.text }}</span>\n </div>\n <button\n v-if=\"panelButton\"\n type=\"button\"\n class=\"dou-sheet__panel-button\"\n :style=\"`left:${panelButton.x}px;top:${panelButton.y}px`\"\n :aria-label=\"messages.openPanel\"\n tabindex=\"-1\"\n @pointerdown.stop.prevent\n @click=\"openPanel\"\n >\n <ChevronDownIcon />\n </button>\n <DouPopover\n v-for=\"button in filterButtons\"\n :key=\"button.col\"\n :open=\"filterOpen === button.col\"\n trigger=\"click\"\n placement=\"bottom-end\"\n :width=\"260\"\n @update:open=\"(open: boolean) => (filterOpen = open ? button.col : null)\"\n >\n <button\n type=\"button\"\n class=\"dou-sheet__filter-button\"\n :class=\"{ 'is-active': button.active || button.sorted }\"\n :style=\"`left:${button.x}px;top:${button.y}px`\"\n :aria-label=\"button.label\"\n :aria-pressed=\"button.active\"\n tabindex=\"-1\"\n @pointerdown.stop\n >\n <SortAscendingIcon v-if=\"button.sorted === 'asc' && !button.active\" />\n <SortDescendingIcon v-else-if=\"button.sorted === 'desc' && !button.active\" />\n <FilterIcon v-else-if=\"button.active\" />\n <ChevronDownIcon v-else />\n </button>\n <template #content>\n <FilterPanel\n v-if=\"filterOpen === button.col\"\n :values=\"filterValues.values\"\n :numeric=\"filterValues.numeric\"\n :rule=\"sheet.filter?.columns?.[button.col]\"\n :sorted=\"\n sheet.filter?.sorted?.col === button.col ? sheet.filter.sorted.order : undefined\n \"\n :messages=\"messages\"\n :readonly=\"viewOnly\"\n @sort=\"(order: SheetSortOrder) => sortFilterColumn(button.col, order)\"\n @apply=\"(rule: SheetFilterRule | undefined) => applyFilter(button.col, rule)\"\n />\n </template>\n </DouPopover>\n <CellPanel\n v-if=\"panelType\"\n ref=\"panel\"\n :resolved=\"panelType\"\n :value=\"editValue\"\n :text=\"editText\"\n :typed=\"editTyped\"\n :anchor=\"editor\"\n @pick=\"pickValue\"\n />\n <SheetLink\n v-if=\"linkCard\"\n :key=\"`${linkCard.row}:${linkCard.col}:${linkCard.editing}`\"\n :anchor=\"linkAnchor\"\n :link=\"linkCard.link\"\n :text=\"linkCard.editing ? linkText(linkCard) : null\"\n :editing=\"linkCard.editing\"\n :docked=\"touching && !linkCard.editing\"\n :editable=\"linkEditable(linkCard)\"\n :removable=\"!!cellOf(sheet.cells[linkCard.row]?.[linkCard.col])?.link\"\n :messages=\"messages.link\"\n @open=\"followLink(linkCard)\"\n @edit=\"editLink(linkCard)\"\n @remove=\"removeLinks\"\n @save=\"saveLink\"\n @cancel=\"cancelLink\"\n />\n <SheetNote\n v-if=\"noteShown\"\n :key=\"`${noteShown.row}:${noteShown.col}:${noteShown.by === 'edit'}`\"\n :anchor=\"noteAnchor\"\n :note=\"(noteShown.by === 'tap' ? tipAt(noteShown) : noteAt(noteShown)) ?? ''\"\n :editing=\"noteShown.by === 'edit'\"\n :messages=\"messages.note\"\n @save=\"saveNote\"\n @cancel=\"cancelNote\"\n @hover=\"onNoteHover\"\n />\n <SheetComment\n v-if=\"commentCell\"\n ref=\"commentCard\"\n :key=\"`${commentCell.row}:${commentCell.col}`\"\n :anchor=\"commentAnchor\"\n :thread=\"comments.pending.value ? null : commentThread\"\n :author=\"author\"\n :readonly=\"!comments.writable.value\"\n :label=\"messages.comment.label\"\n :focus-request=\"comments.focusRequest.value\"\n :focus-handled=\"commentFocused\"\n @focused=\"commentFocused = $event\"\n :grid=\"() => viewport ?? null\"\n @action=\"comments.apply\"\n @close=\"closeComment\"\n />\n <div\n v-if=\"resolved.layers.above.length\"\n class=\"dou-sheet__layer is-above\"\n :style=\"layerClip\"\n aria-hidden=\"true\"\n >\n <component :is=\"layer\" v-for=\"(layer, i) in resolved.layers.above\" :key=\"i\" />\n </div>\n <component :is=\"overlay\" v-for=\"(overlay, i) in resolved.overlays\" :key=\"i\" />\n <div v-if=\"notice\" class=\"dou-sheet__notice\" role=\"status\">{{ notice }}</div>\n <SheetMenu ref=\"menu\" v-model:open=\"menuOpen\" :items=\"menuItems\" @select=\"runMenuItem\" />\n <span :id=\"keysHint\" class=\"dou-sheet__sr-only\">{{ messages.keys }}</span>\n <div class=\"dou-sheet__sr-only\" aria-live=\"polite\">{{ live }}</div>\n </div>\n </div>\n <slot name=\"footer\" />\n </div>\n</template>\n"],"mappings":"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"}