@ai-matrx/canvas 0.6.0 → 0.7.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/CHANGELOG.md +30 -0
- package/README.md +17 -2
- package/dist/index.cjs +76 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -4
- package/dist/index.d.ts +13 -4
- package/dist/index.js +76 -7
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +441 -199
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +77 -44
- package/dist/react.d.ts +77 -44
- package/dist/react.js +396 -153
- package/dist/react.js.map +1 -1
- package/dist/styles.css +88 -37
- package/dist/{toggleKind-DhDmWExm.d.cts → toggleKind-CAI7pndj.d.cts} +21 -2
- package/dist/{toggleKind-DhDmWExm.d.ts → toggleKind-CAI7pndj.d.ts} +21 -2
- package/package.json +1 -1
package/dist/styles.css
CHANGED
|
@@ -194,6 +194,8 @@
|
|
|
194
194
|
|
|
195
195
|
.mxc-pane-header {
|
|
196
196
|
flex: none;
|
|
197
|
+
/* Narrow-header rules below read the header's own width. */
|
|
198
|
+
container: mxc-pane-header / inline-size;
|
|
197
199
|
display: flex;
|
|
198
200
|
align-items: center;
|
|
199
201
|
gap: 0.25rem;
|
|
@@ -224,9 +226,10 @@
|
|
|
224
226
|
cursor: grab;
|
|
225
227
|
}
|
|
226
228
|
|
|
227
|
-
/* One tab as a title, with its own close (a lone tab is never a trap). */
|
|
229
|
+
/* One tab as a title, with its own close (a lone tab is never a trap). Keeps icon + ~7 letters + "…". */
|
|
228
230
|
.mxc-single-title {
|
|
229
231
|
position: relative;
|
|
232
|
+
min-width: min(6.25rem, 100%);
|
|
230
233
|
padding-right: 0.25rem;
|
|
231
234
|
}
|
|
232
235
|
|
|
@@ -258,12 +261,14 @@
|
|
|
258
261
|
gap: 0.125rem;
|
|
259
262
|
}
|
|
260
263
|
|
|
264
|
+
/* Nothing leading: no box and no gap of its own — the tabs keep that room; the actions still sit at the end. */
|
|
261
265
|
.mxc-pane-leading:empty {
|
|
262
|
-
|
|
266
|
+
display: none;
|
|
263
267
|
}
|
|
264
268
|
|
|
265
269
|
.mxc-pane-actions {
|
|
266
270
|
flex: none;
|
|
271
|
+
margin-left: auto;
|
|
267
272
|
display: flex;
|
|
268
273
|
align-items: center;
|
|
269
274
|
gap: 0.125rem;
|
|
@@ -277,6 +282,17 @@
|
|
|
277
282
|
min-width: 0;
|
|
278
283
|
}
|
|
279
284
|
|
|
285
|
+
/* A narrow header: controls close up and the title may shrink to its icon — nothing ever overlaps. */
|
|
286
|
+
@container mxc-pane-header (max-width: 22rem) {
|
|
287
|
+
.mxc-pane-actions {
|
|
288
|
+
gap: 0;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.mxc-single-title {
|
|
292
|
+
min-width: 0;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
280
296
|
.mxc-pane-body {
|
|
281
297
|
position: relative;
|
|
282
298
|
flex: 1 1 auto;
|
|
@@ -404,73 +420,83 @@
|
|
|
404
420
|
/* ── tabs ───────────────────────────────────────────────────────────────── */
|
|
405
421
|
|
|
406
422
|
/*
|
|
407
|
-
* THE STRIP takes
|
|
408
|
-
*
|
|
409
|
-
*
|
|
410
|
-
*
|
|
423
|
+
* THE STRIP takes the header's free width (flex-basis 0: what it shows never
|
|
424
|
+
* changes how wide it is, so the fit is stable). Tabs are as wide as their
|
|
425
|
+
* names; short of room they shrink — the active tab least — to a floor
|
|
426
|
+
* (--mxc-tab-min: icon + ~6 letters + "…"; the active tab keeps more), and
|
|
427
|
+
* the tabs that do not fit at their floor are reached from "All tabs" (the
|
|
428
|
+
* strip never scrolls and never overlaps a control). At the narrowest it is
|
|
429
|
+
* the active tab's title and that menu.
|
|
411
430
|
*/
|
|
412
431
|
.mxc-tabstrip {
|
|
413
|
-
flex:
|
|
432
|
+
flex: 1 1 0;
|
|
414
433
|
min-width: 0;
|
|
415
434
|
display: flex;
|
|
416
435
|
align-items: center;
|
|
417
436
|
gap: 0.125rem;
|
|
437
|
+
overflow: hidden;
|
|
418
438
|
}
|
|
419
439
|
|
|
420
440
|
.mxc-tabs {
|
|
421
|
-
/* The tabs' offset parent, so "keep the active tab in view" measures in strip coordinates. */
|
|
422
441
|
position: relative;
|
|
423
442
|
flex: 0 1 auto;
|
|
424
443
|
min-width: 0;
|
|
425
444
|
display: flex;
|
|
426
445
|
align-items: center;
|
|
427
446
|
gap: 0.125rem;
|
|
428
|
-
overflow
|
|
429
|
-
scrollbar-width: none;
|
|
430
|
-
--mxc-fade-start: 0px;
|
|
431
|
-
--mxc-fade-end: 0px;
|
|
447
|
+
overflow: hidden;
|
|
432
448
|
}
|
|
433
449
|
|
|
434
|
-
|
|
435
|
-
|
|
450
|
+
/* "All tabs": a chevron and how many tabs are out of sight. */
|
|
451
|
+
.mxc-tab-list {
|
|
452
|
+
flex: none;
|
|
453
|
+
width: auto;
|
|
454
|
+
min-width: 1.5rem;
|
|
455
|
+
gap: 0.0625rem;
|
|
456
|
+
padding: 0 0.25rem;
|
|
436
457
|
}
|
|
437
458
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
459
|
+
.mxc-tab-list-count {
|
|
460
|
+
font-size: 0.6875rem;
|
|
461
|
+
line-height: 1;
|
|
462
|
+
font-variant-numeric: tabular-nums;
|
|
441
463
|
}
|
|
442
464
|
|
|
443
|
-
.mxc-
|
|
444
|
-
|
|
465
|
+
.mxc-tab-list-menu {
|
|
466
|
+
max-height: min(24rem, 70vh);
|
|
467
|
+
overflow-y: auto;
|
|
445
468
|
}
|
|
446
469
|
|
|
447
|
-
.mxc-
|
|
448
|
-
-
|
|
449
|
-
mask-image: linear-gradient(to right, transparent 0, #000 var(--mxc-fade-start), #000 calc(100% - var(--mxc-fade-end)), transparent 100%);
|
|
470
|
+
.mxc-tab-list-item {
|
|
471
|
+
max-width: 18rem;
|
|
450
472
|
}
|
|
451
473
|
|
|
452
|
-
.mxc-
|
|
453
|
-
|
|
474
|
+
.mxc-tab-list-item[data-active] {
|
|
475
|
+
font-weight: 600;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.mxc-tab-list-title {
|
|
479
|
+
min-width: 0;
|
|
480
|
+
overflow: hidden;
|
|
481
|
+
text-overflow: ellipsis;
|
|
482
|
+
white-space: nowrap;
|
|
454
483
|
}
|
|
455
484
|
|
|
456
485
|
/*
|
|
457
486
|
* TAB DENSITY (Claude Code / Codex): 12.5px text, a 14px icon, 6px side
|
|
458
|
-
* padding
|
|
459
|
-
*
|
|
460
|
-
* squeezed to three letters), then the strip scrolls. The active tab keeps
|
|
461
|
-
* icon + ~10 letters. Every tab reserves the room of its close, so a name is
|
|
462
|
-
* never under the button; the close shows on hover, the active tab and focus.
|
|
487
|
+
* padding, up to 12rem wide. The active tab reserves the room of its (always
|
|
488
|
+
* shown) close; a background tab's close is overlaid on hover.
|
|
463
489
|
*/
|
|
464
490
|
.mxc-tab {
|
|
465
491
|
position: relative;
|
|
466
492
|
flex: 0 1 auto;
|
|
467
|
-
min-width:
|
|
493
|
+
min-width: var(--mxc-tab-min, 78px);
|
|
468
494
|
max-width: 12rem;
|
|
469
495
|
display: flex;
|
|
470
496
|
align-items: center;
|
|
471
|
-
gap: 0.
|
|
497
|
+
gap: 0.25rem;
|
|
472
498
|
height: 1.625rem;
|
|
473
|
-
padding: 0
|
|
499
|
+
padding: 0 0.375rem;
|
|
474
500
|
border-radius: 0.375rem;
|
|
475
501
|
font-size: 0.78125rem;
|
|
476
502
|
line-height: 1rem;
|
|
@@ -481,18 +507,26 @@
|
|
|
481
507
|
box-sizing: border-box;
|
|
482
508
|
}
|
|
483
509
|
|
|
484
|
-
/*
|
|
485
|
-
.mxc-tab:
|
|
486
|
-
padding-right:
|
|
510
|
+
/* The active tab always shows its close: its room is reserved. */
|
|
511
|
+
.mxc-tab[data-active]:has(> .mxc-tab-close) {
|
|
512
|
+
padding-right: 1.25rem;
|
|
487
513
|
}
|
|
488
514
|
|
|
515
|
+
/* The active tab gets priority width: it shrinks last and keeps a higher floor. */
|
|
489
516
|
.mxc-tab[data-active] {
|
|
490
|
-
|
|
517
|
+
flex-shrink: 0.2;
|
|
518
|
+
min-width: var(--mxc-tab-active-min, 100px);
|
|
491
519
|
background: var(--mxc-tab-active-bg);
|
|
492
520
|
color: var(--mxc-fg);
|
|
493
521
|
box-shadow: var(--mxc-tab-active-shadow);
|
|
494
522
|
}
|
|
495
523
|
|
|
524
|
+
/* The narrowest strip: the active tab is the title, as narrow as it must be (icon + "…"). */
|
|
525
|
+
.mxc-tabstrip[data-compact] .mxc-tab {
|
|
526
|
+
flex: 0 1 auto;
|
|
527
|
+
min-width: 0;
|
|
528
|
+
}
|
|
529
|
+
|
|
496
530
|
.mxc-tab:hover {
|
|
497
531
|
background: var(--mxc-hover);
|
|
498
532
|
}
|
|
@@ -531,10 +565,27 @@
|
|
|
531
565
|
flex: 0 1 auto;
|
|
532
566
|
min-width: 0;
|
|
533
567
|
overflow: hidden;
|
|
534
|
-
text-overflow:
|
|
568
|
+
text-overflow: clip;
|
|
535
569
|
white-space: nowrap;
|
|
536
570
|
}
|
|
537
571
|
|
|
572
|
+
/*
|
|
573
|
+
* A name that is really cut (data-truncated: measured more than 1px short)
|
|
574
|
+
* ends in "…". Only then — system fonts measure a fraction wider than their
|
|
575
|
+
* intrinsic size, which would put "…" on a name that fits.
|
|
576
|
+
*/
|
|
577
|
+
.mxc-tab[data-truncated] .mxc-tab-title,
|
|
578
|
+
.mxc-single-title[data-truncated] > .mxc-tab-title {
|
|
579
|
+
text-overflow: ellipsis;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/* A background tab's close is overlaid while shown: the name's end fades under it. */
|
|
583
|
+
.mxc-tab:not([data-active]):hover:has(> .mxc-tab-close) .mxc-tab-title,
|
|
584
|
+
.mxc-tab:not([data-active]):focus-within:has(> .mxc-tab-close) .mxc-tab-title {
|
|
585
|
+
-webkit-mask-image: linear-gradient(to left, transparent 1.125rem, #000 1.875rem);
|
|
586
|
+
mask-image: linear-gradient(to left, transparent 1.125rem, #000 1.875rem);
|
|
587
|
+
}
|
|
588
|
+
|
|
538
589
|
.mxc-tab-note {
|
|
539
590
|
flex: none;
|
|
540
591
|
font-size: 0.6875rem;
|
|
@@ -84,6 +84,11 @@ interface CanvasItem {
|
|
|
84
84
|
* Chat finds the draft.
|
|
85
85
|
*/
|
|
86
86
|
readonly kept?: readonly CanvasHistoryEntry[] | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Where Forward goes (newest-to-visit LAST): every step Back left, in order.
|
|
89
|
+
* A navigate to anything else clears it, as in a browser. Absent = no Forward.
|
|
90
|
+
*/
|
|
91
|
+
readonly forward?: readonly CanvasHistoryEntry[] | undefined;
|
|
87
92
|
/**
|
|
88
93
|
* The mounted body's identity. Minted when the item is created and kept by
|
|
89
94
|
* `rekey`, so a draft that receives its durable id keeps its live body.
|
|
@@ -248,6 +253,12 @@ type CanvasAction = {
|
|
|
248
253
|
itemId: CanvasItemId;
|
|
249
254
|
now: number;
|
|
250
255
|
};
|
|
256
|
+
} | {
|
|
257
|
+
type: `${typeof P}forward`;
|
|
258
|
+
payload: {
|
|
259
|
+
itemId: CanvasItemId;
|
|
260
|
+
now: number;
|
|
261
|
+
};
|
|
251
262
|
} | {
|
|
252
263
|
type: `${typeof P}closeItem`;
|
|
253
264
|
payload: {
|
|
@@ -356,6 +367,8 @@ declare const canvasActions: {
|
|
|
356
367
|
readonly navigate: (itemId: CanvasItemId, to: CanvasNavigateInput) => CanvasAction;
|
|
357
368
|
/** Returns a tab to what it showed before its last navigate. */
|
|
358
369
|
readonly back: (itemId: CanvasItemId) => CanvasAction;
|
|
370
|
+
/** Re-does the last Back (the step Back left), with that step's live body. */
|
|
371
|
+
readonly forward: (itemId: CanvasItemId) => CanvasAction;
|
|
359
372
|
readonly closeItem: (itemId: CanvasItemId) => CanvasAction;
|
|
360
373
|
readonly closeOthers: (itemId: CanvasItemId) => CanvasAction;
|
|
361
374
|
readonly activate: (itemId: CanvasItemId) => CanvasAction;
|
|
@@ -476,6 +489,8 @@ declare function toPersistableSnapshot(state: CanvasState, isRestorable: (kind:
|
|
|
476
489
|
* the centre squeeze. Side-by-side panes narrower than `paneMinWidth` stack
|
|
477
490
|
* instead of squeezing.
|
|
478
491
|
*/
|
|
492
|
+
/** The web's narrowest side-by-side pane (px): below it, a side-by-side split renders stacked. */
|
|
493
|
+
declare const CANVAS_PANE_MIN_WIDTH = 280;
|
|
479
494
|
interface CanvasLayoutRules {
|
|
480
495
|
/** Width before the person drags the edge: CSS px, or a fraction of the region the canvas shares. */
|
|
481
496
|
readonly defaultWidth: number | {
|
|
@@ -619,6 +634,8 @@ interface CanvasController {
|
|
|
619
634
|
navigate(itemId: CanvasItemId, to: CanvasNavigateInput): CanvasItemId | null;
|
|
620
635
|
/** Returns a tab to what it showed before (see navigate). Null when it has no history. */
|
|
621
636
|
back(itemId: CanvasItemId): CanvasItemId | null;
|
|
637
|
+
/** Re-does the last Back with the same live body. Null when there is nothing forward. */
|
|
638
|
+
forward(itemId: CanvasItemId): CanvasItemId | null;
|
|
622
639
|
/** Opens the launcher as a new tab in a pane (default: this window's focused pane), or focuses the one already there. */
|
|
623
640
|
newTab(paneId?: CanvasPaneId): CanvasItemId;
|
|
624
641
|
close(itemId: CanvasItemId): void;
|
|
@@ -709,7 +726,9 @@ declare function preferredFlowDirection(presentation: CanvasPresentation | null
|
|
|
709
726
|
*
|
|
710
727
|
* absent → open it (and reveal the canvas)
|
|
711
728
|
* background → bring it forward: activate its tab, focus its pane, reveal
|
|
712
|
-
* visible → close it (default) or put the canvas away (`whenVisible: "hide"`)
|
|
729
|
+
* visible → close it (default) or put the canvas away (`whenVisible: "hide"`);
|
|
730
|
+
* closing the canvas's LAST tab puts the canvas away too — a toggle
|
|
731
|
+
* never leaves an empty "New tab" launcher behind
|
|
713
732
|
*
|
|
714
733
|
* "Visible" means: on the canvas, the active tab of its pane, and its window's
|
|
715
734
|
* canvas is open. The same item in a popped-out window counts in that window.
|
|
@@ -732,4 +751,4 @@ interface ToggleKindInput {
|
|
|
732
751
|
/** Returns what the item is after the click. */
|
|
733
752
|
declare function toggleKind(controller: CanvasController, input: ToggleKindInput): CanvasKindVisibility;
|
|
734
753
|
|
|
735
|
-
export {
|
|
754
|
+
export { bindCanvasToReduxStore as $, CANVAS_WEB_LAYOUT_RULES as A, type CanvasControllerOptions as B, type CanvasItemId as C, type CanvasErrorReport as D, type CanvasErrorSink as E, type CanvasKeyValueStore as F, type CanvasKindVisibility as G, type CanvasLayoutRules as H, type CanvasNavigateInput as I, type CanvasOpenInput as J, type CanvasOpenTarget as K, type CanvasOrientation as L, type CanvasPersistencePort as M, type CanvasPreferredTarget as N, type CanvasPresentation as O, type CanvasPresentationOrientation as P, type CanvasRect as Q, type CanvasSessionAttachReason as R, type CanvasSessionDetachReason as S, type CanvasSessionEvent as T, type CanvasSessionHooks as U, type CanvasSplitId as V, type CanvasWindowCloseMode as W, type CanvasWindowFrame as X, type CanvasWindowPorts as Y, type ReduxStoreLike as Z, type ToggleKindInput as _, type CanvasWindowId as a, canvasActions as a0, canvasOrientation as a1, canvasPresentation as a2, canvasReducer as a3, canvasWindowFrame as a4, canvasWindowOfPane as a5, clampDraggedCanvasWidth as a6, consoleCanvasErrorSink as a7, createCanvasController as a8, createCanvasStore as a9, createInitialCanvasState as aa, createKeyValueCanvasPersistence as ab, createLocalStorageCanvasPersistence as ac, defaultCanvasWidth as ad, fitCanvasWidth as ae, foldCanvasWindows as af, isCanvasAction as ag, listCanvasWindowIds as ah, preferredFlowDirection as ai, resolveCanvasLayoutRules as aj, sanitizeCanvasSnapshot as ak, selectCanvasKindVisibility as al, shouldStackSplit as am, toPersistableSnapshot as an, toggleKind as ao, type CanvasJson as b, type CanvasLayoutNode as c, type CanvasPaneId as d, type CanvasStoreBinding as e, type CanvasState as f, type CanvasAction as g, type CanvasController as h, type CanvasItem as i, type CanvasExtraWindow as j, type CanvasHistoryEntry as k, type CanvasPane as l, canvasWindowOfItem as m, CANVAS_DEFAULT_KEY as n, CANVAS_DEFAULT_WIDTH as o, CANVAS_DESKTOP_LAYOUT_RULES as p, CANVAS_HISTORY_LIMIT as q, CANVAS_KEEP_ALIVE_DEPTH as r, CANVAS_LAUNCHER_KIND as s, CANVAS_MAIN_WINDOW as t, CANVAS_MIN_SPLIT_FRACTION as u, CANVAS_MIN_WIDTH as v, CANVAS_NARROW_WIDTH as w, CANVAS_PANE_MIN_WIDTH as x, CANVAS_PHONE_MAX_WIDTH as y, CANVAS_STORAGE_KEY as z };
|
|
@@ -84,6 +84,11 @@ interface CanvasItem {
|
|
|
84
84
|
* Chat finds the draft.
|
|
85
85
|
*/
|
|
86
86
|
readonly kept?: readonly CanvasHistoryEntry[] | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Where Forward goes (newest-to-visit LAST): every step Back left, in order.
|
|
89
|
+
* A navigate to anything else clears it, as in a browser. Absent = no Forward.
|
|
90
|
+
*/
|
|
91
|
+
readonly forward?: readonly CanvasHistoryEntry[] | undefined;
|
|
87
92
|
/**
|
|
88
93
|
* The mounted body's identity. Minted when the item is created and kept by
|
|
89
94
|
* `rekey`, so a draft that receives its durable id keeps its live body.
|
|
@@ -248,6 +253,12 @@ type CanvasAction = {
|
|
|
248
253
|
itemId: CanvasItemId;
|
|
249
254
|
now: number;
|
|
250
255
|
};
|
|
256
|
+
} | {
|
|
257
|
+
type: `${typeof P}forward`;
|
|
258
|
+
payload: {
|
|
259
|
+
itemId: CanvasItemId;
|
|
260
|
+
now: number;
|
|
261
|
+
};
|
|
251
262
|
} | {
|
|
252
263
|
type: `${typeof P}closeItem`;
|
|
253
264
|
payload: {
|
|
@@ -356,6 +367,8 @@ declare const canvasActions: {
|
|
|
356
367
|
readonly navigate: (itemId: CanvasItemId, to: CanvasNavigateInput) => CanvasAction;
|
|
357
368
|
/** Returns a tab to what it showed before its last navigate. */
|
|
358
369
|
readonly back: (itemId: CanvasItemId) => CanvasAction;
|
|
370
|
+
/** Re-does the last Back (the step Back left), with that step's live body. */
|
|
371
|
+
readonly forward: (itemId: CanvasItemId) => CanvasAction;
|
|
359
372
|
readonly closeItem: (itemId: CanvasItemId) => CanvasAction;
|
|
360
373
|
readonly closeOthers: (itemId: CanvasItemId) => CanvasAction;
|
|
361
374
|
readonly activate: (itemId: CanvasItemId) => CanvasAction;
|
|
@@ -476,6 +489,8 @@ declare function toPersistableSnapshot(state: CanvasState, isRestorable: (kind:
|
|
|
476
489
|
* the centre squeeze. Side-by-side panes narrower than `paneMinWidth` stack
|
|
477
490
|
* instead of squeezing.
|
|
478
491
|
*/
|
|
492
|
+
/** The web's narrowest side-by-side pane (px): below it, a side-by-side split renders stacked. */
|
|
493
|
+
declare const CANVAS_PANE_MIN_WIDTH = 280;
|
|
479
494
|
interface CanvasLayoutRules {
|
|
480
495
|
/** Width before the person drags the edge: CSS px, or a fraction of the region the canvas shares. */
|
|
481
496
|
readonly defaultWidth: number | {
|
|
@@ -619,6 +634,8 @@ interface CanvasController {
|
|
|
619
634
|
navigate(itemId: CanvasItemId, to: CanvasNavigateInput): CanvasItemId | null;
|
|
620
635
|
/** Returns a tab to what it showed before (see navigate). Null when it has no history. */
|
|
621
636
|
back(itemId: CanvasItemId): CanvasItemId | null;
|
|
637
|
+
/** Re-does the last Back with the same live body. Null when there is nothing forward. */
|
|
638
|
+
forward(itemId: CanvasItemId): CanvasItemId | null;
|
|
622
639
|
/** Opens the launcher as a new tab in a pane (default: this window's focused pane), or focuses the one already there. */
|
|
623
640
|
newTab(paneId?: CanvasPaneId): CanvasItemId;
|
|
624
641
|
close(itemId: CanvasItemId): void;
|
|
@@ -709,7 +726,9 @@ declare function preferredFlowDirection(presentation: CanvasPresentation | null
|
|
|
709
726
|
*
|
|
710
727
|
* absent → open it (and reveal the canvas)
|
|
711
728
|
* background → bring it forward: activate its tab, focus its pane, reveal
|
|
712
|
-
* visible → close it (default) or put the canvas away (`whenVisible: "hide"`)
|
|
729
|
+
* visible → close it (default) or put the canvas away (`whenVisible: "hide"`);
|
|
730
|
+
* closing the canvas's LAST tab puts the canvas away too — a toggle
|
|
731
|
+
* never leaves an empty "New tab" launcher behind
|
|
713
732
|
*
|
|
714
733
|
* "Visible" means: on the canvas, the active tab of its pane, and its window's
|
|
715
734
|
* canvas is open. The same item in a popped-out window counts in that window.
|
|
@@ -732,4 +751,4 @@ interface ToggleKindInput {
|
|
|
732
751
|
/** Returns what the item is after the click. */
|
|
733
752
|
declare function toggleKind(controller: CanvasController, input: ToggleKindInput): CanvasKindVisibility;
|
|
734
753
|
|
|
735
|
-
export {
|
|
754
|
+
export { bindCanvasToReduxStore as $, CANVAS_WEB_LAYOUT_RULES as A, type CanvasControllerOptions as B, type CanvasItemId as C, type CanvasErrorReport as D, type CanvasErrorSink as E, type CanvasKeyValueStore as F, type CanvasKindVisibility as G, type CanvasLayoutRules as H, type CanvasNavigateInput as I, type CanvasOpenInput as J, type CanvasOpenTarget as K, type CanvasOrientation as L, type CanvasPersistencePort as M, type CanvasPreferredTarget as N, type CanvasPresentation as O, type CanvasPresentationOrientation as P, type CanvasRect as Q, type CanvasSessionAttachReason as R, type CanvasSessionDetachReason as S, type CanvasSessionEvent as T, type CanvasSessionHooks as U, type CanvasSplitId as V, type CanvasWindowCloseMode as W, type CanvasWindowFrame as X, type CanvasWindowPorts as Y, type ReduxStoreLike as Z, type ToggleKindInput as _, type CanvasWindowId as a, canvasActions as a0, canvasOrientation as a1, canvasPresentation as a2, canvasReducer as a3, canvasWindowFrame as a4, canvasWindowOfPane as a5, clampDraggedCanvasWidth as a6, consoleCanvasErrorSink as a7, createCanvasController as a8, createCanvasStore as a9, createInitialCanvasState as aa, createKeyValueCanvasPersistence as ab, createLocalStorageCanvasPersistence as ac, defaultCanvasWidth as ad, fitCanvasWidth as ae, foldCanvasWindows as af, isCanvasAction as ag, listCanvasWindowIds as ah, preferredFlowDirection as ai, resolveCanvasLayoutRules as aj, sanitizeCanvasSnapshot as ak, selectCanvasKindVisibility as al, shouldStackSplit as am, toPersistableSnapshot as an, toggleKind as ao, type CanvasJson as b, type CanvasLayoutNode as c, type CanvasPaneId as d, type CanvasStoreBinding as e, type CanvasState as f, type CanvasAction as g, type CanvasController as h, type CanvasItem as i, type CanvasExtraWindow as j, type CanvasHistoryEntry as k, type CanvasPane as l, canvasWindowOfItem as m, CANVAS_DEFAULT_KEY as n, CANVAS_DEFAULT_WIDTH as o, CANVAS_DESKTOP_LAYOUT_RULES as p, CANVAS_HISTORY_LIMIT as q, CANVAS_KEEP_ALIVE_DEPTH as r, CANVAS_LAUNCHER_KIND as s, CANVAS_MAIN_WINDOW as t, CANVAS_MIN_SPLIT_FRACTION as u, CANVAS_MIN_WIDTH as v, CANVAS_NARROW_WIDTH as w, CANVAS_PANE_MIN_WIDTH as x, CANVAS_PHONE_MAX_WIDTH as y, CANVAS_STORAGE_KEY as z };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-matrx/canvas",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "The AI Matrx canvas: a docked right-hand column with split panes, tabs, full screen, a kind registry, Redux-compatible state and persistence.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|