@pixerate/editor 0.22.0 → 0.23.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 (83) hide show
  1. package/README.md +80 -2
  2. package/THIRD_PARTY_NOTICES.md +88 -0
  3. package/dist/agent/index.cjs +83 -108
  4. package/dist/agent/index.cjs.map +1 -1
  5. package/dist/agent/index.d.cts +69 -211
  6. package/dist/agent/index.d.ts +69 -211
  7. package/dist/agent/index.js +76 -101
  8. package/dist/agent/index.js.map +1 -1
  9. package/dist/arrangeShortcuts-B8O3f8-P.d.cts +184 -0
  10. package/dist/arrangeShortcuts-sLlD2rSX.d.ts +184 -0
  11. package/dist/canvas/index.cjs +879 -83
  12. package/dist/canvas/index.cjs.map +1 -1
  13. package/dist/canvas/index.d.cts +291 -186
  14. package/dist/canvas/index.d.ts +291 -186
  15. package/dist/canvas/index.js +865 -69
  16. package/dist/canvas/index.js.map +1 -1
  17. package/dist/chunk-26BVFKHU.cjs +453 -0
  18. package/dist/chunk-26BVFKHU.cjs.map +1 -0
  19. package/dist/chunk-2H7ZHPEJ.js +762 -0
  20. package/dist/chunk-2H7ZHPEJ.js.map +1 -0
  21. package/dist/chunk-7DWMJCAT.js +453 -0
  22. package/dist/chunk-7DWMJCAT.js.map +1 -0
  23. package/dist/chunk-ARRTP33I.js +101 -0
  24. package/dist/chunk-ARRTP33I.js.map +1 -0
  25. package/dist/chunk-CPOKFNBG.cjs +101 -0
  26. package/dist/chunk-CPOKFNBG.cjs.map +1 -0
  27. package/dist/chunk-G2I4QJOT.cjs +762 -0
  28. package/dist/chunk-G2I4QJOT.cjs.map +1 -0
  29. package/dist/{chunk-RU52I7QO.js → chunk-K3R5NG2D.js} +147 -42
  30. package/dist/chunk-K3R5NG2D.js.map +1 -0
  31. package/dist/{chunk-DENSCKFC.js → chunk-QBJ22YZR.js} +423 -30
  32. package/dist/chunk-QBJ22YZR.js.map +1 -0
  33. package/dist/{chunk-SAZRENEZ.cjs → chunk-RIKBJLS2.cjs} +424 -31
  34. package/dist/chunk-RIKBJLS2.cjs.map +1 -0
  35. package/dist/{chunk-6M3BCTBD.cjs → chunk-XDMXXC4Z.cjs} +230 -125
  36. package/dist/chunk-XDMXXC4Z.cjs.map +1 -0
  37. package/dist/commands/index.cjs +860 -0
  38. package/dist/commands/index.cjs.map +1 -0
  39. package/dist/commands/index.d.cts +592 -0
  40. package/dist/commands/index.d.ts +592 -0
  41. package/dist/commands/index.js +860 -0
  42. package/dist/commands/index.js.map +1 -0
  43. package/dist/{controller-B7GIybc4.d.cts → controller-pePCJLT1.d.cts} +78 -5
  44. package/dist/{controller-B7GIybc4.d.ts → controller-pePCJLT1.d.ts} +78 -5
  45. package/dist/history/index.cjs +12 -2
  46. package/dist/history/index.cjs.map +1 -1
  47. package/dist/history/index.d.cts +211 -7
  48. package/dist/history/index.d.ts +211 -7
  49. package/dist/history/index.js +13 -3
  50. package/dist/image-editor/index.cjs +418 -13
  51. package/dist/image-editor/index.cjs.map +1 -1
  52. package/dist/image-editor/index.d.cts +154 -3
  53. package/dist/image-editor/index.d.ts +154 -3
  54. package/dist/image-editor/index.js +417 -12
  55. package/dist/image-editor/index.js.map +1 -1
  56. package/dist/index.cjs +34 -76
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.cts +5 -42
  59. package/dist/index.d.ts +5 -42
  60. package/dist/index.js +27 -69
  61. package/dist/index.js.map +1 -1
  62. package/dist/registry-D5-R90p0.d.cts +209 -0
  63. package/dist/registry-D5-R90p0.d.ts +209 -0
  64. package/dist/spreadsheet/index.cjs +19 -3
  65. package/dist/spreadsheet/index.cjs.map +1 -1
  66. package/dist/spreadsheet/index.d.cts +67 -9
  67. package/dist/spreadsheet/index.d.ts +67 -9
  68. package/dist/spreadsheet/index.js +18 -2
  69. package/dist/{types-CJ4U-HHI.d.cts → types-DX4Mh4SL.d.cts} +1 -1
  70. package/dist/{types-CJ4U-HHI.d.ts → types-DX4Mh4SL.d.ts} +1 -1
  71. package/dist/types-GT5a5YAX.d.cts +86 -0
  72. package/dist/types-GT5a5YAX.d.ts +86 -0
  73. package/package.json +8 -2
  74. package/dist/chunk-2TWGLC5K.cjs +0 -262
  75. package/dist/chunk-2TWGLC5K.cjs.map +0 -1
  76. package/dist/chunk-6M3BCTBD.cjs.map +0 -1
  77. package/dist/chunk-DENSCKFC.js.map +0 -1
  78. package/dist/chunk-KAADNAPF.js +0 -262
  79. package/dist/chunk-KAADNAPF.js.map +0 -1
  80. package/dist/chunk-RU52I7QO.js.map +0 -1
  81. package/dist/chunk-SAZRENEZ.cjs.map +0 -1
  82. package/dist/types-BZgcDsC5.d.cts +0 -42
  83. package/dist/types-BZgcDsC5.d.ts +0 -42
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-G2I4QJOT.cjs","../src/history/HistoryManager.ts","../src/dirty.ts"],"names":[],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-G2I4QJOT.cjs","sourcesContent":[null,"// Portions ported from filmcraft-main/crates/engine/src/lib.rs, soundcraft-main/crates/engine/src/lib.rs\n// and photocraft-main/crates/ops/src/lib.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors).\n// See THIRD_PARTY_NOTICES.md.\nimport {\n Command,\n HistoryEntry,\n HistoryManagerOptions,\n HistoryMark,\n HistoryState,\n MergedExecutionOptions,\n SnapshotCommandOptions,\n} from \"./types\";\n\n/** One reversible piece of a step. A gesture step holds one part per distinct command. */\ninterface Part {\n undo: () => void;\n redo: () => void;\n tag?: string;\n bytes: number;\n}\n\n/** One undo step. */\ninterface Entry {\n id: number;\n name: string;\n tag?: string;\n timestamp: number;\n parts: Part[];\n bytes: number;\n}\n\nconst sumBytes = (parts: Part[]) => parts.reduce((n, p) => n + p.bytes, 0);\n\nfunction undoParts(parts: Part[]): void {\n for (let i = parts.length - 1; i >= 0; i--) parts[i].undo();\n}\n\nfunction redoParts(parts: Part[]): void {\n for (let i = 0; i < parts.length; i++) parts[i].redo();\n}\n\n/**\n * UI-agnostic History and Undo/Redo manager supporting command closures,\n * snapshot diffs, transaction batching, high-frequency event coalescing,\n * keyed gestures, undo marks, a memory budget and a History-panel listing.\n */\nexport class HistoryManager {\n private undoStack: Entry[] = [];\n private redoStack: Entry[] = [];\n private readonly maxDepth: number;\n private readonly maxBytes: number;\n private readonly sizeOf?: (command: Command) => number;\n private isApplying = false;\n private batchDepth = 0;\n private currentBatch: Command[] | null = null;\n private listeners: Set<(state: HistoryState) => void> = new Set();\n private onStateChange?: (state: HistoryState) => void;\n private cachedState: HistoryState;\n private cachedEntries: HistoryEntry[] | null = null;\n\n private nextId = 1;\n private revision = 0;\n /** Bumped by `clear()`; marks from an earlier epoch are stale. */\n private epoch = 0;\n /** Number of steps dropped from the bottom (depth / byte budget) so far. */\n private dropped = 0;\n /** Key of the gesture that the top step belongs to (see `executeMerged`). */\n private gestureKey: string | null = null;\n private gestureEntryId: number | null = null;\n /** Key every merged execute takes while a gesture is held (`beginGesture`). */\n private heldKey: string | null = null;\n\n constructor(options: HistoryManagerOptions = {}) {\n this.maxDepth = options.maxDepth ?? 50;\n this.maxBytes = Math.max(0, options.maxBytes ?? 0);\n this.sizeOf = options.sizeOf;\n this.onStateChange = options.onStateChange;\n this.cachedState = this.computeState();\n }\n\n private computeState(): HistoryState {\n const canUndo = this.undoStack.length > 0;\n const canRedo = this.redoStack.length > 0;\n return {\n canUndo,\n canRedo,\n undoName: canUndo ? this.undoStack[this.undoStack.length - 1].name : \"\",\n redoName: canRedo ? this.redoStack[this.redoStack.length - 1].name : \"\",\n undoCount: this.undoStack.length,\n redoCount: this.redoStack.length,\n };\n }\n\n /**\n * Returns a snapshot of the current history state.\n * Cached to maintain referential equality across renders for useSyncExternalStore.\n */\n public getState(): HistoryState {\n return this.cachedState;\n }\n\n /**\n * Monotonic counter bumped on every history change (execute, merge, undo,\n * redo, revert, clear). Useful as a cache key, e.g. for `DirtyTracker`.\n */\n public getRevision(): number {\n return this.revision;\n }\n\n private notify(): void {\n this.revision++;\n this.cachedState = this.computeState();\n this.cachedEntries = null;\n const state = this.cachedState;\n this.onStateChange?.(state);\n this.listeners.forEach((listener) => {\n try {\n listener(state);\n } catch (err) {\n console.error(\"[HistoryManager] Error in state listener:\", err);\n }\n });\n }\n\n private measure(command: Command): number {\n const n = this.sizeOf ? this.sizeOf(command) : (command.byteSize ?? 0);\n return Number.isFinite(n) && n > 0 ? n : 0;\n }\n\n private makeEntry(command: Command, timestamp: number): Entry {\n const part: Part = {\n undo: command.undo,\n redo: command.redo ?? command.execute,\n tag: command.tag,\n bytes: this.measure(command),\n };\n return {\n id: this.nextId++,\n name: command.name,\n tag: command.tag,\n timestamp,\n parts: [part],\n bytes: part.bytes,\n };\n }\n\n /** Pushes a step, clears redo and applies the depth and byte limits. */\n private record(entry: Entry): void {\n this.undoStack.push(entry);\n while (this.undoStack.length > this.maxDepth) {\n this.undoStack.shift();\n this.dropped++;\n }\n this.redoStack = [];\n this.trim();\n }\n\n /**\n * Keeps the stacks within `maxBytes`: the oldest undo steps that do not fit\n * are dropped, but the most recent undo step is always kept.\n */\n private trim(): void {\n if (this.maxBytes <= 0 || this.undoStack.length <= 1) return;\n let total = this.getByteSize();\n while (total > this.maxBytes && this.undoStack.length > 1) {\n total -= this.undoStack.shift()!.bytes;\n this.dropped++;\n }\n }\n\n /** Approximate bytes held by the undo and redo stacks (see `maxBytes`). */\n public getByteSize(): number {\n let total = 0;\n for (const e of this.undoStack) total += e.bytes;\n for (const e of this.redoStack) total += e.bytes;\n return total;\n }\n\n private resetGesture(): void {\n this.gestureKey = null;\n this.gestureEntryId = null;\n }\n\n /**\n * Executes a command and pushes it onto the undo stack.\n * Clears the redo stack and ends the current gesture.\n */\n public execute(command: Command): void {\n if (this.isApplying) {\n command.execute();\n return;\n }\n\n if (this.batchDepth > 0 && this.currentBatch) {\n command.execute();\n this.currentBatch.push({\n ...command,\n timestamp: command.timestamp ?? Date.now(),\n });\n return;\n }\n\n command.execute();\n this.record(this.makeEntry(command, command.timestamp ?? Date.now()));\n this.resetGesture();\n this.notify();\n }\n\n /**\n * Executes a command as part of a continuous interaction (slider scrub, node drag).\n *\n * - With `options.key` (or while a gesture is held with `beginGesture`):\n * consecutive merged executes with the same key fold into one undo step,\n * however long the gesture lasts. Recording any other command, undo, redo,\n * `revertTo`, `goTo`, `clear` or `endGesture()` ends the gesture.\n * - Without a key: coalesces with the previous command if they share the same\n * `tag` and occurred within `windowMs` (default: 300ms).\n */\n public executeMerged(\n command: Command,\n options: MergedExecutionOptions = {},\n ): void {\n const now = Date.now();\n const key = this.heldKey ?? options.key;\n\n if (key !== undefined) {\n if (this.isApplying || this.batchDepth > 0) {\n this.execute({ ...command, timestamp: now });\n return;\n }\n const top = this.undoStack[this.undoStack.length - 1];\n if (top && this.gestureKey === key && this.gestureEntryId === top.id) {\n command.execute();\n const redo = command.redo ?? command.execute;\n const bytes = this.measure(command);\n const last = top.parts[top.parts.length - 1];\n if (last.tag !== undefined && last.tag === command.tag) {\n // Same (absolute) command again: keep the pre-gesture undo, take the new redo.\n top.parts[top.parts.length - 1] = { undo: last.undo, redo, tag: last.tag, bytes };\n } else {\n top.parts.push({ undo: command.undo, redo, tag: command.tag, bytes });\n }\n top.bytes = sumBytes(top.parts);\n top.timestamp = now;\n this.redoStack = [];\n this.trim();\n this.notify();\n return;\n }\n this.execute({ ...command, timestamp: now });\n const pushed = this.undoStack[this.undoStack.length - 1];\n if (pushed) {\n this.gestureKey = key;\n this.gestureEntryId = pushed.id;\n }\n return;\n }\n\n const windowMs = options.windowMs ?? 300;\n\n if (\n command.tag &&\n this.undoStack.length > 0 &&\n this.batchDepth === 0 &&\n !this.isApplying\n ) {\n const top = this.undoStack[this.undoStack.length - 1];\n const elapsed = top.timestamp ? now - top.timestamp : Infinity;\n\n if (top.tag === command.tag && elapsed <= windowMs) {\n command.execute();\n // Replace top with merged command keeping the original initial undo\n const initialParts = top.parts;\n const bytes = this.measure(command);\n this.undoStack[this.undoStack.length - 1] = {\n id: top.id,\n name: command.name,\n tag: command.tag,\n timestamp: now,\n parts: [\n {\n undo: () => undoParts(initialParts),\n redo: command.redo ?? command.execute,\n tag: command.tag,\n bytes,\n },\n ],\n bytes,\n };\n this.redoStack = [];\n this.resetGesture();\n this.trim();\n this.notify();\n return;\n }\n }\n\n this.execute({ ...command, timestamp: now });\n }\n\n /**\n * Holds a gesture: until `endGesture()`, every `executeMerged` call (whatever\n * its own key or tag) joins one undo step, e.g. an automation pass and\n * whatever is dragged during it. Commands recorded with `execute` still end\n * the current step; the next merged execute then starts a new one.\n */\n public beginGesture(key: string): void {\n if (this.heldKey === key) return;\n this.heldKey = key;\n this.resetGesture();\n }\n\n /** Ends the current (keyed or held) gesture; the next merged execute starts a new step. */\n public endGesture(): void {\n this.heldKey = null;\n this.resetGesture();\n }\n\n /** The key of the gesture currently merging into the top step, if any. */\n public getGestureKey(): string | null {\n return this.heldKey ?? this.gestureKey;\n }\n\n /**\n * Batches multiple commands executed within `fn` into a single atomic undo entry.\n */\n public batch(name: string, fn: () => void): void {\n if (this.isApplying) {\n fn();\n return;\n }\n\n if (this.batchDepth > 0) {\n // Already inside a batch; execute directly\n fn();\n return;\n }\n\n this.batchDepth++;\n this.currentBatch = [];\n\n try {\n fn();\n } catch (error) {\n const executed = this.currentBatch ?? [];\n this.batchDepth--;\n this.currentBatch = null;\n this.rollback(executed);\n throw error;\n }\n\n this.batchDepth--;\n const batchCommands: Command[] = this.currentBatch ?? [];\n this.currentBatch = null;\n\n if (batchCommands.length > 0) {\n const run = () => {\n for (let i = 0; i < batchCommands.length; i++) {\n (batchCommands[i].redo ?? batchCommands[i].execute)();\n }\n };\n const bytes = batchCommands.reduce((n, c) => n + this.measure(c), 0);\n this.record({\n id: this.nextId++,\n name,\n timestamp: Date.now(),\n parts: [\n {\n undo: () => {\n for (let i = batchCommands.length - 1; i >= 0; i--) {\n batchCommands[i].undo();\n }\n },\n redo: run,\n bytes,\n },\n ],\n bytes,\n });\n this.resetGesture();\n this.notify();\n }\n }\n\n /**\n * Reverts already-executed commands of an aborted batch, newest first.\n * Commands executed by the undo closures themselves are not recorded.\n */\n private rollback(commands: Command[]): void {\n const wasApplying = this.isApplying;\n this.isApplying = true;\n try {\n for (let i = commands.length - 1; i >= 0; i--) {\n try {\n commands[i].undo();\n } catch (err) {\n console.error(\n `[HistoryManager] Error rolling back \"${commands[i].name}\" of a failed batch:`,\n err,\n );\n }\n }\n } finally {\n this.isApplying = wasApplying;\n }\n }\n\n /** Undoes the top step (caller holds `isApplying`). Throws leave it on the stack. */\n private undoOne(): void {\n const entry = this.undoStack[this.undoStack.length - 1];\n undoParts(entry.parts);\n this.undoStack.pop();\n this.redoStack.push(entry);\n }\n\n private redoOne(): void {\n const entry = this.redoStack[this.redoStack.length - 1];\n redoParts(entry.parts);\n this.redoStack.pop();\n this.undoStack.push(entry);\n }\n\n /**\n * Reverts the most recent command on the undo stack.\n * Returns true if a command was undone, false otherwise.\n */\n public undo(): boolean {\n if (this.undoStack.length === 0 || this.isApplying || this.batchDepth > 0) {\n return false;\n }\n\n this.isApplying = true;\n this.resetGesture();\n try {\n // If undo throws, the command stays on the undo stack and the error propagates.\n this.undoOne();\n return true;\n } finally {\n this.isApplying = false;\n this.notify();\n }\n }\n\n /**\n * Re-applies the most recent undone command on the redo stack.\n * Returns true if a command was redone, false otherwise.\n */\n public redo(): boolean {\n if (this.redoStack.length === 0 || this.isApplying || this.batchDepth > 0) {\n return false;\n }\n\n this.isApplying = true;\n this.resetGesture();\n try {\n // If redo throws, the command stays on the redo stack and the error propagates.\n this.redoOne();\n return true;\n } finally {\n this.isApplying = false;\n this.notify();\n }\n }\n\n /**\n * Captures the current point in the history (its top step), for `revertTo`.\n */\n public mark(): HistoryMark {\n const top = this.undoStack[this.undoStack.length - 1];\n return {\n topId: top ? top.id : null,\n nextId: this.nextId,\n epoch: this.epoch,\n dropped: this.dropped,\n };\n }\n\n /** Whether `mark` still points into the undo history. */\n public isMarkValid(mark: HistoryMark): boolean {\n if (mark.epoch !== this.epoch) return false;\n if (mark.topId === null) return mark.dropped === this.dropped;\n return this.undoStack.some((e) => e.id === mark.topId);\n }\n\n /**\n * Takes back every step made since `mark` (merged or not), e.g. to cancel a\n * drag with Escape: the state returns to how it was at `mark`, and neither\n * undo nor redo keeps the reverted steps. Does nothing when `mark` has left\n * the history (undone past, dropped by the limits, or cleared).\n * Returns how many steps were taken back.\n */\n public revertTo(mark: HistoryMark): number {\n if (this.isApplying || this.batchDepth > 0 || !this.isMarkValid(mark)) {\n return 0;\n }\n const redoBefore = this.redoStack.length;\n let n = 0;\n this.isApplying = true;\n this.resetGesture();\n try {\n while (this.undoStack.length > 0) {\n const top = this.undoStack[this.undoStack.length - 1];\n if (top.id === mark.topId) break;\n undoParts(top.parts);\n this.undoStack.pop();\n n++;\n }\n } finally {\n this.isApplying = false;\n // Steps made after the mark are gone for good, including undone ones.\n this.redoStack =\n n > 0 ? [] : this.redoStack.filter((e) => e.id < mark.nextId);\n if (n > 0 || this.redoStack.length !== redoBefore) this.notify();\n }\n return n;\n }\n\n /**\n * Lists the steps for a History panel: undo steps oldest first, then redo\n * steps (the next redo first). Cached until the history changes.\n */\n public getEntries(): HistoryEntry[] {\n if (this.cachedEntries) return this.cachedEntries;\n const u = this.undoStack.length;\n const entries: HistoryEntry[] = this.undoStack.map((e, index) => ({\n id: e.id,\n label: e.name,\n index,\n current: index === u - 1,\n undone: false,\n }));\n for (let i = this.redoStack.length - 1; i >= 0; i--) {\n const e = this.redoStack[i];\n entries.push({\n id: e.id,\n label: e.name,\n index: entries.length,\n current: false,\n undone: true,\n });\n }\n this.cachedEntries = entries;\n return entries;\n }\n\n /**\n * Undoes or redoes until the step at `index` (from `getEntries`) is the\n * current one; `-1` undoes everything. Returns how many steps were applied.\n */\n public goTo(index: number): number {\n if (this.isApplying || this.batchDepth > 0) return 0;\n const total = this.undoStack.length + this.redoStack.length;\n const target = Math.max(0, Math.min(total, Math.floor(index) + 1));\n if (target === this.undoStack.length) return 0;\n let n = 0;\n this.isApplying = true;\n this.resetGesture();\n try {\n while (this.undoStack.length > target) {\n this.undoOne();\n n++;\n }\n while (this.undoStack.length < target) {\n this.redoOne();\n n++;\n }\n } finally {\n this.isApplying = false;\n this.notify();\n }\n return n;\n }\n\n /**\n * Clears both undo and redo stacks.\n */\n public clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n this.epoch++;\n this.resetGesture();\n this.notify();\n }\n\n /**\n * Subscribes to history state changes.\n * The listener is immediately invoked with the current state.\n * Returns an unsubscribe function.\n */\n public subscribe(listener: (state: HistoryState) => void): () => void {\n this.listeners.add(listener);\n listener(this.getState());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Utility helper to create a Command from before/after state snapshots.\n */\n public static createSnapshotCommand<T>(\n options: SnapshotCommandOptions<T>,\n ): Command {\n return {\n name: options.name,\n tag: options.tag,\n execute: () => options.apply(options.after),\n undo: () => options.apply(options.before),\n redo: () => options.apply(options.after),\n };\n }\n}\n\n/**\n * Creates and initializes a new HistoryManager instance.\n */\nexport function createHistoryManager(\n options: HistoryManagerOptions = {},\n): HistoryManager {\n return new HistoryManager(options);\n}\n","// Portions ported from soundcraft-main/crates/engine/src/lib.rs (MIT OR Apache-2.0,\n// © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Compares two values for structural equality.\n * Handles primitives, objects, arrays, and null/undefined.\n */\nexport function defaultIsEqual<T>(a: T, b: T): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n // Fast path for arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!defaultIsEqual(a[i], b[i])) return false;\n }\n return true;\n }\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n const keysA = Object.keys(a) as (keyof T)[];\n const keysB = Object.keys(b) as (keyof T)[];\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!defaultIsEqual(a[key], b[key])) return false;\n }\n\n return true;\n}\n\nexport interface DirtyTrackerOptions<T> {\n /**\n * Equality check. When `normalize` is set it receives the normalized values.\n */\n isEqual?: (a: T, b: T) => boolean;\n /**\n * Projects a value onto the part that counts as \"the document\" before\n * comparing, e.g. `({ selection, viewport, ...doc }) => doc` so that\n * selecting, scrolling or zooming never marks the document dirty.\n */\n normalize?: (value: T) => unknown;\n}\n\ntype Thenable = { then: (...args: any[]) => any };\n\nconst isThenable = (value: unknown): value is Thenable =>\n !!value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as Thenable).then === \"function\";\n\n/**\n * Tracks a baseline (saved) value and determines whether the current value is\n * dirty (modified).\n *\n * Stateless use: `isDirty(current)`. Stateful use: feed values with\n * `update(current, revision?)`, read `dirty`, `subscribe` to changes, call\n * `markClean()` after saving and wrap programmatic loads in `suppress(fn)`.\n */\nexport class DirtyTracker<T = unknown> {\n private baseline: T;\n private readonly isEqual: (a: T, b: T) => boolean;\n private readonly normalize?: (value: T) => unknown;\n private normalizedBaseline: { value: unknown } | null = null;\n /** `isDirty` result as of a revision (and baseline version). */\n private cache: { revision: number; baseline: number; dirty: boolean } | null =\n null;\n private baselineVersion = 0;\n private suppressDepth = 0;\n private hasValue = false;\n private lastValue: T | undefined;\n private dirtyState = false;\n private listeners = new Set<(dirty: boolean) => void>();\n\n constructor(\n initialBaseline: T,\n options?: DirtyTrackerOptions<T> | ((a: T, b: T) => boolean),\n ) {\n this.baseline = initialBaseline;\n if (typeof options === \"function\") {\n this.isEqual = options;\n } else {\n this.isEqual = options?.isEqual ?? defaultIsEqual;\n this.normalize = options?.normalize;\n }\n }\n\n /**\n * Returns current baseline value.\n */\n public getBaseline(): T {\n return this.baseline;\n }\n\n private changeBaseline(value: T): void {\n this.baseline = value;\n this.baselineVersion++;\n this.normalizedBaseline = null;\n this.cache = null;\n }\n\n /**\n * Sets a new baseline value without triggering any dirty state.\n * If a value is being tracked (`update`), `dirty` is recomputed against it.\n */\n public setBaseline(value: T): void {\n this.changeBaseline(value);\n if (this.hasValue) {\n this.setDirtyState(this.compare(this.lastValue as T));\n }\n }\n\n private compare(current: T): boolean {\n if (!this.normalize) return !this.isEqual(this.baseline, current);\n this.normalizedBaseline ??= { value: this.normalize(this.baseline) };\n return !this.isEqual(\n this.normalizedBaseline.value as T,\n this.normalize(current) as T,\n );\n }\n\n /**\n * Checks whether the given value differs from the baseline.\n * With a `revision` (e.g. `HistoryManager.getRevision()`), the result is\n * cached and reused for the same revision until the baseline changes.\n */\n public isDirty(current: T, revision?: number): boolean {\n if (revision === undefined) return this.compare(current);\n const cache = this.cache;\n if (\n cache &&\n cache.revision === revision &&\n cache.baseline === this.baselineVersion\n ) {\n return cache.dirty;\n }\n const dirty = this.compare(current);\n this.cache = { revision, baseline: this.baselineVersion, dirty };\n return dirty;\n }\n\n /**\n * Resets the baseline to the provided current value (or clears dirty status).\n */\n public reset(current: T): void {\n this.changeBaseline(current);\n this.hasValue = true;\n this.lastValue = current;\n this.setDirtyState(false);\n }\n\n /**\n * Records the current value and returns whether it is dirty. While\n * suppressed (`suppress`), the value becomes the new baseline instead, so\n * programmatic loads and restores never mark the document dirty.\n */\n public update(current: T, revision?: number): boolean {\n this.hasValue = true;\n this.lastValue = current;\n if (this.suppressDepth > 0) {\n this.changeBaseline(current);\n this.setDirtyState(false);\n return false;\n }\n const dirty = this.isDirty(current, revision);\n this.setDirtyState(dirty);\n return dirty;\n }\n\n /** Whether the last value passed to `update` differs from the baseline. */\n public get dirty(): boolean {\n return this.dirtyState;\n }\n\n /** Whether `suppress` is currently running. */\n public get suppressed(): boolean {\n return this.suppressDepth > 0;\n }\n\n /**\n * Marks the document saved: `current` (default: the last value passed to\n * `update`) becomes the baseline.\n */\n public markClean(...args: [] | [current: T]): void {\n if (args.length > 0) {\n this.reset(args[0] as T);\n } else if (this.hasValue) {\n this.reset(this.lastValue as T);\n } else {\n this.setDirtyState(false);\n }\n }\n\n /**\n * Runs `fn` without marking anything dirty: every `update` during it\n * rebaselines. Re-entrant (depth counter). If `fn` returns a promise, the\n * suppression lasts until it settles.\n */\n public suppress<R>(fn: () => R): R {\n this.suppressDepth++;\n let result: R;\n try {\n result = fn();\n } catch (error) {\n this.suppressDepth--;\n throw error;\n }\n if (isThenable(result)) {\n const release = () => {\n this.suppressDepth--;\n };\n return (result as unknown as Promise<unknown>).then(\n (value) => {\n release();\n return value;\n },\n (error) => {\n release();\n throw error;\n },\n ) as unknown as R;\n }\n this.suppressDepth--;\n return result;\n }\n\n /**\n * Subscribes to changes of `dirty`. The listener is called immediately with\n * the current value. Returns an unsubscribe function.\n */\n public subscribe(listener: (dirty: boolean) => void): () => void {\n this.listeners.add(listener);\n listener(this.dirtyState);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private setDirtyState(dirty: boolean): void {\n if (dirty === this.dirtyState) return;\n this.dirtyState = dirty;\n this.listeners.forEach((listener) => {\n try {\n listener(dirty);\n } catch (err) {\n console.error(\"[DirtyTracker] Error in listener:\", err);\n }\n });\n }\n}\n\n/**\n * Creates a DirtyTracker instance.\n */\nexport function createDirtyTracker<T>(\n initialBaseline: T,\n options?: DirtyTrackerOptions<T> | ((a: T, b: T) => boolean),\n): DirtyTracker<T> {\n return new DirtyTracker(initialBaseline, options);\n}\n\n/**\n * Runs `fn` with dirty tracking suppressed (see `DirtyTracker.suppress`).\n */\nexport function withoutDirty<R>(tracker: DirtyTracker<any>, fn: () => R): R {\n return tracker.suppress(fn);\n}\n\n/** Minimal history surface used by `bindDirtyToHistory` (`HistoryManager` satisfies it). */\nexport interface DirtyHistorySource {\n subscribe(listener: (...args: any[]) => void): () => void;\n getRevision?(): number;\n}\n\nexport interface BindDirtyToHistoryOptions<T> extends DirtyTrackerOptions<T> {\n history: DirtyHistorySource;\n /** Reads the current document value. */\n getValue: () => T;\n /** Existing tracker to drive (default: a new one baselined on `getValue()`). */\n tracker?: DirtyTracker<T>;\n}\n\nexport interface HistoryDirtyBinding<T> {\n readonly tracker: DirtyTracker<T>;\n /** Whether the document differs from the saved baseline. */\n readonly dirty: boolean;\n /** Marks the current value as saved. */\n markClean(): void;\n /** Runs `fn` (e.g. a load or restore) without marking the document dirty. */\n suppress<R>(fn: () => R): R;\n /** Re-reads the value after a change made outside the history. */\n refresh(): boolean;\n subscribe(listener: (dirty: boolean) => void): () => void;\n /** Stops listening to the history. */\n destroy(): void;\n}\n\n/**\n * Keeps a `DirtyTracker` in step with a `HistoryManager`: every history change\n * re-reads the value (cached per history revision), so undoing back to the\n * saved state makes the document clean again.\n */\nexport function bindDirtyToHistory<T>(\n options: BindDirtyToHistoryOptions<T>,\n): HistoryDirtyBinding<T> {\n const { history, getValue } = options;\n const tracker =\n options.tracker ??\n new DirtyTracker<T>(getValue(), {\n isEqual: options.isEqual,\n normalize: options.normalize,\n });\n const unsubscribe = history.subscribe(() => {\n tracker.update(getValue(), history.getRevision?.());\n });\n return {\n tracker,\n get dirty() {\n return tracker.dirty;\n },\n markClean: () => tracker.markClean(getValue()),\n suppress: <R>(fn: () => R): R => {\n // The loaded value becomes the baseline even if the load never touched the history.\n const rebaseline = () => {\n if (!tracker.suppressed) tracker.reset(getValue());\n };\n const result = tracker.suppress(fn);\n if (isThenable(result)) {\n return (result as unknown as Promise<unknown>).then((value) => {\n rebaseline();\n return value;\n }) as unknown as R;\n }\n rebaseline();\n return result;\n },\n refresh: () => tracker.update(getValue()),\n subscribe: (listener) => tracker.subscribe(listener),\n destroy: unsubscribe,\n };\n}\n"]}
@@ -2,17 +2,23 @@ import {
2
2
  FormulaEvaluator,
3
3
  WHOLE_COLUMN_END_ROW,
4
4
  colNameToIndex,
5
+ compareValues,
5
6
  describeFormulaError,
7
+ formatCellDisplay,
6
8
  getFormulaArgumentSpecIndex,
7
9
  getFormulaFunction,
8
10
  getFormulaSignature,
9
11
  getFormulaSignatureParts,
10
12
  indexToColName,
11
13
  isFormulaError,
14
+ numericValue,
15
+ parseCellInput,
12
16
  parseFormula,
17
+ parseIsoDate,
13
18
  searchFormulaFunctions,
19
+ sortCompareValues,
14
20
  tokenizeFormula
15
- } from "./chunk-DENSCKFC.js";
21
+ } from "./chunk-QBJ22YZR.js";
16
22
 
