@ai-matrx/canvas 0.5.2 → 0.6.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.
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as CanvasItemId, a as CanvasWindowId, b as CanvasJson, c as CanvasLayoutNode, d as CanvasPaneId, e as CanvasStoreBinding, f as CanvasState, g as CanvasAction, h as CanvasController, i as CanvasItem, j as CanvasExtraWindow, k as CanvasHistoryEntry, l as CanvasPane, m as canvasWindowOfItem } from './toggleKind-BD78LnMB.cjs';
2
- export { n as CANVAS_DEFAULT_KEY, o as CANVAS_DEFAULT_WIDTH, p as CANVAS_DESKTOP_LAYOUT_RULES, q as CANVAS_HISTORY_LIMIT, r as CANVAS_LAUNCHER_KIND, s as CANVAS_MAIN_WINDOW, t as CANVAS_MIN_SPLIT_FRACTION, u as CANVAS_MIN_WIDTH, v as CANVAS_NARROW_WIDTH, w as CANVAS_STORAGE_KEY, x as CANVAS_WEB_LAYOUT_RULES, y as CanvasControllerOptions, z as CanvasErrorReport, A as CanvasErrorSink, B as CanvasKeyValueStore, D as CanvasKindVisibility, E as CanvasLayoutRules, F as CanvasNavigateInput, G as CanvasOpenInput, H as CanvasOpenTarget, I as CanvasOrientation, J as CanvasPersistencePort, K as CanvasPreferredTarget, L as CanvasPresentation, M as CanvasPresentationOrientation, N as CanvasRect, O as CanvasSessionAttachReason, P as CanvasSessionDetachReason, Q as CanvasSessionEvent, R as CanvasSessionHooks, S as CanvasSplitId, T as CanvasWindowCloseMode, U as CanvasWindowFrame, V as CanvasWindowPorts, W as ReduxStoreLike, X as ToggleKindInput, Y as bindCanvasToReduxStore, Z as canvasActions, _ as canvasOrientation, $ as canvasPresentation, a0 as canvasReducer, a1 as canvasWindowFrame, a2 as canvasWindowOfPane, a3 as clampDraggedCanvasWidth, a4 as consoleCanvasErrorSink, a5 as createCanvasController, a6 as createCanvasStore, a7 as createInitialCanvasState, a8 as createKeyValueCanvasPersistence, a9 as createLocalStorageCanvasPersistence, aa as defaultCanvasWidth, ab as fitCanvasWidth, ac as foldCanvasWindows, ad as isCanvasAction, ae as listCanvasWindowIds, af as preferredFlowDirection, ag as resolveCanvasLayoutRules, ah as sanitizeCanvasSnapshot, ai as selectCanvasKindVisibility, aj as shouldStackSplit, ak as toPersistableSnapshot, al as toggleKind } from './toggleKind-BD78LnMB.cjs';
1
+ import { C as CanvasItemId, a as CanvasWindowId, b as CanvasJson, c as CanvasLayoutNode, d as CanvasPaneId, e as CanvasStoreBinding, f as CanvasState, g as CanvasAction, h as CanvasController, i as CanvasItem, j as CanvasExtraWindow, k as CanvasHistoryEntry, l as CanvasPane, m as canvasWindowOfItem } from './toggleKind-DhDmWExm.cjs';
2
+ export { n as CANVAS_DEFAULT_KEY, o as CANVAS_DEFAULT_WIDTH, p as CANVAS_DESKTOP_LAYOUT_RULES, q as CANVAS_HISTORY_LIMIT, r as CANVAS_KEEP_ALIVE_DEPTH, s as CANVAS_LAUNCHER_KIND, t as CANVAS_MAIN_WINDOW, u as CANVAS_MIN_SPLIT_FRACTION, v as CANVAS_MIN_WIDTH, w as CANVAS_NARROW_WIDTH, x as CANVAS_PHONE_MAX_WIDTH, y as CANVAS_STORAGE_KEY, z as CANVAS_WEB_LAYOUT_RULES, A as CanvasControllerOptions, B as CanvasErrorReport, D as CanvasErrorSink, E as CanvasKeyValueStore, F as CanvasKindVisibility, G as CanvasLayoutRules, H as CanvasNavigateInput, I as CanvasOpenInput, J as CanvasOpenTarget, K as CanvasOrientation, L as CanvasPersistencePort, M as CanvasPreferredTarget, N as CanvasPresentation, O as CanvasPresentationOrientation, P as CanvasRect, Q as CanvasSessionAttachReason, R as CanvasSessionDetachReason, S as CanvasSessionEvent, T as CanvasSessionHooks, U as CanvasSplitId, V as CanvasWindowCloseMode, W as CanvasWindowFrame, X as CanvasWindowPorts, Y as ReduxStoreLike, Z as ToggleKindInput, _ as bindCanvasToReduxStore, $ as canvasActions, a0 as canvasOrientation, a1 as canvasPresentation, a2 as canvasReducer, a3 as canvasWindowFrame, a4 as canvasWindowOfPane, a5 as clampDraggedCanvasWidth, a6 as consoleCanvasErrorSink, a7 as createCanvasController, a8 as createCanvasStore, a9 as createInitialCanvasState, aa as createKeyValueCanvasPersistence, ab as createLocalStorageCanvasPersistence, ac as defaultCanvasWidth, ad as fitCanvasWidth, ae as foldCanvasWindows, af as isCanvasAction, ag as listCanvasWindowIds, ah as preferredFlowDirection, ai as resolveCanvasLayoutRules, aj as sanitizeCanvasSnapshot, ak as selectCanvasKindVisibility, al as shouldStackSplit, am as toPersistableSnapshot, an as toggleKind } from './toggleKind-DhDmWExm.cjs';
3
3
 
