vastgrid 0.1.0 → 0.2.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 (312) hide show
  1. package/README.md +175 -13
  2. package/dist/canvas/geometry.d.ts +92 -0
  3. package/dist/canvas/geometry.d.ts.map +1 -0
  4. package/dist/canvas/geometry.js +197 -0
  5. package/dist/canvas/geometry.js.map +1 -0
  6. package/dist/canvas/grid-canvas.d.ts +161 -0
  7. package/dist/canvas/grid-canvas.d.ts.map +1 -0
  8. package/dist/canvas/grid-canvas.js +1146 -0
  9. package/dist/canvas/grid-canvas.js.map +1 -0
  10. package/dist/canvas/hooks.d.ts +61 -0
  11. package/dist/canvas/hooks.d.ts.map +1 -0
  12. package/dist/canvas/hooks.js +2 -0
  13. package/dist/canvas/hooks.js.map +1 -0
  14. package/dist/canvas/keys.d.ts +26 -0
  15. package/dist/canvas/keys.d.ts.map +1 -0
  16. package/dist/canvas/keys.js +133 -0
  17. package/dist/canvas/keys.js.map +1 -0
  18. package/dist/canvas/layout.d.ts +26 -0
  19. package/dist/canvas/layout.d.ts.map +1 -0
  20. package/dist/canvas/layout.js +73 -0
  21. package/dist/canvas/layout.js.map +1 -0
  22. package/dist/canvas/scroll.d.ts +31 -0
  23. package/dist/canvas/scroll.d.ts.map +1 -0
  24. package/dist/canvas/scroll.js +111 -0
  25. package/dist/canvas/scroll.js.map +1 -0
  26. package/dist/canvas/text.d.ts +23 -0
  27. package/dist/canvas/text.d.ts.map +1 -0
  28. package/dist/canvas/text.js +142 -0
  29. package/dist/canvas/text.js.map +1 -0
  30. package/dist/{theme.d.ts → canvas/theme.d.ts} +8 -0
  31. package/dist/canvas/theme.d.ts.map +1 -0
  32. package/dist/canvas/theme.js +62 -0
  33. package/dist/canvas/theme.js.map +1 -0
  34. package/dist/core/cache.d.ts +48 -0
  35. package/dist/core/cache.d.ts.map +1 -0
  36. package/dist/core/cache.js +222 -0
  37. package/dist/core/cache.js.map +1 -0
  38. package/dist/core/checked.d.ts +20 -0
  39. package/dist/core/checked.d.ts.map +1 -0
  40. package/dist/core/checked.js +61 -0
  41. package/dist/core/checked.js.map +1 -0
  42. package/dist/core/client.d.ts +33 -0
  43. package/dist/core/client.d.ts.map +1 -0
  44. package/dist/core/client.js +103 -0
  45. package/dist/core/client.js.map +1 -0
  46. package/dist/core/conditions.d.ts +48 -0
  47. package/dist/core/conditions.d.ts.map +1 -0
  48. package/dist/core/conditions.js +105 -0
  49. package/dist/core/conditions.js.map +1 -0
  50. package/dist/core/evaluate.d.ts +20 -0
  51. package/dist/core/evaluate.d.ts.map +1 -0
  52. package/dist/core/evaluate.js +210 -0
  53. package/dist/core/evaluate.js.map +1 -0
  54. package/dist/core/filters.d.ts +51 -0
  55. package/dist/core/filters.d.ts.map +1 -0
  56. package/dist/core/filters.js +303 -0
  57. package/dist/core/filters.js.map +1 -0
  58. package/dist/core/format.d.ts +14 -0
  59. package/dist/core/format.d.ts.map +1 -0
  60. package/dist/core/format.js +303 -0
  61. package/dist/core/format.js.map +1 -0
  62. package/dist/core/measures.d.ts +26 -0
  63. package/dist/core/measures.d.ts.map +1 -0
  64. package/dist/core/measures.js +105 -0
  65. package/dist/core/measures.js.map +1 -0
  66. package/dist/core/request-ids.d.ts +20 -0
  67. package/dist/core/request-ids.d.ts.map +1 -0
  68. package/dist/core/request-ids.js +55 -0
  69. package/dist/core/request-ids.js.map +1 -0
  70. package/dist/core/rows.d.ts +79 -0
  71. package/dist/core/rows.d.ts.map +1 -0
  72. package/dist/core/rows.js +173 -0
  73. package/dist/core/rows.js.map +1 -0
  74. package/dist/core/store.d.ts +233 -0
  75. package/dist/core/store.d.ts.map +1 -0
  76. package/dist/core/store.js +1162 -0
  77. package/dist/core/store.js.map +1 -0
  78. package/dist/core/totals.d.ts +24 -0
  79. package/dist/core/totals.d.ts.map +1 -0
  80. package/dist/core/totals.js +49 -0
  81. package/dist/core/totals.js.map +1 -0
  82. package/dist/core/trace.d.ts +7 -0
  83. package/dist/core/trace.d.ts.map +1 -0
  84. package/dist/core/trace.js +26 -0
  85. package/dist/core/trace.js.map +1 -0
  86. package/dist/core/transports.d.ts +50 -0
  87. package/dist/core/transports.d.ts.map +1 -0
  88. package/dist/core/transports.js +160 -0
  89. package/dist/core/transports.js.map +1 -0
  90. package/dist/core/types.d.ts +150 -0
  91. package/dist/core/types.d.ts.map +1 -0
  92. package/dist/core/types.js +45 -0
  93. package/dist/core/types.js.map +1 -0
  94. package/dist/core.d.ts +12 -0
  95. package/dist/core.d.ts.map +1 -0
  96. package/dist/core.js +11 -0
  97. package/dist/core.js.map +1 -0
  98. package/dist/index.d.ts +15 -6
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +13 -7
  101. package/dist/index.js.map +1 -1
  102. package/dist/react/accessible-rows.d.ts +13 -0
  103. package/dist/react/accessible-rows.d.ts.map +1 -0
  104. package/dist/react/accessible-rows.js +320 -0
  105. package/dist/react/accessible-rows.js.map +1 -0
  106. package/dist/react/cell-editor.d.ts +22 -0
  107. package/dist/react/cell-editor.d.ts.map +1 -0
  108. package/dist/react/cell-editor.js +431 -0
  109. package/dist/react/cell-editor.js.map +1 -0
  110. package/dist/react/cell-menu.d.ts +18 -0
  111. package/dist/react/cell-menu.d.ts.map +1 -0
  112. package/dist/react/cell-menu.js +299 -0
  113. package/dist/react/cell-menu.js.map +1 -0
  114. package/dist/react/column-menu.d.ts +16 -0
  115. package/dist/react/column-menu.d.ts.map +1 -0
  116. package/dist/react/column-menu.js +1311 -0
  117. package/dist/react/column-menu.js.map +1 -0
  118. package/dist/react/columns-menu.d.ts +7 -0
  119. package/dist/react/columns-menu.d.ts.map +1 -0
  120. package/dist/react/columns-menu.js +249 -0
  121. package/dist/react/columns-menu.js.map +1 -0
  122. package/dist/react/conditions-menu.d.ts +10 -0
  123. package/dist/react/conditions-menu.d.ts.map +1 -0
  124. package/dist/react/conditions-menu.js +795 -0
  125. package/dist/react/conditions-menu.js.map +1 -0
  126. package/dist/react/context.d.ts +29 -0
  127. package/dist/react/context.d.ts.map +1 -0
  128. package/dist/react/context.js +18 -0
  129. package/dist/react/context.js.map +1 -0
  130. package/dist/react/data-grid.d.ts +79 -0
  131. package/dist/react/data-grid.d.ts.map +1 -0
  132. package/dist/react/data-grid.js +653 -0
  133. package/dist/react/data-grid.js.map +1 -0
  134. package/dist/react/detail-panel.d.ts +22 -0
  135. package/dist/react/detail-panel.d.ts.map +1 -0
  136. package/dist/react/detail-panel.js +242 -0
  137. package/dist/react/detail-panel.js.map +1 -0
  138. package/dist/react/export-menu.d.ts +11 -0
  139. package/dist/react/export-menu.d.ts.map +1 -0
  140. package/dist/react/export-menu.js +304 -0
  141. package/dist/react/export-menu.js.map +1 -0
  142. package/dist/react/find-bar.d.ts +11 -0
  143. package/dist/react/find-bar.d.ts.map +1 -0
  144. package/dist/react/find-bar.js +303 -0
  145. package/dist/react/find-bar.js.map +1 -0
  146. package/dist/react/format-form.d.ts +12 -0
  147. package/dist/react/format-form.d.ts.map +1 -0
  148. package/dist/react/format-form.js +863 -0
  149. package/dist/react/format-form.js.map +1 -0
  150. package/dist/react/formula-menu.d.ts +6 -0
  151. package/dist/react/formula-menu.d.ts.map +1 -0
  152. package/dist/react/formula-menu.js +343 -0
  153. package/dist/react/formula-menu.js.map +1 -0
  154. package/dist/react/grid-body.d.ts +33 -0
  155. package/dist/react/grid-body.d.ts.map +1 -0
  156. package/dist/react/grid-body.js +1389 -0
  157. package/dist/react/grid-body.js.map +1 -0
  158. package/dist/react/group-menu.d.ts +7 -0
  159. package/dist/react/group-menu.d.ts.map +1 -0
  160. package/dist/react/group-menu.js +508 -0
  161. package/dist/react/group-menu.js.map +1 -0
  162. package/dist/react/hooks.d.ts +33 -0
  163. package/dist/react/hooks.d.ts.map +1 -0
  164. package/dist/react/hooks.js +161 -0
  165. package/dist/react/hooks.js.map +1 -0
  166. package/dist/react/messages.d.ts +180 -0
  167. package/dist/react/messages.d.ts.map +1 -0
  168. package/dist/react/messages.js +414 -0
  169. package/dist/react/messages.js.map +1 -0
  170. package/dist/react/save.d.ts +9 -0
  171. package/dist/react/save.d.ts.map +1 -0
  172. package/dist/react/save.js +102 -0
  173. package/dist/react/save.js.map +1 -0
  174. package/dist/react/static-rows.d.ts +9 -0
  175. package/dist/react/static-rows.d.ts.map +1 -0
  176. package/dist/react/static-rows.js +176 -0
  177. package/dist/react/static-rows.js.map +1 -0
  178. package/dist/react/status-bar.d.ts +12 -0
  179. package/dist/react/status-bar.d.ts.map +1 -0
  180. package/dist/react/status-bar.js +413 -0
  181. package/dist/react/status-bar.js.map +1 -0
  182. package/dist/react/toolbar-popover.d.ts +14 -0
  183. package/dist/react/toolbar-popover.d.ts.map +1 -0
  184. package/dist/react/toolbar-popover.js +143 -0
  185. package/dist/react/toolbar-popover.js.map +1 -0
  186. package/dist/react/toolbar.d.ts +13 -0
  187. package/dist/react/toolbar.d.ts.map +1 -0
  188. package/dist/react/toolbar.js +344 -0
  189. package/dist/react/toolbar.js.map +1 -0
  190. package/dist/server.d.ts +22 -0
  191. package/dist/server.d.ts.map +1 -0
  192. package/dist/server.js +45 -0
  193. package/dist/server.js.map +1 -0
  194. package/dist/styles.css +496 -316
  195. package/package.json +43 -18
  196. package/src/canvas/geometry.ts +197 -0
  197. package/src/canvas/grid-canvas.ts +1222 -0
  198. package/src/canvas/hooks.ts +61 -0
  199. package/src/canvas/keys.ts +96 -0
  200. package/src/canvas/layout.ts +77 -0
  201. package/src/canvas/scroll.ts +120 -0
  202. package/src/canvas/text.ts +155 -0
  203. package/src/{theme.ts → canvas/theme.ts} +14 -1
  204. package/src/core/cache.ts +247 -0
  205. package/src/core/checked.ts +64 -0
  206. package/src/core/client.ts +103 -0
  207. package/src/core/conditions.ts +89 -0
  208. package/src/core/evaluate.ts +221 -0
  209. package/src/core/filters.ts +268 -0
  210. package/src/core/format.ts +309 -0
  211. package/src/core/measures.ts +99 -0
  212. package/src/core/request-ids.ts +54 -0
  213. package/src/core/rows.ts +213 -0
  214. package/src/core/store.ts +1122 -0
  215. package/src/core/totals.ts +59 -0
  216. package/src/core/trace.ts +44 -0
  217. package/src/core/transports.ts +177 -0
  218. package/src/core/types.ts +168 -0
  219. package/src/core.ts +39 -0
  220. package/src/index.ts +24 -12
  221. package/src/react/accessible-rows.tsx +242 -0
  222. package/src/react/cell-editor.tsx +216 -0
  223. package/src/react/cell-menu.tsx +166 -0
  224. package/src/react/column-menu.tsx +619 -0
  225. package/src/react/columns-menu.tsx +116 -0
  226. package/src/react/conditions-menu.tsx +289 -0
  227. package/src/react/context.ts +33 -0
  228. package/src/react/data-grid.tsx +286 -0
  229. package/src/react/detail-panel.tsx +92 -0
  230. package/src/react/export-menu.tsx +112 -0
  231. package/src/react/find-bar.tsx +112 -0
  232. package/src/react/format-form.tsx +421 -0
  233. package/src/react/formula-menu.tsx +163 -0
  234. package/src/react/grid-body.tsx +744 -0
  235. package/src/react/group-menu.tsx +214 -0
  236. package/src/react/hooks.ts +104 -0
  237. package/src/react/messages.ts +556 -0
  238. package/src/react/save.ts +42 -0
  239. package/src/react/static-rows.tsx +59 -0
  240. package/src/react/status-bar.tsx +175 -0
  241. package/src/react/toolbar-popover.tsx +69 -0
  242. package/src/react/toolbar.tsx +152 -0
  243. package/src/server.ts +58 -0
  244. package/src/styles.css +496 -316
  245. package/dist/components/bars.d.ts +0 -14
  246. package/dist/components/bars.d.ts.map +0 -1
  247. package/dist/components/bars.js +0 -67
  248. package/dist/components/bars.js.map +0 -1
  249. package/dist/components/cell-inspector.d.ts +0 -11
  250. package/dist/components/cell-inspector.d.ts.map +0 -1
  251. package/dist/components/cell-inspector.js +0 -37
  252. package/dist/components/cell-inspector.js.map +0 -1
  253. package/dist/components/columns-panel.d.ts +0 -12
  254. package/dist/components/columns-panel.d.ts.map +0 -1
  255. package/dist/components/columns-panel.js +0 -11
  256. package/dist/components/columns-panel.js.map +0 -1
  257. package/dist/components/filter-panel.d.ts +0 -17
  258. package/dist/components/filter-panel.d.ts.map +0 -1
  259. package/dist/components/filter-panel.js +0 -165
  260. package/dist/components/filter-panel.js.map +0 -1
  261. package/dist/components/find-bar.d.ts +0 -9
  262. package/dist/components/find-bar.d.ts.map +0 -1
  263. package/dist/components/find-bar.js +0 -46
  264. package/dist/components/find-bar.js.map +0 -1
  265. package/dist/components/popover.d.ts +0 -38
  266. package/dist/components/popover.d.ts.map +0 -1
  267. package/dist/components/popover.js +0 -104
  268. package/dist/components/popover.js.map +0 -1
  269. package/dist/components/stats-panel.d.ts +0 -12
  270. package/dist/components/stats-panel.d.ts.map +0 -1
  271. package/dist/components/stats-panel.js +0 -40
  272. package/dist/components/stats-panel.js.map +0 -1
  273. package/dist/controller.d.ts +0 -218
  274. package/dist/controller.d.ts.map +0 -1
  275. package/dist/controller.js +0 -788
  276. package/dist/controller.js.map +0 -1
  277. package/dist/data-grid.d.ts +0 -51
  278. package/dist/data-grid.d.ts.map +0 -1
  279. package/dist/data-grid.js +0 -698
  280. package/dist/data-grid.js.map +0 -1
  281. package/dist/labels.d.ts +0 -9
  282. package/dist/labels.d.ts.map +0 -1
  283. package/dist/labels.js +0 -38
  284. package/dist/labels.js.map +0 -1
  285. package/dist/messages.d.ts +0 -99
  286. package/dist/messages.d.ts.map +0 -1
  287. package/dist/messages.js +0 -276
  288. package/dist/messages.js.map +0 -1
  289. package/dist/renderer.d.ts +0 -52
  290. package/dist/renderer.d.ts.map +0 -1
  291. package/dist/renderer.js +0 -522
  292. package/dist/renderer.js.map +0 -1
  293. package/dist/text.d.ts +0 -14
  294. package/dist/text.d.ts.map +0 -1
  295. package/dist/text.js +0 -63
  296. package/dist/text.js.map +0 -1
  297. package/dist/theme.d.ts.map +0 -1
  298. package/dist/theme.js +0 -54
  299. package/dist/theme.js.map +0 -1
  300. package/src/components/bars.tsx +0 -179
  301. package/src/components/cell-inspector.tsx +0 -70
  302. package/src/components/columns-panel.tsx +0 -59
  303. package/src/components/filter-panel.tsx +0 -290
  304. package/src/components/find-bar.tsx +0 -104
  305. package/src/components/popover.tsx +0 -194
  306. package/src/components/stats-panel.tsx +0 -153
  307. package/src/controller.ts +0 -887
  308. package/src/data-grid.tsx +0 -1029
  309. package/src/labels.ts +0 -46
  310. package/src/messages.ts +0 -390
  311. package/src/renderer.ts +0 -535
  312. package/src/text.ts +0 -55