17
23
  // src/spreadsheet/formula/dependency-graph.ts
18
24
  var columnDependencyKey = (col) => `${col.toUpperCase()}:`;
@@ -678,28 +684,41 @@ function compareCellValues(a, b, direction = "asc") {
678
684
  const aBlank = isBlankValue(a);
679
685
  const bBlank = isBlankValue(b);
680
686
  if (aBlank || bBlank) return aBlank === bBlank ? 0 : aBlank ? 1 : -1;
681
- const aNum = toNumber(a);
682
- const bNum = toNumber(b);
683
687
  let result;
684
- if (aNum !== null && bNum !== null) result = aNum - bNum;
685
- else if (aNum !== null) result = -1;
686
- else if (bNum !== null) result = 1;
687
- else result = compareText(String(a), String(b));
688
+ if (isPlainText(a) && isPlainText(b) && !(parseIsoDate(a) && parseIsoDate(b))) {
689
+ result = compareText(a, b);
690
+ } else {
691
+ result = sortCompareValues(a, b);
692
+ }
688
693
  if (result === 0) return 0;
689
694
  return direction === "desc" ? -Math.sign(result) : Math.sign(result);
690
695
  }
696
+ var isPlainText = (value) => typeof value === "string" && !isFormulaError(value);
697
+ function filterValue(value) {
698
+ if (isBlankValue(value) || isFormulaError(value)) return null;
699
+ if (typeof value === "number") return Number.isFinite(value) ? { value, kind: "number" } : null;
700
+ if (typeof value === "boolean") return { value, kind: "boolean" };
701
+ const num = numericValue(value);
702
+ if (num !== null) return { value: num, kind: "number" };
703
+ const text = String(value);
704
+ return { value: text, kind: parseIsoDate(text) ? "number" : "text" };
705
+ }
706
+ function filterOperand(operand) {
707
+ if (typeof operand !== "string") return filterValue(operand);
708
+ if (operand.trim() === "") return null;
709
+ const parsed = parseCellInput(operand.trim());
710
+ if (parsed.type === "number" || parsed.type === "date" || parsed.type === "boolean") return filterValue(parsed.value);
711
+ return { value: operand, kind: "text" };
712
+ }
691
713
  function compareForFilter(value, operand) {
692
- if (isBlankValue(value) || isBlankValue(operand)) return null;
693
- const a = toNumber(value);
694
- const b = toNumber(operand);
695
- if (a !== null && b !== null) return a - b;
696
- if (a !== null || b !== null) return null;
697
- return compareText(String(value), String(operand));
714
+ const a = filterValue(value);
715
+ const b = filterOperand(operand);
716
+ if (!a || !b || a.kind !== b.kind) return null;
717
+ return compareValues(a.value, b.value);
698
718
  }