4
4
  declare function canvasItemId(kind: string, key: string): CanvasItemId;
5
5
  declare function parseCanvasItemId(id: CanvasItemId): {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as CanvasItemId, a as CanvasWindowId, b as CanvasJson, c as CanvasLayoutNode, d as CanvasPaneId, e as CanvasStoreBinding, f as CanvasState, g as CanvasAction, h as CanvasController, i as CanvasItem, j as CanvasExtraWindow, k as CanvasHistoryEntry, l as CanvasPane, m as canvasWindowOfItem } from './toggleKind-BD78LnMB.js';
2
- export { n as CANVAS_DEFAULT_KEY, o as CANVAS_DEFAULT_WIDTH, p as CANVAS_DESKTOP_LAYOUT_RULES, q as CANVAS_HISTORY_LIMIT, r as CANVAS_LAUNCHER_KIND, s as CANVAS_MAIN_WINDOW, t as CANVAS_MIN_SPLIT_FRACTION, u as CANVAS_MIN_WIDTH, v as CANVAS_NARROW_WIDTH, w as CANVAS_STORAGE_KEY, x as CANVAS_WEB_LAYOUT_RULES, y as CanvasControllerOptions, z as CanvasErrorReport, A as CanvasErrorSink, B as CanvasKeyValueStore, D as CanvasKindVisibility, E as CanvasLayoutRules, F as CanvasNavigateInput, G as CanvasOpenInput, H as CanvasOpenTarget, I as CanvasOrientation, J as CanvasPersistencePort, K as CanvasPreferredTarget, L as CanvasPresentation, M as CanvasPresentationOrientation, N as CanvasRect, O as CanvasSessionAttachReason, P as CanvasSessionDetachReason, Q as CanvasSessionEvent, R as CanvasSessionHooks, S as CanvasSplitId, T as CanvasWindowCloseMode, U as CanvasWindowFrame, V as CanvasWindowPorts, W as ReduxStoreLike, X as ToggleKindInput, Y as bindCanvasToReduxStore, Z as canvasActions, _ as canvasOrientation, $ as canvasPresentation, a0 as canvasReducer, a1 as canvasWindowFrame, a2 as canvasWindowOfPane, a3 as clampDraggedCanvasWidth, a4 as consoleCanvasErrorSink, a5 as createCanvasController, a6 as createCanvasStore, a7 as createInitialCanvasState, a8 as createKeyValueCanvasPersistence, a9 as createLocalStorageCanvasPersistence, aa as defaultCanvasWidth, ab as fitCanvasWidth, ac as foldCanvasWindows, ad as isCanvasAction, ae as listCanvasWindowIds, af as preferredFlowDirection, ag as resolveCanvasLayoutRules, ah as sanitizeCanvasSnapshot, ai as selectCanvasKindVisibility, aj as shouldStackSplit, ak as toPersistableSnapshot, al as toggleKind } from './toggleKind-BD78LnMB.js';
1
+ import { C as CanvasItemId, a as CanvasWindowId, b as CanvasJson, c as CanvasLayoutNode, d as CanvasPaneId, e as CanvasStoreBinding, f as CanvasState, g as CanvasAction, h as CanvasController, i as CanvasItem, j as CanvasExtraWindow, k as CanvasHistoryEntry, l as CanvasPane, m as canvasWindowOfItem } from './toggleKind-DhDmWExm.js';
2
+ export { n as CANVAS_DEFAULT_KEY, o as CANVAS_DEFAULT_WIDTH, p as CANVAS_DESKTOP_LAYOUT_RULES, q as CANVAS_HISTORY_LIMIT, r as CANVAS_KEEP_ALIVE_DEPTH, s as CANVAS_LAUNCHER_KIND, t as CANVAS_MAIN_WINDOW, u as CANVAS_MIN_SPLIT_FRACTION, v as CANVAS_MIN_WIDTH, w as CANVAS_NARROW_WIDTH, x as CANVAS_PHONE_MAX_WIDTH, y as CANVAS_STORAGE_KEY, z as CANVAS_WEB_LAYOUT_RULES, A as CanvasControllerOptions, B as CanvasErrorReport, D as CanvasErrorSink, E as CanvasKeyValueStore, F as CanvasKindVisibility, G as CanvasLayoutRules, H as CanvasNavigateInput, I as CanvasOpenInput, J as CanvasOpenTarget, K as CanvasOrientation, L as CanvasPersistencePort, M as CanvasPreferredTarget, N as CanvasPresentation, O as CanvasPresentationOrientation, P as CanvasRect, Q as CanvasSessionAttachReason, R as CanvasSessionDetachReason, S as CanvasSessionEvent, T as CanvasSessionHooks, U as CanvasSplitId, V as CanvasWindowCloseMode, W as CanvasWindowFrame, X as CanvasWindowPorts, Y as ReduxStoreLike, Z as ToggleKindInput, _ as bindCanvasToReduxStore, $ as canvasActions, a0 as canvasOrientation, a1 as canvasPresentation, a2 as canvasReducer, a3 as canvasWindowFrame, a4 as canvasWindowOfPane, a5 as clampDraggedCanvasWidth, a6 as consoleCanvasErrorSink, a7 as createCanvasController, a8 as createCanvasStore, a9 as createInitialCanvasState, aa as createKeyValueCanvasPersistence, ab as createLocalStorageCanvasPersistence, ac as defaultCanvasWidth, ad as fitCanvasWidth, ae as foldCanvasWindows, af as isCanvasAction, ag as listCanvasWindowIds, ah as preferredFlowDirection, ai as resolveCanvasLayoutRules, aj as sanitizeCanvasSnapshot, ak as selectCanvasKindVisibility, al as shouldStackSplit, am as toPersistableSnapshot, an as toggleKind } from './toggleKind-DhDmWExm.js';
3
3
 
