quilt-core 0.2.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/model.d.ts +2 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +5 -3
- package/dist/model.js.map +1 -1
- package/package.json +1 -1
- package/src/model.ts +10 -4
package/README.md
CHANGED
|
@@ -71,13 +71,13 @@ See [API documentation](https://github.com/niko-dellic/quilt/blob/main/docs/api.
|
|
|
71
71
|
|
|
72
72
|
## Documentation
|
|
73
73
|
|
|
74
|
-
- [
|
|
75
|
-
- [
|
|
76
|
-
- [
|
|
77
|
-
- [
|
|
78
|
-
- [
|
|
79
|
-
- [
|
|
80
|
-
- [
|
|
74
|
+
- [Getting started](https://quilt-layouts.vercel.app/docs/)
|
|
75
|
+
- [API reference](https://quilt-layouts.vercel.app/docs/api-reference/)
|
|
76
|
+
- [Themes and tab bars](https://quilt-layouts.vercel.app/docs/theming)
|
|
77
|
+
- [Registration, React context, persistence, and confirmation](https://quilt-layouts.vercel.app/docs/integration)
|
|
78
|
+
- [Examples](https://quilt-layouts.vercel.app/docs/examples)
|
|
79
|
+
- [Troubleshooting](https://quilt-layouts.vercel.app/docs/troubleshooting)
|
|
80
|
+
- [Migration](https://quilt-layouts.vercel.app/docs/migration)
|
|
81
81
|
- [Changelog](https://github.com/niko-dellic/quilt/blob/main/CHANGELOG.md)
|
|
82
82
|
|
|
83
83
|
<!-- shared-docs:end -->
|
package/dist/model.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ export declare function findParent(root: Node, id: string): import('./types.js')
|
|
|
6
6
|
export declare function groups(root: Node): Group[];
|
|
7
7
|
export declare function paneIds(root: Node): string[];
|
|
8
8
|
export declare const DIVIDER = 4;
|
|
9
|
-
|
|
9
|
+
/** Aggregate model constraints, optionally resolving each group's bounds for a host renderer. */
|
|
10
|
+
export declare function bounds(node: Node, layout: Layout, resolveGroup?: (group: Group, constraints: Bounds) => Bounds): Bounds;
|
|
10
11
|
/** Returns content extents; overflow retains minimums, surplus beyond maximums stays empty. */
|
|
11
12
|
export declare function allocate(total: number, ratio: number, minA: number, maxA: number, minB: number, maxB: number, gap?: number): [number, number];
|
|
12
13
|
/** Create independent, validated JSON for an empty or single-pane workspace. */
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAQ,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAoBjF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,CAwJhD;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIlD;AACD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAMjE;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,YAAY,EAAE,KAAK,GAAG,SAAS,CAKzF;AACD,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,CAE1C;AACD,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAE5C;AASD,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,wBAAgB,MAAM,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAQ,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAoBjF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,CAwJhD;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIlD;AACD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAMjE;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,YAAY,EAAE,KAAK,GAAG,SAAS,CAKzF;AACD,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,CAE1C;AACD,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAE5C;AASD,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,iGAAiG;AACjG,wBAAgB,MAAM,CACpB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAC3D,MAAM,CA0BR;AACD,+FAA+F;AAC/F,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,SAAU,GACZ,CAAC,MAAM,EAAE,MAAM,CAAC,CAOlB;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CASpF"}
|
package/dist/model.js
CHANGED
|
@@ -206,17 +206,19 @@ function paneBounds(p) {
|
|
|
206
206
|
};
|
|
207
207
|
}
|
|
208
208
|
export const DIVIDER = 4;
|
|
209
|
-
|
|
209
|
+
/** Aggregate model constraints, optionally resolving each group's bounds for a host renderer. */
|
|
210
|
+
export function bounds(node, layout, resolveGroup) {
|
|
210
211
|
if (node.kind === 'group') {
|
|
211
212
|
const values = node.panes.map((id) => paneBounds(layout.panes[id]));
|
|
212
|
-
|
|
213
|
+
const constraints = {
|
|
213
214
|
minWidth: Math.max(0, ...values.map((b) => b.minWidth)),
|
|
214
215
|
maxWidth: Math.min(Infinity, ...values.map((b) => b.maxWidth)),
|
|
215
216
|
minHeight: Math.max(0, ...values.map((b) => b.minHeight)),
|
|
216
217
|
maxHeight: Math.min(Infinity, ...values.map((b) => b.maxHeight)),
|
|
217
218
|
};
|
|
219
|
+
return resolveGroup ? resolveGroup(node, constraints) : constraints;
|
|
218
220
|
}
|
|
219
|
-
const a = bounds(node.children[0], layout), b = bounds(node.children[1], layout);
|
|
221
|
+
const a = bounds(node.children[0], layout, resolveGroup), b = bounds(node.children[1], layout, resolveGroup);
|
|
220
222
|
return node.axis === 'horizontal'
|
|
221
223
|
? {
|
|
222
224
|
minWidth: a.minWidth + b.minWidth + (node.gap ?? DIVIDER),
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { LayoutError } from './types.js';\nimport type { Bounds, Group, Issue, Json, Layout, Node, Pane } from './types.js';\nconst record = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v);\nconst finite = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nfunction isJson(v: unknown, seen = new Set<unknown>(), depth = 0): v is Json {\n if (depth > 256) return false;\n if (v === null || typeof v === 'string' || typeof v === 'boolean') return true;\n if (typeof v === 'number') return Number.isFinite(v);\n if (typeof v !== 'object' || seen.has(v)) return false;\n if (\n !Array.isArray(v) &&\n Object.getPrototypeOf(v) !== Object.prototype &&\n Object.getPrototypeOf(v) !== null\n )\n return false;\n seen.add(v);\n const result = Object.values(v).every((x) => isJson(x, seen, depth + 1));\n seen.delete(v);\n return result;\n}\nexport function validate(input: unknown): Issue[] {\n const errors: Issue[] = [];\n const fail = (path: string, message: string) => {\n errors.push({ path, message });\n };\n if (!record(input) || !isJson(input))\n return [{ path: '$', message: 'Expected a finite, acyclic JSON object' }];\n if (input.version !== 1) fail('version', 'Expected version 1');\n if (!record(input.panes))\n return [...errors, { path: 'panes', message: 'Expected pane dictionary' }];\n const panes = input.panes;\n for (const [id, pane] of Object.entries(panes)) {\n if (\n !record(pane) ||\n pane.id !== id ||\n !id ||\n typeof pane.type !== 'string' ||\n !pane.type ||\n typeof pane.title !== 'string'\n ) {\n fail(`panes.${id}`, 'Expected matching id, type, and title');\n continue;\n }\n if (pane.confirmClose !== undefined && typeof pane.confirmClose !== 'boolean')\n fail(`panes.${id}.confirmClose`, 'Expected boolean');\n if (pane.icon !== undefined && typeof pane.icon !== 'string')\n fail(`panes.${id}.icon`, 'Expected string');\n if (pane.header !== undefined && typeof pane.header !== 'boolean')\n fail(`panes.${id}.header`, 'Expected boolean');\n if (pane.capabilities !== undefined) {\n if (!record(pane.capabilities)) fail(`panes.${id}.capabilities`, 'Expected object');\n else\n for (const [key, value] of Object.entries(pane.capabilities))\n if (\n !['resize', 'move', 'split', 'join', 'close', 'popout'].includes(key) ||\n typeof value !== 'boolean'\n )\n fail(`panes.${id}.capabilities.${key}`, 'Unknown capability or non-boolean flag');\n }\n if (pane.size !== undefined) {\n if (!record(pane.size)) fail(`panes.${id}.size`, 'Expected object');\n else {\n for (const [key, value] of Object.entries(pane.size))\n if (\n !['minWidth', 'maxWidth', 'minHeight', 'maxHeight'].includes(key) ||\n !finite(value) ||\n value < 0\n )\n fail(`panes.${id}.size.${key}`, 'Expected nonnegative finite size');\n for (const axis of ['Width', 'Height'])\n if (\n finite(pane.size['min' + axis]) &&\n finite(pane.size['max' + axis]) &&\n Number(pane.size['min' + axis]) > Number(pane.size['max' + axis])\n )\n fail(`panes.${id}.size`, 'Minimum exceeds maximum');\n }\n }\n }\n const ids = new Set<string>();\n const assigned = new Set<string>();\n const groups = new Set<string>();\n const use = (id: unknown, path: string) => {\n if (typeof id !== 'string' || !Object.hasOwn(panes, id)) fail(path, 'Unknown pane');\n else if (assigned.has(id)) fail(path, 'Pane is placed more than once');\n else assigned.add(id);\n };\n function walk(node: unknown, path: string, depth: number) {\n if (depth > 64) {\n fail(path, 'Maximum split depth is 64');\n return;\n }\n if (!record(node) || typeof node.id !== 'string' || !node.id) {\n fail(path, 'Expected node with id');\n return;\n }\n if (ids.has(node.id)) fail(path, 'Duplicate node id');\n ids.add(node.id);\n if (node.kind === 'group') {\n groups.add(node.id);\n if (\n node.tabDisplay !== undefined &&\n node.tabDisplay !== 'automatic' &&\n node.tabDisplay !== 'compact'\n )\n fail(path + '.tabDisplay', 'Expected automatic or compact');\n if (\n node.tabPlacement !== undefined &&\n node.tabPlacement !== 'top' &&\n node.tabPlacement !== 'left'\n )\n fail(path + '.tabPlacement', 'Expected top or left');\n if (!Array.isArray(node.panes)) {\n fail(path, 'Expected pane array');\n return;\n }\n node.panes.forEach((p, i) => use(p, `${path}.panes[${i}]`));\n if (node.panes.length ? !node.panes.includes(node.active) : node.active !== null)\n fail(path + '.active', 'Active tab must belong to group (or be null for empty group)');\n } else if (node.kind === 'split') {\n if (node.gap !== undefined && (!finite(node.gap) || node.gap < 0))\n fail(path + '.gap', 'Expected nonnegative divider space');\n if (!['horizontal', 'vertical'].includes(String(node.axis)))\n fail(path + '.axis', 'Expected horizontal or vertical');\n if (!finite(node.ratio) || node.ratio <= 0 || node.ratio >= 1)\n fail(path + '.ratio', 'Expected ratio between 0 and 1');\n if (!Array.isArray(node.children) || node.children.length !== 2)\n fail(path + '.children', 'Expected two children');\n else node.children.forEach((n, i) => walk(n, `${path}.children[${i}]`, depth + 1));\n } else fail(path + '.kind', 'Expected group or split');\n }\n walk(input.root, 'root', 0);\n if (!Array.isArray(input.popouts)) fail('popouts', 'Expected array');\n else\n input.popouts.forEach((p, i) => {\n const path = `popouts[${i}]`;\n if (!record(p)) {\n fail(path, 'Expected popout object');\n return;\n }\n use(p.paneId, path + '.paneId');\n if (typeof p.groupId !== 'string' || !Number.isInteger(p.index) || Number(p.index) < 0)\n fail(path, 'Expected return group id and nonnegative index');\n if (p.placement !== undefined) {\n if (!record(p.placement)) fail(path + '.placement', 'Expected placement object');\n else\n for (const [key, value] of Object.entries(p.placement))\n if (\n !['width', 'height', 'left', 'top'].includes(key) ||\n !finite(value) ||\n (['width', 'height'].includes(key) && value <= 0)\n )\n fail(path + '.placement.' + key, 'Invalid window placement');\n }\n });\n for (const id of Object.keys(panes))\n if (!assigned.has(id)) fail(`panes.${id}`, 'Pane has no placement');\n if (\n input.maximized !== null &&\n (typeof input.maximized !== 'string' || !groups.has(input.maximized))\n )\n fail('maximized', 'Expected a group id or null');\n if (!errors.length) {\n const check = (n: Node) => {\n const b = bounds(n, input as unknown as Layout);\n if (b.minWidth > b.maxWidth || b.minHeight > b.maxHeight)\n fail(n.id, 'Pane constraints cannot coexist in this region');\n if (n.kind === 'split') n.children.forEach(check);\n };\n check(input.root as unknown as Node);\n }\n return errors;\n}\nexport function parseLayout(input: unknown): Layout {\n const issues = validate(input);\n if (issues.length) throw new LayoutError(issues);\n return structuredClone(input) as Layout;\n}\nexport function findNode(root: Node, id: string): Node | undefined {\n return root.id === id\n ? root\n : root.kind === 'split'\n ? (findNode(root.children[0], id) ?? findNode(root.children[1], id))\n : undefined;\n}\nexport function findParent(root: Node, id: string): import('./types.js').Split | undefined {\n if (root.kind === 'group') return undefined;\n return root.children.some((n) => n.id === id)\n ? root\n : (findParent(root.children[0], id) ?? findParent(root.children[1], id));\n}\nexport function groups(root: Node): Group[] {\n return root.kind === 'group' ? [root] : root.children.flatMap(groups);\n}\nexport function paneIds(root: Node): string[] {\n return groups(root).flatMap((g) => g.panes);\n}\nfunction paneBounds(p: Pane): Bounds {\n return {\n minWidth: p.size?.minWidth ?? 0,\n maxWidth: p.size?.maxWidth ?? Infinity,\n minHeight: p.size?.minHeight ?? 0,\n maxHeight: p.size?.maxHeight ?? Infinity,\n };\n}\nexport const DIVIDER = 4;\nexport function bounds(node: Node, layout: Layout): Bounds {\n if (node.kind === 'group') {\n const values = node.panes.map((id) => paneBounds(layout.panes[id]!));\n return {\n minWidth: Math.max(0, ...values.map((b) => b.minWidth)),\n maxWidth: Math.min(Infinity, ...values.map((b) => b.maxWidth)),\n minHeight: Math.max(0, ...values.map((b) => b.minHeight)),\n maxHeight: Math.min(Infinity, ...values.map((b) => b.maxHeight)),\n };\n }\n const a = bounds(node.children[0], layout),\n b = bounds(node.children[1], layout);\n return node.axis === 'horizontal'\n ? {\n minWidth: a.minWidth + b.minWidth + (node.gap ?? DIVIDER),\n maxWidth: a.maxWidth + b.maxWidth + (node.gap ?? DIVIDER),\n minHeight: Math.max(a.minHeight, b.minHeight),\n maxHeight: Math.max(a.maxHeight, b.maxHeight),\n }\n : {\n minHeight: a.minHeight + b.minHeight + (node.gap ?? DIVIDER),\n maxHeight: a.maxHeight + b.maxHeight + (node.gap ?? DIVIDER),\n minWidth: Math.max(a.minWidth, b.minWidth),\n maxWidth: Math.max(a.maxWidth, b.maxWidth),\n };\n}\n/** Returns content extents; overflow retains minimums, surplus beyond maximums stays empty. */\nexport function allocate(\n total: number,\n ratio: number,\n minA: number,\n maxA: number,\n minB: number,\n maxB: number,\n gap = DIVIDER,\n): [number, number] {\n const available = Math.max(total - gap, minA + minB);\n const used = Math.min(available, maxA + maxB);\n const low = Math.max(minA, used - maxB),\n high = Math.min(maxA, used - minB);\n const a = Math.max(low, Math.min(high, used * ratio));\n return [a, used - a];\n}\n\n/** Create independent, validated JSON for an empty or single-pane workspace. */\nexport function createLayout(options: { pane?: Pane; groupId?: string } = {}): Layout {\n const { pane, groupId = 'main' } = options;\n return parseLayout({\n version: 1,\n root: { kind: 'group', id: groupId, panes: pane ? [pane.id] : [], active: pane?.id ?? null },\n panes: pane ? { [pane.id]: pane } : {},\n popouts: [],\n maximized: null,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { LayoutError } from './types.js';\nimport type { Bounds, Group, Issue, Json, Layout, Node, Pane } from './types.js';\nconst record = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v);\nconst finite = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nfunction isJson(v: unknown, seen = new Set<unknown>(), depth = 0): v is Json {\n if (depth > 256) return false;\n if (v === null || typeof v === 'string' || typeof v === 'boolean') return true;\n if (typeof v === 'number') return Number.isFinite(v);\n if (typeof v !== 'object' || seen.has(v)) return false;\n if (\n !Array.isArray(v) &&\n Object.getPrototypeOf(v) !== Object.prototype &&\n Object.getPrototypeOf(v) !== null\n )\n return false;\n seen.add(v);\n const result = Object.values(v).every((x) => isJson(x, seen, depth + 1));\n seen.delete(v);\n return result;\n}\nexport function validate(input: unknown): Issue[] {\n const errors: Issue[] = [];\n const fail = (path: string, message: string) => {\n errors.push({ path, message });\n };\n if (!record(input) || !isJson(input))\n return [{ path: '$', message: 'Expected a finite, acyclic JSON object' }];\n if (input.version !== 1) fail('version', 'Expected version 1');\n if (!record(input.panes))\n return [...errors, { path: 'panes', message: 'Expected pane dictionary' }];\n const panes = input.panes;\n for (const [id, pane] of Object.entries(panes)) {\n if (\n !record(pane) ||\n pane.id !== id ||\n !id ||\n typeof pane.type !== 'string' ||\n !pane.type ||\n typeof pane.title !== 'string'\n ) {\n fail(`panes.${id}`, 'Expected matching id, type, and title');\n continue;\n }\n if (pane.confirmClose !== undefined && typeof pane.confirmClose !== 'boolean')\n fail(`panes.${id}.confirmClose`, 'Expected boolean');\n if (pane.icon !== undefined && typeof pane.icon !== 'string')\n fail(`panes.${id}.icon`, 'Expected string');\n if (pane.header !== undefined && typeof pane.header !== 'boolean')\n fail(`panes.${id}.header`, 'Expected boolean');\n if (pane.capabilities !== undefined) {\n if (!record(pane.capabilities)) fail(`panes.${id}.capabilities`, 'Expected object');\n else\n for (const [key, value] of Object.entries(pane.capabilities))\n if (\n !['resize', 'move', 'split', 'join', 'close', 'popout'].includes(key) ||\n typeof value !== 'boolean'\n )\n fail(`panes.${id}.capabilities.${key}`, 'Unknown capability or non-boolean flag');\n }\n if (pane.size !== undefined) {\n if (!record(pane.size)) fail(`panes.${id}.size`, 'Expected object');\n else {\n for (const [key, value] of Object.entries(pane.size))\n if (\n !['minWidth', 'maxWidth', 'minHeight', 'maxHeight'].includes(key) ||\n !finite(value) ||\n value < 0\n )\n fail(`panes.${id}.size.${key}`, 'Expected nonnegative finite size');\n for (const axis of ['Width', 'Height'])\n if (\n finite(pane.size['min' + axis]) &&\n finite(pane.size['max' + axis]) &&\n Number(pane.size['min' + axis]) > Number(pane.size['max' + axis])\n )\n fail(`panes.${id}.size`, 'Minimum exceeds maximum');\n }\n }\n }\n const ids = new Set<string>();\n const assigned = new Set<string>();\n const groups = new Set<string>();\n const use = (id: unknown, path: string) => {\n if (typeof id !== 'string' || !Object.hasOwn(panes, id)) fail(path, 'Unknown pane');\n else if (assigned.has(id)) fail(path, 'Pane is placed more than once');\n else assigned.add(id);\n };\n function walk(node: unknown, path: string, depth: number) {\n if (depth > 64) {\n fail(path, 'Maximum split depth is 64');\n return;\n }\n if (!record(node) || typeof node.id !== 'string' || !node.id) {\n fail(path, 'Expected node with id');\n return;\n }\n if (ids.has(node.id)) fail(path, 'Duplicate node id');\n ids.add(node.id);\n if (node.kind === 'group') {\n groups.add(node.id);\n if (\n node.tabDisplay !== undefined &&\n node.tabDisplay !== 'automatic' &&\n node.tabDisplay !== 'compact'\n )\n fail(path + '.tabDisplay', 'Expected automatic or compact');\n if (\n node.tabPlacement !== undefined &&\n node.tabPlacement !== 'top' &&\n node.tabPlacement !== 'left'\n )\n fail(path + '.tabPlacement', 'Expected top or left');\n if (!Array.isArray(node.panes)) {\n fail(path, 'Expected pane array');\n return;\n }\n node.panes.forEach((p, i) => use(p, `${path}.panes[${i}]`));\n if (node.panes.length ? !node.panes.includes(node.active) : node.active !== null)\n fail(path + '.active', 'Active tab must belong to group (or be null for empty group)');\n } else if (node.kind === 'split') {\n if (node.gap !== undefined && (!finite(node.gap) || node.gap < 0))\n fail(path + '.gap', 'Expected nonnegative divider space');\n if (!['horizontal', 'vertical'].includes(String(node.axis)))\n fail(path + '.axis', 'Expected horizontal or vertical');\n if (!finite(node.ratio) || node.ratio <= 0 || node.ratio >= 1)\n fail(path + '.ratio', 'Expected ratio between 0 and 1');\n if (!Array.isArray(node.children) || node.children.length !== 2)\n fail(path + '.children', 'Expected two children');\n else node.children.forEach((n, i) => walk(n, `${path}.children[${i}]`, depth + 1));\n } else fail(path + '.kind', 'Expected group or split');\n }\n walk(input.root, 'root', 0);\n if (!Array.isArray(input.popouts)) fail('popouts', 'Expected array');\n else\n input.popouts.forEach((p, i) => {\n const path = `popouts[${i}]`;\n if (!record(p)) {\n fail(path, 'Expected popout object');\n return;\n }\n use(p.paneId, path + '.paneId');\n if (typeof p.groupId !== 'string' || !Number.isInteger(p.index) || Number(p.index) < 0)\n fail(path, 'Expected return group id and nonnegative index');\n if (p.placement !== undefined) {\n if (!record(p.placement)) fail(path + '.placement', 'Expected placement object');\n else\n for (const [key, value] of Object.entries(p.placement))\n if (\n !['width', 'height', 'left', 'top'].includes(key) ||\n !finite(value) ||\n (['width', 'height'].includes(key) && value <= 0)\n )\n fail(path + '.placement.' + key, 'Invalid window placement');\n }\n });\n for (const id of Object.keys(panes))\n if (!assigned.has(id)) fail(`panes.${id}`, 'Pane has no placement');\n if (\n input.maximized !== null &&\n (typeof input.maximized !== 'string' || !groups.has(input.maximized))\n )\n fail('maximized', 'Expected a group id or null');\n if (!errors.length) {\n const check = (n: Node) => {\n const b = bounds(n, input as unknown as Layout);\n if (b.minWidth > b.maxWidth || b.minHeight > b.maxHeight)\n fail(n.id, 'Pane constraints cannot coexist in this region');\n if (n.kind === 'split') n.children.forEach(check);\n };\n check(input.root as unknown as Node);\n }\n return errors;\n}\nexport function parseLayout(input: unknown): Layout {\n const issues = validate(input);\n if (issues.length) throw new LayoutError(issues);\n return structuredClone(input) as Layout;\n}\nexport function findNode(root: Node, id: string): Node | undefined {\n return root.id === id\n ? root\n : root.kind === 'split'\n ? (findNode(root.children[0], id) ?? findNode(root.children[1], id))\n : undefined;\n}\nexport function findParent(root: Node, id: string): import('./types.js').Split | undefined {\n if (root.kind === 'group') return undefined;\n return root.children.some((n) => n.id === id)\n ? root\n : (findParent(root.children[0], id) ?? findParent(root.children[1], id));\n}\nexport function groups(root: Node): Group[] {\n return root.kind === 'group' ? [root] : root.children.flatMap(groups);\n}\nexport function paneIds(root: Node): string[] {\n return groups(root).flatMap((g) => g.panes);\n}\nfunction paneBounds(p: Pane): Bounds {\n return {\n minWidth: p.size?.minWidth ?? 0,\n maxWidth: p.size?.maxWidth ?? Infinity,\n minHeight: p.size?.minHeight ?? 0,\n maxHeight: p.size?.maxHeight ?? Infinity,\n };\n}\nexport const DIVIDER = 4;\n/** Aggregate model constraints, optionally resolving each group's bounds for a host renderer. */\nexport function bounds(\n node: Node,\n layout: Layout,\n resolveGroup?: (group: Group, constraints: Bounds) => Bounds,\n): Bounds {\n if (node.kind === 'group') {\n const values = node.panes.map((id) => paneBounds(layout.panes[id]!));\n const constraints = {\n minWidth: Math.max(0, ...values.map((b) => b.minWidth)),\n maxWidth: Math.min(Infinity, ...values.map((b) => b.maxWidth)),\n minHeight: Math.max(0, ...values.map((b) => b.minHeight)),\n maxHeight: Math.min(Infinity, ...values.map((b) => b.maxHeight)),\n };\n return resolveGroup ? resolveGroup(node, constraints) : constraints;\n }\n const a = bounds(node.children[0], layout, resolveGroup),\n b = bounds(node.children[1], layout, resolveGroup);\n return node.axis === 'horizontal'\n ? {\n minWidth: a.minWidth + b.minWidth + (node.gap ?? DIVIDER),\n maxWidth: a.maxWidth + b.maxWidth + (node.gap ?? DIVIDER),\n minHeight: Math.max(a.minHeight, b.minHeight),\n maxHeight: Math.max(a.maxHeight, b.maxHeight),\n }\n : {\n minHeight: a.minHeight + b.minHeight + (node.gap ?? DIVIDER),\n maxHeight: a.maxHeight + b.maxHeight + (node.gap ?? DIVIDER),\n minWidth: Math.max(a.minWidth, b.minWidth),\n maxWidth: Math.max(a.maxWidth, b.maxWidth),\n };\n}\n/** Returns content extents; overflow retains minimums, surplus beyond maximums stays empty. */\nexport function allocate(\n total: number,\n ratio: number,\n minA: number,\n maxA: number,\n minB: number,\n maxB: number,\n gap = DIVIDER,\n): [number, number] {\n const available = Math.max(total - gap, minA + minB);\n const used = Math.min(available, maxA + maxB);\n const low = Math.max(minA, used - maxB),\n high = Math.min(maxA, used - minB);\n const a = Math.max(low, Math.min(high, used * ratio));\n return [a, used - a];\n}\n\n/** Create independent, validated JSON for an empty or single-pane workspace. */\nexport function createLayout(options: { pane?: Pane; groupId?: string } = {}): Layout {\n const { pane, groupId = 'main' } = options;\n return parseLayout({\n version: 1,\n root: { kind: 'group', id: groupId, panes: pane ? [pane.id] : [], active: pane?.id ?? null },\n panes: pane ? { [pane.id]: pane } : {},\n popouts: [],\n maximized: null,\n });\n}\n"]}
|
package/package.json
CHANGED
package/src/model.ts
CHANGED
|
@@ -205,18 +205,24 @@ function paneBounds(p: Pane): Bounds {
|
|
|
205
205
|
};
|
|
206
206
|
}
|
|
207
207
|
export const DIVIDER = 4;
|
|
208
|
-
|
|
208
|
+
/** Aggregate model constraints, optionally resolving each group's bounds for a host renderer. */
|
|
209
|
+
export function bounds(
|
|
210
|
+
node: Node,
|
|
211
|
+
layout: Layout,
|
|
212
|
+
resolveGroup?: (group: Group, constraints: Bounds) => Bounds,
|
|
213
|
+
): Bounds {
|
|
209
214
|
if (node.kind === 'group') {
|
|
210
215
|
const values = node.panes.map((id) => paneBounds(layout.panes[id]!));
|
|
211
|
-
|
|
216
|
+
const constraints = {
|
|
212
217
|
minWidth: Math.max(0, ...values.map((b) => b.minWidth)),
|
|
213
218
|
maxWidth: Math.min(Infinity, ...values.map((b) => b.maxWidth)),
|
|
214
219
|
minHeight: Math.max(0, ...values.map((b) => b.minHeight)),
|
|
215
220
|
maxHeight: Math.min(Infinity, ...values.map((b) => b.maxHeight)),
|
|
216
221
|
};
|
|
222
|
+
return resolveGroup ? resolveGroup(node, constraints) : constraints;
|
|
217
223
|
}
|
|
218
|
-
const a = bounds(node.children[0], layout),
|
|
219
|
-
b = bounds(node.children[1], layout);
|
|
224
|
+
const a = bounds(node.children[0], layout, resolveGroup),
|
|
225
|
+
b = bounds(node.children[1], layout, resolveGroup);
|
|
220
226
|
return node.axis === 'horizontal'
|
|
221
227
|
? {
|
|
222
228
|
minWidth: a.minWidth + b.minWidth + (node.gap ?? DIVIDER),
|