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.
Files changed (98) hide show
  1. package/README.md +6 -0
  2. package/dist/action-icons.d.ts +12 -12
  3. package/dist/action-icons.d.ts.map +1 -1
  4. package/dist/action-icons.js.map +1 -1
  5. package/dist/close.d.ts +4 -0
  6. package/dist/close.d.ts.map +1 -0
  7. package/dist/close.js +95 -0
  8. package/dist/close.js.map +1 -0
  9. package/dist/corners.d.ts +2 -2
  10. package/dist/corners.d.ts.map +1 -1
  11. package/dist/corners.js +15 -7
  12. package/dist/corners.js.map +1 -1
  13. package/dist/index.d.ts +7 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/lifetime.d.ts.map +1 -1
  18. package/dist/lifetime.js +1 -0
  19. package/dist/lifetime.js.map +1 -1
  20. package/dist/menu.d.ts +3 -3
  21. package/dist/menu.d.ts.map +1 -1
  22. package/dist/menu.js +93 -33
  23. package/dist/menu.js.map +1 -1
  24. package/dist/messages.d.ts +62 -0
  25. package/dist/messages.d.ts.map +1 -0
  26. package/dist/messages.js +62 -0
  27. package/dist/messages.js.map +1 -0
  28. package/dist/panes.d.ts +2 -2
  29. package/dist/panes.d.ts.map +1 -1
  30. package/dist/panes.js +20 -4
  31. package/dist/panes.js.map +1 -1
  32. package/dist/picker.d.ts +2 -2
  33. package/dist/picker.d.ts.map +1 -1
  34. package/dist/picker.js +9 -6
  35. package/dist/picker.js.map +1 -1
  36. package/dist/registry.d.ts +21 -0
  37. package/dist/registry.d.ts.map +1 -1
  38. package/dist/registry.js +61 -0
  39. package/dist/registry.js.map +1 -1
  40. package/dist/renderer.d.ts +1 -1
  41. package/dist/renderer.d.ts.map +1 -1
  42. package/dist/renderer.js +169 -25
  43. package/dist/renderer.js.map +1 -1
  44. package/dist/shortcuts.d.ts +5 -3
  45. package/dist/shortcuts.d.ts.map +1 -1
  46. package/dist/shortcuts.js +57 -41
  47. package/dist/shortcuts.js.map +1 -1
  48. package/dist/styles.css +14 -23
  49. package/dist/styles.css.d.ts +2 -0
  50. package/dist/tab-bar.d.ts +2 -1
  51. package/dist/tab-bar.d.ts.map +1 -1
  52. package/dist/tab-bar.js +25 -4
  53. package/dist/tab-bar.js.map +1 -1
  54. package/dist/tab-tooltip.d.ts +2 -1
  55. package/dist/tab-tooltip.d.ts.map +1 -1
  56. package/dist/tab-tooltip.js +5 -2
  57. package/dist/tab-tooltip.js.map +1 -1
  58. package/dist/tabs.d.ts +3 -2
  59. package/dist/tabs.d.ts.map +1 -1
  60. package/dist/tabs.js +3 -2
  61. package/dist/tabs.js.map +1 -1
  62. package/dist/theme.d.ts +122 -119
  63. package/dist/theme.d.ts.map +1 -1
  64. package/dist/theme.js +31 -0
  65. package/dist/theme.js.map +1 -1
  66. package/dist/types.d.ts +58 -11
  67. package/dist/types.d.ts.map +1 -1
  68. package/dist/types.js.map +1 -1
  69. package/dist/windows.d.ts +8 -4
  70. package/dist/windows.d.ts.map +1 -1
  71. package/dist/windows.js +118 -23
  72. package/dist/windows.js.map +1 -1
  73. package/dist/workspace.d.ts +14 -0
  74. package/dist/workspace.d.ts.map +1 -0
  75. package/dist/workspace.js +39 -0
  76. package/dist/workspace.js.map +1 -0
  77. package/package.json +6 -3
  78. package/src/action-icons.ts +2 -2
  79. package/src/close.ts +120 -0
  80. package/src/corners.ts +28 -9
  81. package/src/index.ts +7 -0
  82. package/src/lifetime.ts +1 -0
  83. package/src/menu.ts +112 -39
  84. package/src/messages.ts +71 -0
  85. package/src/panes.ts +20 -6
  86. package/src/picker.ts +11 -8
  87. package/src/registry.ts +71 -0
  88. package/src/renderer.ts +205 -38
  89. package/src/shortcuts.ts +63 -54
  90. package/src/styles.css +14 -23
  91. package/src/styles.css.d.ts +2 -0
  92. package/src/tab-bar.ts +30 -5
  93. package/src/tab-tooltip.ts +6 -1
  94. package/src/tabs.ts +6 -4
  95. package/src/theme.ts +30 -0
  96. package/src/types.ts +57 -11
  97. package/src/windows.ts +127 -23
  98. 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 ? `${pane.title} actions` : 'Empty pane actions');
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 ? `${targetTitle} keeps all tabs` : `Joins ${targetTitle}`));
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 ? 'Restore region' : 'Maximize region', true, () => options.store.maximize(options.store.getSnapshot().maximized === group.id ? null : group.id));
272
- if (group.panes.length && pane) {
273
- add('popout', windows.pending.has(pane.id) ? 'Reopen window' : 'Open in window', options.store.can(pane.id, 'popout'), () => {
274
- windows.open(pane.id, windows.pending.get(pane.id));
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'), () => options.store.close(pane.id, { source: 'user' }));
316
- add('close', 'Close pane', group.panes.every((id) => options.store.can(id, 'close')), () => options.store.closeGroup(group.id, { source: 'user' }));
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
- 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`;
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"}
@@ -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 { LayoutOptions, PaneView, PaneRenderer } from './types.js';
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: LayoutOptions): MountedPane;
12
+ export declare function mountPane(doc: Document, pane: Pane, location: 'main' | 'popout', options: ResolvedLayoutOptions): MountedPane;
13
13
  //# sourceMappingURL=panes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"panes.d.ts","sourceRoot":"","sources":["../src/panes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAExE,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,aAAa,GACrB,WAAW,CA0Db"}
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"}