4
4
  declare function canvasItemId(kind: string, key: string): CanvasItemId;
5
5
  declare function parseCanvasItemId(id: CanvasItemId): {
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  var CANVAS_MAIN_WINDOW = "main";
3
3
  var CANVAS_LAUNCHER_KIND = "canvas.launcher";
4
4
  var CANVAS_HISTORY_LIMIT = 50;
5
+ var CANVAS_KEEP_ALIVE_DEPTH = 5;
5
6
  var CANVAS_MIN_WIDTH = 360;
6
7
  var CANVAS_DEFAULT_WIDTH = 640;
7
8
  var CANVAS_MIN_SPLIT_FRACTION = 0.12;
@@ -367,8 +368,10 @@ function sendHome(state, itemId, home, activate) {
367
368
  next = insertInto(next, homeFrame.focusedPaneId, itemId, activate);
368
369
  return activate ? withFrame(next, target, { focusedPaneId: homeFrame.focusedPaneId }) : next;
369
370
  }
370
- function newItem(kind, key, title, data, now, history) {
371
+ function newItem(kind, key, title, data, now, steps) {
371
372
  const id = canvasItemId(kind, key);
373
+ const history = steps?.history ?? [];
374
+ const kept = steps?.kept ?? [];
372
375
  return {
373
376
  id,
374
377
  kind,
@@ -377,12 +380,14 @@ function newItem(kind, key, title, data, now, history) {
377
380
  data,
378
381
  openedAt: now,
379
382
  updatedAt: now,
380
- instance: `${now.toString(36)}:${id}`,
381
- ...history && history.length > 0 ? { history: history.slice(-CANVAS_HISTORY_LIMIT) } : {}
383
+ // A reused instance is the SAME live body coming back (Back, or returning to a kept step).
384
+ instance: steps?.instance ?? `${now.toString(36)}:${id}`,
385
+ ...history.length > 0 ? { history: history.slice(-CANVAS_HISTORY_LIMIT) } : {},
386
+ ...kept.length > 0 ? { kept: kept.slice(-CANVAS_KEEP_ALIVE_DEPTH) } : {}
382
387
  };
383
388
  }
384
389
  function historyEntry(item) {
385
- return { kind: item.kind, key: item.key, title: item.title, data: item.data };
390
+ return { kind: item.kind, key: item.key, title: item.title, data: item.data, ...item.instance ? { instance: item.instance } : {} };
386
391
  }
387
392
  function replaceInPlace(state, current, next) {
388
393
  const pane = paneOf(state, current.id);
@@ -411,17 +416,25 @@ function sanitizeHistory(raw) {
411
416
  if (!entry || typeof entry !== "object") continue;
412
417
  const e = entry;
413
418
  if (typeof e.kind !== "string" || typeof e.key !== "string") continue;
414
- out.push({ kind: e.kind, key: e.key, title: typeof e.title === "string" ? e.title : null, data: e.data ?? null });
419
+ out.push({
420
+ kind: e.kind,
421
+ key: e.key,
422
+ title: typeof e.title === "string" ? e.title : null,
423
+ data: e.data ?? null,
424
+ ...typeof e.instance === "string" && e.instance ? { instance: e.instance } : {}
425
+ });
415
426
  }
416
427
  return out.slice(-CANVAS_HISTORY_LIMIT);
417
428
  }
418
429
  function sanitizeItem(item) {
419
430
  const history = sanitizeHistory(item.history);
420
- const { history: _history, instance, ...rest } = item;
431
+ const kept = sanitizeHistory(item.kept).slice(-CANVAS_KEEP_ALIVE_DEPTH);
432
+ const { history: _history, kept: _kept, instance, ...rest } = item;
421
433
  return {
422
434
  ...rest,
423
435
  ...typeof instance === "string" && instance ? { instance } : {},
424
- ...history.length > 0 ? { history } : {}
436
+ ...history.length > 0 ? { history } : {},
437
+ ...kept.length > 0 ? { kept } : {}
425
438
  };
426
439
  }
427
440
  function clampWidth(width) {
@@ -608,7 +621,22 @@ function canvasReducer(state = createInitialCanvasState(), action) {
608
621
  return current.kind === CANVAS_LAUNCHER_KIND ? canvasReducer(focused, canvasActions.closeItem(itemId)) : focused;
609
622
  }
610
623
  const history = [...current.history ?? [], historyEntry(current)];
611
- return replaceInPlace(state, current, newItem(to.kind, to.key, to.title ?? null, to.data ?? null, now, history));
624
+ const keptAll = current.kept ?? [];
625
+ const keptIndex = keptAll.findIndex((entry) => canvasItemId(entry.kind, entry.key) === targetId);
626
+ const revived = keptIndex >= 0 ? keptAll[keptIndex] : void 0;
627
+ const kept = keptAll.filter((_, i) => i !== keptIndex);
628
+ return replaceInPlace(
629
+ state,
630
+ current,
631
+ newItem(
632
+ to.kind,
633
+ to.key,
634
+ to.title !== void 0 ? to.title : revived?.title ?? null,
635
+ to.data !== void 0 ? to.data : revived?.data ?? null,
636
+ now,
637
+ { history, kept, instance: revived?.instance }
638
+ )
639
+ );
612
640
  }
613
641
  case `${P}back`: {
614
642
  const { itemId, now } = action.payload;
@@ -621,7 +649,12 @@ function canvasReducer(state = createInitialCanvasState(), action) {
621
649
  if (state.items[targetId]) {
622
650
  return focusExisting(canvasReducer(state, canvasActions.closeItem(itemId)), targetId);
623
651
  }
624
- return replaceInPlace(state, current, newItem(entry.kind, entry.key, entry.title, entry.data, now, history.slice(0, -1)));
652
+ const kept = [...(current.kept ?? []).filter((k) => canvasItemId(k.kind, k.key) !== itemId), historyEntry(current)];
653
+ return replaceInPlace(
654
+ state,
655
+ current,
656
+ newItem(entry.kind, entry.key, entry.title, entry.data, now, { history: history.slice(0, -1), kept, instance: entry.instance })
657
+ );
625
658
  }
626
659
  case `${P}closeItem`: {
627
660
  const { itemId } = action.payload;
@@ -1458,6 +1491,7 @@ function selectCanvasItemHistory(s, itemId) {
1458
1491
  var selectCanvasCanGoBack = (s, itemId) => (s.items[itemId]?.history?.length ?? 0) > 0;
1459
1492
 
1460
1493
  // src/core/presentation.ts
1494
+ var CANVAS_PHONE_MAX_WIDTH = 767;
1461
1495
  var CANVAS_NARROW_WIDTH = 480;
1462
1496
  var SQUARE_BAND = 1.2;
1463
1497
  function canvasOrientation(width, height) {
@@ -1529,11 +1563,13 @@ export {
1529
1563
  CANVAS_DEFAULT_WIDTH,
1530
1564
  CANVAS_DESKTOP_LAYOUT_RULES,
1531
1565
  CANVAS_HISTORY_LIMIT,
1566
+ CANVAS_KEEP_ALIVE_DEPTH,
1532
1567
  CANVAS_LAUNCHER_KIND,
1533
1568
  CANVAS_MAIN_WINDOW,
1534
1569
  CANVAS_MIN_SPLIT_FRACTION,
1535
1570
  CANVAS_MIN_WIDTH,
1536
1571
  CANVAS_NARROW_WIDTH,
1572
+ CANVAS_PHONE_MAX_WIDTH,
1537
1573
  CANVAS_SHORTCUTS,
1538
1574
  CANVAS_STORAGE_KEY,
1539
1575
  CANVAS_WEB_LAYOUT_RULES,