quilt-vanilla 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/dist/action-icons.d.ts +18 -0
- package/dist/action-icons.d.ts.map +1 -0
- package/dist/action-icons.js +36 -0
- package/dist/action-icons.js.map +1 -0
- package/dist/chrome-icons.d.ts +3 -0
- package/dist/chrome-icons.d.ts.map +1 -0
- package/dist/chrome-icons.js +32 -0
- package/dist/chrome-icons.js.map +1 -0
- package/dist/corners.d.ts +8 -0
- package/dist/corners.d.ts.map +1 -0
- package/dist/corners.js +205 -0
- package/dist/corners.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lifetime.d.ts +10 -0
- package/dist/lifetime.d.ts.map +1 -0
- package/dist/lifetime.js +44 -0
- package/dist/lifetime.js.map +1 -0
- package/dist/menu.d.ts +10 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +356 -0
- package/dist/menu.js.map +1 -0
- package/dist/panes.d.ts +13 -0
- package/dist/panes.d.ts.map +1 -0
- package/dist/panes.js +58 -0
- package/dist/panes.js.map +1 -0
- package/dist/picker.d.ts +6 -0
- package/dist/picker.d.ts.map +1 -0
- package/dist/picker.js +112 -0
- package/dist/picker.js.map +1 -0
- package/dist/registry.d.ts +25 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +39 -0
- package/dist/registry.js.map +1 -0
- package/dist/renderer.d.ts +3 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +570 -0
- package/dist/renderer.js.map +1 -0
- package/dist/resize.d.ts +7 -0
- package/dist/resize.d.ts.map +1 -0
- package/dist/resize.js +56 -0
- package/dist/resize.js.map +1 -0
- package/dist/shortcuts.d.ts +6 -0
- package/dist/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts.js +64 -0
- package/dist/shortcuts.js.map +1 -0
- package/dist/styles.css +842 -0
- package/dist/tab-bar.d.ts +6 -0
- package/dist/tab-bar.d.ts.map +1 -0
- package/dist/tab-bar.js +336 -0
- package/dist/tab-bar.js.map +1 -0
- package/dist/tab-tooltip.d.ts +4 -0
- package/dist/tab-tooltip.d.ts.map +1 -0
- package/dist/tab-tooltip.js +95 -0
- package/dist/tab-tooltip.js.map +1 -0
- package/dist/tabs.d.ts +15 -0
- package/dist/tabs.d.ts.map +1 -0
- package/dist/tabs.js +126 -0
- package/dist/tabs.js.map +1 -0
- package/dist/theme.d.ts +206 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +166 -0
- package/dist/theme.js.map +1 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/windows.d.ts +23 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +247 -0
- package/dist/windows.js.map +1 -0
- package/package.json +50 -0
- package/src/action-icons.ts +40 -0
- package/src/chrome-icons.ts +30 -0
- package/src/corners.ts +259 -0
- package/src/index.ts +27 -0
- package/src/lifetime.ts +46 -0
- package/src/menu.ts +432 -0
- package/src/panes.ts +76 -0
- package/src/picker.ts +114 -0
- package/src/registry.ts +46 -0
- package/src/renderer.ts +654 -0
- package/src/resize.ts +65 -0
- package/src/shortcuts.ts +90 -0
- package/src/styles.css +842 -0
- package/src/tab-bar.ts +382 -0
- package/src/tab-tooltip.ts +96 -0
- package/src/tabs.ts +129 -0
- package/src/theme.ts +211 -0
- package/src/types.ts +67 -0
- package/src/windows.ts +244 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Group, Pane } from 'quilt-core';\nimport type { LayoutOptions } from './types.js';\nimport type { TabRegistration } from './registry.js';\nimport { el, Scope } from './lifetime.js';\nlet sequence = 0;\n/** Search remains focused while aria-activedescendant tracks keyboard selection. */\nexport function fillTabPicker(\n dialog: HTMLElement,\n scope: Scope,\n options: LayoutOptions,\n source: Pane | undefined,\n group: Group,\n choose: (pane: Pane) => void,\n report: (error: unknown) => void,\n persistent = false,\n) {\n const doc = dialog.ownerDocument;\n const input = el(doc, 'input', 'layouts-picker-search');\n input.type = 'search';\n input.placeholder = 'Search tabs…';\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-label', 'Search tabs');\n input.setAttribute('aria-expanded', 'true');\n input.setAttribute('aria-autocomplete', 'list');\n const list = el(doc, 'div', 'layouts-picker-list');\n list.id = `layouts-picker-${++sequence}`;\n list.setAttribute('role', 'listbox');\n list.setAttribute('aria-label', 'Available tabs');\n input.setAttribute('aria-controls', list.id);\n const status = el(doc, 'div', 'layouts-picker-status');\n status.setAttribute('role', 'status');\n let matches: readonly TabRegistration[] = [],\n selected = 0;\n function select(entry: TabRegistration) {\n try {\n const pane = entry.create({ source, groupId: group.id });\n if (pane) {\n choose(pane);\n scope.dispose();\n }\n } catch (error) {\n status.textContent = error instanceof Error ? error.message : String(error);\n report(error);\n }\n }\n function paint() {\n list.replaceChildren();\n matches.forEach((entry, index) => {\n const option = el(doc, 'div', 'layouts-picker-option');\n option.id = `${list.id}-${index}`;\n option.setAttribute('role', 'option');\n option.setAttribute('aria-selected', String(index === selected));\n option.setAttribute('aria-label', entry.title);\n if (entry.icon) {\n const icon = el(doc, 'span', 'layouts-tab-icon');\n icon.setAttribute('aria-hidden', 'true');\n try {\n const node = options.renderIcon?.(entry.icon, doc);\n if (node) icon.append(node);\n } catch (error) {\n report(error);\n }\n option.append(icon);\n }\n const text = el(doc, 'span', '');\n text.append(el(doc, 'strong', '', entry.title));\n if (entry.description) text.append(el(doc, 'small', '', entry.description));\n option.append(text);\n option.onmousedown = (e) => e.preventDefault();\n option.onclick = () => select(entry);\n list.append(option);\n });\n if (matches[selected]) {\n input.setAttribute('aria-activedescendant', `${list.id}-${selected}`);\n list.children[selected]?.scrollIntoView({ block: 'nearest' });\n } else input.removeAttribute('aria-activedescendant');\n status.textContent = matches.length ? `${matches.length} tab types` : 'No matching tabs';\n }\n function search() {\n const terms = input.value.toLocaleLowerCase().trim().split(/\\s+/);\n matches = (options.tabs?.list() ?? []).filter((entry) => {\n const text = [entry.title, entry.description ?? '', ...(entry.keywords ?? [])]\n .join(' ')\n .toLocaleLowerCase();\n return terms.every((term) => text.includes(term));\n });\n selected = 0;\n paint();\n }\n input.oninput = search;\n input.onkeydown = (e) => {\n if (persistent && e.key === 'Escape') {\n e.preventDefault();\n input.blur();\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n if (matches.length)\n selected = (selected + (e.key === 'ArrowDown' ? 1 : matches.length - 1)) % matches.length;\n paint();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const entry = matches[selected];\n if (entry) select(entry);\n }\n };\n const cancel = el(doc, 'button', 'layouts-button', 'Cancel');\n cancel.type = 'button';\n cancel.onclick = () => scope.dispose();\n dialog.replaceChildren(input, list, status, ...(persistent ? [] : [cancel]));\n dialog.setAttribute('aria-label', 'Choose a tab');\n if (options.tabs) scope.add(options.tabs.subscribe(search));\n search();\n input.focus();\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Pane } from 'quilt-core';
|
|
2
|
+
export interface TabRegistration {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
icon?: string;
|
|
7
|
+
keywords?: readonly string[];
|
|
8
|
+
/** Source is undefined when creating content in a completely empty workspace.
|
|
9
|
+
* Return a fresh pane with a unique id; undefined cancels creation. */
|
|
10
|
+
create: (context: {
|
|
11
|
+
source: Pane | undefined;
|
|
12
|
+
groupId: string;
|
|
13
|
+
}) => Pane | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Available content types, independent of open pane instances and layout JSON. */
|
|
16
|
+
export declare class TabRegistry {
|
|
17
|
+
private entries;
|
|
18
|
+
private listeners;
|
|
19
|
+
constructor(entries?: readonly TabRegistration[]);
|
|
20
|
+
list(): readonly TabRegistration[];
|
|
21
|
+
register(entry: TabRegistration): () => void;
|
|
22
|
+
subscribe(listener: () => void): () => void;
|
|
23
|
+
private emit;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Available content types, independent of open pane instances and layout JSON. */
|
|
2
|
+
export class TabRegistry {
|
|
3
|
+
entries = new Map();
|
|
4
|
+
listeners = new Set();
|
|
5
|
+
constructor(entries = []) {
|
|
6
|
+
for (const entry of entries)
|
|
7
|
+
this.register(entry);
|
|
8
|
+
}
|
|
9
|
+
list() {
|
|
10
|
+
return [...this.entries.values()];
|
|
11
|
+
}
|
|
12
|
+
register(entry) {
|
|
13
|
+
if (!entry.id || this.entries.has(entry.id))
|
|
14
|
+
throw new Error(`Duplicate or empty tab registration: ${entry.id}`);
|
|
15
|
+
const stored = Object.freeze({
|
|
16
|
+
...entry,
|
|
17
|
+
...(entry.keywords ? { keywords: Object.freeze([...entry.keywords]) } : {}),
|
|
18
|
+
});
|
|
19
|
+
this.entries.set(entry.id, stored);
|
|
20
|
+
this.emit();
|
|
21
|
+
return () => {
|
|
22
|
+
if (this.entries.get(entry.id) !== stored)
|
|
23
|
+
return;
|
|
24
|
+
this.entries.delete(entry.id);
|
|
25
|
+
this.emit();
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
subscribe(listener) {
|
|
29
|
+
this.listeners.add(listener);
|
|
30
|
+
return () => {
|
|
31
|
+
this.listeners.delete(listener);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
emit() {
|
|
35
|
+
for (const listener of this.listeners)
|
|
36
|
+
listener();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiB/D,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,CAmnBpF"}
|