quilt-vanilla 0.1.0 → 0.1.1

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.
@@ -1,15 +1,15 @@
1
1
  import type { LayoutOptions } from './types.js';
2
2
  declare const paths: {
3
- readonly 'add-tab': readonly ["M12 5v14M5 12h14"];
4
- readonly 'split-right': readonly ["M3 4h18v16H3z", "M12 4v16"];
5
- readonly 'split-below': readonly ["M3 4h18v16H3z", "M3 12h18"];
6
- readonly 'tab-orientation': readonly ["M3 4h18v16H3z", "M3 9h18", "M8 9v11"];
7
- readonly join: readonly ["M3 4h18v16H3z", "m7 9 3 3-3 3m10-6-3 3 3 3"];
8
- readonly maximize: readonly ["M8 3H3v5m13-5h5v5M3 16v5h5m13-5v5h-5"];
9
- readonly restore: readonly ["M3 8h5V3m13 5h-5V3M8 21v-5H3m13 5v-5h5"];
10
- readonly popout: readonly ["M14 3h7v7m0-7L11 13", "M10 3H3v18h18v-7"];
11
- readonly close: readonly ["m6 6 12 12M6 18 18 6"];
12
- readonly cancel: readonly ["M9 5 2 12l7 7M2 12h14a5 5 0 0 0 0-10"];
3
+ readonly 'add-tab': readonly ['M12 5v14M5 12h14'];
4
+ readonly 'split-right': readonly ['M3 4h18v16H3z', 'M12 4v16'];
5
+ readonly 'split-below': readonly ['M3 4h18v16H3z', 'M3 12h18'];
6
+ readonly 'tab-orientation': readonly ['M3 4h18v16H3z', 'M3 9h18', 'M8 9v11'];
7
+ readonly join: readonly ['M3 4h18v16H3z', 'm7 9 3 3-3 3m10-6-3 3 3 3'];
8
+ readonly maximize: readonly ['M8 3H3v5m13-5h5v5M3 16v5h5m13-5v5h-5'];
9
+ readonly restore: readonly ['M3 8h5V3m13 5h-5V3M8 21v-5H3m13 5v-5h5'];
10
+ readonly popout: readonly ['M14 3h7v7m0-7L11 13', 'M10 3H3v18h18v-7'];
11
+ readonly close: readonly ['m6 6 12 12M6 18 18 6'];
12
+ readonly cancel: readonly ['M9 5 2 12l7 7M2 12h14a5 5 0 0 0 0-10'];
13
13
  };
14
14
  export type ActionIcon = keyof typeof paths;
15
15
  /** Small built-in chrome icons; applications may override the namespaced keys. */