@@ -0,0 +1 @@
1
+ {"version":3,"names":["startTransition","useEffect","useState","textOf","useGridSelector","useGridStore","jsx","_jsx","jsxs","_jsxs","MAX_ROWS","MAX_COLUMNS","cellId","id","row","column","shownColumns","settled","columns","shown","length","scrolls","left","right","setting","pin","undefined","push","boxOf","canvas","x","y","width","height","geometry","scrollX","native","top","scrollY","readRow","store","onScreen","rowY","headerHeight","cells","map","item","value","cell","name","text","description","styleOf","action","actionAt","columnX","columnWidth","rowHeight","readScreen","header","format","label","groups","groupNames","join","rows","end","Math","min","selectedOf","ranges","active","selected","inRange","some","range","includes","sortOf","sort","key","find","direction","style","box","AccessibleRow","t0","$","_c","t1","Set","split","Number","marked","t2","t3","t4","role","has","children","kind","AccessibleRows","getSettled","setSettled","subscribeSettled","_temp","_temp2","selection","_temp3","_temp4","totals","_temp5","bottom","footer","rowCount","values","screen","elsewhere","_temp6","t5","t6","className","cell_0","type","a","b","snapshot_3","snapshot","snapshot_2","session","snapshot_1","snapshot_0","document","plan","displayed"],"sources":["accessible-rows.tsx"],"sourcesContent":["import { startTransition, useEffect, useState } from \"react\";\nimport { type ActiveCell, type CellRange, type DisplayedColumn, type SortKey, textOf } from \"vastgrid-spec\";\nimport type { GridCanvas, Settled } from \"../canvas/grid-canvas.js\";\nimport type { GridStore } from \"../core/store.js\";\nimport { useGridSelector, useGridStore } from \"./hooks.js\";\n\n/** Rows and columns that the accessibility tree holds at most. */\nconst MAX_ROWS = 200;\nconst MAX_COLUMNS = 60;\n\n/** The id of the element of a cell, for `aria-activedescendant`. */\nexport function cellId(id: string, row: number, column: number) {\n return `${id}-r${row}-c${column}`;\n}\n\ninterface Box {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\ninterface Cell extends Box {\n column: number;\n name: string;\n text: string;\n /** What the colors of a style rule mean (§5.1), read by screen readers. */\n description?: string;\n /** A link or a button (`cellAction`), with its name for screen readers. */\n action?: { kind: \"link\" | \"button\"; label?: string };\n}\n\ninterface ShownRow {\n row: number;\n cells: Cell[];\n}\n\n/** The display positions of the columns on screen: those that scroll into view, and those pinned. */\nfunction shownColumns(settled: Settled, columns: readonly DisplayedColumn[]): number[] {\n const shown: number[] = [];\n for (let column = 0; column < columns.length && shown.length < MAX_COLUMNS; column++) {\n const scrolls = column >= settled.left && column <= settled.right;\n if (scrolls || columns[column].setting.pin !== undefined) shown.push(column);\n }\n return shown;\n}\n\n/** A box of the canvas, in the scroller's content. */\nfunction boxOf(canvas: GridCanvas, x: number, y: number, width: number, height: number): Box {\n return { left: canvas.geometry.scrollX.native + x, top: canvas.geometry.scrollY.native + y, width, height };\n}\n\n/** A row's cells; a row that is not on screen is placed at the top of the screen. */\nfunction readRow(\n canvas: GridCanvas,\n store: GridStore,\n columns: readonly DisplayedColumn[],\n shown: readonly number[],\n row: number,\n onScreen: boolean,\n): ShownRow {\n const { geometry } = canvas;\n const y = onScreen ? geometry.rowY(row) : geometry.headerHeight;\n const cells = shown.map((column) => {\n const item = columns[column].column;\n const value = store.cell(row, item.name);\n return {\n column,\n name: item.name,\n text: value === undefined || value === null ? \"\" : canvas.text(row, item, value),\n description: canvas.styleOf(row, item.name)?.description,\n action: canvas.actionAt(row, column)?.action,\n ...boxOf(canvas, geometry.columnX(column), y, geometry.columnWidth(column), geometry.rowHeight),\n };\n });\n return { row, cells };\n}\n\n/**\n * Where the headers and the cells on screen are, in the scroller's content, and their text. The canvas and the\n * cache change inside their objects, so `settled` is an argument: they are read again when scrolling pauses or\n * rows arrive (memoization, React Compiler's included, keys on it), and not when the selection moves.\n */\nfunction readScreen(canvas: GridCanvas, store: GridStore, settled: Settled, columns: readonly DisplayedColumn[]) {\n const { geometry } = canvas;\n const shown = shownColumns(settled, columns);\n const header = shown.map((column) => ({\n column,\n name: columns[column].column.name,\n text: columns[column].setting.format?.label ?? columns[column].column.name,\n groups: canvas.groupNames(column).join(\" › \"),\n ...boxOf(canvas, geometry.columnX(column), 0, geometry.columnWidth(column), geometry.headerHeight),\n }));\n const rows: ShownRow[] = [];\n const end = Math.min(settled.top + settled.rows, settled.top + MAX_ROWS);\n for (let row = settled.top; row < end; row++) rows.push(readRow(canvas, store, columns, shown, row, true));\n return { header, rows, shown, end };\n}\n\n/** The display positions of a row's selected cells (§5.2), as text that stays the same while they do. */\nfunction selectedOf(ranges: readonly CellRange[] | undefined, active: ActiveCell | undefined, row: ShownRow) {\n const selected: number[] = [];\n for (const cell of row.cells) {\n const inRange = (ranges ?? []).some(\n (range) =>\n (range.rows === \"all\" || (row.row >= range.rows[0] && row.row < range.rows[1])) &&\n (range.columns === \"all\" || range.columns.includes(cell.name)),\n );\n if (inRange || (active?.row === row.row && active.column === cell.name)) selected.push(cell.column);\n }\n return selected.join(\",\");\n}\n\nfunction sortOf(sort: readonly SortKey[] | undefined, column: string) {\n const key = sort?.find((item) => item.column === column);\n return key ? (key.direction === \"asc\" ? \"ascending\" : \"descending\") : undefined;\n}\n\nconst style = (box: Box) => ({ left: box.left, top: box.top, width: box.width, height: box.height });\n\n/** A row of the accessibility tree; it renders again only when its cells or its selected cells change. */\nfunction AccessibleRow({ id, row, selected }: { id: string; row: ShownRow; selected: string }) {\n const marked = new Set(selected === \"\" ? [] : selected.split(\",\").map(Number));\n return (\n // biome-ignore lint/a11y/useSemanticElements: ARIA grid pattern over a canvas.\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant).\n <div role=\"row\" aria-rowindex={row.row + 2}>\n {row.cells.map((cell) => (\n // biome-ignore lint/a11y/useSemanticElements: ARIA grid pattern over a canvas.\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant).\n <div\n key={cell.name}\n id={cellId(id, row.row, cell.column)}\n role=\"gridcell\"\n aria-colindex={cell.column + 1}\n aria-selected={marked.has(cell.column)}\n aria-description={cell.description}\n style={style(cell)}\n >\n {cell.action?.kind === \"link\" ? (\n // biome-ignore lint/a11y/useSemanticElements: the cell's link is drawn on the canvas; this names it.\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant).\n <span role=\"link\" aria-label={cell.action.label}>\n {cell.text}\n </span>\n ) : cell.action?.kind === \"button\" ? (\n // biome-ignore lint/a11y/useSemanticElements: the cell's button is drawn on the canvas; this names it.\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant).\n <span role=\"button\" aria-label={cell.action.label}>\n {cell.text}\n </span>\n ) : (\n cell.text\n )}\n </div>\n ))}\n </div>\n );\n}\n\n/**\n * The rows on screen as ARIA rows and cells under the canvas (§6.4 of react.md), placed over the cells they\n * stand for and drawn transparent, with the row of the active cell when it is elsewhere. They follow the canvas\n * when scrolling pauses, in a Transition: one commit at a lower priority than anything the person does.\n */\nexport function AccessibleRows({ canvas, id }: { canvas: GridCanvas; id: string }) {\n const { geometry } = canvas;\n const store = useGridStore();\n const [settled, setSettled] = useState(() => canvas.getSettled());\n useEffect(\n () =>\n canvas.subscribeSettled(() => {\n startTransition(() => setSettled(canvas.getSettled()));\n }),\n [canvas],\n );\n const columns = useGridSelector((snapshot) => snapshot.displayed);\n const sort = useGridSelector((snapshot) => snapshot.document.plan?.sort);\n const selection = useGridSelector((snapshot) => snapshot.session.selection);\n const active = useGridSelector((snapshot) => snapshot.session.active);\n const totals = useGridSelector((snapshot) => snapshot.totals);\n const screen = readScreen(canvas, store, settled, columns);\n const elsewhere =\n active && (active.row < settled.top || active.row >= screen.end) && active.row < geometry.rowCount\n ? readRow(canvas, store, columns, screen.shown, active.row, false)\n : null;\n const rows = elsewhere ? [...screen.rows, elsewhere].sort((a, b) => a.row - b.row) : screen.rows;\n return (\n // biome-ignore lint/a11y/useSemanticElements: ARIA grid pattern over a canvas.\n <div className=\"vg-a11y\" role=\"rowgroup\">\n {/* biome-ignore lint/a11y/useSemanticElements: ARIA grid pattern over a canvas. */}\n {/* biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant). */}\n <div role=\"row\" aria-rowindex={1}>\n {screen.header.map((cell) => (\n // biome-ignore lint/a11y/useSemanticElements: ARIA grid pattern over a canvas.\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant).\n <div\n key={cell.name}\n role=\"columnheader\"\n aria-colindex={cell.column + 1}\n aria-sort={sortOf(sort, cell.name)}\n aria-description={cell.groups || undefined}\n style={style(cell)}\n >\n {cell.text}\n </div>\n ))}\n </div>\n {rows.map((row) => (\n <AccessibleRow key={row.row} id={id} row={row} selected={selectedOf(selection, active, row)} />\n ))}\n {geometry.footer > 0 && (\n // The totals row (§5.1 of the specification), after the rows.\n // biome-ignore lint/a11y/useSemanticElements: ARIA grid pattern over a canvas.\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant).\n <div role=\"row\" aria-rowindex={geometry.rowCount + 2}>\n {screen.header.map((cell) => {\n const value = totals?.values[cell.name];\n const type = totals?.columns[cell.name];\n return (\n // biome-ignore lint/a11y/useSemanticElements: ARIA grid pattern over a canvas.\n // biome-ignore lint/a11y/useFocusableInteractive: focus stays on the grid (aria-activedescendant).\n <div\n key={cell.name}\n role=\"gridcell\"\n aria-colindex={cell.column + 1}\n style={{\n left: cell.left,\n top: geometry.bottom,\n width: cell.width,\n height: geometry.footer,\n }}\n >\n {value === undefined || value === null || !type ? \"\" : (textOf(value, type) ?? \"\")}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import { type Ref, type RefObject } from "react";
2
+ import type { GridCanvas } from "../canvas/grid-canvas.js";
3
+ /** What the grid asks of the editor while it handles a key. */
4
+ export interface EditorControl {
5
+ /** Places the editor over the editor's cell and gives it the focus, before the key's text arrives. */
6
+ open(): void;
7
+ }
8
+ export interface CellEditorProps {
9
+ canvas: GridCanvas;
10
+ scrollerRef: RefObject<HTMLDivElement | null>;
11
+ announce: (text: string) => void;
12
+ ref?: Ref<EditorControl>;
13
+ }
14
+ /**
15
+ * The text field over the cell being edited (§6.5 of the specification), the session's `editor`. It stays in the
16
+ * page while no cell is edited, so that a key that types text, an IME's included, moves into it with its text:
17
+ * the grid opens the editor and gives it the focus before the browser handles the key. Enter saves and moves down
18
+ * (Shift+Enter up), Tab saves and moves right (Shift+Tab left), Esc cancels, and Alt+Enter (also ⌃↩ on Apple
19
+ * platforms) starts a new line. Keys that end an IME composition are left to the IME.
20
+ */
21
+ export declare function CellEditor({ canvas, scrollerRef, announce, ref }: CellEditorProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=cell-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-editor.d.ts","sourceRoot":"","sources":["../../src/react/cell-editor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM3D,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,sGAAsG;IACtG,IAAI,IAAI,IAAI,CAAC;CACd;AA2BD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,eAAe,+BAqJjF"}
@@ -0,0 +1,431 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { use, useId, useImperativeHandle, useLayoutEffect, useRef, useState } from "react";
3
+ import { CommandError } from "vastgrid-spec";
4
+ import { isApple, keyCommand } from "../canvas/keys.js";
5
+ import { LocaleContext, SaveContext } from "./context.js";
6
+ import { useGridSelector, useGridStore } from "./hooks.js";
7
+
8
+ /** What the grid asks of the editor while it handles a key. */
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ /** Whether an editor of the session is for the same cell as another. */
11
+ function sameCell(a, b) {
12
+ return a !== undefined && b !== undefined && a.row === b.row && a.column === b.column;
13
+ }
14
+
15
+ /** Grows the editor with its lines, from the cell's height up. */
16
+ function fit(textarea) {
17
+ textarea.style.height = "";
18
+ textarea.style.height = `${Math.max(textarea.offsetHeight, textarea.scrollHeight)}px`;
19
+ }
20
+
21
+ /** Places the editor's box over the cell of the session's editor, hidden while the cell is scrolled away. */
22
+ function place(box, store, canvas) {
23
+ const current = store.getSnapshot().session.editor;
24
+ if (!box || !current) return;
25
+ const at = store.getSnapshot().displayed.findIndex(item => item.column.name === current.column);
26
+ if (at < 0) return;
27
+ const cell = canvas.geometry.cellBox(current.row, at);
28
+ box.style.left = `${cell.left}px`;
29
+ box.style.top = `${cell.top}px`;
30
+ box.style.minWidth = `${Math.max(cell.width, 60)}px`;
31
+ box.style.setProperty("--vg-editor-height", `${cell.height}px`);
32
+ box.style.visibility = cell.shown ? "" : "hidden";
33
+ }
34
+ /**
35
+ * The text field over the cell being edited (§6.5 of the specification), the session's `editor`. It stays in the
36
+ * page while no cell is edited, so that a key that types text, an IME's included, moves into it with its text:
37
+ * the grid opens the editor and gives it the focus before the browser handles the key. Enter saves and moves down
38
+ * (Shift+Enter up), Tab saves and moves right (Shift+Tab left), Esc cancels, and Alt+Enter (also ⌃↩ on Apple
39
+ * platforms) starts a new line. Keys that end an IME composition are left to the IME.
40
+ */
41
+ export function CellEditor(t0) {
42
+ const $ = _c(72);
43
+ const {
44
+ canvas,
45
+ scrollerRef,
46
+ announce,
47
+ ref
48
+ } = t0;
49
+ const store = useGridStore();
50
+ const {
51
+ messages,
52
+ number
53
+ } = use(LocaleContext);
54
+ const saving = use(SaveContext);
55
+ const editor = useGridSelector(_temp);
56
+ const columns = useGridSelector(_temp2);
57
+ const boxRef = useRef(null);
58
+ const textareaRef = useRef(null);
59
+ const shown = useRef(undefined);
60
+ const [problem, setProblem] = useState(null);
61
+ const hintId = useId();
62
+ const errorId = useId();
63
+ let t1;
64
+ if ($[0] !== columns || $[1] !== editor) {
65
+ t1 = editor ? columns.findIndex(item => item.column.name === editor.column) : -1;
66
+ $[0] = columns;
67
+ $[1] = editor;
68
+ $[2] = t1;
69
+ } else {
70
+ t1 = $[2];
71
+ }
72
+ const column = t1;
73
+ const open = editor !== undefined && column >= 0;
74
+ let t2;
75
+ if ($[3] !== editor || $[4] !== problem) {
76
+ t2 = problem && sameCell(problem.editor, editor) ? problem.text : null;
77
+ $[3] = editor;
78
+ $[4] = problem;
79
+ $[5] = t2;
80
+ } else {
81
+ t2 = $[5];
82
+ }
83
+ const error = t2;
84
+ let t3;
85
+ let t4;
86
+ if ($[6] !== canvas || $[7] !== store) {
87
+ t3 = () => ({
88
+ open: () => {
89
+ place(boxRef.current, store, canvas);
90
+ textareaRef.current?.focus({
91
+ preventScroll: true
92
+ });
93
+ }
94
+ });
95
+ t4 = [store, canvas];
96
+ $[6] = canvas;
97
+ $[7] = store;
98
+ $[8] = t3;
99
+ $[9] = t4;
100
+ } else {
101
+ t3 = $[8];
102
+ t4 = $[9];
103
+ }
104
+ useImperativeHandle(ref, t3, t4);
105
+ let t5;
106
+ if ($[10] !== canvas || $[11] !== open || $[12] !== store) {
107
+ t5 = () => {
108
+ if (!open) {
109
+ return;
110
+ }
111
+ const box = boxRef.current;
112
+ place(box, store, canvas);
113
+ return canvas.subscribeFrames(() => place(box, store, canvas));
114
+ };
115
+ $[10] = canvas;
116
+ $[11] = open;
117
+ $[12] = store;
118
+ $[13] = t5;
119
+ } else {
120
+ t5 = $[13];
121
+ }
122
+ const t6 = editor?.row;
123
+ let t7;
124
+ if ($[14] !== canvas || $[15] !== column || $[16] !== open || $[17] !== store || $[18] !== t6) {
125
+ t7 = [canvas, store, open, t6, column];
126
+ $[14] = canvas;
127
+ $[15] = column;
128
+ $[16] = open;
129
+ $[17] = store;
130
+ $[18] = t6;
131
+ $[19] = t7;
132
+ } else {
133
+ t7 = $[19];
134
+ }
135
+ useLayoutEffect(t5, t7);
136
+ let t8;
137
+ let t9;
138
+ if ($[20] !== editor || $[21] !== scrollerRef) {
139
+ t8 = () => {
140
+ const textarea = textareaRef.current;
141
+ const before = shown.current;
142
+ shown.current = editor;
143
+ if (!textarea) {
144
+ return;
145
+ }
146
+ if (editor && !sameCell(before, editor)) {
147
+ textarea.value = editor.text;
148
+ textarea.setSelectionRange(editor.text.length, editor.text.length);
149
+ textarea.style.height = "";
150
+ if (document.activeElement !== textarea) {
151
+ textarea.focus({
152
+ preventScroll: true
153
+ });
154
+ }
155
+ fit(textarea);
156
+ } else {
157
+ if (!editor && before && document.activeElement === textarea) {
158
+ scrollerRef.current?.focus({
159
+ preventScroll: true
160
+ });
161
+ }
162
+ }
163
+ };
164
+ t9 = [editor, scrollerRef];
165
+ $[20] = editor;
166
+ $[21] = scrollerRef;
167
+ $[22] = t8;
168
+ $[23] = t9;
169
+ } else {
170
+ t8 = $[22];
171
+ t9 = $[23];
172
+ }
173
+ useLayoutEffect(t8, t9);
174
+ let t10;
175
+ if ($[24] !== store) {
176
+ t10 = text => {
177
+ if (store.getSnapshot().session.editor) {
178
+ store.dispatchSync({
179
+ command: "edit.change",
180
+ text
181
+ });
182
+ }
183
+ };
184
+ $[24] = store;
185
+ $[25] = t10;
186
+ } else {
187
+ t10 = $[25];
188
+ }
189
+ const change = t10;
190
+ let t11;
191
+ if ($[26] !== announce || $[27] !== change || $[28] !== messages || $[29] !== store) {
192
+ t11 = async move => {
193
+ const textarea_0 = textareaRef.current;
194
+ const current = store.getSnapshot().session.editor;
195
+ if (!textarea_0 || !current) {
196
+ return false;
197
+ }
198
+ setProblem(null);
199
+ change(textarea_0.value);
200
+ const outcome = await store.dispatch({
201
+ command: "edit.commit",
202
+ move
203
+ });
204
+ if (outcome.ok) {
205
+ return true;
206
+ }
207
+ const reason = outcome.error instanceof CommandError ? outcome.error.reason : null;
208
+ if (reason === "invalid_value") {
209
+ setProblem({
210
+ editor: current,
211
+ text: messages.invalidValue(current.column)
212
+ });
213
+ } else {
214
+ if (reason === "read_only") {
215
+ setProblem({
216
+ editor: current,
217
+ text: messages.readOnly
218
+ });
219
+ } else {
220
+ announce(messages.failed(outcome.error.message));
221
+ }
222
+ }
223
+ return false;
224
+ };
225
+ $[26] = announce;
226
+ $[27] = change;
227
+ $[28] = messages;
228
+ $[29] = store;
229
+ $[30] = t11;
230
+ } else {
231
+ t11 = $[30];
232
+ }
233
+ const commit = t11;
234
+ let t12;
235
+ if ($[31] !== change || $[32] !== commit || $[33] !== open || $[34] !== saving || $[35] !== store) {
236
+ t12 = event => {
237
+ event.stopPropagation();
238
+ if (!open || event.nativeEvent.isComposing || event.keyCode === 229) {
239
+ return;
240
+ }
241
+ const textarea_1 = event.currentTarget;
242
+ if (event.key === "Escape") {
243
+ event.preventDefault();
244
+ store.dispatchSync({
245
+ command: "edit.cancel"
246
+ });
247
+ } else {
248
+ if (event.key === "Enter" && (event.altKey || isApple() && event.ctrlKey)) {
249
+ event.preventDefault();
250
+ textarea_1.setRangeText("\n", textarea_1.selectionStart, textarea_1.selectionEnd, "end");
251
+ change(textarea_1.value);
252
+ fit(textarea_1);
253
+ } else {
254
+ if (event.key === "Enter") {
255
+ event.preventDefault();
256
+ commit(event.shiftKey ? "up" : "down");
257
+ } else {
258
+ if (event.key === "Tab") {
259
+ event.preventDefault();
260
+ commit(event.shiftKey ? "left" : "right");
261
+ } else {
262
+ if (saving && keyCommand(event, isApple())?.command === "save") {
263
+ if (store.getSnapshot().table?.capabilities.save !== true) {
264
+ return;
265
+ }
266
+ event.preventDefault();
267
+ commit(null).then(written => {
268
+ if (written) {
269
+ saving.save();
270
+ }
271
+ });
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ };
278
+ $[31] = change;
279
+ $[32] = commit;
280
+ $[33] = open;
281
+ $[34] = saving;
282
+ $[35] = store;
283
+ $[36] = t12;
284
+ } else {
285
+ t12 = $[36];
286
+ }
287
+ const onKeyDown = t12;
288
+ let t13;
289
+ if ($[37] !== change) {
290
+ t13 = event_0 => {
291
+ fit(event_0.currentTarget);
292
+ if (!event_0.nativeEvent.isComposing) {
293
+ change(event_0.currentTarget.value);
294
+ }
295
+ };
296
+ $[37] = change;
297
+ $[38] = t13;
298
+ } else {
299
+ t13 = $[38];
300
+ }
301
+ const onInput = t13;
302
+ let t14;
303
+ if ($[39] !== change) {
304
+ t14 = event_1 => change(event_1.currentTarget.value);
305
+ $[39] = change;
306
+ $[40] = t14;
307
+ } else {
308
+ t14 = $[40];
309
+ }
310
+ const onCompositionEnd = t14;
311
+ let t15;
312
+ if ($[41] !== commit || $[42] !== open) {
313
+ t15 = event_2 => {
314
+ if (open && event_2.relatedTarget !== null) {
315
+ commit(null);
316
+ }
317
+ };
318
+ $[41] = commit;
319
+ $[42] = open;
320
+ $[43] = t15;
321
+ } else {
322
+ t15 = $[43];
323
+ }
324
+ const onBlur = t15;
325
+ const t16 = open || undefined;
326
+ const t17 = error ? true : undefined;
327
+ const t18 = open ? 0 : -1;
328
+ const t19 = open ? undefined : true;
329
+ let t20;
330
+ if ($[44] !== editor || $[45] !== messages || $[46] !== number) {
331
+ t20 = editor ? messages.editing(number.format(editor.row + 1), editor.column) : undefined;
332
+ $[44] = editor;
333
+ $[45] = messages;
334
+ $[46] = number;
335
+ $[47] = t20;
336
+ } else {
337
+ t20 = $[47];
338
+ }
339
+ const t21 = error ? true : undefined;
340
+ const t22 = open ? error ? `${errorId} ${hintId}` : hintId : undefined;
341
+ let t23;
342
+ if ($[48] !== onBlur || $[49] !== onCompositionEnd || $[50] !== onInput || $[51] !== onKeyDown || $[52] !== t18 || $[53] !== t19 || $[54] !== t20 || $[55] !== t21 || $[56] !== t22) {
343
+ t23 = /*#__PURE__*/_jsx("textarea", {
344
+ ref: textareaRef,
345
+ className: "vg-editor-input",
346
+ tabIndex: t18,
347
+ "aria-hidden": t19,
348
+ "aria-label": t20,
349
+ "aria-invalid": t21,
350
+ "aria-describedby": t22,
351
+ spellCheck: false,
352
+ autoComplete: "off",
353
+ autoCapitalize: "off",
354
+ rows: 1,
355
+ onKeyDown: onKeyDown,
356
+ onInput: onInput,
357
+ onCompositionEnd: onCompositionEnd,
358
+ onBlur: onBlur
359
+ });
360
+ $[48] = onBlur;
361
+ $[49] = onCompositionEnd;
362
+ $[50] = onInput;
363
+ $[51] = onKeyDown;
364
+ $[52] = t18;
365
+ $[53] = t19;
366
+ $[54] = t20;
367
+ $[55] = t21;
368
+ $[56] = t22;
369
+ $[57] = t23;
370
+ } else {
371
+ t23 = $[57];
372
+ }
373
+ let t24;
374
+ if ($[58] !== hintId || $[59] !== messages || $[60] !== open) {
375
+ t24 = open && /*#__PURE__*/_jsx("span", {
376
+ id: hintId,
377
+ className: "vg-sr-only",
378
+ children: messages.editorHint
379
+ });
380
+ $[58] = hintId;
381
+ $[59] = messages;
382
+ $[60] = open;
383
+ $[61] = t24;
384
+ } else {
385
+ t24 = $[61];
386
+ }
387
+ let t25;
388
+ if ($[62] !== error || $[63] !== errorId || $[64] !== open) {
389
+ t25 = open && error && /*#__PURE__*/_jsx("div", {
390
+ className: "vg-editor-note",
391
+ children: /*#__PURE__*/_jsx("span", {
392
+ id: errorId,
393
+ className: "vg-editor-error",
394
+ role: "alert",
395
+ children: error
396
+ })
397
+ });
398
+ $[62] = error;
399
+ $[63] = errorId;
400
+ $[64] = open;
401
+ $[65] = t25;
402
+ } else {
403
+ t25 = $[65];
404
+ }
405
+ let t26;
406
+ if ($[66] !== t16 || $[67] !== t17 || $[68] !== t23 || $[69] !== t24 || $[70] !== t25) {
407
+ t26 = /*#__PURE__*/_jsxs("div", {
408
+ className: "vg-editor",
409
+ ref: boxRef,
410
+ "data-open": t16,
411
+ "data-invalid": t17,
412
+ children: [t23, t24, t25]
413
+ });
414
+ $[66] = t16;
415
+ $[67] = t17;
416
+ $[68] = t23;
417
+ $[69] = t24;
418
+ $[70] = t25;
419
+ $[71] = t26;
420
+ } else {
421
+ t26 = $[71];
422
+ }
423
+ return t26;
424
+ }
425
+ function _temp2(snapshot_0) {
426
+ return snapshot_0.displayed;
427
+ }
428
+ function _temp(snapshot) {
429
+ return snapshot.session.editor;
430
+ }
431
+ //# sourceMappingURL=cell-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["use","useId","useImperativeHandle","useLayoutEffect","useRef","useState","CommandError","isApple","keyCommand","LocaleContext","SaveContext","useGridSelector","useGridStore","jsx","_jsx","jsxs","_jsxs","sameCell","a","b","undefined","row","column","fit","textarea","style","height","Math","max","offsetHeight","scrollHeight","place","box","store","canvas","current","getSnapshot","session","editor","at","displayed","findIndex","item","name","cell","geometry","cellBox","left","top","minWidth","width","setProperty","visibility","shown","CellEditor","t0","$","_c","scrollerRef","announce","ref","messages","number","saving","_temp","columns","_temp2","boxRef","textareaRef","problem","setProblem","hintId","errorId","t1","open","t2","text","error","t3","t4","focus","preventScroll","t5","subscribeFrames","t6","t7","t8","t9","before","value","setSelectionRange","length","document","activeElement","t10","dispatchSync","command","change","t11","move","textarea_0","outcome","dispatch","ok","reason","invalidValue","readOnly","failed","message","commit","t12","event","stopPropagation","nativeEvent","isComposing","keyCode","textarea_1","currentTarget","key","preventDefault","altKey","ctrlKey","setRangeText","selectionStart","selectionEnd","shiftKey","table","capabilities","save","then","written","onKeyDown","t13","event_0","onInput","t14","event_1","onCompositionEnd","t15","event_2","relatedTarget","onBlur","t16","t17","t18","t19","t20","editing","format","t21","t22","t23","className","tabIndex","spellCheck","autoComplete","autoCapitalize","rows","t24","children","editorHint","t25","role","t26","snapshot_0","snapshot"],"sources":["cell-editor.tsx"],"sourcesContent":["import {\n type CompositionEvent,\n type FocusEvent,\n type FormEvent,\n type KeyboardEvent,\n type Ref,\n type RefObject,\n use,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { CommandError, type Editor } from \"vastgrid-spec\";\nimport type { GridCanvas } from \"../canvas/grid-canvas.js\";\nimport { isApple, keyCommand } from \"../canvas/keys.js\";\nimport type { GridStore } from \"../core/store.js\";\nimport { LocaleContext, SaveContext } from \"./context.js\";\nimport { useGridSelector, useGridStore } from \"./hooks.js\";\n\n/** What the grid asks of the editor while it handles a key. */\nexport interface EditorControl {\n /** Places the editor over the editor's cell and gives it the focus, before the key's text arrives. */\n open(): void;\n}\n\n/** Whether an editor of the session is for the same cell as another. */\nfunction sameCell(a: Editor | undefined, b: Editor | undefined) {\n return a !== undefined && b !== undefined && a.row === b.row && a.column === b.column;\n}\n\n/** Grows the editor with its lines, from the cell's height up. */\nfunction fit(textarea: HTMLTextAreaElement) {\n textarea.style.height = \"\";\n textarea.style.height = `${Math.max(textarea.offsetHeight, textarea.scrollHeight)}px`;\n}\n\n/** Places the editor's box over the cell of the session's editor, hidden while the cell is scrolled away. */\nfunction place(box: HTMLDivElement | null, store: GridStore, canvas: GridCanvas) {\n const current = store.getSnapshot().session.editor;\n if (!box || !current) return;\n const at = store.getSnapshot().displayed.findIndex((item) => item.column.name === current.column);\n if (at < 0) return;\n const cell = canvas.geometry.cellBox(current.row, at);\n box.style.left = `${cell.left}px`;\n box.style.top = `${cell.top}px`;\n box.style.minWidth = `${Math.max(cell.width, 60)}px`;\n box.style.setProperty(\"--vg-editor-height\", `${cell.height}px`);\n box.style.visibility = cell.shown ? \"\" : \"hidden\";\n}\n\nexport interface CellEditorProps {\n canvas: GridCanvas;\n scrollerRef: RefObject<HTMLDivElement | null>;\n announce: (text: string) => void;\n ref?: Ref<EditorControl>;\n}\n\n/**\n * The text field over the cell being edited (§6.5 of the specification), the session's `editor`. It stays in the\n * page while no cell is edited, so that a key that types text, an IME's included, moves into it with its text:\n * the grid opens the editor and gives it the focus before the browser handles the key. Enter saves and moves down\n * (Shift+Enter up), Tab saves and moves right (Shift+Tab left), Esc cancels, and Alt+Enter (also ⌃↩ on Apple\n * platforms) starts a new line. Keys that end an IME composition are left to the IME.\n */\nexport function CellEditor({ canvas, scrollerRef, announce, ref }: CellEditorProps) {\n const store = useGridStore();\n const { messages, number } = use(LocaleContext);\n const saving = use(SaveContext);\n const editor = useGridSelector((snapshot) => snapshot.session.editor);\n const columns = useGridSelector((snapshot) => snapshot.displayed);\n const boxRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const shown = useRef<Editor | undefined>(undefined);\n const [problem, setProblem] = useState<{ editor: Editor; text: string } | null>(null);\n const hintId = useId();\n const errorId = useId();\n const column = editor ? columns.findIndex((item) => item.column.name === editor.column) : -1;\n const open = editor !== undefined && column >= 0;\n const error = problem && sameCell(problem.editor, editor) ? problem.text : null;\n\n useImperativeHandle(\n ref,\n () => ({\n open: () => {\n place(boxRef.current, store, canvas);\n textareaRef.current?.focus({ preventScroll: true });\n },\n }),\n [store, canvas],\n );\n\n // Over its cell, and again at every frame the canvas draws (scrolling, resizing).\n // biome-ignore lint/correctness/useExhaustiveDependencies: the editor's row and column are the triggers.\n useLayoutEffect(() => {\n if (!open) return;\n const box = boxRef.current;\n place(box, store, canvas);\n return canvas.subscribeFrames(() => place(box, store, canvas));\n }, [canvas, store, open, editor?.row, column]);\n\n // An editor that opens starts with its text: the cell's (F2, a double click) or empty for the key being typed.\n useLayoutEffect(() => {\n const textarea = textareaRef.current;\n const before = shown.current;\n shown.current = editor;\n if (!textarea) return;\n if (editor && !sameCell(before, editor)) {\n textarea.value = editor.text;\n textarea.setSelectionRange(editor.text.length, editor.text.length);\n textarea.style.height = \"\";\n if (document.activeElement !== textarea) textarea.focus({ preventScroll: true });\n fit(textarea);\n } else if (!editor && before && document.activeElement === textarea) {\n // Closed: the focus goes back to the grid.\n scrollerRef.current?.focus({ preventScroll: true });\n }\n }, [editor, scrollerRef]);\n\n const change = (text: string) => {\n if (store.getSnapshot().session.editor) store.dispatchSync({ command: \"edit.change\", text });\n };\n\n /** Writes the text (`edit.commit`); resolves with whether it was written. */\n const commit = async (move: \"up\" | \"down\" | \"left\" | \"right\" | null) => {\n const textarea = textareaRef.current;\n const current = store.getSnapshot().session.editor;\n if (!textarea || !current) return false;\n setProblem(null);\n change(textarea.value);\n const outcome = await store.dispatch({ command: \"edit.commit\", move });\n if (outcome.ok) return true;\n const reason = outcome.error instanceof CommandError ? outcome.error.reason : null;\n if (reason === \"invalid_value\") setProblem({ editor: current, text: messages.invalidValue(current.column) });\n else if (reason === \"read_only\") setProblem({ editor: current, text: messages.readOnly });\n else announce(messages.failed(outcome.error.message));\n return false;\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n // The grid does not handle keys typed into the editor.\n event.stopPropagation();\n if (!open || event.nativeEvent.isComposing || event.keyCode === 229) return;\n const textarea = event.currentTarget;\n if (event.key === \"Escape\") {\n event.preventDefault();\n store.dispatchSync({ command: \"edit.cancel\" });\n } else if (event.key === \"Enter\" && (event.altKey || (isApple() && event.ctrlKey))) {\n event.preventDefault();\n textarea.setRangeText(\"\\n\", textarea.selectionStart, textarea.selectionEnd, \"end\");\n change(textarea.value);\n fit(textarea);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n void commit(event.shiftKey ? \"up\" : \"down\");\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n void commit(event.shiftKey ? \"left\" : \"right\");\n } else if (saving && keyCommand(event, isApple())?.command === \"save\") {\n // The modifier and S writes the text, then saves, as a spreadsheet does.\n if (store.getSnapshot().table?.capabilities.save !== true) return;\n event.preventDefault();\n void commit(null).then((written) => {\n if (written) saving.save();\n });\n }\n };\n\n const onInput = (event: FormEvent<HTMLTextAreaElement>) => {\n fit(event.currentTarget);\n // While an IME composes, the text is not the person's yet: it is taken when the composition ends.\n if (!(event.nativeEvent as InputEvent).isComposing) change(event.currentTarget.value);\n };\n\n const onCompositionEnd = (event: CompositionEvent<HTMLTextAreaElement>) => change(event.currentTarget.value);\n\n // Leaving the editor for another place of the page saves it, as a spreadsheet does.\n const onBlur = (event: FocusEvent<HTMLTextAreaElement>) => {\n if (open && event.relatedTarget !== null) void commit(null);\n };\n\n return (\n <div className=\"vg-editor\" ref={boxRef} data-open={open || undefined} data-invalid={error ? true : undefined}>\n <textarea\n ref={textareaRef}\n className=\"vg-editor-input\"\n tabIndex={open ? 0 : -1}\n aria-hidden={open ? undefined : true}\n aria-label={editor ? messages.editing(number.format(editor.row + 1), editor.column) : undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={open ? (error ? `${errorId} ${hintId}` : hintId) : undefined}\n spellCheck={false}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n rows={1}\n onKeyDown={onKeyDown}\n onInput={onInput}\n onCompositionEnd={onCompositionEnd}\n onBlur={onBlur}\n />\n {open && (\n <span id={hintId} className=\"vg-sr-only\">\n {messages.editorHint}\n </span>\n )}\n {open && error && (\n <div className=\"vg-editor-note\">\n <span id={errorId} className=\"vg-editor-error\" role=\"alert\">\n {error}\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";AAAA,SAOEA,GAAG,EACHC,KAAK,EACLC,mBAAmB,EACnBC,eAAe,EACfC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SAASC,YAAY,QAAqB,eAAe;AAEzD,SAASC,OAAO,EAAEC,UAAU,QAAQ,mBAAmB;AAEvD,SAASC,aAAa,EAAEC,WAAW,QAAQ,cAAc;AACzD,SAASC,eAAe,EAAEC,YAAY,QAAQ,YAAY;;AAE1D;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAMA;AACA,SAASC,QAAQA,CAACC,CAAqB,EAAEC,CAAqB,EAAE;EAC9D,OAAOD,CAAC,KAAKE,SAAS,IAAID,CAAC,KAAKC,SAAS,IAAIF,CAAC,CAACG,GAAG,KAAKF,CAAC,CAACE,GAAG,IAAIH,CAAC,CAACI,MAAM,KAAKH,CAAC,CAACG,MAAM;AACvF;;AAEA;AACA,SAASC,GAAGA,CAACC,QAA6B,EAAE;EAC1CA,QAAQ,CAACC,KAAK,CAACC,MAAM,GAAG,EAAE;EAC1BF,QAAQ,CAACC,KAAK,CAACC,MAAM,GAAG,GAAGC,IAAI,CAACC,GAAG,CAACJ,QAAQ,CAACK,YAAY,EAAEL,QAAQ,CAACM,YAAY,CAAC,IAAI;AACvF;;AAEA;AACA,SAASC,KAAKA,CAACC,GAA0B,EAAEC,KAAgB,EAAEC,MAAkB,EAAE;EAC/E,MAAMC,OAAO,GAAGF,KAAK,CAACG,WAAW,CAAC,CAAC,CAACC,OAAO,CAACC,MAAM;EAClD,IAAI,CAACN,GAAG,IAAI,CAACG,OAAO,EAAE;EACtB,MAAMI,EAAE,GAAGN,KAAK,CAACG,WAAW,CAAC,CAAC,CAACI,SAAS,CAACC,SAAS,CAAEC,IAAI,IAAKA,IAAI,CAACpB,MAAM,CAACqB,IAAI,KAAKR,OAAO,CAACb,MAAM,CAAC;EACjG,IAAIiB,EAAE,GAAG,CAAC,EAAE;EACZ,MAAMK,IAAI,GAAGV,MAAM,CAACW,QAAQ,CAACC,OAAO,CAACX,OAAO,CAACd,GAAG,EAAEkB,EAAE,CAAC;EACrDP,GAAG,CAACP,KAAK,CAACsB,IAAI,GAAG,GAAGH,IAAI,CAACG,IAAI,IAAI;EACjCf,GAAG,CAACP,KAAK,CAACuB,GAAG,GAAG,GAAGJ,IAAI,CAACI,GAAG,IAAI;EAC/BhB,GAAG,CAACP,KAAK,CAACwB,QAAQ,GAAG,GAAGtB,IAAI,CAACC,GAAG,CAACgB,IAAI,CAACM,KAAK,EAAE,EAAE,CAAC,IAAI;EACpDlB,GAAG,CAACP,KAAK,CAAC0B,WAAW,CAAC,oBAAoB,EAAE,GAAGP,IAAI,CAAClB,MAAM,IAAI,CAAC;EAC/DM,GAAG,CAACP,KAAK,CAAC2B,UAAU,GAAGR,IAAI,CAACS,KAAK,GAAG,EAAE,GAAG,QAAQ;AACnD;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAAC,WAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAC,EAAA;EAAoB;IAAAvB,MAAA;IAAAwB,WAAA;IAAAC,QAAA;IAAAC;EAAA,IAAAL,EAAuD;EAChF,MAAAtB,KAAA,GAAcrB,YAAY,CAAC,CAAC;EAC5B;IAAAiD,QAAA;IAAAC;EAAA,IAA6B9D,GAAG,CAACS,aAAa,CAAC;EAC/C,MAAAsD,MAAA,GAAe/D,GAAG,CAACU,WAAW,CAAC;EAC/B,MAAA4B,MAAA,GAAe3B,eAAe,CAACqD,KAAqC,CAAC;EACrE,MAAAC,OAAA,GAAgBtD,eAAe,CAACuD,MAAgC,CAAC;EACjE,MAAAC,MAAA,GAAe/D,MAAM,CAAiB,IAAI,CAAC;EAC3C,MAAAgE,WAAA,GAAoBhE,MAAM,CAAsB,IAAI,CAAC;EACrD,MAAAiD,KAAA,GAAcjD,MAAM,CAAqBgB,SAAS,CAAC;EACnD,OAAAiD,OAAA,EAAAC,UAAA,IAA8BjE,QAAQ,CAA0C,IAAI,CAAC;EACrF,MAAAkE,MAAA,GAAetE,KAAK,CAAC,CAAC;EACtB,MAAAuE,OAAA,GAAgBvE,KAAK,CAAC,CAAC;EAAC,IAAAwE,EAAA;EAAA,IAAAjB,CAAA,QAAAS,OAAA,IAAAT,CAAA,QAAAlB,MAAA;IACTmC,EAAA,GAAAnC,MAAM,GAAG2B,OAAO,CAAAxB,SAAU,CAACC,IAAA,IAAUA,IAAI,CAAApB,MAAO,CAAAqB,IAAK,KAAKL,MAAM,CAAAhB,MAAY,CAAC,GAA7E,EAA6E;IAAAkC,CAAA,MAAAS,OAAA;IAAAT,CAAA,MAAAlB,MAAA;IAAAkB,CAAA,MAAAiB,EAAA;EAAA;IAAAA,EAAA,GAAAjB,CAAA;EAAA;EAA5F,MAAAlC,MAAA,GAAemD,EAA6E;EAC5F,MAAAC,IAAA,GAAapC,MAAM,KAAKlB,SAAwB,IAAXE,MAAM,IAAI,CAAC;EAAC,IAAAqD,EAAA;EAAA,IAAAnB,CAAA,QAAAlB,MAAA,IAAAkB,CAAA,QAAAa,OAAA;IACnCM,EAAA,GAAAN,OAA2C,IAAhCpD,QAAQ,CAACoD,OAAO,CAAA/B,MAAO,EAAEA,MAAM,CAAuB,GAAnB+B,OAAO,CAAAO,IAAY,GAAjE,IAAiE;IAAApB,CAAA,MAAAlB,MAAA;IAAAkB,CAAA,MAAAa,OAAA;IAAAb,CAAA,MAAAmB,EAAA;EAAA;IAAAA,EAAA,GAAAnB,CAAA;EAAA;EAA/E,MAAAqB,KAAA,GAAcF,EAAiE;EAAC,IAAAG,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAvB,CAAA,QAAAtB,MAAA,IAAAsB,CAAA,QAAAvB,KAAA;IAI9E6C,EAAA,GAAAA,CAAA,MAAO;MAAAJ,IAAA,EACCA,CAAA;QACJ3C,KAAK,CAACoC,MAAM,CAAAhC,OAAQ,EAAEF,KAAK,EAAEC,MAAM,CAAC;QACpCkC,WAAW,CAAAjC,OAAe,EAAA6C,KAAyB,CAAxB;UAAAC,aAAA,EAAiB;QAAK,CAAC,CAAC;MAAA;IAEvD,CAAC,CAAC;IACFF,EAAA,IAAC9C,KAAK,EAAEC,MAAM,CAAC;IAAAsB,CAAA,MAAAtB,MAAA;IAAAsB,CAAA,MAAAvB,KAAA;IAAAuB,CAAA,MAAAsB,EAAA;IAAAtB,CAAA,MAAAuB,EAAA;EAAA;IAAAD,EAAA,GAAAtB,CAAA;IAAAuB,EAAA,GAAAvB,CAAA;EAAA;EARjBtD,mBAAmB,CACjB0D,GAAG,EACHkB,EAKE,EACFC,EACF,CAAC;EAAA,IAAAG,EAAA;EAAA,IAAA1B,CAAA,SAAAtB,MAAA,IAAAsB,CAAA,SAAAkB,IAAA,IAAAlB,CAAA,SAAAvB,KAAA;IAIeiD,EAAA,GAAAA,CAAA;MACd,IAAI,CAACR,IAAI;QAAA;MAAA;MACT,MAAA1C,GAAA,GAAYmC,MAAM,CAAAhC,OAAQ;MAC1BJ,KAAK,CAACC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC;MAAA,OAClBA,MAAM,CAAAiD,eAAgB,CAAC,MAAMpD,KAAK,CAACC,GAAG,EAAEC,KAAK,EAAEC,MAAM,CAAC,CAAC;IAAA,CAC/D;IAAAsB,CAAA,OAAAtB,MAAA;IAAAsB,CAAA,OAAAkB,IAAA;IAAAlB,CAAA,OAAAvB,KAAA;IAAAuB,CAAA,OAAA0B,EAAA;EAAA;IAAAA,EAAA,GAAA1B,CAAA;EAAA;EAAwB,MAAA4B,EAAA,GAAA9C,MAAM,EAAAjB,GAAK;EAAA,IAAAgE,EAAA;EAAA,IAAA7B,CAAA,SAAAtB,MAAA,IAAAsB,CAAA,SAAAlC,MAAA,IAAAkC,CAAA,SAAAkB,IAAA,IAAAlB,CAAA,SAAAvB,KAAA,IAAAuB,CAAA,SAAA4B,EAAA;IAAjCC,EAAA,IAACnD,MAAM,EAAED,KAAK,EAAEyC,IAAI,EAAEU,EAAW,EAAE9D,MAAM,CAAC;IAAAkC,CAAA,OAAAtB,MAAA;IAAAsB,CAAA,OAAAlC,MAAA;IAAAkC,CAAA,OAAAkB,IAAA;IAAAlB,CAAA,OAAAvB,KAAA;IAAAuB,CAAA,OAAA4B,EAAA;IAAA5B,CAAA,OAAA6B,EAAA;EAAA;IAAAA,EAAA,GAAA7B,CAAA;EAAA;EAL7CrD,eAAe,CAAC+E,EAKf,EAAEG,EAA0C,CAAC;EAAA,IAAAC,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAA/B,CAAA,SAAAlB,MAAA,IAAAkB,CAAA,SAAAE,WAAA;IAG9B4B,EAAA,GAAAA,CAAA;MACd,MAAA9D,QAAA,GAAiB4C,WAAW,CAAAjC,OAAQ;MACpC,MAAAqD,MAAA,GAAenC,KAAK,CAAAlB,OAAQ;MAC5BkB,KAAK,CAAAlB,OAAA,GAAWG,MAAH;MACb,IAAI,CAACd,QAAQ;QAAA;MAAA;MACb,IAAIc,MAAmC,IAAnC,CAAWrB,QAAQ,CAACuE,MAAM,EAAElD,MAAM,CAAC;QACrCd,QAAQ,CAAAiE,KAAA,GAASnD,MAAM,CAAAsC,IAAT;QACdpD,QAAQ,CAAAkE,iBAAkB,CAACpD,MAAM,CAAAsC,IAAK,CAAAe,MAAO,EAAErD,MAAM,CAAAsC,IAAK,CAAAe,MAAO,CAAC;QAClEnE,QAAQ,CAAAC,KAAM,CAAAC,MAAA,GAAU,EAAH;QACrB,IAAIkE,QAAQ,CAAAC,aAAc,KAAKrE,QAAQ;UAAEA,QAAQ,CAAAwD,KAAM,CAAC;YAAAC,aAAA,EAAiB;UAAK,CAAC,CAAC;QAAA;QAChF1D,GAAG,CAACC,QAAQ,CAAC;MAAA;QACR,IAAI,CAACc,MAAgB,IAAjBkD,MAAwD,IAAnCI,QAAQ,CAAAC,aAAc,KAAKrE,QAAQ;UAEjEkC,WAAW,CAAAvB,OAAe,EAAA6C,KAAyB,CAAxB;YAAAC,aAAA,EAAiB;UAAK,CAAC,CAAC;QAAA;MACpD;IAAA,CACF;IAAEM,EAAA,IAACjD,MAAM,EAAEoB,WAAW,CAAC;IAAAF,CAAA,OAAAlB,MAAA;IAAAkB,CAAA,OAAAE,WAAA;IAAAF,CAAA,OAAA8B,EAAA;IAAA9B,CAAA,OAAA+B,EAAA;EAAA;IAAAD,EAAA,GAAA9B,CAAA;IAAA+B,EAAA,GAAA/B,CAAA;EAAA;EAfxBrD,eAAe,CAACmF,EAef,EAAEC,EAAqB,CAAC;EAAA,IAAAO,GAAA;EAAA,IAAAtC,CAAA,SAAAvB,KAAA;IAEV6D,GAAA,GAAAlB,IAAA;MACb,IAAI3C,KAAK,CAAAG,WAAY,CAAC,CAAC,CAAAC,OAAQ,CAAAC,MAAO;QAAEL,KAAK,CAAA8D,YAAa,CAAC;UAAAC,OAAA,EAAW,aAAa;UAAApB;QAAO,CAAC,CAAC;MAAA;IAAC,CAC9F;IAAApB,CAAA,OAAAvB,KAAA;IAAAuB,CAAA,OAAAsC,GAAA;EAAA;IAAAA,GAAA,GAAAtC,CAAA;EAAA;EAFD,MAAAyC,MAAA,GAAeH,GAEd;EAAC,IAAAI,GAAA;EAAA,IAAA1C,CAAA,SAAAG,QAAA,IAAAH,CAAA,SAAAyC,MAAA,IAAAzC,CAAA,SAAAK,QAAA,IAAAL,CAAA,SAAAvB,KAAA;IAGaiE,GAAA,SAAAC,IAAA;MACb,MAAAC,UAAA,GAAiBhC,WAAW,CAAAjC,OAAQ;MACpC,MAAAA,OAAA,GAAgBF,KAAK,CAAAG,WAAY,CAAC,CAAC,CAAAC,OAAQ,CAAAC,MAAO;MAClD,IAAI,CAACd,UAAoB,IAArB,CAAcW,OAAO;QAAA,OAAS,KAAK;MAAA;MACvCmC,UAAU,CAAC,IAAI,CAAC;MAChB2B,MAAM,CAACzE,UAAQ,CAAAiE,KAAM,CAAC;MACtB,MAAAY,OAAA,GAAgB,MAAMpE,KAAK,CAAAqE,QAAS,CAAC;QAAAN,OAAA,EAAW,aAAa;QAAAG;MAAO,CAAC,CAAC;MACtE,IAAIE,OAAO,CAAAE,EAAG;QAAA,OAAS,IAAI;MAAA;MAC3B,MAAAC,MAAA,GAAeH,OAAO,CAAAxB,KAAM,YAAYvE,YAA0C,GAA3B+F,OAAO,CAAAxB,KAAM,CAAA2B,MAAc,GAAnE,IAAmE;MAClF,IAAIA,MAAM,KAAK,eAAe;QAAElC,UAAU,CAAC;UAAAhC,MAAA,EAAUH,OAAO;UAAAyC,IAAA,EAAQf,QAAQ,CAAA4C,YAAa,CAACtE,OAAO,CAAAb,MAAO;QAAE,CAAC,CAAC;MAAA;QACvG,IAAIkF,MAAM,KAAK,WAAW;UAAElC,UAAU,CAAC;YAAAhC,MAAA,EAAUH,OAAO;YAAAyC,IAAA,EAAQf,QAAQ,CAAA6C;UAAU,CAAC,CAAC;QAAA;UACpF/C,QAAQ,CAACE,QAAQ,CAAA8C,MAAO,CAACN,OAAO,CAAAxB,KAAM,CAAA+B,OAAQ,CAAC,CAAC;QAAA;MAAC;MAAA,OAC/C,KAAK;IAAA,CACb;IAAApD,CAAA,OAAAG,QAAA;IAAAH,CAAA,OAAAyC,MAAA;IAAAzC,CAAA,OAAAK,QAAA;IAAAL,CAAA,OAAAvB,KAAA;IAAAuB,CAAA,OAAA0C,GAAA;EAAA;IAAAA,GAAA,GAAA1C,CAAA;EAAA;EAbD,MAAAqD,MAAA,GAAeX,GAad;EAAC,IAAAY,GAAA;EAAA,IAAAtD,CAAA,SAAAyC,MAAA,IAAAzC,CAAA,SAAAqD,MAAA,IAAArD,CAAA,SAAAkB,IAAA,IAAAlB,CAAA,SAAAO,MAAA,IAAAP,CAAA,SAAAvB,KAAA;IAEgB6E,GAAA,GAAAC,KAAA;MAEhBA,KAAK,CAAAC,eAAgB,CAAC,CAAC;MACvB,IAAI,CAACtC,IAAqC,IAA7BqC,KAAK,CAAAE,WAAY,CAAAC,WAAqC,IAArBH,KAAK,CAAAI,OAAQ,KAAK,GAAG;QAAA;MAAA;MACnE,MAAAC,UAAA,GAAiBL,KAAK,CAAAM,aAAc;MACpC,IAAIN,KAAK,CAAAO,GAAI,KAAK,QAAQ;QACxBP,KAAK,CAAAQ,cAAe,CAAC,CAAC;QACtBtF,KAAK,CAAA8D,YAAa,CAAC;UAAAC,OAAA,EAAW;QAAc,CAAC,CAAC;MAAA;QACzC,IAAIe,KAAK,CAAAO,GAAI,KAAK,OAAyD,KAA7CP,KAAK,CAAAS,MAAuC,IAA3BjH,OAAO,CAAkB,CAAC,IAAbwG,KAAK,CAAAU,OAAU;UAChFV,KAAK,CAAAQ,cAAe,CAAC,CAAC;UACtB/F,UAAQ,CAAAkG,YAAa,CAAC,IAAI,EAAElG,UAAQ,CAAAmG,cAAe,EAAEnG,UAAQ,CAAAoG,YAAa,EAAE,KAAK,CAAC;UAClF3B,MAAM,CAACzE,UAAQ,CAAAiE,KAAM,CAAC;UACtBlE,GAAG,CAACC,UAAQ,CAAC;QAAA;UACR,IAAIuF,KAAK,CAAAO,GAAI,KAAK,OAAO;YAC9BP,KAAK,CAAAQ,cAAe,CAAC,CAAC;YACjBV,MAAM,CAACE,KAAK,CAAAc,QAAyB,GAA9B,IAA8B,GAA9B,MAA8B,CAAC;UAAA;YACtC,IAAId,KAAK,CAAAO,GAAI,KAAK,KAAK;cAC5BP,KAAK,CAAAQ,cAAe,CAAC,CAAC;cACjBV,MAAM,CAACE,KAAK,CAAAc,QAA4B,GAAjC,MAAiC,GAAjC,OAAiC,CAAC;YAAA;cACzC,IAAI9D,MAA0D,IAAhDvD,UAAU,CAACuG,KAAK,EAAExG,OAAO,CAAC,CAAU,CAAC,EAAAyF,OAAA,KAAK,MAAM;gBAEnE,IAAI/D,KAAK,CAAAG,WAAY,CAAC,CAAC,CAAA0F,KAAoB,EAAAC,YAAK,CAAAC,IAAA,KAAK,IAAI;kBAAA;gBAAA;gBACzDjB,KAAK,CAAAQ,cAAe,CAAC,CAAC;gBACjBV,MAAM,CAAC,IAAI,CAAC,CAAAoB,IAAK,CAACC,OAAA;kBACrB,IAAIA,OAAO;oBAAEnE,MAAM,CAAAiE,IAAK,CAAC,CAAC;kBAAA;gBAAC,CAC5B,CAAC;cAAA;YACH;UAAA;QAAA;MAAA;IAAA,CACF;IAAAxE,CAAA,OAAAyC,MAAA;IAAAzC,CAAA,OAAAqD,MAAA;IAAArD,CAAA,OAAAkB,IAAA;IAAAlB,CAAA,OAAAO,MAAA;IAAAP,CAAA,OAAAvB,KAAA;IAAAuB,CAAA,OAAAsD,GAAA;EAAA;IAAAA,GAAA,GAAAtD,CAAA;EAAA;EA3BD,MAAA2E,SAAA,GAAkBrB,GA2BjB;EAAC,IAAAsB,GAAA;EAAA,IAAA5E,CAAA,SAAAyC,MAAA;IAEcmC,GAAA,GAAAC,OAAA;MACd9G,GAAG,CAACwF,OAAK,CAAAM,aAAc,CAAC;MAExB,IAAI,CAAEN,OAAK,CAAAE,WAAY,CAAAC,WAA2B;QAAEjB,MAAM,CAACc,OAAK,CAAAM,aAAc,CAAA5B,KAAM,CAAC;MAAA;IAAC,CACvF;IAAAjC,CAAA,OAAAyC,MAAA;IAAAzC,CAAA,OAAA4E,GAAA;EAAA;IAAAA,GAAA,GAAA5E,CAAA;EAAA;EAJD,MAAA8E,OAAA,GAAgBF,GAIf;EAAC,IAAAG,GAAA;EAAA,IAAA/E,CAAA,SAAAyC,MAAA;IAEuBsC,GAAA,GAAAC,OAAA,IAAkDvC,MAAM,CAACc,OAAK,CAAAM,aAAc,CAAA5B,KAAM,CAAC;IAAAjC,CAAA,OAAAyC,MAAA;IAAAzC,CAAA,OAAA+E,GAAA;EAAA;IAAAA,GAAA,GAAA/E,CAAA;EAAA;EAA5G,MAAAiF,gBAAA,GAAyBF,GAAmF;EAAC,IAAAG,GAAA;EAAA,IAAAlF,CAAA,SAAAqD,MAAA,IAAArD,CAAA,SAAAkB,IAAA;IAG9FgE,GAAA,GAAAC,OAAA;MACb,IAAIjE,IAAoC,IAA5BqC,OAAK,CAAA6B,aAAc,KAAK,IAAI;QAAO/B,MAAM,CAAC,IAAI,CAAC;MAAA;IAAC,CAC7D;IAAArD,CAAA,OAAAqD,MAAA;IAAArD,CAAA,OAAAkB,IAAA;IAAAlB,CAAA,OAAAkF,GAAA;EAAA;IAAAA,GAAA,GAAAlF,CAAA;EAAA;EAFD,MAAAqF,MAAA,GAAeH,GAEd;EAGoD,MAAAI,GAAA,GAAApE,IAAiB,IAAjBtD,SAAiB;EAAgB,MAAA2H,GAAA,GAAAlE,KAAK,GAAL,IAAwB,GAAxBzD,SAAwB;EAI9F,MAAA4H,GAAA,GAAAtE,IAAI,GAAJ,CAAa,GAAb,EAAa;EACV,MAAAuE,GAAA,GAAAvE,IAAI,GAAJtD,SAAuB,GAAvB,IAAuB;EAAA,IAAA8H,GAAA;EAAA,IAAA1F,CAAA,SAAAlB,MAAA,IAAAkB,CAAA,SAAAK,QAAA,IAAAL,CAAA,SAAAM,MAAA;IACxBoF,GAAA,GAAA5G,MAAM,GAAGuB,QAAQ,CAAAsF,OAAQ,CAACrF,MAAM,CAAAsF,MAAO,CAAC9G,MAAM,CAAAjB,GAAI,GAAG,CAAC,CAAC,EAAEiB,MAAM,CAAAhB,MAAmB,CAAC,GAAnFF,SAAmF;IAAAoC,CAAA,OAAAlB,MAAA;IAAAkB,CAAA,OAAAK,QAAA;IAAAL,CAAA,OAAAM,MAAA;IAAAN,CAAA,OAAA0F,GAAA;EAAA;IAAAA,GAAA,GAAA1F,CAAA;EAAA;EACjF,MAAA6F,GAAA,GAAAxE,KAAK,GAAL,IAAwB,GAAxBzD,SAAwB;EACpB,MAAAkI,GAAA,GAAA5E,IAAI,GAAIG,KAAK,GAAL,GAAWL,OAAO,IAAID,MAAM,EAAW,GAAvCA,MAAoD,GAA5DnD,SAA4D;EAAA,IAAAmI,GAAA;EAAA,IAAA/F,CAAA,SAAAqF,MAAA,IAAArF,CAAA,SAAAiF,gBAAA,IAAAjF,CAAA,SAAA8E,OAAA,IAAA9E,CAAA,SAAA2E,SAAA,IAAA3E,CAAA,SAAAwF,GAAA,IAAAxF,CAAA,SAAAyF,GAAA,IAAAzF,CAAA,SAAA0F,GAAA,IAAA1F,CAAA,SAAA6F,GAAA,IAAA7F,CAAA,SAAA8F,GAAA;IAPhFC,GAAA,gBAAAzI,IAAA;MACOsD,GAAW,EAAXA,WAAW;MACNoF,SAAiB,EAAjB,iBAAiB;MACjBC,QAAa,EAAbT,GAAa;MACV,eAAAC,GAAuB;MACxB,cAAAC,GAAmF;MACjF,gBAAAG,GAAwB;MACpB,oBAAAC,GAA4D;MAClEI,UAAK,EAAL,KAAK;MACJC,YAAK,EAAL,KAAK;MACHC,cAAK,EAAL,KAAK;MACdC,IAAC,EAAD,CAAC;MACI1B,SAAS,EAATA,SAAS;MACXG,OAAO,EAAPA,OAAO;MACEG,gBAAgB,EAAhBA,gBAAgB;MAC1BI,MAAM,EAANA;IAAM,CACf,CAAC;IAAArF,CAAA,OAAAqF,MAAA;IAAArF,CAAA,OAAAiF,gBAAA;IAAAjF,CAAA,OAAA8E,OAAA;IAAA9E,CAAA,OAAA2E,SAAA;IAAA3E,CAAA,OAAAwF,GAAA;IAAAxF,CAAA,OAAAyF,GAAA;IAAAzF,CAAA,OAAA0F,GAAA;IAAA1F,CAAA,OAAA6F,GAAA;IAAA7F,CAAA,OAAA8F,GAAA;IAAA9F,CAAA,OAAA+F,GAAA;EAAA;IAAAA,GAAA,GAAA/F,CAAA;EAAA;EAAA,IAAAsG,GAAA;EAAA,IAAAtG,CAAA,SAAAe,MAAA,IAAAf,CAAA,SAAAK,QAAA,IAAAL,CAAA,SAAAkB,IAAA;IACDoF,GAAA,GAAApF,IAIA,iBAJA5D,IAAA;MACWyD,EAAM,EAANA,MAAM;MAAYiF,SAAY,EAAZ,YAAY;MAAAO,QAAA,EACrClG,QAAQ,CAAAmG;IAAW,CAExB,CAAC;IAAAxG,CAAA,OAAAe,MAAA;IAAAf,CAAA,OAAAK,QAAA;IAAAL,CAAA,OAAAkB,IAAA;IAAAlB,CAAA,OAAAsG,GAAA;EAAA;IAAAA,GAAA,GAAAtG,CAAA;EAAA;EAAA,IAAAyG,GAAA;EAAA,IAAAzG,CAAA,SAAAqB,KAAA,IAAArB,CAAA,SAAAgB,OAAA,IAAAhB,CAAA,SAAAkB,IAAA;IACAuF,GAAA,GAAAvF,IAAa,IAAbG,KAMA,iBANA/D,IAAA;MACgB0I,SAAgB,EAAhB,gBAAgB;MAAAO,QAAA,eAC7BjJ,IAAA;QAAU0D,EAAO,EAAPA,OAAO;QAAYgF,SAAiB,EAAjB,iBAAiB;QAAMU,IAAO,EAAP,OAAO;QAAAH,QAAA,EACxDlF;MAAK,CACF;IAAC,CAEX,CAAC;IAAArB,CAAA,OAAAqB,KAAA;IAAArB,CAAA,OAAAgB,OAAA;IAAAhB,CAAA,OAAAkB,IAAA;IAAAlB,CAAA,OAAAyG,GAAA;EAAA;IAAAA,GAAA,GAAAzG,CAAA;EAAA;EAAA,IAAA2G,GAAA;EAAA,IAAA3G,CAAA,SAAAsF,GAAA,IAAAtF,CAAA,SAAAuF,GAAA,IAAAvF,CAAA,SAAA+F,GAAA,IAAA/F,CAAA,SAAAsG,GAAA,IAAAtG,CAAA,SAAAyG,GAAA;IA7BHE,GAAA,gBAAAnJ,KAAA;MAAewI,SAAW,EAAX,WAAW;MAAMrF,GAAM,EAANA,MAAM;MAAa,aAAA2E,GAAiB;MAAgB,gBAAAC,GAAwB;MAAAgB,QAAA,GAC1GR,GAgBE,EACDO,GAIA,EACAG,GAMA;IAAA,CACE,CAAC;IAAAzG,CAAA,OAAAsF,GAAA;IAAAtF,CAAA,OAAAuF,GAAA;IAAAvF,CAAA,OAAA+F,GAAA;IAAA/F,CAAA,OAAAsG,GAAA;IAAAtG,CAAA,OAAAyG,GAAA;IAAAzG,CAAA,OAAA2G,GAAA;EAAA;IAAAA,GAAA,GAAA3G,CAAA;EAAA;EAAA,OA9BN2G,GA8BM;AAAA;AAnJH,SAAAjG,OAAAkG,UAAA;EAAA,OAKyCC,UAAQ,CAAA7H,SAAU;AAAA;AAL3D,SAAAwB,MAAAqG,QAAA;EAAA,OAIwCA,QAAQ,CAAAhI,OAAQ,CAAAC,MAAO;AAAA","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ /** Where the cell menu opens: a cell of the view, at a point of the page. */
2
+ export interface CellMenuTarget {
3
+ row: number;
4
+ column: string;
5
+ x: number;
6
+ y: number;
7
+ }
8
+ /**
9
+ * The menu of a cell (a right click on it, Shift+F10 or the context menu key): copying the selection, filtering the
10
+ * column to the cell's value or excluding it (`filter.column`, replacing the column's conditions), showing the
11
+ * value in full (read again without the text limit when the engine cut it, §8.4), and the detail panel.
12
+ */
13
+ export declare function CellMenu({ target, onClose, copy, }: {
14
+ target: CellMenuTarget | null;
15
+ onClose: () => void;
16
+ copy: () => void;
17
+ }): import("react").JSX.Element;
18
+ //# sourceMappingURL=cell-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-menu.d.ts","sourceRoot":"","sources":["../../src/react/cell-menu.tsx"],"names":[],"mappings":"AAMA,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAqBD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,OAAO,EACP,IAAI,GACL,EAAE;IACD,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,+BAuHA"}