quilt-vanilla 0.3.0 → 0.4.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/actions.d.ts +14 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +115 -0
- package/dist/actions.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/menu.d.ts +9 -3
- package/dist/menu.d.ts.map +1 -1
- package/dist/menu.js +110 -37
- package/dist/menu.js.map +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +35 -8
- package/dist/renderer.js.map +1 -1
- package/dist/shortcut-registration.d.ts +9 -0
- package/dist/shortcut-registration.d.ts.map +1 -0
- package/dist/shortcut-registration.js +95 -0
- package/dist/shortcut-registration.js.map +1 -0
- package/dist/shortcuts.d.ts +7 -6
- package/dist/shortcuts.d.ts.map +1 -1
- package/dist/shortcuts.js +28 -50
- package/dist/shortcuts.js.map +1 -1
- package/dist/styles.css +25 -9
- package/dist/tabs.d.ts.map +1 -1
- package/dist/tabs.js +10 -12
- package/dist/tabs.js.map +1 -1
- package/dist/types.d.ts +21 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/workspace-api.d.ts +8 -2
- package/dist/workspace-api.d.ts.map +1 -1
- package/dist/workspace-api.js +14 -0
- package/dist/workspace-api.js.map +1 -1
- package/package.json +2 -2
- package/src/actions.ts +125 -0
- package/src/index.ts +6 -0
- package/src/menu.ts +123 -43
- package/src/renderer.ts +41 -7
- package/src/shortcut-registration.ts +106 -0
- package/src/shortcuts.ts +38 -63
- package/src/styles.css +25 -9
- package/src/tabs.ts +9 -11
- package/src/types.ts +43 -5
- package/src/workspace-api.ts +23 -1
package/dist/shortcuts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionContext, ResolvedLayoutOptions, WorkspaceAction } from './types.js';\nimport type { Scope } from './lifetime.js';\nimport { registeredShortcuts } from './shortcut-registration.js';\nexport function shortcutEnabled(options: ResolvedLayoutOptions, key: 'middleClickClose') {\n return (\n options.shortcuts === true ||\n (typeof options.shortcuts === 'object' && !!options.shortcuts[key])\n );\n}\nconst hovered = new WeakMap<Document, HTMLElement>();\nexport function bindShortcuts(\n root: HTMLElement,\n options: ResolvedLayoutOptions,\n scope: Scope,\n canExecute: (action: WorkspaceAction, context?: ActionContext) => boolean,\n execute: (action: WorkspaceAction, context?: ActionContext) => Promise<boolean>,\n menuTarget: () =>\n { dialog: HTMLDialogElement; context: ActionContext; close(): void } | undefined,\n) {\n const doc = root.ownerDocument;\n let hoveredGroup: string | undefined;\n scope.listen(root, 'pointerover', (event) => {\n hovered.set(doc, root);\n hoveredGroup = (event.target as Element).closest<HTMLElement>('.layouts-group')?.dataset.nodeId;\n });\n scope.listen(root, 'pointerleave', () => {\n if (hovered.get(doc) === root) hovered.delete(doc);\n hoveredGroup = undefined;\n });\n scope.add(() => {\n if (hovered.get(doc) === root) hovered.delete(doc);\n });\n const ownsFocus = () =>\n (doc.activeElement?.closest<HTMLElement>('.layouts') ?? hovered.get(doc)) === root;\n const context = (): ActionContext => {\n if (!ownsFocus()) return {};\n const menu = menuTarget();\n if (menu) return menu.context;\n const focusedGroup = doc.activeElement?.closest<HTMLElement>('.layouts-group')?.dataset.nodeId;\n const groupId = (hovered.get(doc) === root ? hoveredGroup : undefined) ?? focusedGroup;\n return groupId ? { groupId } : {};\n };\n scope.listen(doc, 'keydown', (event) => {\n const e = event as KeyboardEvent;\n const target = e.target as HTMLElement | null;\n if (!ownsFocus() || e.defaultPrevented || e.repeat || e.isComposing) return;\n const menu = menuTarget();\n if (\n target?.closest(\n 'input, textarea, select, [contenteditable]:not([contenteditable=\"false\"])',\n ) ||\n Array.from(doc.querySelectorAll('dialog[open]')).some((dialog) => dialog !== menu?.dialog)\n )\n return;\n const entry = registeredShortcuts(options).find(\n (entry) =>\n entry.handling === 'quilt' &&\n entry.bindings.some(\n (binding) =>\n e.key.toLowerCase() === binding.key.toLowerCase() &&\n e.ctrlKey === !!binding.ctrl &&\n e.altKey === !!binding.alt &&\n e.shiftKey === !!binding.shift &&\n e.metaKey === !!binding.meta,\n ),\n );\n const actionContext = context();\n if (!entry || !canExecute(entry.action, actionContext)) return;\n e.preventDefault();\n menu?.close();\n void execute(entry.action, actionContext);\n });\n return context;\n}\n"]}
|
package/dist/styles.css
CHANGED
|
@@ -162,10 +162,13 @@
|
|
|
162
162
|
.layouts-menu {
|
|
163
163
|
position: fixed;
|
|
164
164
|
margin: 0;
|
|
165
|
-
padding: 5px;
|
|
166
165
|
width: 240px;
|
|
167
166
|
max-height: min(520px, 70vh);
|
|
168
167
|
overflow: auto;
|
|
168
|
+
}
|
|
169
|
+
.layouts-menu,
|
|
170
|
+
.layouts-submenu-content {
|
|
171
|
+
padding: var(--layouts-spacing, 5px);
|
|
169
172
|
background: var(--layouts-header, #242a34);
|
|
170
173
|
color: var(--layouts-text, #e5e9f0);
|
|
171
174
|
border: 1px solid var(--layouts-line, #39414e);
|
|
@@ -374,9 +377,6 @@
|
|
|
374
377
|
.layouts-submenu-content {
|
|
375
378
|
display: flex;
|
|
376
379
|
flex-direction: column;
|
|
377
|
-
padding: 4px;
|
|
378
|
-
border: 1px solid var(--layouts-line);
|
|
379
|
-
background: var(--layouts-panel);
|
|
380
380
|
}
|
|
381
381
|
.layouts-corner {
|
|
382
382
|
position: absolute;
|
|
@@ -437,8 +437,6 @@
|
|
|
437
437
|
box-sizing: border-box;
|
|
438
438
|
overflow: auto;
|
|
439
439
|
width: 200px;
|
|
440
|
-
box-shadow: 0 8px 24px #0005;
|
|
441
|
-
border-radius: var(--layouts-radius, 5px);
|
|
442
440
|
}
|
|
443
441
|
|
|
444
442
|
.layouts-corner-overlay {
|
|
@@ -482,9 +480,6 @@
|
|
|
482
480
|
.layouts-picker button {
|
|
483
481
|
min-height: var(--layouts-control-height, 28px);
|
|
484
482
|
}
|
|
485
|
-
.layouts-menu {
|
|
486
|
-
padding: var(--layouts-spacing, 5px);
|
|
487
|
-
}
|
|
488
483
|
|
|
489
484
|
/* Tapered chrome overlays the pane; only its painted footprint intercepts input. */
|
|
490
485
|
.layouts-group[data-tab-bar='tapered'] > .layouts-header {
|
|
@@ -880,3 +875,24 @@
|
|
|
880
875
|
flex-basis: max(22px, var(--layouts-icon-size, 16px));
|
|
881
876
|
height: max(22px, var(--layouts-icon-size, 16px));
|
|
882
877
|
}
|
|
878
|
+
|
|
879
|
+
.layouts-shortcut {
|
|
880
|
+
display: inline-flex;
|
|
881
|
+
align-items: center;
|
|
882
|
+
justify-content: center;
|
|
883
|
+
margin-left: auto;
|
|
884
|
+
min-width: 1.8em;
|
|
885
|
+
min-height: 1.8em;
|
|
886
|
+
padding: 0.15em 0.45em;
|
|
887
|
+
flex-shrink: 0;
|
|
888
|
+
border: 1px solid color-mix(in srgb, var(--layouts-text, #e5e9f0) 22%, transparent);
|
|
889
|
+
border-radius: 0.5em;
|
|
890
|
+
background: color-mix(in srgb, var(--layouts-text, #e5e9f0) 4%, transparent);
|
|
891
|
+
font: inherit;
|
|
892
|
+
font-size: 0.9em;
|
|
893
|
+
font-weight: 500;
|
|
894
|
+
line-height: 1.2;
|
|
895
|
+
color: var(--layouts-text, #e5e9f0);
|
|
896
|
+
white-space: nowrap;
|
|
897
|
+
pointer-events: none;
|
|
898
|
+
}
|
package/dist/tabs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../src/tabs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,UAAU,eAAe;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AACD,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../src/tabs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD,UAAU,eAAe;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAClC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AACD,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,QA+G7F"}
|
package/dist/tabs.js
CHANGED
|
@@ -108,18 +108,16 @@ export function fillTabs(tabs, group, panes, deps) {
|
|
|
108
108
|
x.dataset.focusId = `close-${pane.id}`;
|
|
109
109
|
x.onclick = close;
|
|
110
110
|
item.append(x);
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
};
|
|
122
|
-
}
|
|
111
|
+
item.onmousedown = (e) => {
|
|
112
|
+
if (e.button === 1 && shortcutEnabled(options, 'middleClickClose'))
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
};
|
|
115
|
+
item.onauxclick = (e) => {
|
|
116
|
+
if (e.button === 1 && shortcutEnabled(options, 'middleClickClose')) {
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
close();
|
|
119
|
+
}
|
|
120
|
+
};
|
|
123
121
|
}
|
|
124
122
|
tabs.append(item);
|
|
125
123
|
});
|
package/dist/tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../src/tabs.ts"],"names":[],"mappings":"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","sourcesContent":["import { message } from './messages.js';\nimport { chromeIcon } from './chrome-icons.js';\nimport type { Group, Pane } from 'quilt-core';\nimport type { ResolvedLayoutOptions } from './types.js';\nimport { el } from './lifetime.js';\nimport { shortcutEnabled } from './shortcuts.js';\ninterface TabDependencies {\n options: ResolvedLayoutOptions;\n requestClose: (id: string) => Promise<boolean>;\n prefix: string;\n act: (fn: () => void) => void;\n getDrag: () => string | undefined;\n setDrag: (id: string | undefined) => void;\n clearDrop: () => void;\n focusActive: () => void;\n}\n/** Header nodes are disposable; pane views are owned separately by the renderer. */\nexport function fillTabs(tabs: HTMLElement, group: Group, panes: Pane[], deps: TabDependencies) {\n const { options, prefix, act } = deps;\n const doc = tabs.ownerDocument;\n panes.forEach((pane, i) => {\n const active = pane.id === group.active;\n const item = el(doc, 'div', 'layouts-tab-item');\n item.dataset.active = String(active);\n const tab = el(doc, 'button', 'layouts-tab');\n tab.type = 'button';\n tab.setAttribute('aria-label', pane.title);\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-selected', String(active));\n tab.tabIndex = active ? 0 : -1;\n tab.dataset.focusId = `tab-${pane.id}`;\n tab.id = `${prefix}-tab-${pane.id}`;\n tab.setAttribute('aria-controls', `${prefix}-panel-${pane.id}`);\n const icon = el(doc, 'span', 'layouts-tab-icon');\n icon.setAttribute('aria-hidden', 'true');\n let resolved: Element | undefined;\n act(() => {\n resolved = pane.icon ? options.renderIcon?.(pane.icon, doc) : undefined;\n });\n if (resolved) icon.append(resolved);\n else icon.textContent = Array.from(pane.title.trim())[0] || '•';\n tab.append(icon, el(doc, 'span', 'layouts-tab-label', pane.title));\n tab.onclick = () => act(() => options.store.activate(group.id, pane.id));\n tab.draggable = options.store.can(pane.id, 'move');\n tab.ondragstart = (e) => {\n deps.setDrag(pane.id);\n e.dataTransfer?.setData('text/plain', pane.id);\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n };\n tab.ondragend = () => {\n deps.setDrag(undefined);\n deps.clearDrop();\n };\n const vertical = () => tabs.getAttribute('aria-orientation') === 'vertical';\n const after = (e: DragEvent) => {\n const rect = item.getBoundingClientRect();\n return vertical()\n ? e.clientY > rect.top + rect.height / 2\n : e.clientX > rect.left + rect.width / 2;\n };\n item.ondragover = (e) => {\n const id = deps.getDrag();\n if (\n !id ||\n !options.store.can(id, 'move') ||\n !group.panes.every((p) => options.store.can(p, 'move'))\n )\n return;\n e.preventDefault();\n e.stopPropagation();\n deps.clearDrop();\n item.dataset.tabDrop = after(e) ? 'after' : 'before';\n };\n item.ondragleave = () => {\n delete item.dataset.tabDrop;\n };\n item.ondrop = (e) => {\n const id = deps.getDrag();\n if (!id) return;\n e.preventDefault();\n e.stopPropagation();\n let index = i + (after(e) ? 1 : 0);\n const source = group.panes.indexOf(id);\n // The controller accepts an insertion index after removing the source tab.\n if (source >= 0 && source < index) index--;\n deps.setDrag(undefined);\n deps.clearDrop();\n act(() => options.store.move(id, group.id, 'tab', index, { source: 'user' }));\n };\n tab.onkeydown = (e) => {\n let index = i;\n if (e.key === (vertical() ? 'ArrowDown' : 'ArrowRight')) index = (i + 1) % panes.length;\n else if (e.key === (vertical() ? 'ArrowUp' : 'ArrowLeft'))\n index = (i + panes.length - 1) % panes.length;\n else if (e.key === 'Home') index = 0;\n else if (e.key === 'End') index = panes.length - 1;\n else return;\n e.preventDefault();\n act(() => options.store.activate(group.id, panes[index]!.id));\n deps.focusActive();\n };\n const close = () =>\n act(() => {\n void deps.requestClose(pane.id);\n deps.focusActive();\n });\n item.append(tab);\n if (options.store.can(pane.id, 'close')) {\n const x = el(doc, 'button', 'layouts-button layouts-tab-close');\n x.append(chromeIcon(doc, 'close'));\n x.type = 'button';\n x.title = message(options, 'Close {title}', { title: pane.title });\n x.setAttribute('aria-label', x.title);\n x.dataset.focusId = `close-${pane.id}`;\n x.onclick = close;\n item.append(x);\n if (shortcutEnabled(options, 'middleClickClose')) {\n item.onmousedown = (e) => {\n if (e.button === 1) e.preventDefault();\n };\n item.onauxclick = (e) => {\n if (e.button === 1) {\n e.preventDefault();\n close();\n }\n };\n }\n }\n tabs.append(item);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../src/tabs.ts"],"names":[],"mappings":"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","sourcesContent":["import { message } from './messages.js';\nimport { chromeIcon } from './chrome-icons.js';\nimport type { Group, Pane } from 'quilt-core';\nimport type { ResolvedLayoutOptions } from './types.js';\nimport { el } from './lifetime.js';\nimport { shortcutEnabled } from './shortcuts.js';\ninterface TabDependencies {\n options: ResolvedLayoutOptions;\n requestClose: (id: string) => Promise<boolean>;\n prefix: string;\n act: (fn: () => void) => void;\n getDrag: () => string | undefined;\n setDrag: (id: string | undefined) => void;\n clearDrop: () => void;\n focusActive: () => void;\n}\n/** Header nodes are disposable; pane views are owned separately by the renderer. */\nexport function fillTabs(tabs: HTMLElement, group: Group, panes: Pane[], deps: TabDependencies) {\n const { options, prefix, act } = deps;\n const doc = tabs.ownerDocument;\n panes.forEach((pane, i) => {\n const active = pane.id === group.active;\n const item = el(doc, 'div', 'layouts-tab-item');\n item.dataset.active = String(active);\n const tab = el(doc, 'button', 'layouts-tab');\n tab.type = 'button';\n tab.setAttribute('aria-label', pane.title);\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-selected', String(active));\n tab.tabIndex = active ? 0 : -1;\n tab.dataset.focusId = `tab-${pane.id}`;\n tab.id = `${prefix}-tab-${pane.id}`;\n tab.setAttribute('aria-controls', `${prefix}-panel-${pane.id}`);\n const icon = el(doc, 'span', 'layouts-tab-icon');\n icon.setAttribute('aria-hidden', 'true');\n let resolved: Element | undefined;\n act(() => {\n resolved = pane.icon ? options.renderIcon?.(pane.icon, doc) : undefined;\n });\n if (resolved) icon.append(resolved);\n else icon.textContent = Array.from(pane.title.trim())[0] || '•';\n tab.append(icon, el(doc, 'span', 'layouts-tab-label', pane.title));\n tab.onclick = () => act(() => options.store.activate(group.id, pane.id));\n tab.draggable = options.store.can(pane.id, 'move');\n tab.ondragstart = (e) => {\n deps.setDrag(pane.id);\n e.dataTransfer?.setData('text/plain', pane.id);\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n };\n tab.ondragend = () => {\n deps.setDrag(undefined);\n deps.clearDrop();\n };\n const vertical = () => tabs.getAttribute('aria-orientation') === 'vertical';\n const after = (e: DragEvent) => {\n const rect = item.getBoundingClientRect();\n return vertical()\n ? e.clientY > rect.top + rect.height / 2\n : e.clientX > rect.left + rect.width / 2;\n };\n item.ondragover = (e) => {\n const id = deps.getDrag();\n if (\n !id ||\n !options.store.can(id, 'move') ||\n !group.panes.every((p) => options.store.can(p, 'move'))\n )\n return;\n e.preventDefault();\n e.stopPropagation();\n deps.clearDrop();\n item.dataset.tabDrop = after(e) ? 'after' : 'before';\n };\n item.ondragleave = () => {\n delete item.dataset.tabDrop;\n };\n item.ondrop = (e) => {\n const id = deps.getDrag();\n if (!id) return;\n e.preventDefault();\n e.stopPropagation();\n let index = i + (after(e) ? 1 : 0);\n const source = group.panes.indexOf(id);\n // The controller accepts an insertion index after removing the source tab.\n if (source >= 0 && source < index) index--;\n deps.setDrag(undefined);\n deps.clearDrop();\n act(() => options.store.move(id, group.id, 'tab', index, { source: 'user' }));\n };\n tab.onkeydown = (e) => {\n let index = i;\n if (e.key === (vertical() ? 'ArrowDown' : 'ArrowRight')) index = (i + 1) % panes.length;\n else if (e.key === (vertical() ? 'ArrowUp' : 'ArrowLeft'))\n index = (i + panes.length - 1) % panes.length;\n else if (e.key === 'Home') index = 0;\n else if (e.key === 'End') index = panes.length - 1;\n else return;\n e.preventDefault();\n act(() => options.store.activate(group.id, panes[index]!.id));\n deps.focusActive();\n };\n const close = () =>\n act(() => {\n void deps.requestClose(pane.id);\n deps.focusActive();\n });\n item.append(tab);\n if (options.store.can(pane.id, 'close')) {\n const x = el(doc, 'button', 'layouts-button layouts-tab-close');\n x.append(chromeIcon(doc, 'close'));\n x.type = 'button';\n x.title = message(options, 'Close {title}', { title: pane.title });\n x.setAttribute('aria-label', x.title);\n x.dataset.focusId = `close-${pane.id}`;\n x.onclick = close;\n item.append(x);\n item.onmousedown = (e) => {\n if (e.button === 1 && shortcutEnabled(options, 'middleClickClose')) e.preventDefault();\n };\n item.onauxclick = (e) => {\n if (e.button === 1 && shortcutEnabled(options, 'middleClickClose')) {\n e.preventDefault();\n close();\n }\n };\n }\n tabs.append(item);\n });\n}\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -54,12 +54,11 @@ export interface WorkspaceSettings<State = unknown> {
|
|
|
54
54
|
/** Return a fresh decorative icon element. Unknown keys use a title initial. */
|
|
55
55
|
renderIcon?: (key: string, document: Document) => Element | undefined;
|
|
56
56
|
/** Opt-in conveniences; omitted and false disable all. */
|
|
57
|
-
shortcuts?: boolean | {
|
|
58
|
-
maximize?: boolean | KeyBinding | readonly KeyBinding[];
|
|
57
|
+
shortcuts?: boolean | (Partial<Record<WorkspaceAction, ShortcutRegistration>> & {
|
|
59
58
|
middleClickClose?: boolean;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
});
|
|
60
|
+
/** Customize presentation only; matching and accessibility encoding use the binding. */
|
|
61
|
+
formatShortcut?: (binding: Readonly<KeyBinding>) => string;
|
|
63
62
|
getPaneState?: (paneId: string) => State;
|
|
64
63
|
onError?: (error: unknown) => void;
|
|
65
64
|
/** Copy additional app styles/assets into a same-origin companion document. */
|
|
@@ -104,6 +103,20 @@ export type LayoutOptions<State = unknown> = Omit<ResolvedLayoutOptions<State>,
|
|
|
104
103
|
export type LayoutOptionUpdates<State = unknown> = {
|
|
105
104
|
[Key in keyof Omit<ResolvedLayoutOptions<State>, 'store'>]?: ResolvedLayoutOptions<State>[Key] | undefined;
|
|
106
105
|
};
|
|
106
|
+
export type WorkspaceAction = 'maximize' | 'addTab' | 'restoreClosedTab' | 'closeActiveTab' | 'closePane' | 'closeEmptyPane' | 'popout' | 'joinSiblingRegion' | 'splitLeft' | 'splitRight' | 'splitUp' | 'splitDown' | 'tabOrientationDefault' | 'tabOrientationHorizontal' | 'tabOrientationVertical' | 'tabDisplayDefault' | 'tabDisplayAutomatic' | 'tabDisplayCompact';
|
|
107
|
+
export interface ActionContext {
|
|
108
|
+
groupId?: string;
|
|
109
|
+
paneId?: string;
|
|
110
|
+
}
|
|
111
|
+
export type ShortcutRegistration = boolean | KeyBinding | readonly KeyBinding[] | {
|
|
112
|
+
bindings: true | KeyBinding | readonly KeyBinding[];
|
|
113
|
+
handling?: 'quilt' | 'external';
|
|
114
|
+
};
|
|
115
|
+
export interface RegisteredShortcut {
|
|
116
|
+
readonly action: WorkspaceAction;
|
|
117
|
+
readonly bindings: readonly Readonly<KeyBinding>[];
|
|
118
|
+
readonly handling: 'quilt' | 'external';
|
|
119
|
+
}
|
|
107
120
|
export interface KeyBinding {
|
|
108
121
|
key: string;
|
|
109
122
|
ctrl?: boolean;
|
|
@@ -119,6 +132,9 @@ export interface CloseRequest {
|
|
|
119
132
|
}
|
|
120
133
|
export interface MountedLayout<State = unknown> {
|
|
121
134
|
readonly store: WorkspaceStore;
|
|
135
|
+
canExecuteAction(action: WorkspaceAction, context?: ActionContext): boolean;
|
|
136
|
+
executeAction(action: WorkspaceAction, context?: ActionContext): Promise<boolean>;
|
|
137
|
+
getShortcuts(): readonly RegisteredShortcut[];
|
|
122
138
|
updateOptions(options: LayoutOptionUpdates<State>): void;
|
|
123
139
|
exportWorkspace(): WorkspacePreset;
|
|
124
140
|
loadWorkspace(input: unknown): void;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,OAAO;IAC1C,OAAO,EAAE,WAAW,CAAC;IACrB,qEAAqE;IACrE,MAAM,EAAE,WAAW,CAAC;IACpB,wEAAwE;IACxE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,qFAAqF;IACrF,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC7B;AACD,MAAM,WAAW,QAAQ;IACvB,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AACD,MAAM,MAAM,YAAY,CAAC,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC;AAC7F,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7D,4EAA4E;IAC5E,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACvC;AACD,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB,CAAC,KAAK,GAAG,OAAO;IAChD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,gFAAgF;IAChF,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,GAAG,SAAS,CAAC;IACtE,0DAA0D;IAC1D,SAAS,CAAC,EACN,OAAO,GACP
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,OAAO;IAC1C,OAAO,EAAE,WAAW,CAAC;IACrB,qEAAqE;IACrE,MAAM,EAAE,WAAW,CAAC;IACpB,wEAAwE;IACxE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACtC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,qFAAqF;IACrF,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC7B;AACD,MAAM,WAAW,QAAQ;IACvB,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AACD,MAAM,MAAM,YAAY,CAAC,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC;AAC7F,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7D,4EAA4E;IAC5E,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACvC;AACD,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB,CAAC,KAAK,GAAG,OAAO;IAChD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,gFAAgF;IAChF,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,GAAG,SAAS,CAAC;IACtE,0DAA0D;IAC1D,SAAS,CAAC,EACN,OAAO,GACP,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC,GAAG;QACxD,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC,CAAC;IACP,wFAAwF;IACxF,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC;IAC3D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACrD,4GAA4G;IAC5G,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,KAAK,MAAM,GAAG,IAAI,CAAC;CACxE;AACD,wFAAwF;AACxF,MAAM,WAAW,qBAAqB,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,iBAAiB,CAAC,KAAK,CAAC;IACtF,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;CAC9C;AACD,wFAAwF;AACxF,MAAM,MAAM,oBAAoB,GAC5B;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,KAAK,CAAA;CAAE,GACpD;IAAE,aAAa,CAAC,EAAE,KAAK,CAAC;IAAC,gBAAgB,EAAE,eAAe,CAAA;CAAE,CAAC;AACjE,8DAA8D;AAC9D,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAC1D,6EAA6E;AAC7E,MAAM,MAAM,aAAa,CAAC,KAAK,GAAG,OAAO,IAAI,IAAI,CAC/C,qBAAqB,CAAC,KAAK,CAAC,EAC5B,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,cAAc,CAC7D,GACC,oBAAoB,GAAG;IAAE,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,CAAC,OAAO,SAAS,KAAK,GAC7D;IAAE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAA;CAAE,GAC5C;IAAE,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAA;CAAE,CAAC,GAChD,CACI;IAAE,QAAQ,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAAE,CAChG,CAAC;AACJ,gFAAgF;AAChF,MAAM,MAAM,mBAAmB,CAAC,KAAK,GAAG,OAAO,IAAI;KAChD,GAAG,IAAI,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACzD,qBAAqB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;CAChD,CAAC;AACF,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,QAAQ,GACR,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,gBAAgB,GAChB,QAAQ,GACR,mBAAmB,GACnB,WAAW,GACX,YAAY,GACZ,SAAS,GACT,WAAW,GACX,uBAAuB,GACvB,0BAA0B,GAC1B,wBAAwB,GACxB,mBAAmB,GACnB,qBAAqB,GACrB,mBAAmB,CAAC;AACxB,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,MAAM,oBAAoB,GAC5B,OAAO,GACP,UAAU,GACV,SAAS,UAAU,EAAE,GACrB;IACE,QAAQ,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS,UAAU,EAAE,CAAC;IACpD,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CACjC,CAAC;AACN,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAAC;CACzC;AACD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,qBAAqB,EAAE,SAAS,IAAI,EAAE,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACrB;AACD,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,OAAO;IAC5C,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC;IAC5E,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,YAAY,IAAI,SAAS,kBAAkB,EAAE,CAAC;IAC9C,aAAa,CAAC,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACzD,eAAe,IAAI,eAAe,CAAC;IACnC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,YAAY,IAAI,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,IAAI,CAAC;CACjB"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { PaneRegistry } from './registry.js';\nimport type { WorkspacePreset } from './workspace.js';\nimport type { Messages } from './messages.js';\nimport type { TabRegistry } from './registry.js';\nimport type { LayoutTheme } from './theme.js';\nimport type { LayoutStore, Layout, Pane, WindowPlacement } from 'quilt-core';\nexport interface PaneContext<State = unknown> {\n element: HTMLElement;\n /** Aborted when this view is torn down, including a failed mount. */\n signal: AbortSignal;\n /** Register view-owned cleanup; callbacks run once in reverse order. */\n onCleanup(callback: () => void): void;\n reportError(error: unknown): void;\n document: Document;\n window: Window;\n pane: Pane;\n /** Stable application-owned reference. The library does not serialize this value. */\n state: State;\n location: 'main' | 'popout';\n}\nexport interface PaneView {\n /** Resolves once destination content has committed; rejection rolls back a popout. */\n ready?: Promise<void>;\n dispose(): void;\n resize?(width: number, height: number): void;\n update?(pane: Pane): void;\n}\nexport type PaneRenderer<State = unknown> = (context: PaneContext<State>) => PaneView | void;\nexport interface TabBarStyle {\n /** Left placement uses an icon-only rail; mode and shape apply in either placement. */\n placement?: 'top' | 'left';\n /** Automatic shows labels as width permits; compact always uses icons only. */\n display?: 'automatic' | 'compact';\n mode?: 'full' | 'tapered';\n shape?: 'angle' | 'round' | 'scoop' | 'vertical' | 'rounded';\n /** Anchored by default; floating bars overlay content with an 8px inset. */\n attachment?: 'anchored' | 'floating';\n fit?: 'full' | 'fit';\n corners?: 'fitted' | 'rounded' | 'capsule';\n /** Positive finite CSS pixels. Omit to match header height. */\n taperWidth?: number;\n}\nexport interface TabBarOptions extends TabBarStyle {\n /** Partial overrides keyed by stable group ID; not serialized in Layout JSON. */\n regions?: Record<string, TabBarStyle>;\n}\n/** Live appearance, interactions, and application integration callbacks. */\nexport interface WorkspaceSettings<State = unknown> {\n tabBar?: TabBarOptions;\n theme?: LayoutTheme;\n messages?: Messages;\n popouts?: boolean;\n confirmClose?: (request: CloseRequest) => boolean | Promise<boolean>;\n /** Return a fresh decorative icon element. Unknown keys use a title initial. */\n renderIcon?: (key: string, document: Document) => Element | undefined;\n /** Opt-in conveniences; omitted and false disable all. */\n shortcuts?:\n | boolean\n | {\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { PaneRegistry } from './registry.js';\nimport type { WorkspacePreset } from './workspace.js';\nimport type { Messages } from './messages.js';\nimport type { TabRegistry } from './registry.js';\nimport type { LayoutTheme } from './theme.js';\nimport type { LayoutStore, Layout, Pane, WindowPlacement } from 'quilt-core';\nexport interface PaneContext<State = unknown> {\n element: HTMLElement;\n /** Aborted when this view is torn down, including a failed mount. */\n signal: AbortSignal;\n /** Register view-owned cleanup; callbacks run once in reverse order. */\n onCleanup(callback: () => void): void;\n reportError(error: unknown): void;\n document: Document;\n window: Window;\n pane: Pane;\n /** Stable application-owned reference. The library does not serialize this value. */\n state: State;\n location: 'main' | 'popout';\n}\nexport interface PaneView {\n /** Resolves once destination content has committed; rejection rolls back a popout. */\n ready?: Promise<void>;\n dispose(): void;\n resize?(width: number, height: number): void;\n update?(pane: Pane): void;\n}\nexport type PaneRenderer<State = unknown> = (context: PaneContext<State>) => PaneView | void;\nexport interface TabBarStyle {\n /** Left placement uses an icon-only rail; mode and shape apply in either placement. */\n placement?: 'top' | 'left';\n /** Automatic shows labels as width permits; compact always uses icons only. */\n display?: 'automatic' | 'compact';\n mode?: 'full' | 'tapered';\n shape?: 'angle' | 'round' | 'scoop' | 'vertical' | 'rounded';\n /** Anchored by default; floating bars overlay content with an 8px inset. */\n attachment?: 'anchored' | 'floating';\n fit?: 'full' | 'fit';\n corners?: 'fitted' | 'rounded' | 'capsule';\n /** Positive finite CSS pixels. Omit to match header height. */\n taperWidth?: number;\n}\nexport interface TabBarOptions extends TabBarStyle {\n /** Partial overrides keyed by stable group ID; not serialized in Layout JSON. */\n regions?: Record<string, TabBarStyle>;\n}\n/** Live appearance, interactions, and application integration callbacks. */\nexport interface WorkspaceSettings<State = unknown> {\n tabBar?: TabBarOptions;\n theme?: LayoutTheme;\n messages?: Messages;\n popouts?: boolean;\n confirmClose?: (request: CloseRequest) => boolean | Promise<boolean>;\n /** Return a fresh decorative icon element. Unknown keys use a title initial. */\n renderIcon?: (key: string, document: Document) => Element | undefined;\n /** Opt-in conveniences; omitted and false disable all. */\n shortcuts?:\n | boolean\n | (Partial<Record<WorkspaceAction, ShortcutRegistration>> & {\n middleClickClose?: boolean;\n });\n /** Customize presentation only; matching and accessibility encoding use the binding. */\n formatShortcut?: (binding: Readonly<KeyBinding>) => string;\n getPaneState?: (paneId: string) => State;\n onError?: (error: unknown) => void;\n /** Copy additional app styles/assets into a same-origin companion document. */\n prepareWindow?: (window: Window, pane: Pane) => void;\n /** Override window creation for applications with a managed same-origin host. Must return synchronously. */\n openWindow?: (pane: Pane, placement: WindowPlacement) => Window | null;\n}\n/** Internal renderer configuration; mounted workspaces create this model themselves. */\nexport interface ResolvedLayoutOptions<State = unknown> extends WorkspaceSettings<State> {\n store: LayoutStore;\n tabs?: TabRegistry;\n renderers?: Record<string, PaneRenderer<State>>;\n registry?: PaneRegistry<PaneRenderer<State>>;\n}\n/** Initial configuration is consumed once. Use workspace commands for later changes. */\nexport type InitialConfiguration =\n | { initialLayout?: Layout; initialWorkspace?: never }\n | { initialLayout?: never; initialWorkspace: WorkspacePreset };\n/** Commands and subscriptions for a workspace-owned store. */\nexport type WorkspaceStore = Omit<LayoutStore, 'dispose'>;\n/** Choose a unified registry OR the low-level renderer and creation maps. */\nexport type LayoutOptions<State = unknown> = Omit<\n ResolvedLayoutOptions<State>,\n 'store' | 'registry' | 'renderers' | 'tabs' | 'getPaneState'\n> &\n InitialConfiguration & { store?: never } & (unknown extends State\n ? { getPaneState?: (paneId: string) => State }\n : { getPaneState: (paneId: string) => State }) &\n (\n | { registry: PaneRegistry<PaneRenderer<State>>; renderers?: never; tabs?: never }\n | { registry?: undefined; renderers?: Record<string, PaneRenderer<State>>; tabs?: TabRegistry }\n );\n/** Omitted keys retain their value; explicit undefined restores the default. */\nexport type LayoutOptionUpdates<State = unknown> = {\n [Key in keyof Omit<ResolvedLayoutOptions<State>, 'store'>]?:\n ResolvedLayoutOptions<State>[Key] | undefined;\n};\nexport type WorkspaceAction =\n | 'maximize'\n | 'addTab'\n | 'restoreClosedTab'\n | 'closeActiveTab'\n | 'closePane'\n | 'closeEmptyPane'\n | 'popout'\n | 'joinSiblingRegion'\n | 'splitLeft'\n | 'splitRight'\n | 'splitUp'\n | 'splitDown'\n | 'tabOrientationDefault'\n | 'tabOrientationHorizontal'\n | 'tabOrientationVertical'\n | 'tabDisplayDefault'\n | 'tabDisplayAutomatic'\n | 'tabDisplayCompact';\nexport interface ActionContext {\n groupId?: string;\n paneId?: string;\n}\nexport type ShortcutRegistration =\n | boolean\n | KeyBinding\n | readonly KeyBinding[]\n | {\n bindings: true | KeyBinding | readonly KeyBinding[];\n handling?: 'quilt' | 'external';\n };\nexport interface RegisteredShortcut {\n readonly action: WorkspaceAction;\n readonly bindings: readonly Readonly<KeyBinding>[];\n readonly handling: 'quilt' | 'external';\n}\nexport interface KeyBinding {\n key: string;\n ctrl?: boolean;\n alt?: boolean;\n shift?: boolean;\n meta?: boolean;\n}\nexport interface CloseRequest {\n panes: readonly Pane[];\n requiringConfirmation: readonly Pane[];\n groupId?: string;\n signal: AbortSignal;\n}\nexport interface MountedLayout<State = unknown> {\n readonly store: WorkspaceStore;\n canExecuteAction(action: WorkspaceAction, context?: ActionContext): boolean;\n executeAction(action: WorkspaceAction, context?: ActionContext): Promise<boolean>;\n getShortcuts(): readonly RegisteredShortcut[];\n updateOptions(options: LayoutOptionUpdates<State>): void;\n exportWorkspace(): WorkspacePreset;\n loadWorkspace(input: unknown): void;\n refreshTheme(): void;\n retryPane(id: string): void;\n requestClose(id: string, kind?: 'pane' | 'group'): Promise<boolean>;\n setTabBar(options: TabBarOptions): void;\n setTheme(theme: LayoutTheme): void;\n popout(paneId: string, placement?: WindowPlacement): Promise<boolean>;\n returnPane(paneId: string): void;\n dispose(): void;\n}\n"]}
|
package/dist/workspace-api.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { Pane, Group, WindowPlacement, AutoCollapse, Axis, CommandOptions,
|
|
|
2
2
|
import { PaneRegistry } from './registry.js';
|
|
3
3
|
import type { PaneRegistration } from './registry.js';
|
|
4
4
|
import type { LayoutTheme } from './theme.js';
|
|
5
|
-
import type { PaneRenderer, TabBarOptions, WorkspaceSettings } from './types.js';
|
|
5
|
+
import type { PaneRenderer, TabBarOptions, WorkspaceSettings, WorkspaceAction, ActionContext, RegisteredShortcut } from './types.js';
|
|
6
6
|
export type PaneType<T> = Omit<PaneRegistration<T>, 'type' | 'view'> & {
|
|
7
7
|
render: T;
|
|
8
8
|
};
|
|
@@ -48,7 +48,7 @@ export type WorkspaceOptionUpdates<State = unknown> = {
|
|
|
48
48
|
});
|
|
49
49
|
export interface WorkspaceChange {
|
|
50
50
|
action: string;
|
|
51
|
-
changes: readonly ('layout' | 'theme' | 'tabBar' | 'autoCollapse')[];
|
|
51
|
+
changes: readonly ('layout' | 'theme' | 'tabBar' | 'autoCollapse' | 'shortcuts')[];
|
|
52
52
|
}
|
|
53
53
|
export interface WorkspaceEvents {
|
|
54
54
|
change: WorkspaceChange;
|
|
@@ -76,6 +76,9 @@ export interface PaneHandle {
|
|
|
76
76
|
/** The mounted API. The model and its lifetime remain private to Quilt. */
|
|
77
77
|
export interface WorkspaceHandle<State = unknown> {
|
|
78
78
|
readonly isDisposed: boolean;
|
|
79
|
+
canExecuteAction(action: WorkspaceAction, context?: ActionContext): boolean;
|
|
80
|
+
executeAction(action: WorkspaceAction, context?: ActionContext): Promise<boolean>;
|
|
81
|
+
getShortcuts(): readonly RegisteredShortcut[];
|
|
79
82
|
/** Subscribe to configuration changes or errors. The returned function unsubscribes. */
|
|
80
83
|
on<K extends keyof WorkspaceEvents>(event: K, listener: (event: WorkspaceEvents[K]) => void): () => void;
|
|
81
84
|
/** Stable immutable arrangement snapshot, including live detached records. */
|
|
@@ -141,6 +144,9 @@ export declare class Workspace<State = unknown> implements WorkspaceHandle<State
|
|
|
141
144
|
reset(): void;
|
|
142
145
|
exportWorkspace(): import("./workspace.js").WorkspacePreset;
|
|
143
146
|
loadWorkspace(input: unknown): void;
|
|
147
|
+
canExecuteAction(action: WorkspaceAction, context?: ActionContext): boolean;
|
|
148
|
+
executeAction(action: WorkspaceAction, context?: ActionContext): Promise<boolean>;
|
|
149
|
+
getShortcuts(): readonly RegisteredShortcut[];
|
|
144
150
|
updateOptions(next: WorkspaceOptionUpdates<State>): void;
|
|
145
151
|
setTheme(theme: LayoutTheme): void;
|
|
146
152
|
setTabBar(tabBar: TabBarOptions): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-api.d.ts","sourceRoot":"","sources":["../src/workspace-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,IAAI,EACJ,KAAK,EACL,eAAe,EACf,YAAY,EACZ,IAAI,EACJ,cAAc,EACd,WAAW,EACX,UAAU,EACV,MAAM,EACP,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAIV,YAAY,EACZ,aAAa,EACb,iBAAiB,
|
|
1
|
+
{"version":3,"file":"workspace-api.d.ts","sourceRoot":"","sources":["../src/workspace-api.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace-api.js
CHANGED
|
@@ -146,6 +146,15 @@ export class Workspace {
|
|
|
146
146
|
}
|
|
147
147
|
this.#emit({ action: 'loadWorkspace', changes: ['layout', 'theme', 'tabBar', 'autoCollapse'] });
|
|
148
148
|
}
|
|
149
|
+
canExecuteAction(action, context) {
|
|
150
|
+
return !this.#disposed && this.#mounted.canExecuteAction(action, context);
|
|
151
|
+
}
|
|
152
|
+
executeAction(action, context) {
|
|
153
|
+
return this.#disposed ? Promise.resolve(false) : this.#mounted.executeAction(action, context);
|
|
154
|
+
}
|
|
155
|
+
getShortcuts() {
|
|
156
|
+
return this.#mounted.getShortcuts();
|
|
157
|
+
}
|
|
149
158
|
updateOptions(next) {
|
|
150
159
|
this.#alive();
|
|
151
160
|
if ('container' in next)
|
|
@@ -154,6 +163,8 @@ export class Workspace {
|
|
|
154
163
|
const adapted = this.#adapt(candidate);
|
|
155
164
|
const changes = [];
|
|
156
165
|
const before = this.exportWorkspace();
|
|
166
|
+
const beforeShortcuts = JSON.stringify(this.getShortcuts());
|
|
167
|
+
const beforeFormatter = this.#options.formatShortcut;
|
|
157
168
|
// Initial appearance is mount-only: only explicitly updated appearance keys apply.
|
|
158
169
|
if (!('theme' in next))
|
|
159
170
|
delete adapted.theme;
|
|
@@ -166,6 +177,9 @@ export class Workspace {
|
|
|
166
177
|
changes.push('theme');
|
|
167
178
|
if (JSON.stringify(before.tabBar) !== JSON.stringify(after.tabBar))
|
|
168
179
|
changes.push('tabBar');
|
|
180
|
+
if (beforeShortcuts !== JSON.stringify(this.getShortcuts()) ||
|
|
181
|
+
beforeFormatter !== candidate.formatShortcut)
|
|
182
|
+
changes.push('shortcuts');
|
|
169
183
|
if (changes.length)
|
|
170
184
|
this.#emit({ action: 'updateOptions', changes });
|
|
171
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-api.js","sourceRoot":"","sources":["../src/workspace-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { groups, findNode } from 'quilt-core';\nimport type {\n LayoutStore,\n Pane,\n Group,\n WindowPlacement,\n AutoCollapse,\n Axis,\n CommandOptions,\n JoinOptions,\n Capability,\n Layout,\n} from 'quilt-core';\nimport { mountLayout } from './renderer.js';\nimport { PaneRegistry, createPaneId } from './registry.js';\nimport type { PaneRegistration } from './registry.js';\nimport { dockLayout } from './workspace.js';\nimport type { LayoutTheme } from './theme.js';\nimport type {\n LayoutOptions,\n LayoutOptionUpdates,\n MountedLayout,\n PaneRenderer,\n TabBarOptions,\n WorkspaceSettings,\n} from './types.js';\n\nexport type PaneType<T> = Omit<PaneRegistration<T>, 'type' | 'view'> & { render: T };\nexport type PaneTypes<T> = Record<string, PaneType<T>>;\nexport type WorkspaceOptions<State = unknown> = WorkspaceSettings<State> &\n import('./types.js').InitialConfiguration & {\n container: HTMLElement;\n store?: never;\n } & (unknown extends State ? {} : { getPaneState: (paneId: string) => State }) &\n (\n | {\n paneTypes: PaneTypes<PaneRenderer<State>>;\n registry?: never;\n renderers?: never;\n tabs?: never;\n }\n | {\n paneTypes?: undefined;\n registry: PaneRegistry<PaneRenderer<State>>;\n renderers?: never;\n tabs?: never;\n }\n | {\n paneTypes?: undefined;\n registry?: undefined;\n renderers?: Record<string, PaneRenderer<State>>;\n tabs?: import('./registry.js').TabRegistry;\n }\n );\nexport type WorkspaceOptionUpdates<State = unknown> = {\n [Key in keyof WorkspaceSettings<State>]?: WorkspaceSettings<State>[Key] | undefined;\n} & (\n | {\n paneTypes?: PaneTypes<PaneRenderer<State>> | undefined;\n registry?: undefined;\n renderers?: undefined;\n tabs?: undefined;\n }\n | {\n paneTypes?: undefined;\n registry?: PaneRegistry<PaneRenderer<State>> | undefined;\n renderers?: undefined;\n tabs?: undefined;\n }\n | {\n paneTypes?: undefined;\n registry?: undefined;\n renderers?: Record<string, PaneRenderer<State>> | undefined;\n tabs?: import('./registry.js').TabRegistry | undefined;\n }\n);\nexport interface WorkspaceChange {\n action: string;\n changes: readonly ('layout' | 'theme' | 'tabBar' | 'autoCollapse')[];\n}\nexport interface WorkspaceEvents {\n change: WorkspaceChange;\n error: unknown;\n}\nexport type AddPaneOptions = Partial<Omit<Pane, 'type'>> & { groupId?: string };\nexport interface CloseOptions {\n force?: boolean;\n}\nexport interface PaneHandle {\n readonly id: string;\n readonly isDisposed: boolean;\n getSnapshot(): Pane;\n update(patch: Partial<Omit<Pane, 'id'>>): void;\n setTitle(title: string): void;\n activate(): void;\n move(\n groupId: string,\n position?: 'tab' | 'left' | 'right' | 'top' | 'bottom',\n index?: number,\n ): void;\n popout(placement?: WindowPlacement): Promise<boolean>;\n return(): void;\n retry(): void;\n close(options?: CloseOptions): Promise<boolean>;\n}\n/** The mounted API. The model and its lifetime remain private to Quilt. */\nexport interface WorkspaceHandle<State = unknown> {\n readonly isDisposed: boolean;\n /** Subscribe to configuration changes or errors. The returned function unsubscribes. */\n on<K extends keyof WorkspaceEvents>(\n event: K,\n listener: (event: WorkspaceEvents[K]) => void,\n ): () => void;\n /** Stable immutable arrangement snapshot, including live detached records. */\n getLayout(): Layout;\n /** Mutable arrangement copy. Use exportWorkspace for persistence with appearance. */\n exportLayout(): Layout;\n /** Validate and replace the arrangement; detached records restore docked. Invalidates old pane handles on success. */\n loadLayout(input: unknown): void;\n /** Restore the initial arrangement and appearance. */\n reset(): void;\n exportWorkspace(): import('./workspace.js').WorkspacePreset;\n /** Apply a complete preset atomically; emit one consolidated change event. */\n loadWorkspace(input: unknown): void;\n updateOptions(options: WorkspaceOptionUpdates<State>): void;\n setTheme(theme: LayoutTheme): void;\n setTabBar(tabBar: TabBarOptions): void;\n refreshTheme(): void;\n getAutoCollapse(): AutoCollapse;\n setAutoCollapse(mode: AutoCollapse): void;\n getPane(id: string): PaneHandle | undefined;\n getPanes(): PaneHandle[];\n /** Create from a registered type; undefined means its factory cancelled. */\n addPane(type: string, options?: AddPaneOptions): PaneHandle | undefined;\n insertPane(pane: Pane, groupId: string, options?: CommandOptions): void;\n updatePane(pane: Pane): void;\n activatePane(id: string): void;\n movePane(\n paneId: string,\n groupId: string,\n position?: 'tab' | 'left' | 'right' | 'top' | 'bottom',\n index?: number,\n options?: CommandOptions,\n ): void;\n splitGroup(\n groupId: string,\n axis: Axis,\n pane?: Pane | null,\n options?: CommandOptions & { before?: boolean; ratio?: number },\n ): string;\n removeEmptyGroup(groupId: string): void;\n joinGroup(groupId: string, options?: CommandOptions): void;\n joinGroups(receiverId: string, otherId: string, options?: JoinOptions): void;\n resize(splitId: string, ratio: number, options?: CommandOptions): void;\n resizeMany(ratios: Record<string, number>, options?: CommandOptions): void;\n maximize(groupId: string | null): void;\n setTabDisplay(groupId: string, display: Group['tabDisplay']): void;\n setTabPlacement(groupId: string, placement: Group['tabPlacement']): void;\n can(paneId: string, capability: Capability): boolean;\n canRestoreClosedPane(): boolean;\n restoreClosedPane(): void;\n /** Confirm and check permissions unless force is explicitly supplied. */\n closePane(id: string, options?: CloseOptions): Promise<boolean>;\n closeGroup(id: string, options?: CloseOptions): Promise<boolean>;\n /** Call during a user gesture. Resolves after destination readiness or rollback. */\n popout(id: string, placement?: WindowPlacement): Promise<boolean>;\n returnPane(id: string): void;\n retryPane(id: string): void;\n /** Idempotently cancel pending work and release views, companions, and the private model. */\n dispose(): void;\n}\n\ntype InternalOptions<State> = LayoutOptionUpdates<State> & {\n paneTypes?: PaneTypes<PaneRenderer<State>> | undefined;\n};\n\n/** A mounted workspace. Call dispose once when its application container is removed. */\nexport class Workspace<State = unknown> implements WorkspaceHandle<State> {\n #mounted: MountedLayout<State>;\n #disposed = false;\n #handles = new Map<string, PaneHandle>();\n #listeners = {\n change: new Set<(event: WorkspaceChange) => void>(),\n error: new Set<(event: unknown) => void>(),\n };\n #cleanups: (() => void)[] = [];\n #options: InternalOptions<State>;\n #activeGroup: string | undefined;\n #batch = false;\n #initial: ReturnType<MountedLayout['exportWorkspace']>;\n constructor(options: WorkspaceOptions<State>) {\n if (!options?.container?.ownerDocument?.defaultView)\n throw new Error('Workspace requires a container in a live document');\n const { container, ...input } = options;\n const { initialLayout: _layout, initialWorkspace: _workspace, ...updates } = input;\n this.#options = { ...updates };\n const adapted = this.#adapt(this.#options);\n this.#mounted = mountLayout(container, {\n ...input,\n ...adapted,\n onError: this.#report,\n } as unknown as LayoutOptions<State>);\n this.#initial = this.#mounted.exportWorkspace();\n this.#cleanups.push(\n this.#model.subscribe((event) => {\n if (event.action === 'load') {\n this.#handles.clear();\n this.#activeGroup = undefined;\n } else\n for (const id of this.#handles.keys())\n if (!Object.hasOwn(event.layout.panes, id)) this.#handles.delete(id);\n if (!this.#batch) this.#emit({ action: event.action, changes: ['layout'] });\n }),\n this.#model.onError(this.#report),\n );\n const activate = (event: Event) => {\n const target = event.target as Element | null;\n const id = target?.closest?.('[data-node-id]')?.getAttribute('data-node-id');\n if (id && findNode(this.getLayout().root, id)?.kind === 'group') this.#activeGroup = id;\n };\n container.addEventListener('pointerdown', activate);\n container.addEventListener('focusin', activate);\n this.#cleanups.push(\n () => container.removeEventListener('pointerdown', activate),\n () => container.removeEventListener('focusin', activate),\n );\n }\n get #model(): LayoutStore {\n return this.#mounted.store as LayoutStore;\n }\n #alive() {\n if (this.#disposed) throw new Error('Workspace has been disposed');\n }\n #report = (error: unknown) => {\n try {\n this.#options.onError?.(error);\n } catch {\n /* Reporting must not interrupt cleanup. */\n }\n for (const listener of [...this.#listeners.error]) {\n if (!this.#listeners.error.has(listener)) continue;\n try {\n listener(error);\n } catch {\n /* Isolate reporters. */\n }\n }\n };\n #emit(event: WorkspaceChange) {\n for (const listener of [...this.#listeners.change]) {\n if (!this.#listeners.change.has(listener)) continue;\n try {\n listener(event);\n } catch (error) {\n this.#report(error);\n }\n }\n }\n #adapt(options: InternalOptions<State>): LayoutOptionUpdates<State> {\n const { paneTypes, ...rest } = options;\n if (paneTypes !== undefined) {\n if (rest.registry || rest.renderers || rest.tabs)\n throw new Error('paneTypes cannot be combined with registry, renderers, or tabs');\n return {\n ...rest,\n registry: new PaneRegistry(\n Object.entries(paneTypes).map(([type, { render, ...entry }]) => ({\n ...entry,\n type,\n view: render,\n })),\n ),\n };\n }\n return { ...rest, registry: rest.registry };\n }\n get isDisposed() {\n return this.#disposed;\n }\n on<K extends keyof WorkspaceEvents>(\n event: K,\n listener: (event: WorkspaceEvents[K]) => void,\n ): () => void {\n this.#alive();\n const listeners = this.#listeners[event] as Set<(event: WorkspaceEvents[K]) => void>;\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n /** Stable immutable layout snapshot. */\n getLayout = () => {\n this.#alive();\n return this.#model.getSnapshot();\n };\n exportLayout() {\n this.#alive();\n return this.#model.export();\n }\n loadLayout(input: unknown) {\n this.#alive();\n this.#model.load(dockLayout(input));\n }\n reset() {\n this.loadWorkspace(this.#initial);\n }\n exportWorkspace() {\n this.#alive();\n return this.#mounted.exportWorkspace();\n }\n loadWorkspace(input: unknown) {\n this.#alive();\n this.#batch = true;\n try {\n this.#mounted.loadWorkspace(input);\n } finally {\n this.#batch = false;\n }\n this.#emit({ action: 'loadWorkspace', changes: ['layout', 'theme', 'tabBar', 'autoCollapse'] });\n }\n updateOptions(next: WorkspaceOptionUpdates<State>) {\n this.#alive();\n if ('container' in next) throw new Error('Workspace container cannot be updated');\n const candidate = { ...this.#options, ...next };\n const adapted = this.#adapt(candidate);\n const changes: WorkspaceChange['changes'][number][] = [];\n const before = this.exportWorkspace();\n // Initial appearance is mount-only: only explicitly updated appearance keys apply.\n if (!('theme' in next)) delete adapted.theme;\n if (!('tabBar' in next)) delete adapted.tabBar;\n this.#mounted.updateOptions({ ...adapted, onError: this.#report });\n this.#options = candidate;\n const after = this.exportWorkspace();\n if (JSON.stringify(before.theme) !== JSON.stringify(after.theme)) changes.push('theme');\n if (JSON.stringify(before.tabBar) !== JSON.stringify(after.tabBar)) changes.push('tabBar');\n if (changes.length) this.#emit({ action: 'updateOptions', changes });\n }\n setTheme(theme: LayoutTheme) {\n this.updateOptions({ theme });\n }\n setTabBar(tabBar: TabBarOptions) {\n this.updateOptions({ tabBar });\n }\n refreshTheme() {\n this.#alive();\n this.#mounted.refreshTheme();\n }\n getAutoCollapse() {\n this.#alive();\n return this.#model.getAutoCollapse();\n }\n setAutoCollapse(mode: AutoCollapse) {\n this.#alive();\n const previous = this.#model.getAutoCollapse();\n this.#model.setAutoCollapse(mode);\n if (mode !== previous) this.#emit({ action: 'setAutoCollapse', changes: ['autoCollapse'] });\n }\n getPane(id: string): PaneHandle | undefined {\n this.#alive();\n if (!Object.hasOwn(this.getLayout().panes, id)) return undefined;\n let handle = this.#handles.get(id);\n if (handle) return handle;\n const workspace = this;\n const alive = () => {\n workspace.#alive();\n if (workspace.#handles.get(id) !== handle) throw new Error(`Pane ${id} has been disposed`);\n };\n handle = {\n id,\n get isDisposed() {\n return workspace.#disposed || workspace.#handles.get(id) !== handle;\n },\n getSnapshot() {\n alive();\n return workspace.getLayout().panes[id]!;\n },\n update(patch) {\n alive();\n workspace.updatePane({ ...workspace.getLayout().panes[id]!, ...patch, id });\n },\n setTitle(title) {\n this.update({ title });\n },\n activate() {\n alive();\n workspace.activatePane(id);\n },\n move(groupId, position, index) {\n alive();\n workspace.movePane(id, groupId, position, index);\n },\n async popout(placement) {\n alive();\n return workspace.popout(id, placement);\n },\n return() {\n alive();\n workspace.returnPane(id);\n },\n retry() {\n alive();\n workspace.retryPane(id);\n },\n async close(options) {\n alive();\n return workspace.closePane(id, options);\n },\n };\n Object.freeze(handle);\n this.#handles.set(id, handle);\n return handle;\n }\n getPanes(): PaneHandle[] {\n return Object.keys(this.getLayout().panes).map((id) => this.getPane(id)!);\n }\n addPane(type: string, options: AddPaneOptions = {}): PaneHandle | undefined {\n this.#alive();\n const layout = this.getLayout();\n const all = groups(layout.root);\n const groupId =\n options.groupId ?? all.find((group) => group.id === this.#activeGroup)?.id ?? all[0]!.id;\n const group = all.find((group) => group.id === groupId);\n if (!group) throw new Error(`Group not found: ${groupId}`);\n const registry = this.#adapt(this.#options).registry;\n const entry = registry?.list().find((entry) => entry.type === type);\n if (!entry) throw new Error(`Pane type is not registered: ${type}`);\n const supplied = entry.create\n ? entry.create({ groupId, source: group.active ? layout.panes[group.active] : undefined })\n : {};\n if (supplied === undefined) return undefined;\n const { groupId: _groupId, ...patch } = options;\n const pane = {\n title: entry.title,\n ...(entry.icon === undefined ? {} : { icon: entry.icon }),\n ...supplied,\n ...patch,\n type,\n id: patch.id ?? supplied.id ?? createPaneId(),\n };\n this.insertPane(pane, groupId);\n return this.getPane(pane.id);\n }\n /** Insert a fully specified serializable record (advanced model integration). */\n insertPane(pane: Pane, groupId: string, options: CommandOptions = {}) {\n this.#alive();\n this.#model.add(pane, groupId, options);\n }\n updatePane(pane: Pane) {\n this.#alive();\n this.#model.updatePane(pane);\n }\n activatePane(id: string) {\n const group = groups(this.getLayout().root).find((group) => group.panes.includes(id));\n if (!group) throw new Error(`Pane is not docked: ${id}`);\n this.#activeGroup = group.id;\n this.#model.activate(group.id, id);\n }\n movePane(\n paneId: string,\n groupId: string,\n position: 'tab' | 'left' | 'right' | 'top' | 'bottom' = 'tab',\n index?: number,\n options: CommandOptions = {},\n ) {\n this.#alive();\n this.#model.move(paneId, groupId, position, index, options);\n }\n splitGroup(\n groupId: string,\n axis: Axis,\n pane: Pane | null = null,\n options: CommandOptions & { before?: boolean; ratio?: number } = {},\n ) {\n this.#alive();\n return this.#model.split(groupId, axis, pane, options);\n }\n removeEmptyGroup(groupId: string) {\n this.#alive();\n this.#model.removeEmptyGroup(groupId);\n }\n joinGroup(groupId: string, options: CommandOptions = {}) {\n this.#alive();\n this.#model.join(groupId, options);\n }\n joinGroups(receiverId: string, otherId: string, options: JoinOptions = {}) {\n this.#alive();\n this.#model.joinRegions(receiverId, otherId, options);\n }\n resize(splitId: string, ratio: number, options: CommandOptions = {}) {\n this.#alive();\n this.#model.resize(splitId, ratio, options);\n }\n resizeMany(ratios: Record<string, number>, options: CommandOptions = {}) {\n this.#alive();\n this.#model.resizeMany(ratios, options);\n }\n maximize(groupId: string | null) {\n this.#alive();\n this.#model.maximize(groupId);\n }\n setTabDisplay(groupId: string, display: Group['tabDisplay']) {\n this.#alive();\n this.#model.setTabDisplay(groupId, display);\n }\n setTabPlacement(groupId: string, placement: Group['tabPlacement']) {\n this.#alive();\n this.#model.setTabPlacement(groupId, placement);\n }\n can(paneId: string, capability: Capability) {\n this.#alive();\n return this.#model.can(paneId, capability);\n }\n canRestoreClosedPane() {\n this.#alive();\n return this.#model.canRestoreClosedTab();\n }\n restoreClosedPane() {\n this.#alive();\n this.#model.restoreClosedTab();\n }\n async closePane(id: string, options: CloseOptions = {}): Promise<boolean> {\n this.#alive();\n if (options.force) {\n this.#model.close(id);\n return true;\n }\n return this.#mounted.requestClose(id);\n }\n async closeGroup(id: string, options: CloseOptions = {}): Promise<boolean> {\n this.#alive();\n if (options.force) {\n this.#model.closeGroup(id);\n return true;\n }\n return this.#mounted.requestClose(id, 'group');\n }\n async popout(id: string, placement?: WindowPlacement): Promise<boolean> {\n this.#alive();\n return this.#mounted.popout(id, placement);\n }\n returnPane(id: string) {\n this.#alive();\n this.#mounted.returnPane(id);\n }\n retryPane(id: string) {\n this.#alive();\n this.#mounted.retryPane(id);\n }\n dispose() {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#handles.clear();\n for (const cleanup of this.#cleanups.splice(0)) cleanup();\n try {\n this.#mounted.dispose();\n } finally {\n this.#listeners.change.clear();\n this.#listeners.error.clear();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workspace-api.js","sourceRoot":"","sources":["../src/workspace-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { groups, findNode } from 'quilt-core';\nimport type {\n LayoutStore,\n Pane,\n Group,\n WindowPlacement,\n AutoCollapse,\n Axis,\n CommandOptions,\n JoinOptions,\n Capability,\n Layout,\n} from 'quilt-core';\nimport { mountLayout } from './renderer.js';\nimport { PaneRegistry, createPaneId } from './registry.js';\nimport type { PaneRegistration } from './registry.js';\nimport { dockLayout } from './workspace.js';\nimport type { LayoutTheme } from './theme.js';\nimport type {\n LayoutOptions,\n LayoutOptionUpdates,\n MountedLayout,\n PaneRenderer,\n TabBarOptions,\n WorkspaceSettings,\n WorkspaceAction,\n ActionContext,\n RegisteredShortcut,\n} from './types.js';\n\nexport type PaneType<T> = Omit<PaneRegistration<T>, 'type' | 'view'> & { render: T };\nexport type PaneTypes<T> = Record<string, PaneType<T>>;\nexport type WorkspaceOptions<State = unknown> = WorkspaceSettings<State> &\n import('./types.js').InitialConfiguration & {\n container: HTMLElement;\n store?: never;\n } & (unknown extends State ? {} : { getPaneState: (paneId: string) => State }) &\n (\n | {\n paneTypes: PaneTypes<PaneRenderer<State>>;\n registry?: never;\n renderers?: never;\n tabs?: never;\n }\n | {\n paneTypes?: undefined;\n registry: PaneRegistry<PaneRenderer<State>>;\n renderers?: never;\n tabs?: never;\n }\n | {\n paneTypes?: undefined;\n registry?: undefined;\n renderers?: Record<string, PaneRenderer<State>>;\n tabs?: import('./registry.js').TabRegistry;\n }\n );\nexport type WorkspaceOptionUpdates<State = unknown> = {\n [Key in keyof WorkspaceSettings<State>]?: WorkspaceSettings<State>[Key] | undefined;\n} & (\n | {\n paneTypes?: PaneTypes<PaneRenderer<State>> | undefined;\n registry?: undefined;\n renderers?: undefined;\n tabs?: undefined;\n }\n | {\n paneTypes?: undefined;\n registry?: PaneRegistry<PaneRenderer<State>> | undefined;\n renderers?: undefined;\n tabs?: undefined;\n }\n | {\n paneTypes?: undefined;\n registry?: undefined;\n renderers?: Record<string, PaneRenderer<State>> | undefined;\n tabs?: import('./registry.js').TabRegistry | undefined;\n }\n);\nexport interface WorkspaceChange {\n action: string;\n changes: readonly ('layout' | 'theme' | 'tabBar' | 'autoCollapse' | 'shortcuts')[];\n}\nexport interface WorkspaceEvents {\n change: WorkspaceChange;\n error: unknown;\n}\nexport type AddPaneOptions = Partial<Omit<Pane, 'type'>> & { groupId?: string };\nexport interface CloseOptions {\n force?: boolean;\n}\nexport interface PaneHandle {\n readonly id: string;\n readonly isDisposed: boolean;\n getSnapshot(): Pane;\n update(patch: Partial<Omit<Pane, 'id'>>): void;\n setTitle(title: string): void;\n activate(): void;\n move(\n groupId: string,\n position?: 'tab' | 'left' | 'right' | 'top' | 'bottom',\n index?: number,\n ): void;\n popout(placement?: WindowPlacement): Promise<boolean>;\n return(): void;\n retry(): void;\n close(options?: CloseOptions): Promise<boolean>;\n}\n/** The mounted API. The model and its lifetime remain private to Quilt. */\nexport interface WorkspaceHandle<State = unknown> {\n readonly isDisposed: boolean;\n canExecuteAction(action: WorkspaceAction, context?: ActionContext): boolean;\n executeAction(action: WorkspaceAction, context?: ActionContext): Promise<boolean>;\n getShortcuts(): readonly RegisteredShortcut[];\n /** Subscribe to configuration changes or errors. The returned function unsubscribes. */\n on<K extends keyof WorkspaceEvents>(\n event: K,\n listener: (event: WorkspaceEvents[K]) => void,\n ): () => void;\n /** Stable immutable arrangement snapshot, including live detached records. */\n getLayout(): Layout;\n /** Mutable arrangement copy. Use exportWorkspace for persistence with appearance. */\n exportLayout(): Layout;\n /** Validate and replace the arrangement; detached records restore docked. Invalidates old pane handles on success. */\n loadLayout(input: unknown): void;\n /** Restore the initial arrangement and appearance. */\n reset(): void;\n exportWorkspace(): import('./workspace.js').WorkspacePreset;\n /** Apply a complete preset atomically; emit one consolidated change event. */\n loadWorkspace(input: unknown): void;\n updateOptions(options: WorkspaceOptionUpdates<State>): void;\n setTheme(theme: LayoutTheme): void;\n setTabBar(tabBar: TabBarOptions): void;\n refreshTheme(): void;\n getAutoCollapse(): AutoCollapse;\n setAutoCollapse(mode: AutoCollapse): void;\n getPane(id: string): PaneHandle | undefined;\n getPanes(): PaneHandle[];\n /** Create from a registered type; undefined means its factory cancelled. */\n addPane(type: string, options?: AddPaneOptions): PaneHandle | undefined;\n insertPane(pane: Pane, groupId: string, options?: CommandOptions): void;\n updatePane(pane: Pane): void;\n activatePane(id: string): void;\n movePane(\n paneId: string,\n groupId: string,\n position?: 'tab' | 'left' | 'right' | 'top' | 'bottom',\n index?: number,\n options?: CommandOptions,\n ): void;\n splitGroup(\n groupId: string,\n axis: Axis,\n pane?: Pane | null,\n options?: CommandOptions & { before?: boolean; ratio?: number },\n ): string;\n removeEmptyGroup(groupId: string): void;\n joinGroup(groupId: string, options?: CommandOptions): void;\n joinGroups(receiverId: string, otherId: string, options?: JoinOptions): void;\n resize(splitId: string, ratio: number, options?: CommandOptions): void;\n resizeMany(ratios: Record<string, number>, options?: CommandOptions): void;\n maximize(groupId: string | null): void;\n setTabDisplay(groupId: string, display: Group['tabDisplay']): void;\n setTabPlacement(groupId: string, placement: Group['tabPlacement']): void;\n can(paneId: string, capability: Capability): boolean;\n canRestoreClosedPane(): boolean;\n restoreClosedPane(): void;\n /** Confirm and check permissions unless force is explicitly supplied. */\n closePane(id: string, options?: CloseOptions): Promise<boolean>;\n closeGroup(id: string, options?: CloseOptions): Promise<boolean>;\n /** Call during a user gesture. Resolves after destination readiness or rollback. */\n popout(id: string, placement?: WindowPlacement): Promise<boolean>;\n returnPane(id: string): void;\n retryPane(id: string): void;\n /** Idempotently cancel pending work and release views, companions, and the private model. */\n dispose(): void;\n}\n\ntype InternalOptions<State> = LayoutOptionUpdates<State> & {\n paneTypes?: PaneTypes<PaneRenderer<State>> | undefined;\n};\n\n/** A mounted workspace. Call dispose once when its application container is removed. */\nexport class Workspace<State = unknown> implements WorkspaceHandle<State> {\n #mounted: MountedLayout<State>;\n #disposed = false;\n #handles = new Map<string, PaneHandle>();\n #listeners = {\n change: new Set<(event: WorkspaceChange) => void>(),\n error: new Set<(event: unknown) => void>(),\n };\n #cleanups: (() => void)[] = [];\n #options: InternalOptions<State>;\n #activeGroup: string | undefined;\n #batch = false;\n #initial: ReturnType<MountedLayout['exportWorkspace']>;\n constructor(options: WorkspaceOptions<State>) {\n if (!options?.container?.ownerDocument?.defaultView)\n throw new Error('Workspace requires a container in a live document');\n const { container, ...input } = options;\n const { initialLayout: _layout, initialWorkspace: _workspace, ...updates } = input;\n this.#options = { ...updates };\n const adapted = this.#adapt(this.#options);\n this.#mounted = mountLayout(container, {\n ...input,\n ...adapted,\n onError: this.#report,\n } as unknown as LayoutOptions<State>);\n this.#initial = this.#mounted.exportWorkspace();\n this.#cleanups.push(\n this.#model.subscribe((event) => {\n if (event.action === 'load') {\n this.#handles.clear();\n this.#activeGroup = undefined;\n } else\n for (const id of this.#handles.keys())\n if (!Object.hasOwn(event.layout.panes, id)) this.#handles.delete(id);\n if (!this.#batch) this.#emit({ action: event.action, changes: ['layout'] });\n }),\n this.#model.onError(this.#report),\n );\n const activate = (event: Event) => {\n const target = event.target as Element | null;\n const id = target?.closest?.('[data-node-id]')?.getAttribute('data-node-id');\n if (id && findNode(this.getLayout().root, id)?.kind === 'group') this.#activeGroup = id;\n };\n container.addEventListener('pointerdown', activate);\n container.addEventListener('focusin', activate);\n this.#cleanups.push(\n () => container.removeEventListener('pointerdown', activate),\n () => container.removeEventListener('focusin', activate),\n );\n }\n get #model(): LayoutStore {\n return this.#mounted.store as LayoutStore;\n }\n #alive() {\n if (this.#disposed) throw new Error('Workspace has been disposed');\n }\n #report = (error: unknown) => {\n try {\n this.#options.onError?.(error);\n } catch {\n /* Reporting must not interrupt cleanup. */\n }\n for (const listener of [...this.#listeners.error]) {\n if (!this.#listeners.error.has(listener)) continue;\n try {\n listener(error);\n } catch {\n /* Isolate reporters. */\n }\n }\n };\n #emit(event: WorkspaceChange) {\n for (const listener of [...this.#listeners.change]) {\n if (!this.#listeners.change.has(listener)) continue;\n try {\n listener(event);\n } catch (error) {\n this.#report(error);\n }\n }\n }\n #adapt(options: InternalOptions<State>): LayoutOptionUpdates<State> {\n const { paneTypes, ...rest } = options;\n if (paneTypes !== undefined) {\n if (rest.registry || rest.renderers || rest.tabs)\n throw new Error('paneTypes cannot be combined with registry, renderers, or tabs');\n return {\n ...rest,\n registry: new PaneRegistry(\n Object.entries(paneTypes).map(([type, { render, ...entry }]) => ({\n ...entry,\n type,\n view: render,\n })),\n ),\n };\n }\n return { ...rest, registry: rest.registry };\n }\n get isDisposed() {\n return this.#disposed;\n }\n on<K extends keyof WorkspaceEvents>(\n event: K,\n listener: (event: WorkspaceEvents[K]) => void,\n ): () => void {\n this.#alive();\n const listeners = this.#listeners[event] as Set<(event: WorkspaceEvents[K]) => void>;\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n /** Stable immutable layout snapshot. */\n getLayout = () => {\n this.#alive();\n return this.#model.getSnapshot();\n };\n exportLayout() {\n this.#alive();\n return this.#model.export();\n }\n loadLayout(input: unknown) {\n this.#alive();\n this.#model.load(dockLayout(input));\n }\n reset() {\n this.loadWorkspace(this.#initial);\n }\n exportWorkspace() {\n this.#alive();\n return this.#mounted.exportWorkspace();\n }\n loadWorkspace(input: unknown) {\n this.#alive();\n this.#batch = true;\n try {\n this.#mounted.loadWorkspace(input);\n } finally {\n this.#batch = false;\n }\n this.#emit({ action: 'loadWorkspace', changes: ['layout', 'theme', 'tabBar', 'autoCollapse'] });\n }\n canExecuteAction(action: WorkspaceAction, context?: ActionContext): boolean {\n return !this.#disposed && this.#mounted.canExecuteAction(action, context);\n }\n executeAction(action: WorkspaceAction, context?: ActionContext): Promise<boolean> {\n return this.#disposed ? Promise.resolve(false) : this.#mounted.executeAction(action, context);\n }\n getShortcuts(): readonly RegisteredShortcut[] {\n return this.#mounted.getShortcuts();\n }\n updateOptions(next: WorkspaceOptionUpdates<State>) {\n this.#alive();\n if ('container' in next) throw new Error('Workspace container cannot be updated');\n const candidate = { ...this.#options, ...next };\n const adapted = this.#adapt(candidate);\n const changes: WorkspaceChange['changes'][number][] = [];\n const before = this.exportWorkspace();\n const beforeShortcuts = JSON.stringify(this.getShortcuts());\n const beforeFormatter = this.#options.formatShortcut;\n // Initial appearance is mount-only: only explicitly updated appearance keys apply.\n if (!('theme' in next)) delete adapted.theme;\n if (!('tabBar' in next)) delete adapted.tabBar;\n this.#mounted.updateOptions({ ...adapted, onError: this.#report });\n this.#options = candidate;\n const after = this.exportWorkspace();\n if (JSON.stringify(before.theme) !== JSON.stringify(after.theme)) changes.push('theme');\n if (JSON.stringify(before.tabBar) !== JSON.stringify(after.tabBar)) changes.push('tabBar');\n if (\n beforeShortcuts !== JSON.stringify(this.getShortcuts()) ||\n beforeFormatter !== candidate.formatShortcut\n )\n changes.push('shortcuts');\n if (changes.length) this.#emit({ action: 'updateOptions', changes });\n }\n setTheme(theme: LayoutTheme) {\n this.updateOptions({ theme });\n }\n setTabBar(tabBar: TabBarOptions) {\n this.updateOptions({ tabBar });\n }\n refreshTheme() {\n this.#alive();\n this.#mounted.refreshTheme();\n }\n getAutoCollapse() {\n this.#alive();\n return this.#model.getAutoCollapse();\n }\n setAutoCollapse(mode: AutoCollapse) {\n this.#alive();\n const previous = this.#model.getAutoCollapse();\n this.#model.setAutoCollapse(mode);\n if (mode !== previous) this.#emit({ action: 'setAutoCollapse', changes: ['autoCollapse'] });\n }\n getPane(id: string): PaneHandle | undefined {\n this.#alive();\n if (!Object.hasOwn(this.getLayout().panes, id)) return undefined;\n let handle = this.#handles.get(id);\n if (handle) return handle;\n const workspace = this;\n const alive = () => {\n workspace.#alive();\n if (workspace.#handles.get(id) !== handle) throw new Error(`Pane ${id} has been disposed`);\n };\n handle = {\n id,\n get isDisposed() {\n return workspace.#disposed || workspace.#handles.get(id) !== handle;\n },\n getSnapshot() {\n alive();\n return workspace.getLayout().panes[id]!;\n },\n update(patch) {\n alive();\n workspace.updatePane({ ...workspace.getLayout().panes[id]!, ...patch, id });\n },\n setTitle(title) {\n this.update({ title });\n },\n activate() {\n alive();\n workspace.activatePane(id);\n },\n move(groupId, position, index) {\n alive();\n workspace.movePane(id, groupId, position, index);\n },\n async popout(placement) {\n alive();\n return workspace.popout(id, placement);\n },\n return() {\n alive();\n workspace.returnPane(id);\n },\n retry() {\n alive();\n workspace.retryPane(id);\n },\n async close(options) {\n alive();\n return workspace.closePane(id, options);\n },\n };\n Object.freeze(handle);\n this.#handles.set(id, handle);\n return handle;\n }\n getPanes(): PaneHandle[] {\n return Object.keys(this.getLayout().panes).map((id) => this.getPane(id)!);\n }\n addPane(type: string, options: AddPaneOptions = {}): PaneHandle | undefined {\n this.#alive();\n const layout = this.getLayout();\n const all = groups(layout.root);\n const groupId =\n options.groupId ?? all.find((group) => group.id === this.#activeGroup)?.id ?? all[0]!.id;\n const group = all.find((group) => group.id === groupId);\n if (!group) throw new Error(`Group not found: ${groupId}`);\n const registry = this.#adapt(this.#options).registry;\n const entry = registry?.list().find((entry) => entry.type === type);\n if (!entry) throw new Error(`Pane type is not registered: ${type}`);\n const supplied = entry.create\n ? entry.create({ groupId, source: group.active ? layout.panes[group.active] : undefined })\n : {};\n if (supplied === undefined) return undefined;\n const { groupId: _groupId, ...patch } = options;\n const pane = {\n title: entry.title,\n ...(entry.icon === undefined ? {} : { icon: entry.icon }),\n ...supplied,\n ...patch,\n type,\n id: patch.id ?? supplied.id ?? createPaneId(),\n };\n this.insertPane(pane, groupId);\n return this.getPane(pane.id);\n }\n /** Insert a fully specified serializable record (advanced model integration). */\n insertPane(pane: Pane, groupId: string, options: CommandOptions = {}) {\n this.#alive();\n this.#model.add(pane, groupId, options);\n }\n updatePane(pane: Pane) {\n this.#alive();\n this.#model.updatePane(pane);\n }\n activatePane(id: string) {\n const group = groups(this.getLayout().root).find((group) => group.panes.includes(id));\n if (!group) throw new Error(`Pane is not docked: ${id}`);\n this.#activeGroup = group.id;\n this.#model.activate(group.id, id);\n }\n movePane(\n paneId: string,\n groupId: string,\n position: 'tab' | 'left' | 'right' | 'top' | 'bottom' = 'tab',\n index?: number,\n options: CommandOptions = {},\n ) {\n this.#alive();\n this.#model.move(paneId, groupId, position, index, options);\n }\n splitGroup(\n groupId: string,\n axis: Axis,\n pane: Pane | null = null,\n options: CommandOptions & { before?: boolean; ratio?: number } = {},\n ) {\n this.#alive();\n return this.#model.split(groupId, axis, pane, options);\n }\n removeEmptyGroup(groupId: string) {\n this.#alive();\n this.#model.removeEmptyGroup(groupId);\n }\n joinGroup(groupId: string, options: CommandOptions = {}) {\n this.#alive();\n this.#model.join(groupId, options);\n }\n joinGroups(receiverId: string, otherId: string, options: JoinOptions = {}) {\n this.#alive();\n this.#model.joinRegions(receiverId, otherId, options);\n }\n resize(splitId: string, ratio: number, options: CommandOptions = {}) {\n this.#alive();\n this.#model.resize(splitId, ratio, options);\n }\n resizeMany(ratios: Record<string, number>, options: CommandOptions = {}) {\n this.#alive();\n this.#model.resizeMany(ratios, options);\n }\n maximize(groupId: string | null) {\n this.#alive();\n this.#model.maximize(groupId);\n }\n setTabDisplay(groupId: string, display: Group['tabDisplay']) {\n this.#alive();\n this.#model.setTabDisplay(groupId, display);\n }\n setTabPlacement(groupId: string, placement: Group['tabPlacement']) {\n this.#alive();\n this.#model.setTabPlacement(groupId, placement);\n }\n can(paneId: string, capability: Capability) {\n this.#alive();\n return this.#model.can(paneId, capability);\n }\n canRestoreClosedPane() {\n this.#alive();\n return this.#model.canRestoreClosedTab();\n }\n restoreClosedPane() {\n this.#alive();\n this.#model.restoreClosedTab();\n }\n async closePane(id: string, options: CloseOptions = {}): Promise<boolean> {\n this.#alive();\n if (options.force) {\n this.#model.close(id);\n return true;\n }\n return this.#mounted.requestClose(id);\n }\n async closeGroup(id: string, options: CloseOptions = {}): Promise<boolean> {\n this.#alive();\n if (options.force) {\n this.#model.closeGroup(id);\n return true;\n }\n return this.#mounted.requestClose(id, 'group');\n }\n async popout(id: string, placement?: WindowPlacement): Promise<boolean> {\n this.#alive();\n return this.#mounted.popout(id, placement);\n }\n returnPane(id: string) {\n this.#alive();\n this.#mounted.returnPane(id);\n }\n retryPane(id: string) {\n this.#alive();\n this.#mounted.retryPane(id);\n }\n dispose() {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#handles.clear();\n for (const cleanup of this.#cleanups.splice(0)) cleanup();\n try {\n this.#mounted.dispose();\n } finally {\n this.#listeners.change.clear();\n this.#listeners.error.clear();\n }\n }\n}\n"]}
|