@@ -1 +1 @@
1
- {"version":3,"file":"action-icons.d.ts","sourceRoot":"","sources":["../src/action-icons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,QAAA,MAAM,KAAK;;;;;;;;;;;CAWD,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,KAAK,CAAC;AAC5C,kFAAkF;AAClF,wBAAgB,UAAU,CACxB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,GACzC,OAAO,CAoBT"}
1
+ {"version":3,"file":"action-icons.d.ts","sourceRoot":"","sources":["../src/action-icons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,QAAA,MAAM,KAAK;aACT,SAAS,YAAG,kBAAkB;aAC9B,aAAa,YAAG,eAAe,EAAE,UAAU;aAC3C,aAAa,YAAG,eAAe,EAAE,UAAU;aAC3C,iBAAiB,YAAG,eAAe,EAAE,SAAS,EAAE,SAAS;aACzD,IAAI,YAAG,eAAe,EAAE,2BAA2B;aACnD,QAAQ,YAAG,sCAAsC;aACjD,OAAO,YAAG,wCAAwC;aAClD,MAAM,YAAG,qBAAqB,EAAE,kBAAkB;aAClD,KAAK,YAAG,sBAAsB;aAC9B,MAAM,YAAG,sCAAsC;CACvC,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,KAAK,CAAC;AAC5C,kFAAkF;AAClF,wBAAgB,UAAU,CACxB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,GACzC,OAAO,CAoBT"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifetime.d.ts","sourceRoot":"","sources":["../src/lifetime.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,KAAK,CAAS;IACtB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI;IAIvB,MAAM,CACJ,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,uBAAuB;IAKnC,OAAO;CAWR;AACD,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAMxE;AACD,wBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACtD,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,CAAC,EACN,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,qBAAqB,CAAC,CAAC,CAAC,CAK1B"}
1
+ {"version":3,"file":"lifetime.d.ts","sourceRoot":"","sources":["../src/lifetime.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,KAAK,CAAS;IACtB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,QAGtB;IACD,MAAM,CACJ,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,uBAAuB,QAIlC;IACD,OAAO,SAUN;CACF;AACD,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAMxE;AACD,wBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACtD,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,CAAC,EACN,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,GACZ,qBAAqB,CAAC,CAAC,CAAC,CAK1B"}
package/dist/menu.d.ts CHANGED
@@ -2,7 +2,7 @@ import type { Group, Pane } from 'quilt-core';
2
2
  import type { LayoutOptions } from './types.js';
3
3
  import type { Windows } from './windows.js';
4
4
  export declare function createPaneMenu(root: HTMLElement, options: LayoutOptions, windows: Pick<Windows, 'pending' | 'open'>, refresh: () => void, report: (e: unknown) => void): {
5
- open: (anchor: HTMLElement, pane: Pane | undefined, group: Group, direction?: "left" | "right" | "top" | "bottom", ratio?: number, groupActions?: boolean, addTab?: boolean) => void;
5
+ open: (anchor: HTMLElement, pane: Pane | undefined, group: Group, direction?: 'left' | 'right' | 'top' | 'bottom', ratio?: number, groupActions?: boolean, addTab?: boolean) => void;
6
6
  addTab(anchor: HTMLElement, group: Group): void;
7
7
  openEmpty(anchor: HTMLElement, group: Group): void;
8
8
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC,EAC1C,OAAO,EAAE,MAAM,IAAI,EACnB,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;mBAsBlB,WAAW,QACb,IAAI,GAAG,SAAS,SACf,KAAK,cACA,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ;mBAkXhC,WAAW,SAAS,KAAK;sBAYtB,WAAW,SAAS,KAAK;;EAW9C"}
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC,EAC1C,OAAO,EAAE,MAAM,IAAI,EACnB,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI;mBAsBlB,WAAW,QACb,IAAI,GAAG,SAAS,SACf,KAAK,cACA,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ;mBAyahC,WAAW,SAAS,KAAK;sBAYtB,WAAW,SAAS,KAAK;;EAW9C"}
package/dist/menu.js CHANGED
@@ -150,6 +150,8 @@ export function createPaneMenu(root, options, windows, refresh, report) {
150
150
  }
151
151
  add('add-tab', '+ Add tab', available && allowed('move'), () => create());
152
152
  const canCreate = !group.panes.length || available;
153
+ const flyouts = [];
154
+ let positionMenus = () => { };
153
155
  function submenu(label, icon, enabled = true) {
154
156
  const container = el(doc, 'div', 'layouts-submenu');
155
157
  const trigger = button(`${label} ▸`, label, () => setOpen(true));
@@ -164,9 +166,18 @@ export function createPaneMenu(root, options, windows, refresh, report) {
164
166
  flyout.hidden = true;
165
167
  flyout.setAttribute('role', 'menu');
166
168
  flyout.setAttribute('aria-label', label);
169
+ flyouts.push({ trigger, flyout });
167
170
  const setOpen = (open) => {
171
+ if (open) {
172
+ for (const other of flyouts) {
173
+ other.flyout.hidden = true;
174
+ other.trigger.setAttribute('aria-expanded', 'false');
175
+ }
176
+ }
168
177
  flyout.hidden = !open;
169
178
  trigger.setAttribute('aria-expanded', String(open));
179
+ if (open)
180
+ positionMenus();
170
181
  };
171
182
  local.listen(container, 'pointerenter', () => {
172
183
  if (!trigger.disabled)
@@ -187,8 +198,6 @@ export function createPaneMenu(root, options, windows, refresh, report) {
187
198
  trigger.focus();
188
199
  }
189
200
  });
190
- container.dataset.side =
191
- anchor.getBoundingClientRect().right + 220 > win.innerWidth ? 'left' : 'right';
192
201
  container.append(trigger, flyout);
193
202
  dialog.append(container);
194
203
  return flyout;
@@ -321,9 +330,40 @@ export function createPaneMenu(root, options, windows, refresh, report) {
321
330
  add('restore', 'Restore closed tab', options.store.canRestoreClosedTab(), () => options.store.restoreClosedTab());
322
331
  add('cancel', 'Cancel', true, () => { });
323
332
  root.append(dialog);
324
- const rect = anchor.getBoundingClientRect();
325
- dialog.style.left = `${Math.max(8, Math.min(rect.right - 230, win.innerWidth - 250))}px`;
326
- dialog.style.top = `${Math.min(rect.bottom + 4, win.innerHeight - 180)}px`;
333
+ // Measure after opening: theme density, labels, and available actions change the size.
334
+ // Fixed flyouts escape the scrolling dialog while retaining its modal focus scope.
335
+ positionMenus = () => {
336
+ const viewport = win.visualViewport;
337
+ const left = (viewport?.offsetLeft ?? 0) + 8;
338
+ const top = (viewport?.offsetTop ?? 0) + 8;
339
+ const width = Math.max(0, (viewport?.width ?? doc.documentElement.clientWidth) - 16);
340
+ const height = Math.max(0, (viewport?.height ?? doc.documentElement.clientHeight) - 16);
341
+ const fit = (element) => {
342
+ element.style.maxWidth = `${width}px`;
343
+ element.style.maxHeight = `${height}px`;
344
+ };
345
+ const place = (element, x, y) => {
346
+ const bounds = element.getBoundingClientRect();
347
+ element.style.left = `${Math.max(left, Math.min(x, left + width - bounds.width))}px`;
348
+ element.style.top = `${Math.max(top, Math.min(y, top + height - bounds.height))}px`;
349
+ };
350
+ fit(dialog);
351
+ const rect = anchor.getBoundingClientRect();
352
+ const bounds = dialog.getBoundingClientRect();
353
+ const below = rect.bottom + 4;
354
+ const above = rect.top - bounds.height - 4;
355
+ place(dialog, rect.right - bounds.width, below + bounds.height <= top + height || above < top ? below : above);
356
+ for (const { trigger, flyout } of flyouts) {
357
+ if (flyout.hidden)
358
+ continue;
359
+ fit(flyout);
360
+ const row = trigger.getBoundingClientRect();
361
+ const menu = dialog.getBoundingClientRect();
362
+ const size = flyout.getBoundingClientRect();
363
+ const x = menu.right - 1 + size.width <= left + width ? menu.right - 1 : menu.left - size.width + 1;
364
+ place(flyout, x, row.top);
365
+ }
366
+ };
327
367
  local.listen(dialog, 'close', () => local.dispose());
328
368
  local.listen(dialog, 'click', (event) => {
329
369
  if (event.target === dialog) {
@@ -334,6 +374,19 @@ export function createPaneMenu(root, options, windows, refresh, report) {
334
374
  }
335
375
  });
336
376
  dialog.showModal();
377
+ positionMenus();
378
+ const observer = new win.ResizeObserver(positionMenus);
379
+ observer.observe(dialog);
380
+ observer.observe(anchor);
381
+ for (const { flyout } of flyouts)
382
+ observer.observe(flyout);
383
+ local.add(() => observer.disconnect());
384
+ local.listen(win, 'resize', positionMenus);
385
+ local.listen(doc, 'scroll', positionMenus, { capture: true });
386
+ if (win.visualViewport) {
387
+ local.listen(win.visualViewport, 'resize', positionMenus);
388
+ local.listen(win.visualViewport, 'scroll', positionMenus);
389
+ }
337
390
  dialog.focus({ preventScroll: true });
338
391
  }
339
392
  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 { 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 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('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 // 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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B;2EACuE;IACvE,MAAM,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,SAAS,CAAC;CACtF;AACD,mFAAmF;AACnF,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,SAAS,CAAyB;gBAC9B,OAAO,GAAE,SAAS,eAAe,EAAO;IAGpD,IAAI,IAAI,SAAS,eAAe,EAAE;IAGlC,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,IAAI;IAe5C,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAM3C,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B;2EACuE;IACvE,MAAM,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,SAAS,CAAC;CACtF;AACD,mFAAmF;AACnF,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,SAAS,CAAyB;IAC1C,YAAY,OAAO,GAAE,SAAS,eAAe,EAAO,EAEnD;IACD,IAAI,IAAI,SAAS,eAAe,EAAE,CAEjC;IACD,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,IAAI,CAc3C;IACD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAK1C;IACD,OAAO,CAAC,IAAI;CAGb"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAWA,mFAAmF;AACnF,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC7C,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAC1C,YAAY,UAAsC,EAAE;QAClD,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,QAAQ,CAAC,KAAsB;QAC7B,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC3B,GAAG,KAAK;YACR,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,MAAM;gBAAE,OAAO;YAClD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,QAAoB;QAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IACO,IAAI;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;CACF","sourcesContent":["import type { Pane } from 'quilt-core';\nexport interface TabRegistration {\n id: string;\n title: string;\n description?: string;\n icon?: string;\n keywords?: readonly string[];\n /** Source is undefined when creating content in a completely empty workspace.\n * Return a fresh pane with a unique id; undefined cancels creation. */\n create: (context: { source: Pane | undefined; groupId: string }) => Pane | undefined;\n}\n/** Available content types, independent of open pane instances and layout JSON. */\nexport class TabRegistry {\n private entries = new Map<string, TabRegistration>();\n private listeners = new Set<() => void>();\n constructor(entries: readonly TabRegistration[] = []) {\n for (const entry of entries) this.register(entry);\n }\n list(): readonly TabRegistration[] {\n return [...this.entries.values()];\n }\n register(entry: TabRegistration): () => void {\n if (!entry.id || this.entries.has(entry.id))\n throw new Error(`Duplicate or empty tab registration: ${entry.id}`);\n const stored = Object.freeze({\n ...entry,\n ...(entry.keywords ? { keywords: Object.freeze([...entry.keywords]) } : {}),\n });\n this.entries.set(entry.id, stored);\n this.emit();\n return () => {\n if (this.entries.get(entry.id) !== stored) return;\n this.entries.delete(entry.id);\n this.emit();\n };\n }\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n private emit() {\n for (const listener of this.listeners) listener();\n }\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAWA,mFAAmF;AACnF,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC7C,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAC1C,YAAY,OAAO,GAA+B,EAAE;QAClD,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,QAAQ,CAAC,KAAsB;QAC7B,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC3B,GAAG,KAAK;YACR,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,MAAM;gBAAE,OAAO;YAClD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,QAAoB;QAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IACO,IAAI;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;CACF","sourcesContent":["import type { Pane } from 'quilt-core';\nexport interface TabRegistration {\n id: string;\n title: string;\n description?: string;\n icon?: string;\n keywords?: readonly string[];\n /** Source is undefined when creating content in a completely empty workspace.\n * Return a fresh pane with a unique id; undefined cancels creation. */\n create: (context: { source: Pane | undefined; groupId: string }) => Pane | undefined;\n}\n/** Available content types, independent of open pane instances and layout JSON. */\nexport class TabRegistry {\n private entries = new Map<string, TabRegistration>();\n private listeners = new Set<() => void>();\n constructor(entries: readonly TabRegistration[] = []) {\n for (const entry of entries) this.register(entry);\n }\n list(): readonly TabRegistration[] {\n return [...this.entries.values()];\n }\n register(entry: TabRegistration): () => void {\n if (!entry.id || this.entries.has(entry.id))\n throw new Error(`Duplicate or empty tab registration: ${entry.id}`);\n const stored = Object.freeze({\n ...entry,\n ...(entry.keywords ? { keywords: Object.freeze([...entry.keywords]) } : {}),\n });\n this.entries.set(entry.id, stored);\n this.emit();\n return () => {\n if (this.entries.get(entry.id) !== stored) return;\n this.entries.delete(entry.id);\n this.emit();\n };\n }\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n private emit() {\n for (const listener of this.listeners) listener();\n }\n}\n"]}