quilt-vanilla 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/action-icons.d.ts +12 -12
- package/dist/action-icons.d.ts.map +1 -1
- package/dist/action-icons.js.map +1 -1
- package/dist/close.d.ts +4 -0
- package/dist/close.d.ts.map +1 -0
- package/dist/close.js +95 -0
- package/dist/close.js.map +1 -0
- package/dist/corners.d.ts +2 -2
- package/dist/corners.d.ts.map +1 -1
- package/dist/corners.js +15 -7
- package/dist/corners.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lifetime.d.ts.map +1 -1
- package/dist/lifetime.js +1 -0
- package/dist/lifetime.js.map +1 -1
- package/dist/menu.d.ts +3 -3
- package/dist/menu.d.ts.map +1 -1
- package/dist/menu.js +93 -33
- package/dist/menu.js.map +1 -1
- package/dist/messages.d.ts +62 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +62 -0
- package/dist/messages.js.map +1 -0
- package/dist/panes.d.ts +2 -2
- package/dist/panes.d.ts.map +1 -1
- package/dist/panes.js +20 -4
- package/dist/panes.js.map +1 -1
- package/dist/picker.d.ts +2 -2
- package/dist/picker.d.ts.map +1 -1
- package/dist/picker.js +9 -6
- package/dist/picker.js.map +1 -1
- package/dist/registry.d.ts +21 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +61 -0
- package/dist/registry.js.map +1 -1
- package/dist/renderer.d.ts +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +169 -25
- package/dist/renderer.js.map +1 -1
- package/dist/shortcuts.d.ts +5 -3
- package/dist/shortcuts.d.ts.map +1 -1
- package/dist/shortcuts.js +57 -41
- package/dist/shortcuts.js.map +1 -1
- package/dist/styles.css +14 -23
- package/dist/styles.css.d.ts +2 -0
- package/dist/tab-bar.d.ts +2 -1
- package/dist/tab-bar.d.ts.map +1 -1
- package/dist/tab-bar.js +25 -4
- package/dist/tab-bar.js.map +1 -1
- package/dist/tab-tooltip.d.ts +2 -1
- package/dist/tab-tooltip.d.ts.map +1 -1
- package/dist/tab-tooltip.js +5 -2
- package/dist/tab-tooltip.js.map +1 -1
- package/dist/tabs.d.ts +3 -2
- package/dist/tabs.d.ts.map +1 -1
- package/dist/tabs.js +3 -2
- package/dist/tabs.js.map +1 -1
- package/dist/theme.d.ts +122 -119
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +31 -0
- package/dist/theme.js.map +1 -1
- package/dist/types.d.ts +58 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/windows.d.ts +8 -4
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +118 -23
- package/dist/windows.js.map +1 -1
- package/dist/workspace.d.ts +14 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +39 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +6 -3
- package/src/action-icons.ts +2 -2
- package/src/close.ts +120 -0
- package/src/corners.ts +28 -9
- package/src/index.ts +7 -0
- package/src/lifetime.ts +1 -0
- package/src/menu.ts +112 -39
- package/src/messages.ts +71 -0
- package/src/panes.ts +20 -6
- package/src/picker.ts +11 -8
- package/src/registry.ts +71 -0
- package/src/renderer.ts +205 -38
- package/src/shortcuts.ts +63 -54
- package/src/styles.css +14 -23
- package/src/styles.css.d.ts +2 -0
- package/src/tab-bar.ts +30 -5
- package/src/tab-tooltip.ts +6 -1
- package/src/tabs.ts +6 -4
- package/src/theme.ts +30 -0
- package/src/types.ts +57 -11
- package/src/windows.ts +127 -23
- package/src/workspace.ts +44 -0
package/dist/menu.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { message } from './messages.js';
|
|
1
2
|
import { actionIcon } from './action-icons.js';
|
|
2
3
|
import { fillTabPicker } from './picker.js';
|
|
3
4
|
import { findNode, findParent, groups, paneIds } from 'quilt-core';
|
|
4
5
|
import { el, Scope } from './lifetime.js';
|
|
5
|
-
export function createPaneMenu(root, options, windows, refresh, report) {
|
|
6
|
+
export function createPaneMenu(root, options, windows, refresh, report, requestClose) {
|
|
6
7
|
const doc = root.ownerDocument, win = doc.defaultView;
|
|
7
8
|
let current;
|
|
8
9
|
const persistentPickers = new Map();
|
|
@@ -33,7 +34,9 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
33
34
|
const dialog = el(doc, 'dialog', 'layouts-menu');
|
|
34
35
|
dialog.tabIndex = -1;
|
|
35
36
|
dialog.autofocus = true;
|
|
36
|
-
dialog.setAttribute('aria-label', pane && !groupActions
|
|
37
|
+
dialog.setAttribute('aria-label', pane && !groupActions
|
|
38
|
+
? message(options, '{title} actions', { title: pane.title })
|
|
39
|
+
: message(options, 'Empty pane actions'));
|
|
37
40
|
local.add(() => dialog.remove());
|
|
38
41
|
const add = (icon, label, enabled, fn) => {
|
|
39
42
|
const b = button(label, label, () => {
|
|
@@ -148,8 +151,10 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
148
151
|
create(direction === 'left' || direction === 'right' ? 'horizontal' : 'vertical', direction === 'left' || direction === 'top');
|
|
149
152
|
return;
|
|
150
153
|
}
|
|
151
|
-
add('add-tab', '+ Add tab', available && allowed('move'), () => create());
|
|
154
|
+
add('add-tab', message(options, '+ Add tab'), available && allowed('move'), () => create());
|
|
152
155
|
const canCreate = !group.panes.length || available;
|
|
156
|
+
const flyouts = [];
|
|
157
|
+
let positionMenus = () => { };
|
|
153
158
|
function submenu(label, icon, enabled = true) {
|
|
154
159
|
const container = el(doc, 'div', 'layouts-submenu');
|
|
155
160
|
const trigger = button(`${label} ▸`, label, () => setOpen(true));
|
|
@@ -164,9 +169,18 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
164
169
|
flyout.hidden = true;
|
|
165
170
|
flyout.setAttribute('role', 'menu');
|
|
166
171
|
flyout.setAttribute('aria-label', label);
|
|
172
|
+
flyouts.push({ trigger, flyout });
|
|
167
173
|
const setOpen = (open) => {
|
|
174
|
+
if (open) {
|
|
175
|
+
for (const other of flyouts) {
|
|
176
|
+
other.flyout.hidden = true;
|
|
177
|
+
other.trigger.setAttribute('aria-expanded', 'false');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
168
180
|
flyout.hidden = !open;
|
|
169
181
|
trigger.setAttribute('aria-expanded', String(open));
|
|
182
|
+
if (open)
|
|
183
|
+
positionMenus();
|
|
170
184
|
};
|
|
171
185
|
local.listen(container, 'pointerenter', () => {
|
|
172
186
|
if (!trigger.disabled)
|
|
@@ -187,18 +201,16 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
187
201
|
trigger.focus();
|
|
188
202
|
}
|
|
189
203
|
});
|
|
190
|
-
container.dataset.side =
|
|
191
|
-
anchor.getBoundingClientRect().right + 220 > win.innerWidth ? 'left' : 'right';
|
|
192
204
|
container.append(trigger, flyout);
|
|
193
205
|
dialog.append(container);
|
|
194
206
|
return flyout;
|
|
195
207
|
}
|
|
196
|
-
const flyout = submenu('Split', 'split-right', canCreate && allowed('split'));
|
|
208
|
+
const flyout = submenu(message(options, 'Split'), 'split-right', canCreate && allowed('split'));
|
|
197
209
|
for (const [label, axis, before] of [
|
|
198
|
-
['Split left', 'horizontal', true],
|
|
199
|
-
['Split right', 'horizontal', false],
|
|
200
|
-
['Split up', 'vertical', true],
|
|
201
|
-
['Split down', 'vertical', false],
|
|
210
|
+
[message(options, 'Split left'), 'horizontal', true],
|
|
211
|
+
[message(options, 'Split right'), 'horizontal', false],
|
|
212
|
+
[message(options, 'Split up'), 'vertical', true],
|
|
213
|
+
[message(options, 'Split down'), 'vertical', false],
|
|
202
214
|
]) {
|
|
203
215
|
const option = button(label, label, () => {
|
|
204
216
|
local.dispose();
|
|
@@ -212,7 +224,7 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
212
224
|
flyout.append(option);
|
|
213
225
|
}
|
|
214
226
|
const joinParent = findParent(options.store.getSnapshot().root, group.id);
|
|
215
|
-
const join = add('join', 'Join sibling region', Boolean(joinParent) && paneIds(joinParent).every((id) => options.store.can(id, 'join')), () => options.store.join(group.id, { source: 'user' }));
|
|
227
|
+
const join = add('join', message(options, 'Join sibling region'), Boolean(joinParent) && paneIds(joinParent).every((id) => options.store.can(id, 'join')), () => options.store.join(group.id, { source: 'user' }));
|
|
216
228
|
let preview;
|
|
217
229
|
const clearPreview = () => {
|
|
218
230
|
preview?.dispose();
|
|
@@ -231,7 +243,7 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
231
243
|
overlay.setAttribute('aria-hidden', 'true');
|
|
232
244
|
root.append(overlay);
|
|
233
245
|
scope.add(() => overlay.remove());
|
|
234
|
-
const targetTitle = layout.panes[group.active ?? '']?.title ?? 'This region';
|
|
246
|
+
const targetTitle = layout.panes[group.active ?? '']?.title ?? message(options, 'This region');
|
|
235
247
|
const regions = groups(parent).map((region) => ({
|
|
236
248
|
region,
|
|
237
249
|
element: Array.from(root.querySelectorAll('[data-node-id]')).find((element) => element.dataset.nodeId === region.id && element.closest('.layouts') === root),
|
|
@@ -250,7 +262,9 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
250
262
|
width: `${rect.width}px`,
|
|
251
263
|
height: `${rect.height}px`,
|
|
252
264
|
});
|
|
253
|
-
box.append(el(doc, 'span', 'layouts-corner-label', region.id === group.id
|
|
265
|
+
box.append(el(doc, 'span', 'layouts-corner-label', region.id === group.id
|
|
266
|
+
? message(options, '{target} keeps all tabs', { target: targetTitle })
|
|
267
|
+
: message(options, 'Joins {target}', { target: targetTitle })));
|
|
254
268
|
overlay.append(box);
|
|
255
269
|
}
|
|
256
270
|
};
|
|
@@ -268,18 +282,20 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
268
282
|
local.listen(join, 'pointerleave', clearPreview);
|
|
269
283
|
local.listen(join, 'focus', showPreview);
|
|
270
284
|
local.listen(join, 'blur', clearPreview);
|
|
271
|
-
add(options.store.getSnapshot().maximized === group.id ? 'restore' : 'maximize', options.store.getSnapshot().maximized === group.id
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
285
|
+
add(options.store.getSnapshot().maximized === group.id ? 'restore' : 'maximize', options.store.getSnapshot().maximized === group.id
|
|
286
|
+
? message(options, 'Restore region')
|
|
287
|
+
: message(options, 'Maximize region'), true, () => options.store.maximize(options.store.getSnapshot().maximized === group.id ? null : group.id));
|
|
288
|
+
if (group.panes.length && pane && options.popouts !== false) {
|
|
289
|
+
add('popout', message(options, 'Open in window'), options.store.can(pane.id, 'popout'), () => {
|
|
290
|
+
void windows.open(pane.id);
|
|
275
291
|
refresh();
|
|
276
292
|
});
|
|
277
293
|
}
|
|
278
|
-
const orientation = submenu('Tab orientation', 'tab-orientation');
|
|
294
|
+
const orientation = submenu(message(options, 'Tab orientation'), 'tab-orientation');
|
|
279
295
|
for (const [value, label] of [
|
|
280
|
-
[undefined, 'Workspace default'],
|
|
281
|
-
['top', 'Horizontal'],
|
|
282
|
-
['left', 'Vertical'],
|
|
296
|
+
[undefined, message(options, 'Workspace default')],
|
|
297
|
+
['top', message(options, 'Horizontal')],
|
|
298
|
+
['left', message(options, 'Vertical')],
|
|
283
299
|
]) {
|
|
284
300
|
const selected = group.tabPlacement === value;
|
|
285
301
|
const option = button(label, label, () => {
|
|
@@ -293,11 +309,11 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
293
309
|
option.prepend(mark);
|
|
294
310
|
orientation.append(option);
|
|
295
311
|
}
|
|
296
|
-
const display = submenu('Tab display', 'tab-orientation');
|
|
312
|
+
const display = submenu(message(options, 'Tab display'), 'tab-orientation');
|
|
297
313
|
for (const [value, label] of [
|
|
298
|
-
[undefined, 'Workspace default'],
|
|
299
|
-
['automatic', 'Automatic'],
|
|
300
|
-
['compact', 'Compact'],
|
|
314
|
+
[undefined, message(options, 'Workspace default')],
|
|
315
|
+
['automatic', message(options, 'Automatic')],
|
|
316
|
+
['compact', message(options, 'Compact')],
|
|
301
317
|
]) {
|
|
302
318
|
const selected = group.tabDisplay === value;
|
|
303
319
|
const option = button(label, label, () => {
|
|
@@ -312,18 +328,49 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
312
328
|
display.append(option);
|
|
313
329
|
}
|
|
314
330
|
if (group.panes.length && pane) {
|
|
315
|
-
add('close', 'Close active tab', options.store.can(pane.id, 'close'), () =>
|
|
316
|
-
add('close', 'Close pane', group.panes.every((id) => options.store.can(id, 'close')), () =>
|
|
331
|
+
add('close', message(options, 'Close active tab'), options.store.can(pane.id, 'close'), () => void requestClose(pane.id));
|
|
332
|
+
add('close', message(options, 'Close pane'), group.panes.every((id) => options.store.can(id, 'close')), () => void requestClose(group.id, 'group'));
|
|
317
333
|
}
|
|
318
334
|
else {
|
|
319
|
-
add('close', 'Close empty pane', options.store.getSnapshot().root.id !== group.id, () => options.store.removeEmptyGroup(group.id));
|
|
335
|
+
add('close', message(options, 'Close empty pane'), options.store.getSnapshot().root.id !== group.id, () => options.store.removeEmptyGroup(group.id));
|
|
320
336
|
}
|
|
321
|
-
add('restore', 'Restore closed tab', options.store.canRestoreClosedTab(), () => options.store.restoreClosedTab());
|
|
322
|
-
add('cancel', 'Cancel', true, () => { });
|
|
337
|
+
add('restore', message(options, 'Restore closed tab'), options.store.canRestoreClosedTab(), () => options.store.restoreClosedTab());
|
|
338
|
+
add('cancel', message(options, 'Cancel'), true, () => { });
|
|
323
339
|
root.append(dialog);
|
|
324
|
-
|
|
325
|
-
dialog
|
|
326
|
-
|
|
340
|
+
// Measure after opening: theme density, labels, and available actions change the size.
|
|
341
|
+
// Fixed flyouts escape the scrolling dialog while retaining its modal focus scope.
|
|
342
|
+
positionMenus = () => {
|
|
343
|
+
const viewport = win.visualViewport;
|
|
344
|
+
const left = (viewport?.offsetLeft ?? 0) + 8;
|
|
345
|
+
const top = (viewport?.offsetTop ?? 0) + 8;
|
|
346
|
+
const width = Math.max(0, (viewport?.width ?? doc.documentElement.clientWidth) - 16);
|
|
347
|
+
const height = Math.max(0, (viewport?.height ?? doc.documentElement.clientHeight) - 16);
|
|
348
|
+
const fit = (element) => {
|
|
349
|
+
element.style.maxWidth = `${width}px`;
|
|
350
|
+
element.style.maxHeight = `${height}px`;
|
|
351
|
+
};
|
|
352
|
+
const place = (element, x, y) => {
|
|
353
|
+
const bounds = element.getBoundingClientRect();
|
|
354
|
+
element.style.left = `${Math.max(left, Math.min(x, left + width - bounds.width))}px`;
|
|
355
|
+
element.style.top = `${Math.max(top, Math.min(y, top + height - bounds.height))}px`;
|
|
356
|
+
};
|
|
357
|
+
fit(dialog);
|
|
358
|
+
const rect = anchor.getBoundingClientRect();
|
|
359
|
+
const bounds = dialog.getBoundingClientRect();
|
|
360
|
+
const below = rect.bottom + 4;
|
|
361
|
+
const above = rect.top - bounds.height - 4;
|
|
362
|
+
place(dialog, rect.right - bounds.width, below + bounds.height <= top + height || above < top ? below : above);
|
|
363
|
+
for (const { trigger, flyout } of flyouts) {
|
|
364
|
+
if (flyout.hidden)
|
|
365
|
+
continue;
|
|
366
|
+
fit(flyout);
|
|
367
|
+
const row = trigger.getBoundingClientRect();
|
|
368
|
+
const menu = dialog.getBoundingClientRect();
|
|
369
|
+
const size = flyout.getBoundingClientRect();
|
|
370
|
+
const x = menu.right - 1 + size.width <= left + width ? menu.right - 1 : menu.left - size.width + 1;
|
|
371
|
+
place(flyout, x, row.top);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
327
374
|
local.listen(dialog, 'close', () => local.dispose());
|
|
328
375
|
local.listen(dialog, 'click', (event) => {
|
|
329
376
|
if (event.target === dialog) {
|
|
@@ -334,6 +381,19 @@ export function createPaneMenu(root, options, windows, refresh, report) {
|
|
|
334
381
|
}
|
|
335
382
|
});
|
|
336
383
|
dialog.showModal();
|
|
384
|
+
positionMenus();
|
|
385
|
+
const observer = new win.ResizeObserver(positionMenus);
|
|
386
|
+
observer.observe(dialog);
|
|
387
|
+
observer.observe(anchor);
|
|
388
|
+
for (const { flyout } of flyouts)
|
|
389
|
+
observer.observe(flyout);
|
|
390
|
+
local.add(() => observer.disconnect());
|
|
391
|
+
local.listen(win, 'resize', positionMenus);
|
|
392
|
+
local.listen(doc, 'scroll', positionMenus, { capture: true });
|
|
393
|
+
if (win.visualViewport) {
|
|
394
|
+
local.listen(win.visualViewport, 'resize', positionMenus);
|
|
395
|
+
local.listen(win.visualViewport, 'scroll', positionMenus);
|
|
396
|
+
}
|
|
337
397
|
dialog.focus({ preventScroll: true });
|
|
338
398
|
}
|
|
339
399
|
return {
|
package/dist/menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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","sourcesContent":["import { actionIcon } from './action-icons.js';\nimport type { ActionIcon } from './action-icons.js';\nimport { fillTabPicker } from './picker.js';\nimport { findNode, findParent, groups, paneIds } from 'quilt-core';\nimport type { Group, Pane } from 'quilt-core';\nimport type { LayoutOptions } from './types.js';\nimport type { Windows } from './windows.js';\nimport { el, Scope } from './lifetime.js';\nexport function createPaneMenu(\n root: HTMLElement,\n options: LayoutOptions,\n windows: Pick<Windows, 'pending' | 'open'>,\n refresh: () => void,\n report: (e: unknown) => void,\n) {\n const doc = root.ownerDocument,\n win = doc.defaultView!;\n let current: Scope | undefined;\n const persistentPickers = new Map<string, Scope>();\n const act = (fn: () => void) => {\n try {\n fn();\n } catch (error) {\n report(error);\n }\n };\n function button(text: string, title: string, action: () => void) {\n const b = el(doc, 'button', 'layouts-button', text);\n b.type = 'button';\n b.title = title;\n b.setAttribute('aria-label', title);\n b.onclick = () => act(action);\n return b;\n }\n function open(\n anchor: HTMLElement,\n pane: Pane | undefined,\n group: Group,\n direction?: 'left' | 'right' | 'top' | 'bottom',\n ratio = 0.5,\n groupActions = false,\n addTab = false,\n ) {\n current?.dispose();\n const latestGroup = findNode(options.store.getSnapshot().root, group.id);\n if (latestGroup?.kind !== 'group') return;\n group = latestGroup;\n const local = new Scope();\n current = local;\n const dialog = el(doc, 'dialog', 'layouts-menu');\n dialog.tabIndex = -1;\n dialog.autofocus = true;\n dialog.setAttribute(\n 'aria-label',\n pane && !groupActions ? `${pane.title} actions` : 'Empty pane actions',\n );\n local.add(() => dialog.remove());\n const add = (icon: ActionIcon, label: string, enabled: boolean, fn: () => void) => {\n const b = button(label, label, () => {\n local.dispose();\n act(fn);\n });\n const glyph = el(doc, 'span', 'layouts-tab-icon');\n glyph.setAttribute('aria-hidden', 'true');\n act(() => glyph.append(actionIcon(doc, icon, options)));\n b.replaceChildren(glyph, el(doc, 'span', '', label.replace(/^\\+ /, '')));\n b.disabled = !enabled;\n dialog.append(b);\n return b;\n };\n const allowed = (cap: 'split' | 'join' | 'move') =>\n group.panes.every((id) => options.store.can(id, cap));\n const available = Boolean(options.tabs?.list().length);\n const create = (axis?: 'horizontal' | 'vertical', before = false) => {\n if (!axis && !pane && !options.tabs) return;\n let destination = group;\n if (axis && (options.tabs || !pane)) {\n const id = options.store.split(group.id, axis, null, { source: 'user', before, ratio });\n destination = findNode(options.store.getSnapshot().root, id) as Group;\n refresh();\n if (!options.tabs) return;\n }\n const commit = (fresh: Pane) => options.store.add(fresh, destination.id, { source: 'user' });\n if (options.tabs) {\n if ((axis || !group.panes.length) && options.store.getAutoCollapse() === 'disabled') {\n if (persistentPickers.has(destination.id)) {\n const region = Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === destination.id,\n );\n region?.querySelector<HTMLInputElement>('.layouts-picker-search')?.focus();\n return;\n }\n const region = Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === destination.id,\n );\n if (!region) return;\n const pickerScope = new Scope();\n persistentPickers.set(destination.id, pickerScope);\n const picker = el(doc, 'div', 'layouts-menu layouts-picker layouts-picker-persistent');\n picker.setAttribute('role', 'dialog');\n region.append(picker);\n pickerScope.listen(\n doc,\n 'pointerdown',\n (event) => {\n if (!event.composedPath().includes(region)) pickerScope.dispose();\n },\n { capture: true },\n );\n pickerScope.add(() => {\n picker.remove();\n persistentPickers.delete(destination.id);\n });\n pickerScope.add(\n options.store.subscribe(() => {\n const group = findNode(options.store.getSnapshot().root, destination.id);\n if (group?.kind !== 'group' || group.panes.length) pickerScope.dispose();\n }),\n );\n fillTabPicker(picker, pickerScope, options, pane, destination, commit, report, true);\n return;\n }\n const pickerScope = new Scope();\n current = pickerScope;\n const picker = el(doc, 'dialog', 'layouts-menu layouts-picker');\n if (axis)\n pickerScope.add(() => {\n if (options.store.getAutoCollapse() !== 'disabled')\n options.store.removeEmptyGroup(destination.id);\n });\n pickerScope.add(() => picker.remove());\n pickerScope.listen(picker, 'close', () => pickerScope.dispose());\n root.append(picker);\n pickerScope.listen(picker, 'click', (event) => {\n const e = event as MouseEvent;\n const bounds = picker.getBoundingClientRect();\n if (\n e.target === picker &&\n (e.clientX < bounds.left ||\n e.clientX > bounds.right ||\n e.clientY < bounds.top ||\n e.clientY > bounds.bottom)\n )\n pickerScope.dispose();\n });\n picker.showModal();\n fillTabPicker(picker, pickerScope, options, pane, destination, commit, report);\n const region = Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === destination.id,\n );\n if (region) {\n const position = () => {\n const bounds = region.getBoundingClientRect();\n picker.style.width = `${Math.max(0, Math.min(340, bounds.width - 16))}px`;\n picker.style.maxHeight = `${Math.max(0, bounds.height - 16)}px`;\n picker.style.left = `${bounds.left + (bounds.width - picker.offsetWidth) / 2}px`;\n picker.style.top = `${bounds.top + (bounds.height - picker.offsetHeight) / 2}px`;\n };\n position();\n const observer = new ResizeObserver(position);\n observer.observe(region);\n observer.observe(picker);\n pickerScope.add(() => observer.disconnect());\n pickerScope.listen(win, 'resize', position);\n pickerScope.add(\n options.store.subscribe(() => {\n if (!findNode(options.store.getSnapshot().root, destination.id))\n pickerScope.dispose();\n }),\n );\n }\n }\n };\n if (addTab || (!direction && !group.panes.length && !groupActions)) {\n local.dispose();\n create();\n return;\n }\n if (direction) {\n local.dispose();\n create(\n direction === 'left' || direction === 'right' ? 'horizontal' : 'vertical',\n direction === 'left' || direction === 'top',\n );\n return;\n }\n add('add-tab', '+ Add tab', available && allowed('move'), () => create());\n const canCreate = !group.panes.length || available;\n function submenu(label: string, icon: ActionIcon, enabled = true) {\n const container = el(doc, 'div', 'layouts-submenu');\n const trigger = button(`${label} ▸`, label, () => setOpen(true));\n const glyph = el(doc, 'span', 'layouts-tab-icon');\n glyph.setAttribute('aria-hidden', 'true');\n glyph.append(actionIcon(doc, icon, options));\n trigger.prepend(glyph);\n trigger.disabled = !enabled;\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', 'false');\n const flyout = el(doc, 'div', 'layouts-submenu-content');\n flyout.hidden = true;\n flyout.setAttribute('role', 'menu');\n flyout.setAttribute('aria-label', label);\n const setOpen = (open: boolean) => {\n flyout.hidden = !open;\n trigger.setAttribute('aria-expanded', String(open));\n };\n local.listen(container, 'pointerenter', () => {\n if (!trigger.disabled) setOpen(true);\n });\n local.listen(container, 'pointerleave', () => setOpen(false));\n local.listen(trigger, 'keydown', (event) => {\n if ((event as KeyboardEvent).key === 'ArrowRight') {\n event.preventDefault();\n setOpen(true);\n (flyout.firstElementChild as HTMLElement)?.focus();\n }\n });\n local.listen(flyout, 'keydown', (event) => {\n if ((event as KeyboardEvent).key === 'ArrowLeft') {\n event.preventDefault();\n setOpen(false);\n trigger.focus();\n }\n });\n container.dataset.side =\n anchor.getBoundingClientRect().right + 220 > win.innerWidth ? 'left' : 'right';\n container.append(trigger, flyout);\n dialog.append(container);\n return flyout;\n }\n const flyout = submenu('Split', 'split-right', canCreate && allowed('split'));\n for (const [label, axis, before] of [\n ['Split left', 'horizontal', true],\n ['Split right', 'horizontal', false],\n ['Split up', 'vertical', true],\n ['Split down', 'vertical', false],\n ] as const) {\n const option = button(label, label, () => {\n local.dispose();\n create(axis, before);\n });\n const icon = el(doc, 'span', 'layouts-tab-icon');\n icon.setAttribute('aria-hidden', 'true');\n icon.append(actionIcon(doc, axis === 'horizontal' ? 'split-right' : 'split-below', options));\n option.prepend(icon);\n option.setAttribute('role', 'menuitem');\n flyout.append(option);\n }\n const joinParent = findParent(options.store.getSnapshot().root, group.id);\n const join = add(\n 'join',\n 'Join sibling region',\n Boolean(joinParent) && paneIds(joinParent!).every((id) => options.store.can(id, 'join')),\n () => options.store.join(group.id, { source: 'user' }),\n );\n let preview: Scope | undefined;\n const clearPreview = () => {\n preview?.dispose();\n preview = undefined;\n };\n local.add(clearPreview);\n const showPreview = () => {\n clearPreview();\n const layout = options.store.getSnapshot();\n const parent = findParent(layout.root, group.id);\n if (join.disabled || !parent) return;\n const scope = new Scope();\n preview = scope;\n const overlay = el(doc, 'div', 'layouts-corner-overlay');\n overlay.setAttribute('aria-hidden', 'true');\n root.append(overlay);\n scope.add(() => overlay.remove());\n const targetTitle = layout.panes[group.active ?? '']?.title ?? 'This region';\n const regions = groups(parent).map((region) => ({\n region,\n element: Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === region.id && element.closest('.layouts') === root,\n ),\n }));\n const position = () => {\n overlay.replaceChildren();\n for (const { region, element } of regions) {\n if (!element || !element.getClientRects().length) continue;\n const rect = element.getBoundingClientRect();\n const box = el(doc, 'div', 'layouts-corner-preview');\n box.dataset.cornerPreview = region.id === group.id ? 'join-target' : 'join-source';\n Object.assign(box.style, {\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n });\n box.append(\n el(\n doc,\n 'span',\n 'layouts-corner-label',\n region.id === group.id ? `${targetTitle} keeps all tabs` : `Joins ${targetTitle}`,\n ),\n );\n overlay.append(box);\n }\n };\n position();\n const observer = new win.ResizeObserver(position);\n for (const { element } of regions) if (element) observer.observe(element);\n scope.add(() => observer.disconnect());\n scope.listen(win, 'resize', position);\n scope.listen(doc, 'scroll', position, { capture: true });\n scope.add(options.store.subscribe(clearPreview));\n };\n local.listen(join, 'pointerenter', showPreview);\n local.listen(join, 'pointerleave', clearPreview);\n local.listen(join, 'focus', showPreview);\n local.listen(join, 'blur', clearPreview);\n add(\n options.store.getSnapshot().maximized === group.id ? 'restore' : 'maximize',\n options.store.getSnapshot().maximized === group.id ? 'Restore region' : 'Maximize region',\n true,\n () =>\n options.store.maximize(\n options.store.getSnapshot().maximized === group.id ? null : group.id,\n ),\n );\n if (group.panes.length && pane) {\n add(\n 'popout',\n windows.pending.has(pane.id) ? 'Reopen window' : 'Open in window',\n options.store.can(pane.id, 'popout'),\n () => {\n windows.open(pane.id, windows.pending.get(pane.id));\n refresh();\n },\n );\n }\n const orientation = submenu('Tab orientation', 'tab-orientation');\n for (const [value, label] of [\n [undefined, 'Workspace default'],\n ['top', 'Horizontal'],\n ['left', 'Vertical'],\n ] as const) {\n const selected = group.tabPlacement === value;\n const option = button(label, label, () => {\n options.store.setTabPlacement(group.id, value);\n local.dispose();\n });\n option.setAttribute('role', 'menuitemradio');\n option.setAttribute('aria-checked', String(selected));\n const mark = el(doc, 'span', 'layouts-tab-icon', selected ? '✓' : '');\n mark.setAttribute('aria-hidden', 'true');\n option.prepend(mark);\n orientation.append(option);\n }\n const display = submenu('Tab display', 'tab-orientation');\n for (const [value, label] of [\n [undefined, 'Workspace default'],\n ['automatic', 'Automatic'],\n ['compact', 'Compact'],\n ] as const) {\n const selected = group.tabDisplay === value;\n const option = button(label, label, () => {\n options.store.setTabDisplay(group.id, value);\n local.dispose();\n });\n option.setAttribute('role', 'menuitemradio');\n option.setAttribute('aria-checked', String(selected));\n const mark = el(doc, 'span', 'layouts-tab-icon', selected ? '✓' : '');\n mark.setAttribute('aria-hidden', 'true');\n option.prepend(mark);\n display.append(option);\n }\n if (group.panes.length && pane) {\n add('close', 'Close active tab', options.store.can(pane.id, 'close'), () =>\n options.store.close(pane.id, { source: 'user' }),\n );\n add(\n 'close',\n 'Close pane',\n group.panes.every((id) => options.store.can(id, 'close')),\n () => options.store.closeGroup(group.id, { source: 'user' }),\n );\n } else {\n add('close', 'Close empty pane', options.store.getSnapshot().root.id !== group.id, () =>\n options.store.removeEmptyGroup(group.id),\n );\n }\n add('restore', 'Restore closed tab', options.store.canRestoreClosedTab(), () =>\n options.store.restoreClosedTab(),\n );\n add('cancel', 'Cancel', true, () => {});\n root.append(dialog);\n const rect = anchor.getBoundingClientRect();\n dialog.style.left = `${Math.max(8, Math.min(rect.right - 230, win!.innerWidth - 250))}px`;\n dialog.style.top = `${Math.min(rect.bottom + 4, win!.innerHeight - 180)}px`;\n local.listen(dialog, 'close', () => local.dispose());\n local.listen(dialog, 'click', (event) => {\n if (event.target === dialog) {\n const r = dialog.getBoundingClientRect();\n const e = event as MouseEvent;\n if (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom)\n local.dispose();\n }\n });\n dialog.showModal();\n dialog.focus({ preventScroll: true });\n }\n return {\n open,\n addTab(anchor: HTMLElement, group: Group) {\n const layout = options.store.getSnapshot();\n open(\n anchor,\n group.active ? layout.panes[group.active] : undefined,\n group,\n undefined,\n 0.5,\n false,\n true,\n );\n },\n openEmpty(anchor: HTMLElement, group: Group) {\n const source = Object.values(options.store.getSnapshot().panes).find(\n (pane) => pane.header !== false,\n );\n open(anchor, source, group, undefined, 0.5, true);\n },\n dispose() {\n current?.dispose();\n for (const picker of persistentPickers.values()) picker.dispose();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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","sourcesContent":["import { message } from './messages.js';\nimport { actionIcon } from './action-icons.js';\nimport type { ActionIcon } from './action-icons.js';\nimport { fillTabPicker } from './picker.js';\nimport { findNode, findParent, groups, paneIds } from 'quilt-core';\nimport type { Group, Pane } from 'quilt-core';\nimport type { ResolvedLayoutOptions } from './types.js';\nimport type { Windows } from './windows.js';\nimport { el, Scope } from './lifetime.js';\nexport function createPaneMenu(\n root: HTMLElement,\n options: ResolvedLayoutOptions,\n windows: Pick<Windows, 'open'>,\n refresh: () => void,\n report: (e: unknown) => void,\n requestClose: (id: string, kind?: 'pane' | 'group') => Promise<boolean>,\n) {\n const doc = root.ownerDocument,\n win = doc.defaultView!;\n let current: Scope | undefined;\n const persistentPickers = new Map<string, Scope>();\n const act = (fn: () => void) => {\n try {\n fn();\n } catch (error) {\n report(error);\n }\n };\n function button(text: string, title: string, action: () => void) {\n const b = el(doc, 'button', 'layouts-button', text);\n b.type = 'button';\n b.title = title;\n b.setAttribute('aria-label', title);\n b.onclick = () => act(action);\n return b;\n }\n function open(\n anchor: HTMLElement,\n pane: Pane | undefined,\n group: Group,\n direction?: 'left' | 'right' | 'top' | 'bottom',\n ratio = 0.5,\n groupActions = false,\n addTab = false,\n ) {\n current?.dispose();\n const latestGroup = findNode(options.store.getSnapshot().root, group.id);\n if (latestGroup?.kind !== 'group') return;\n group = latestGroup;\n const local = new Scope();\n current = local;\n const dialog = el(doc, 'dialog', 'layouts-menu');\n dialog.tabIndex = -1;\n dialog.autofocus = true;\n dialog.setAttribute(\n 'aria-label',\n pane && !groupActions\n ? message(options, '{title} actions', { title: pane.title })\n : message(options, 'Empty pane actions'),\n );\n local.add(() => dialog.remove());\n const add = (icon: ActionIcon, label: string, enabled: boolean, fn: () => void) => {\n const b = button(label, label, () => {\n local.dispose();\n act(fn);\n });\n const glyph = el(doc, 'span', 'layouts-tab-icon');\n glyph.setAttribute('aria-hidden', 'true');\n act(() => glyph.append(actionIcon(doc, icon, options)));\n b.replaceChildren(glyph, el(doc, 'span', '', label.replace(/^\\+ /, '')));\n b.disabled = !enabled;\n dialog.append(b);\n return b;\n };\n const allowed = (cap: 'split' | 'join' | 'move') =>\n group.panes.every((id) => options.store.can(id, cap));\n const available = Boolean(options.tabs?.list().length);\n const create = (axis?: 'horizontal' | 'vertical', before = false) => {\n if (!axis && !pane && !options.tabs) return;\n let destination = group;\n if (axis && (options.tabs || !pane)) {\n const id = options.store.split(group.id, axis, null, { source: 'user', before, ratio });\n destination = findNode(options.store.getSnapshot().root, id) as Group;\n refresh();\n if (!options.tabs) return;\n }\n const commit = (fresh: Pane) => options.store.add(fresh, destination.id, { source: 'user' });\n if (options.tabs) {\n if ((axis || !group.panes.length) && options.store.getAutoCollapse() === 'disabled') {\n if (persistentPickers.has(destination.id)) {\n const region = Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === destination.id,\n );\n region?.querySelector<HTMLInputElement>('.layouts-picker-search')?.focus();\n return;\n }\n const region = Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === destination.id,\n );\n if (!region) return;\n const pickerScope = new Scope();\n persistentPickers.set(destination.id, pickerScope);\n const picker = el(doc, 'div', 'layouts-menu layouts-picker layouts-picker-persistent');\n picker.setAttribute('role', 'dialog');\n region.append(picker);\n pickerScope.listen(\n doc,\n 'pointerdown',\n (event) => {\n if (!event.composedPath().includes(region)) pickerScope.dispose();\n },\n { capture: true },\n );\n pickerScope.add(() => {\n picker.remove();\n persistentPickers.delete(destination.id);\n });\n pickerScope.add(\n options.store.subscribe(() => {\n const group = findNode(options.store.getSnapshot().root, destination.id);\n if (group?.kind !== 'group' || group.panes.length) pickerScope.dispose();\n }),\n );\n fillTabPicker(picker, pickerScope, options, pane, destination, commit, report, true);\n return;\n }\n const pickerScope = new Scope();\n current = pickerScope;\n const picker = el(doc, 'dialog', 'layouts-menu layouts-picker');\n if (axis)\n pickerScope.add(() => {\n if (options.store.getAutoCollapse() !== 'disabled')\n options.store.removeEmptyGroup(destination.id);\n });\n pickerScope.add(() => picker.remove());\n pickerScope.listen(picker, 'close', () => pickerScope.dispose());\n root.append(picker);\n pickerScope.listen(picker, 'click', (event) => {\n const e = event as MouseEvent;\n const bounds = picker.getBoundingClientRect();\n if (\n e.target === picker &&\n (e.clientX < bounds.left ||\n e.clientX > bounds.right ||\n e.clientY < bounds.top ||\n e.clientY > bounds.bottom)\n )\n pickerScope.dispose();\n });\n picker.showModal();\n fillTabPicker(picker, pickerScope, options, pane, destination, commit, report);\n const region = Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === destination.id,\n );\n if (region) {\n const position = () => {\n const bounds = region.getBoundingClientRect();\n picker.style.width = `${Math.max(0, Math.min(340, bounds.width - 16))}px`;\n picker.style.maxHeight = `${Math.max(0, bounds.height - 16)}px`;\n picker.style.left = `${bounds.left + (bounds.width - picker.offsetWidth) / 2}px`;\n picker.style.top = `${bounds.top + (bounds.height - picker.offsetHeight) / 2}px`;\n };\n position();\n const observer = new ResizeObserver(position);\n observer.observe(region);\n observer.observe(picker);\n pickerScope.add(() => observer.disconnect());\n pickerScope.listen(win, 'resize', position);\n pickerScope.add(\n options.store.subscribe(() => {\n if (!findNode(options.store.getSnapshot().root, destination.id))\n pickerScope.dispose();\n }),\n );\n }\n }\n };\n if (addTab || (!direction && !group.panes.length && !groupActions)) {\n local.dispose();\n create();\n return;\n }\n if (direction) {\n local.dispose();\n create(\n direction === 'left' || direction === 'right' ? 'horizontal' : 'vertical',\n direction === 'left' || direction === 'top',\n );\n return;\n }\n add('add-tab', message(options, '+ Add tab'), available && allowed('move'), () => create());\n const canCreate = !group.panes.length || available;\n const flyouts: { trigger: HTMLElement; flyout: HTMLElement }[] = [];\n let positionMenus = () => {};\n function submenu(label: string, icon: ActionIcon, enabled = true) {\n const container = el(doc, 'div', 'layouts-submenu');\n const trigger = button(`${label} ▸`, label, () => setOpen(true));\n const glyph = el(doc, 'span', 'layouts-tab-icon');\n glyph.setAttribute('aria-hidden', 'true');\n glyph.append(actionIcon(doc, icon, options));\n trigger.prepend(glyph);\n trigger.disabled = !enabled;\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', 'false');\n const flyout = el(doc, 'div', 'layouts-submenu-content');\n flyout.hidden = true;\n flyout.setAttribute('role', 'menu');\n flyout.setAttribute('aria-label', label);\n flyouts.push({ trigger, flyout });\n const setOpen = (open: boolean) => {\n if (open) {\n for (const other of flyouts) {\n other.flyout.hidden = true;\n other.trigger.setAttribute('aria-expanded', 'false');\n }\n }\n flyout.hidden = !open;\n trigger.setAttribute('aria-expanded', String(open));\n if (open) positionMenus();\n };\n local.listen(container, 'pointerenter', () => {\n if (!trigger.disabled) setOpen(true);\n });\n local.listen(container, 'pointerleave', () => setOpen(false));\n local.listen(trigger, 'keydown', (event) => {\n if ((event as KeyboardEvent).key === 'ArrowRight') {\n event.preventDefault();\n setOpen(true);\n (flyout.firstElementChild as HTMLElement)?.focus();\n }\n });\n local.listen(flyout, 'keydown', (event) => {\n if ((event as KeyboardEvent).key === 'ArrowLeft') {\n event.preventDefault();\n setOpen(false);\n trigger.focus();\n }\n });\n container.append(trigger, flyout);\n dialog.append(container);\n return flyout;\n }\n const flyout = submenu(message(options, 'Split'), 'split-right', canCreate && allowed('split'));\n for (const [label, axis, before] of [\n [message(options, 'Split left'), 'horizontal', true],\n [message(options, 'Split right'), 'horizontal', false],\n [message(options, 'Split up'), 'vertical', true],\n [message(options, 'Split down'), 'vertical', false],\n ] as const) {\n const option = button(label, label, () => {\n local.dispose();\n create(axis, before);\n });\n const icon = el(doc, 'span', 'layouts-tab-icon');\n icon.setAttribute('aria-hidden', 'true');\n icon.append(actionIcon(doc, axis === 'horizontal' ? 'split-right' : 'split-below', options));\n option.prepend(icon);\n option.setAttribute('role', 'menuitem');\n flyout.append(option);\n }\n const joinParent = findParent(options.store.getSnapshot().root, group.id);\n const join = add(\n 'join',\n message(options, 'Join sibling region'),\n Boolean(joinParent) && paneIds(joinParent!).every((id) => options.store.can(id, 'join')),\n () => options.store.join(group.id, { source: 'user' }),\n );\n let preview: Scope | undefined;\n const clearPreview = () => {\n preview?.dispose();\n preview = undefined;\n };\n local.add(clearPreview);\n const showPreview = () => {\n clearPreview();\n const layout = options.store.getSnapshot();\n const parent = findParent(layout.root, group.id);\n if (join.disabled || !parent) return;\n const scope = new Scope();\n preview = scope;\n const overlay = el(doc, 'div', 'layouts-corner-overlay');\n overlay.setAttribute('aria-hidden', 'true');\n root.append(overlay);\n scope.add(() => overlay.remove());\n const targetTitle =\n layout.panes[group.active ?? '']?.title ?? message(options, 'This region');\n const regions = groups(parent).map((region) => ({\n region,\n element: Array.from(root.querySelectorAll<HTMLElement>('[data-node-id]')).find(\n (element) => element.dataset.nodeId === region.id && element.closest('.layouts') === root,\n ),\n }));\n const position = () => {\n overlay.replaceChildren();\n for (const { region, element } of regions) {\n if (!element || !element.getClientRects().length) continue;\n const rect = element.getBoundingClientRect();\n const box = el(doc, 'div', 'layouts-corner-preview');\n box.dataset.cornerPreview = region.id === group.id ? 'join-target' : 'join-source';\n Object.assign(box.style, {\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n });\n box.append(\n el(\n doc,\n 'span',\n 'layouts-corner-label',\n region.id === group.id\n ? message(options, '{target} keeps all tabs', { target: targetTitle })\n : message(options, 'Joins {target}', { target: targetTitle }),\n ),\n );\n overlay.append(box);\n }\n };\n position();\n const observer = new win.ResizeObserver(position);\n for (const { element } of regions) if (element) observer.observe(element);\n scope.add(() => observer.disconnect());\n scope.listen(win, 'resize', position);\n scope.listen(doc, 'scroll', position, { capture: true });\n scope.add(options.store.subscribe(clearPreview));\n };\n local.listen(join, 'pointerenter', showPreview);\n local.listen(join, 'pointerleave', clearPreview);\n local.listen(join, 'focus', showPreview);\n local.listen(join, 'blur', clearPreview);\n add(\n options.store.getSnapshot().maximized === group.id ? 'restore' : 'maximize',\n options.store.getSnapshot().maximized === group.id\n ? message(options, 'Restore region')\n : message(options, 'Maximize region'),\n true,\n () =>\n options.store.maximize(\n options.store.getSnapshot().maximized === group.id ? null : group.id,\n ),\n );\n if (group.panes.length && pane && options.popouts !== false) {\n add(\n 'popout',\n message(options, 'Open in window'),\n options.store.can(pane.id, 'popout'),\n () => {\n void windows.open(pane.id);\n refresh();\n },\n );\n }\n const orientation = submenu(message(options, 'Tab orientation'), 'tab-orientation');\n for (const [value, label] of [\n [undefined, message(options, 'Workspace default')],\n ['top', message(options, 'Horizontal')],\n ['left', message(options, 'Vertical')],\n ] as const) {\n const selected = group.tabPlacement === value;\n const option = button(label, label, () => {\n options.store.setTabPlacement(group.id, value);\n local.dispose();\n });\n option.setAttribute('role', 'menuitemradio');\n option.setAttribute('aria-checked', String(selected));\n const mark = el(doc, 'span', 'layouts-tab-icon', selected ? '✓' : '');\n mark.setAttribute('aria-hidden', 'true');\n option.prepend(mark);\n orientation.append(option);\n }\n const display = submenu(message(options, 'Tab display'), 'tab-orientation');\n for (const [value, label] of [\n [undefined, message(options, 'Workspace default')],\n ['automatic', message(options, 'Automatic')],\n ['compact', message(options, 'Compact')],\n ] as const) {\n const selected = group.tabDisplay === value;\n const option = button(label, label, () => {\n options.store.setTabDisplay(group.id, value);\n local.dispose();\n });\n option.setAttribute('role', 'menuitemradio');\n option.setAttribute('aria-checked', String(selected));\n const mark = el(doc, 'span', 'layouts-tab-icon', selected ? '✓' : '');\n mark.setAttribute('aria-hidden', 'true');\n option.prepend(mark);\n display.append(option);\n }\n if (group.panes.length && pane) {\n add(\n 'close',\n message(options, 'Close active tab'),\n options.store.can(pane.id, 'close'),\n () => void requestClose(pane.id),\n );\n add(\n 'close',\n message(options, 'Close pane'),\n group.panes.every((id) => options.store.can(id, 'close')),\n () => void requestClose(group.id, 'group'),\n );\n } else {\n add(\n 'close',\n message(options, 'Close empty pane'),\n options.store.getSnapshot().root.id !== group.id,\n () => options.store.removeEmptyGroup(group.id),\n );\n }\n add(\n 'restore',\n message(options, 'Restore closed tab'),\n options.store.canRestoreClosedTab(),\n () => options.store.restoreClosedTab(),\n );\n add('cancel', message(options, 'Cancel'), true, () => {});\n root.append(dialog);\n // Measure after opening: theme density, labels, and available actions change the size.\n // Fixed flyouts escape the scrolling dialog while retaining its modal focus scope.\n positionMenus = () => {\n const viewport = win.visualViewport;\n const left = (viewport?.offsetLeft ?? 0) + 8;\n const top = (viewport?.offsetTop ?? 0) + 8;\n const width = Math.max(0, (viewport?.width ?? doc.documentElement.clientWidth) - 16);\n const height = Math.max(0, (viewport?.height ?? doc.documentElement.clientHeight) - 16);\n const fit = (element: HTMLElement) => {\n element.style.maxWidth = `${width}px`;\n element.style.maxHeight = `${height}px`;\n };\n const place = (element: HTMLElement, x: number, y: number) => {\n const bounds = element.getBoundingClientRect();\n element.style.left = `${Math.max(left, Math.min(x, left + width - bounds.width))}px`;\n element.style.top = `${Math.max(top, Math.min(y, top + height - bounds.height))}px`;\n };\n fit(dialog);\n const rect = anchor.getBoundingClientRect();\n const bounds = dialog.getBoundingClientRect();\n const below = rect.bottom + 4;\n const above = rect.top - bounds.height - 4;\n place(\n dialog,\n rect.right - bounds.width,\n below + bounds.height <= top + height || above < top ? below : above,\n );\n for (const { trigger, flyout } of flyouts) {\n if (flyout.hidden) continue;\n fit(flyout);\n const row = trigger.getBoundingClientRect();\n const menu = dialog.getBoundingClientRect();\n const size = flyout.getBoundingClientRect();\n const x =\n menu.right - 1 + size.width <= left + width ? menu.right - 1 : menu.left - size.width + 1;\n place(flyout, x, row.top);\n }\n };\n local.listen(dialog, 'close', () => local.dispose());\n local.listen(dialog, 'click', (event) => {\n if (event.target === dialog) {\n const r = dialog.getBoundingClientRect();\n const e = event as MouseEvent;\n if (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom)\n local.dispose();\n }\n });\n dialog.showModal();\n positionMenus();\n const observer = new win.ResizeObserver(positionMenus);\n observer.observe(dialog);\n observer.observe(anchor);\n for (const { flyout } of flyouts) observer.observe(flyout);\n local.add(() => observer.disconnect());\n local.listen(win, 'resize', positionMenus);\n local.listen(doc, 'scroll', positionMenus, { capture: true });\n if (win.visualViewport) {\n local.listen(win.visualViewport, 'resize', positionMenus);\n local.listen(win.visualViewport, 'scroll', positionMenus);\n }\n dialog.focus({ preventScroll: true });\n }\n return {\n open,\n addTab(anchor: HTMLElement, group: Group) {\n const layout = options.store.getSnapshot();\n open(\n anchor,\n group.active ? layout.panes[group.active] : undefined,\n group,\n undefined,\n 0.5,\n false,\n true,\n );\n },\n openEmpty(anchor: HTMLElement, group: Group) {\n const source = Object.values(options.store.getSnapshot().panes).find(\n (pane) => pane.header !== false,\n );\n open(anchor, source, group, undefined, 0.5, true);\n },\n dispose() {\n current?.dispose();\n for (const picker of persistentPickers.values()) picker.dispose();\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** Override English message keys; placeholders use {name}. */
|
|
2
|
+
export declare const defaultMessages: {
|
|
3
|
+
readonly 'Tabs in {id}': 'Tabs in {id}';
|
|
4
|
+
readonly '{count} empty region': '{count} empty region';
|
|
5
|
+
readonly '{count} empty regions': '{count} empty regions';
|
|
6
|
+
readonly '{target} absorbs {source}': '{target} absorbs {source}';
|
|
7
|
+
readonly 'Joins {target}': 'Joins {target}';
|
|
8
|
+
readonly '{target} keeps all tabs': '{target} keeps all tabs';
|
|
9
|
+
readonly 'Pane could not be rendered.': 'Pane could not be rendered.';
|
|
10
|
+
readonly 'Pane workspace': 'Pane workspace';
|
|
11
|
+
readonly 'Pane region': 'Pane region';
|
|
12
|
+
readonly 'Resize panes': 'Resize panes';
|
|
13
|
+
readonly 'Close empty pane': 'Close empty pane';
|
|
14
|
+
readonly 'Empty pane actions': 'Empty pane actions';
|
|
15
|
+
readonly 'Choose a tab': 'Choose a tab';
|
|
16
|
+
readonly '+ Add tab': '+ Add tab';
|
|
17
|
+
readonly Split: 'Split';
|
|
18
|
+
readonly 'Split left': 'Split left';
|
|
19
|
+
readonly 'Split right': 'Split right';
|
|
20
|
+
readonly 'Split up': 'Split up';
|
|
21
|
+
readonly 'Split down': 'Split down';
|
|
22
|
+
readonly 'Join sibling region': 'Join sibling region';
|
|
23
|
+
readonly 'This region': 'This region';
|
|
24
|
+
readonly 'Restore region': 'Restore region';
|
|
25
|
+
readonly 'Maximize region': 'Maximize region';
|
|
26
|
+
readonly 'Open in window': 'Open in window';
|
|
27
|
+
readonly 'Tab orientation': 'Tab orientation';
|
|
28
|
+
readonly 'Workspace default': 'Workspace default';
|
|
29
|
+
readonly Horizontal: 'Horizontal';
|
|
30
|
+
readonly Vertical: 'Vertical';
|
|
31
|
+
readonly 'Tab display': 'Tab display';
|
|
32
|
+
readonly Automatic: 'Automatic';
|
|
33
|
+
readonly Compact: 'Compact';
|
|
34
|
+
readonly 'Close active tab': 'Close active tab';
|
|
35
|
+
readonly 'Close pane': 'Close pane';
|
|
36
|
+
readonly 'Restore closed tab': 'Restore closed tab';
|
|
37
|
+
readonly Cancel: 'Cancel';
|
|
38
|
+
readonly 'Search tabs…': 'Search tabs…';
|
|
39
|
+
readonly 'Search tabs': 'Search tabs';
|
|
40
|
+
readonly 'Available tabs': 'Available tabs';
|
|
41
|
+
readonly 'No matching tabs': 'No matching tabs';
|
|
42
|
+
readonly 'Return to layout': 'Return to layout';
|
|
43
|
+
readonly 'Disconnected: the main layout session has ended.': 'Disconnected: the main layout session has ended.';
|
|
44
|
+
readonly 'The browser blocked the popout. Allow popups or try again from the pane menu.': 'The browser blocked the popout. Allow popups or try again from the pane menu.';
|
|
45
|
+
readonly 'Close selected panes?': 'Close selected panes?';
|
|
46
|
+
readonly Close: 'Close';
|
|
47
|
+
readonly 'New pane': 'New pane';
|
|
48
|
+
readonly 'Empty region': 'Empty region';
|
|
49
|
+
readonly 'Click to add a pane': 'Click to add a pane';
|
|
50
|
+
readonly 'Drag inward to split; drag across adjacent regions to join. Escape cancels.': 'Drag inward to split; drag across adjacent regions to join. Escape cancels.';
|
|
51
|
+
readonly '{title} actions': '{title} actions';
|
|
52
|
+
readonly 'Close {title}': 'Close {title}';
|
|
53
|
+
readonly '{count} tab types': '{count} tab types';
|
|
54
|
+
readonly 'Unknown pane type: {type}. Register a renderer to display this pane.': 'Unknown pane type: {type}. Register a renderer to display this pane.';
|
|
55
|
+
readonly 'Could not mount {title}. Retry this pane.': 'Could not mount {title}. Retry this pane.';
|
|
56
|
+
readonly 'Split or join region from {corner} corner': 'Split or join region from {corner} corner';
|
|
57
|
+
};
|
|
58
|
+
export type Messages = Partial<Record<keyof typeof defaultMessages, string>>;
|
|
59
|
+
export declare function message(options: {
|
|
60
|
+
messages?: Messages;
|
|
61
|
+
}, key: string, values?: Record<string, string | number>): string;
|
|
62
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,eAAO,MAAM,eAAe;aAC1B,cAAc,EAAE,cAAc;aAC9B,sBAAsB,EAAE,sBAAsB;aAC9C,uBAAuB,EAAE,uBAAuB;aAChD,2BAA2B,EAAE,2BAA2B;aACxD,gBAAgB,EAAE,gBAAgB;aAClC,yBAAyB,EAAE,yBAAyB;aACpD,6BAA6B,EAAE,6BAA6B;aAE5D,gBAAgB,EAAE,gBAAgB;aAClC,aAAa,EAAE,aAAa;aAC5B,cAAc,EAAE,cAAc;aAC9B,kBAAkB,EAAE,kBAAkB;aACtC,oBAAoB,EAAE,oBAAoB;aAC1C,cAAc,EAAE,cAAc;aAC9B,WAAW,EAAE,WAAW;aACxB,KAAK,EAAE,OAAO;aACd,YAAY,EAAE,YAAY;aAC1B,aAAa,EAAE,aAAa;aAC5B,UAAU,EAAE,UAAU;aACtB,YAAY,EAAE,YAAY;aAC1B,qBAAqB,EAAE,qBAAqB;aAC5C,aAAa,EAAE,aAAa;aAC5B,gBAAgB,EAAE,gBAAgB;aAClC,iBAAiB,EAAE,iBAAiB;aACpC,gBAAgB,EAAE,gBAAgB;aAClC,iBAAiB,EAAE,iBAAiB;aACpC,mBAAmB,EAAE,mBAAmB;aACxC,UAAU,EAAE,YAAY;aACxB,QAAQ,EAAE,UAAU;aACpB,aAAa,EAAE,aAAa;aAC5B,SAAS,EAAE,WAAW;aACtB,OAAO,EAAE,SAAS;aAClB,kBAAkB,EAAE,kBAAkB;aACtC,YAAY,EAAE,YAAY;aAC1B,oBAAoB,EAAE,oBAAoB;aAC1C,MAAM,EAAE,QAAQ;aAChB,cAAmB,EAAE,cAAmB;aACxC,aAAa,EAAE,aAAa;aAC5B,gBAAgB,EAAE,gBAAgB;aAClC,kBAAkB,EAAE,kBAAkB;aACtC,kBAAkB,EAAE,kBAAkB;aACtC,kDAAkD,EAChD,kDAAkD;aACpD,+EAA+E,EAC7E,+EAA+E;aACjF,uBAAuB,EAAE,uBAAuB;aAChD,KAAK,EAAE,OAAO;aACd,UAAU,EAAE,UAAU;aACtB,cAAc,EAAE,cAAc;aAC9B,qBAAqB,EAAE,qBAAqB;aAC5C,6EAA6E,EAC3E,6EAA6E;aAC/E,iBAAiB,EAAE,iBAAiB;aACpC,eAAe,EAAE,eAAe;aAChC,mBAAmB,EAAE,mBAAmB;aACxC,sEAAsE,EACpE,sEAAsE;aACxE,2CAA2C,EAAE,2CAA2C;aACxF,2CAA2C,EAAE,2CAA2C;CAChF,CAAC;AACX,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7E,wBAAgB,OAAO,CACrB,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,EAChC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAM,GAC3C,MAAM,CAGR"}
|
package/dist/messages.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** Override English message keys; placeholders use {name}. */
|
|
2
|
+
export const defaultMessages = {
|
|
3
|
+
'Tabs in {id}': 'Tabs in {id}',
|
|
4
|
+
'{count} empty region': '{count} empty region',
|
|
5
|
+
'{count} empty regions': '{count} empty regions',
|
|
6
|
+
'{target} absorbs {source}': '{target} absorbs {source}',
|
|
7
|
+
'Joins {target}': 'Joins {target}',
|
|
8
|
+
'{target} keeps all tabs': '{target} keeps all tabs',
|
|
9
|
+
'Pane could not be rendered.': 'Pane could not be rendered.',
|
|
10
|
+
'Pane workspace': 'Pane workspace',
|
|
11
|
+
'Pane region': 'Pane region',
|
|
12
|
+
'Resize panes': 'Resize panes',
|
|
13
|
+
'Close empty pane': 'Close empty pane',
|
|
14
|
+
'Empty pane actions': 'Empty pane actions',
|
|
15
|
+
'Choose a tab': 'Choose a tab',
|
|
16
|
+
'+ Add tab': '+ Add tab',
|
|
17
|
+
Split: 'Split',
|
|
18
|
+
'Split left': 'Split left',
|
|
19
|
+
'Split right': 'Split right',
|
|
20
|
+
'Split up': 'Split up',
|
|
21
|
+
'Split down': 'Split down',
|
|
22
|
+
'Join sibling region': 'Join sibling region',
|
|
23
|
+
'This region': 'This region',
|
|
24
|
+
'Restore region': 'Restore region',
|
|
25
|
+
'Maximize region': 'Maximize region',
|
|
26
|
+
'Open in window': 'Open in window',
|
|
27
|
+
'Tab orientation': 'Tab orientation',
|
|
28
|
+
'Workspace default': 'Workspace default',
|
|
29
|
+
Horizontal: 'Horizontal',
|
|
30
|
+
Vertical: 'Vertical',
|
|
31
|
+
'Tab display': 'Tab display',
|
|
32
|
+
Automatic: 'Automatic',
|
|
33
|
+
Compact: 'Compact',
|
|
34
|
+
'Close active tab': 'Close active tab',
|
|
35
|
+
'Close pane': 'Close pane',
|
|
36
|
+
'Restore closed tab': 'Restore closed tab',
|
|
37
|
+
Cancel: 'Cancel',
|
|
38
|
+
'Search tabs\u2026': 'Search tabs\u2026',
|
|
39
|
+
'Search tabs': 'Search tabs',
|
|
40
|
+
'Available tabs': 'Available tabs',
|
|
41
|
+
'No matching tabs': 'No matching tabs',
|
|
42
|
+
'Return to layout': 'Return to layout',
|
|
43
|
+
'Disconnected: the main layout session has ended.': 'Disconnected: the main layout session has ended.',
|
|
44
|
+
'The browser blocked the popout. Allow popups or try again from the pane menu.': 'The browser blocked the popout. Allow popups or try again from the pane menu.',
|
|
45
|
+
'Close selected panes?': 'Close selected panes?',
|
|
46
|
+
Close: 'Close',
|
|
47
|
+
'New pane': 'New pane',
|
|
48
|
+
'Empty region': 'Empty region',
|
|
49
|
+
'Click to add a pane': 'Click to add a pane',
|
|
50
|
+
'Drag inward to split; drag across adjacent regions to join. Escape cancels.': 'Drag inward to split; drag across adjacent regions to join. Escape cancels.',
|
|
51
|
+
'{title} actions': '{title} actions',
|
|
52
|
+
'Close {title}': 'Close {title}',
|
|
53
|
+
'{count} tab types': '{count} tab types',
|
|
54
|
+
'Unknown pane type: {type}. Register a renderer to display this pane.': 'Unknown pane type: {type}. Register a renderer to display this pane.',
|
|
55
|
+
'Could not mount {title}. Retry this pane.': 'Could not mount {title}. Retry this pane.',
|
|
56
|
+
'Split or join region from {corner} corner': 'Split or join region from {corner} corner',
|
|
57
|
+
};
|
|
58
|
+
export function message(options, key, values = {}) {
|
|
59
|
+
const template = options.messages?.[key] ?? key;
|
|
60
|
+
return template.replace(/\{(\w+)\}/g, (match, name) => String(values[name] ?? match));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc,EAAE,cAAc;IAC9B,sBAAsB,EAAE,sBAAsB;IAC9C,uBAAuB,EAAE,uBAAuB;IAChD,2BAA2B,EAAE,2BAA2B;IACxD,gBAAgB,EAAE,gBAAgB;IAClC,yBAAyB,EAAE,yBAAyB;IACpD,6BAA6B,EAAE,6BAA6B;IAE5D,gBAAgB,EAAE,gBAAgB;IAClC,aAAa,EAAE,aAAa;IAC5B,cAAc,EAAE,cAAc;IAC9B,kBAAkB,EAAE,kBAAkB;IACtC,oBAAoB,EAAE,oBAAoB;IAC1C,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,WAAW;IACxB,KAAK,EAAE,OAAO;IACd,YAAY,EAAE,YAAY;IAC1B,aAAa,EAAE,aAAa;IAC5B,UAAU,EAAE,UAAU;IACtB,YAAY,EAAE,YAAY;IAC1B,qBAAqB,EAAE,qBAAqB;IAC5C,aAAa,EAAE,aAAa;IAC5B,gBAAgB,EAAE,gBAAgB;IAClC,iBAAiB,EAAE,iBAAiB;IACpC,gBAAgB,EAAE,gBAAgB;IAClC,iBAAiB,EAAE,iBAAiB;IACpC,mBAAmB,EAAE,mBAAmB;IACxC,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,aAAa;IAC5B,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,SAAS;IAClB,kBAAkB,EAAE,kBAAkB;IACtC,YAAY,EAAE,YAAY;IAC1B,oBAAoB,EAAE,oBAAoB;IAC1C,MAAM,EAAE,QAAQ;IAChB,mBAAmB,EAAE,mBAAmB;IACxC,aAAa,EAAE,aAAa;IAC5B,gBAAgB,EAAE,gBAAgB;IAClC,kBAAkB,EAAE,kBAAkB;IACtC,kBAAkB,EAAE,kBAAkB;IACtC,kDAAkD,EAChD,kDAAkD;IACpD,+EAA+E,EAC7E,+EAA+E;IACjF,uBAAuB,EAAE,uBAAuB;IAChD,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,UAAU;IACtB,cAAc,EAAE,cAAc;IAC9B,qBAAqB,EAAE,qBAAqB;IAC5C,6EAA6E,EAC3E,6EAA6E;IAC/E,iBAAiB,EAAE,iBAAiB;IACpC,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,mBAAmB;IACxC,sEAAsE,EACpE,sEAAsE;IACxE,2CAA2C,EAAE,2CAA2C;IACxF,2CAA2C,EAAE,2CAA2C;CAChF,CAAC;AAEX,MAAM,UAAU,OAAO,CACrB,OAAgC,EAChC,GAAW,EACX,MAAM,GAAoC,EAAE;IAE5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAqB,CAAC,IAAI,GAAG,CAAC;IAClE,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;AAChG,CAAC","sourcesContent":["/** Override English message keys; placeholders use {name}. */\nexport const defaultMessages = {\n 'Tabs in {id}': 'Tabs in {id}',\n '{count} empty region': '{count} empty region',\n '{count} empty regions': '{count} empty regions',\n '{target} absorbs {source}': '{target} absorbs {source}',\n 'Joins {target}': 'Joins {target}',\n '{target} keeps all tabs': '{target} keeps all tabs',\n 'Pane could not be rendered.': 'Pane could not be rendered.',\n\n 'Pane workspace': 'Pane workspace',\n 'Pane region': 'Pane region',\n 'Resize panes': 'Resize panes',\n 'Close empty pane': 'Close empty pane',\n 'Empty pane actions': 'Empty pane actions',\n 'Choose a tab': 'Choose a tab',\n '+ Add tab': '+ Add tab',\n Split: 'Split',\n 'Split left': 'Split left',\n 'Split right': 'Split right',\n 'Split up': 'Split up',\n 'Split down': 'Split down',\n 'Join sibling region': 'Join sibling region',\n 'This region': 'This region',\n 'Restore region': 'Restore region',\n 'Maximize region': 'Maximize region',\n 'Open in window': 'Open in window',\n 'Tab orientation': 'Tab orientation',\n 'Workspace default': 'Workspace default',\n Horizontal: 'Horizontal',\n Vertical: 'Vertical',\n 'Tab display': 'Tab display',\n Automatic: 'Automatic',\n Compact: 'Compact',\n 'Close active tab': 'Close active tab',\n 'Close pane': 'Close pane',\n 'Restore closed tab': 'Restore closed tab',\n Cancel: 'Cancel',\n 'Search tabs\\u2026': 'Search tabs\\u2026',\n 'Search tabs': 'Search tabs',\n 'Available tabs': 'Available tabs',\n 'No matching tabs': 'No matching tabs',\n 'Return to layout': 'Return to layout',\n 'Disconnected: the main layout session has ended.':\n 'Disconnected: the main layout session has ended.',\n 'The browser blocked the popout. Allow popups or try again from the pane menu.':\n 'The browser blocked the popout. Allow popups or try again from the pane menu.',\n 'Close selected panes?': 'Close selected panes?',\n Close: 'Close',\n 'New pane': 'New pane',\n 'Empty region': 'Empty region',\n 'Click to add a pane': 'Click to add a pane',\n 'Drag inward to split; drag across adjacent regions to join. Escape cancels.':\n 'Drag inward to split; drag across adjacent regions to join. Escape cancels.',\n '{title} actions': '{title} actions',\n 'Close {title}': 'Close {title}',\n '{count} tab types': '{count} tab types',\n 'Unknown pane type: {type}. Register a renderer to display this pane.':\n 'Unknown pane type: {type}. Register a renderer to display this pane.',\n 'Could not mount {title}. Retry this pane.': 'Could not mount {title}. Retry this pane.',\n 'Split or join region from {corner} corner': 'Split or join region from {corner} corner',\n} as const;\nexport type Messages = Partial<Record<keyof typeof defaultMessages, string>>;\nexport function message(\n options: { messages?: Messages },\n key: string,\n values: Record<string, string | number> = {},\n): string {\n const template = options.messages?.[key as keyof Messages] ?? key;\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => String(values[name] ?? match));\n}\n"]}
|
package/dist/panes.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Pane } from 'quilt-core';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ResolvedLayoutOptions, PaneView, PaneRenderer } from './types.js';
|
|
3
3
|
export interface MountedPane {
|
|
4
4
|
element: HTMLElement;
|
|
5
5
|
view: PaneView;
|
|
@@ -9,5 +9,5 @@ export interface MountedPane {
|
|
|
9
9
|
failed?: boolean;
|
|
10
10
|
dispose(): void;
|
|
11
11
|
}
|
|
12
|
-
export declare function mountPane(doc: Document, pane: Pane, location: 'main' | 'popout', options:
|
|
12
|
+
export declare function mountPane(doc: Document, pane: Pane, location: 'main' | 'popout', options: ResolvedLayoutOptions): MountedPane;
|
|
13
13
|
//# sourceMappingURL=panes.d.ts.map
|
package/dist/panes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panes.d.ts","sourceRoot":"","sources":["../src/panes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"panes.d.ts","sourceRoot":"","sources":["../src/panes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,IAAI,IAAI,CAAC;CACjB;AACD,wBAAgB,SAAS,CACvB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAC3B,OAAO,EAAE,qBAAqB,GAC7B,WAAW,CAuEb"}
|