699
719
  function looselyEquals(value, operand) {
700
- const a = toNumber(value);
701
- const b = toNumber(operand);
702
- if (a !== null && b !== null) return a === b;
720
+ const c = compareForFilter(value, operand);
721
+ if (c !== null) return c === 0;
703
722
  return String(value ?? "").trim().toLowerCase() === String(operand ?? "").trim().toLowerCase();
704
723
  }
705
724
  function matchesFilterRule(value, rule) {
@@ -774,7 +793,8 @@ function classifyFillValue(raw) {
774
793
  if (raw.trim() === "") return { kind: "blank" };
775
794
  const num = toNumber(raw);
776
795
  if (num !== null) return { kind: "number", value: num };
777
- const date = ISO_DATE_PATTERN.exec(raw.trim());
796
+ const typed = parseCellInput(raw);
797
+ const date = ISO_DATE_PATTERN.exec(typed.type === "date" ? String(typed.value) : raw.trim());
778
798
  if (date) {
779
799
  const [year, month, day] = [Number(date[1]), Number(date[2]), Number(date[3])];
780
800
  const time = Date.UTC(year, month - 1, day);
@@ -1071,11 +1091,16 @@ function parseHtmlTable(html) {
1071
1091
  return rows.length > 0 ? rows : null;
1072
1092
  }
1073
1093
  function createSpreadsheetClipboardData(cells, origin) {
1074
- const values = cells.map((row) => row.map((cell) => cell.value));
1075
- const payload = { type: "pixerate-spreadsheet", version: 1, origin, cells };
1094
+ const texts = cells.map((row) => row.map((cell) => cell.text ?? displayText(cell.value)));
1095
+ const payload = {
1096
+ type: "pixerate-spreadsheet",
1097
+ version: 1,
1098
+ origin,
1099
+ cells: cells.map((row) => row.map(({ raw, value }) => ({ raw, value })))
1100
+ };
1076
1101
  return {
1077
- "text/plain": serializeTsv(values.map((row) => row.map(displayText))),
1078
- "text/html": serializeHtmlTable(values),
1102
+ "text/plain": serializeTsv(texts),
1103
+ "text/html": serializeHtmlTable(texts),
1079
1104
  [SPREADSHEET_CLIPBOARD_MIME]: JSON.stringify(payload)
1080
1105
  };
1081
1106
  }
@@ -1289,6 +1314,7 @@ function buildSpreadsheetView(doc, getValue) {
1289
1314
 
1290
1315
  // src/spreadsheet/controller.ts
1291
1316
  var nextIdSequence = 0;
1317
+ var DEFAULT_MAX_HISTORY_BYTES = 64 * 1024 * 1024;
1292
1318
  var MAX_SPILL_PASSES = 25;
1293
1319
  var spillCellId = (rowId, colId) => `${rowId}\0${colId}`;
1294
1320
  var SpreadsheetController = class {
@@ -1308,6 +1334,7 @@ var SpreadsheetController = class {
1308
1334
  undoStack = [];
1309
1335
  redoStack = [];
1310
1336
  isApplyingHistory = false;
1337
+ maxHistoryBytes;
1311
1338
  // Set while importing TSV: history and recalculation are done once at the end.
1312
1339
  batching = false;
1313
1340
  pendingCommits = [];
@@ -1349,6 +1376,7 @@ var SpreadsheetController = class {
1349
1376
  ...options.document?.table ? { table: options.document.table } : {}
1350
1377
  };
1351
1378
  this.primaryDataSourceId = options.primaryDataSourceId;
1379
+ this.maxHistoryBytes = Math.max(0, options.maxHistoryBytes ?? DEFAULT_MAX_HISTORY_BYTES);
1352
1380
  this.onDocumentChange = options.onDocumentChange;
1353
1381
  this.onSelectionChange = options.onSelectionChange;
1354
1382
  this.onCellCommit = options.onCellCommit;
@@ -1363,6 +1391,7 @@ var SpreadsheetController = class {
1363
1391
  getFormulaCell: () => this.evaluatingCell
1364
1392
  });
1365
1393
  this.syncWithDataSource();
1394
+ this.rederiveTypedValues();
1366
1395
  this.recalculateAll();
1367
1396
  }
1368
1397
  loadDocument(document) {
@@ -1374,9 +1403,63 @@ var SpreadsheetController = class {
1374
1403
  this.undoStack = [];
1375
1404
  this.redoStack = [];
1376
1405
  this.syncWithDataSource();
1406
+ this.rederiveTypedValues();
1377
1407
  this.recalculateAll();
1378
1408
  this.notifyChange();
1379
1409
  }
1410
+ /**
1411
+ * Re-parses the value of every stored typed (non-formula) cell from its
1412
+ * `raw` input, so documents saved before typed input was parsed (whose
1413
+ * values are text such as `"120"`) compare and sort as numbers. Cells of
1414
+ * bound columns in record rows keep their value: it belongs to the data
1415
+ * source.
1416
+ */
1417
+ rederiveTypedValues() {
1418
+ for (const row of this.document.rows) {
1419
+ const cells = this.document.cells[row.id];
1420
+ if (!cells) continue;
1421
+ for (const col of this.document.columns) {
1422
+ const cell = cells[col.id];
1423
+ if (!cell || typeof cell.raw !== "string" || cell.raw.startsWith("=")) continue;
1424
+ if (col.type === "bound" && col.binding && row.recordId) continue;
1425
+ const typed = this.typedCell(cell.raw, cell.format);
1426
+ cell.value = typed.value;
1427
+ if (typed.numberFormat) cell.numberFormat = typed.numberFormat;
1428
+ else delete cell.numberFormat;
1429
+ if (typed.format) cell.format = typed.format;
1430
+ }
1431
+ }
1432
+ }
1433
+ /**
1434
+ * Value of typed (non-formula) input: a number, boolean, ISO date, error
1435
+ * or text (see `parseCellInput`), its automatic number format, and the
1436
+ * `CellFormat` to use: the automatic one (currency, percentage, date,
1437
+ * number) when `format` is unset or `text` (the default of new columns).
1438
+ */
1439
+ typedCell(raw, format) {
1440
+ const parsed = parseCellInput(raw);
1441
+ return {
1442
+ value: parsed.value,
1443
+ ...parsed.numberFormat ? { numberFormat: parsed.numberFormat } : {},
1444
+ format: parsed.cellFormat && (!format || format === "text") ? parsed.cellFormat : format
1445
+ };
1446
+ }
1447
+ /**
1448
+ * Typed input for a bound field, coerced by the field's declared type:
1449
+ * number, boolean and date fields get a number, boolean or ISO date when
1450
+ * the input parses as one; string and enum fields (and unknown fields)
1451
+ * keep the text exactly as typed.
1452
+ */
1453
+ boundInputValue(dataSourceId, field, raw) {
1454
+ if (raw.startsWith("=")) return raw;
1455
+ const type = this.binder.getDataSource(dataSourceId)?.getFields().find((f) => f.key === field)?.type;
1456
+ if (type !== "number" && type !== "boolean" && type !== "date") return raw;
1457
+ const parsed = parseCellInput(raw);
1458
+ if (type === "number" && parsed.type === "number") return parsed.value;
1459
+ if (type === "boolean" && parsed.type === "boolean") return parsed.value;
1460
+ if (type === "date" && parsed.type === "date") return parsed.value;
1461
+ return raw;
1462
+ }
1380
1463
  registerDataSource(ds) {
1381
1464
  this.binder.register(ds);
1382
1465
  this.syncWithDataSource();
@@ -1453,21 +1536,20 @@ var SpreadsheetController = class {
1453
1536
  }
1454
1537
  const col = this.document.columns.find((c) => c.id === colId);
1455
1538
  const row = this.document.rows.find((r) => r.id === rowId);
1539
+ const isFormula = raw.startsWith("=");
1540
+ let cell;
1456
1541
  if (col?.type === "bound" && col.binding && row?.recordId) {
1457
- this.binder.commitBoundValue(
1458
- col.binding.dataSource,
1459
- row.recordId,
1460
- col.binding.field,
1461
- raw
1462
- );
1542
+ const value = this.boundInputValue(col.binding.dataSource, col.binding.field, raw);
1543
+ this.binder.commitBoundValue(col.binding.dataSource, row.recordId, col.binding.field, value);
1544
+ cell = { raw, value, format: col.format };
1545
+ } else if (isFormula) {
1546
+ cell = { raw, value: raw, format: col?.format };
1547
+ } else {
1548
+ cell = { raw, ...this.typedCell(raw, col?.format) };
1463
1549
  }
1464
1550
  const cellKey = this.getCellKey(rowId, colId);
1465
- this.depGraph.setCellFormula(cellKey, raw.startsWith("=") ? raw : null);
1466
- this.document.cells[rowId][colId] = {
1467
- raw,
1468
- value: raw,
1469
- format: col?.format
1470
- };
1551
+ this.depGraph.setCellFormula(cellKey, isFormula ? raw : null);
1552
+ this.document.cells[rowId][colId] = cell;
1471
1553
  this.document.updatedAt = Date.now();
1472
1554
  if (this.batching) {
1473
1555
  this.pendingCommits.push([rowId, colId, raw]);
@@ -1983,7 +2065,7 @@ var SpreadsheetController = class {
1983
2065
  let maxLen = (col.title || "").length + (col.key ? col.key.length + 3 : 0);
1984
2066
  for (const row of this.document.rows) {
1985
2067
  const cell = this.getCell(row.id, col.id);
1986
- const valStr = cell.value != null ? String(cell.value) : "";
2068
+ const valStr = formatCellDisplay(cell);
1987
2069
  if (valStr.length > maxLen) {
1988
2070
  maxLen = valStr.length;
1989
2071
  }
@@ -2007,8 +2089,7 @@ var SpreadsheetController = class {
2007
2089
  ) : this.document.columns;
2008
2090
  return rows.map(
2009
2091
  (row) => columns.map((col) => {
2010
- const cell = this.getCell(row.id, col.id);
2011
- return String(cell.value ?? "").replace(/\t/g, " ");
2092
+ return formatCellDisplay(this.getCell(row.id, col.id)).replace(/\t/g, " ");
2012
2093
  }).join(" ")
2013
2094
  ).join("\n");
2014
2095
  }
@@ -2085,7 +2166,7 @@ var SpreadsheetController = class {
2085
2166
  */
2086
2167
  exportToCsv(options = {}) {
2087
2168
  const matrix = this.readMatrix(options.range ?? null).map(
2088
- (row) => row.map((cell) => options.formulas ? cell.raw : String(cell.value ?? ""))
2169
+ (row) => row.map((cell) => options.formulas ? cell.raw : formatCellDisplay(cell))
2089
2170
  );
2090
2171
  return serializeCsv(matrix, {
2091
2172
  delimiter: options.delimiter,
@@ -2126,10 +2207,11 @@ var SpreadsheetController = class {
2126
2207
  const cells = this.readMatrix(r).map(
2127
2208
  (row) => row.map((cell) => {
2128
2209
  const value = cell.error || cell.value;
2210
+ const text = formatCellDisplay(cell);
2129
2211
  if (cell.spillAnchor && !this.spillAnchorInRange(cell.spillAnchor, r)) {
2130
- return { raw: value === null || value === void 0 ? "" : String(value), value };
2212
+ return { raw: text, value, text };
2131
2213
  }
2132
- return { raw: cell.raw, value };
2214
+ return { raw: cell.raw, value, text };
2133
2215
  })
2134
2216
  );
2135
2217
  return createSpreadsheetClipboardData(cells, { row: r.startRow, col: r.startCol });
@@ -2648,6 +2730,28 @@ var SpreadsheetController = class {
2648
2730
  this.undoStack.push(JSON.stringify(this.document));
2649
2731
  if (this.undoStack.length > 50) this.undoStack.shift();
2650
2732
  this.redoStack = [];
2733
+ this.trimHistory();
2734
+ }
2735
+ /** Drops the oldest snapshots beyond `maxHistoryBytes`, always keeping the newest. */
2736
+ trimHistory() {
2737
+ if (this.maxHistoryBytes <= 0 || this.undoStack.length <= 1) return;
2738
+ let total = 0;
2739
+ for (const s of this.undoStack) total += s.length * 2;
2740
+ for (const s of this.redoStack) total += s.length * 2;
2741
+ while (total > this.maxHistoryBytes && this.undoStack.length > 1) {
2742
+ total -= this.undoStack.shift().length * 2;
2743
+ }
2744
+ }
2745
+ /** Approximate bytes held by the undo/redo snapshots (UTF-16 size). */
2746
+ getHistoryByteSize() {
2747
+ let total = 0;
2748
+ for (const s of this.undoStack) total += s.length * 2;
2749
+ for (const s of this.redoStack) total += s.length * 2;
2750
+ return total;
2751
+ }
2752
+ /** Number of undo / redo snapshots currently held. */
2753
+ getHistoryDepth() {
2754
+ return { undo: this.undoStack.length, redo: this.redoStack.length };
2651
2755
  }
2652
2756
  undo() {
2653
2757
  if (this.undoStack.length === 0) return;
@@ -2711,7 +2815,8 @@ function getSpreadsheetMenuItems(controller, cell) {
2711
2815
  if (!column || !row) return [];
2712
2816
  const selection = controller.selectedRange && rangeContains(controller.selectedRange, cell.row, cell.col) ? normalizeRange(controller.selectedRange) : { startRow: cell.row, startCol: cell.col, endRow: cell.row, endCol: cell.col };
2713
2817
  const colName = indexToColName(cell.col);
2714
- const value = controller.getCell(row.id, column.id).value;
2818
+ const cellData = controller.getCell(row.id, column.id);
2819
+ const value = cellData.value;
2715
2820
  const table = doc.table ?? {};
2716
2821
  const filter = controller.getFilterState();
2717
2822
  const grouping = table.grouping;
@@ -2733,7 +2838,7 @@ function getSpreadsheetMenuItems(controller, cell) {
2733
2838
  },
2734
2839
  {
2735
2840
  id: "filter-equals",
2736
- label: `Show only rows where ${colName} = ${quote(value)}`,
2841
+ label: `Show only rows where ${colName} = ${quote(formatCellDisplay(cellData))}`,
2737
2842
  separatorBefore: true,
2738
2843
  run: () => controller.addFilterRule({ colId: column.id, operator: "equals", value: String(value ?? "") })
2739
2844
  },
@@ -2992,4 +3097,4 @@ export {
2992
3097
  registerSpreadsheetImportAdapters,
2993
3098
  importFileIntoSpreadsheet
2994
3099
  };
2995
- //# sourceMappingURL=chunk-RU52I7QO.js.map
3100
+ //# sourceMappingURL=chunk-K3R5NG2D.js.map