quilt-core 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +2 -0
- package/dist/model.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/model.ts +2 -0
- package/src/types.ts +2 -0
package/README.md
CHANGED
|
@@ -31,6 +31,6 @@ store.dispose();
|
|
|
31
31
|
|
|
32
32
|
`createLayout()` returns a fresh empty layout. `createLayout({ pane, groupId })` returns a validated clone, activates the supplied pane, and defaults `groupId` to `main`. It preserves IDs and throws `LayoutError` for invalid input. `parseLayout` validates complete JSON; `validate` returns issues without throwing for invalid layout input.
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
Development and verification use Node 24; browser use requires modern JavaScript support including `structuredClone`. This package needs no stylesheet or host element. The `quilt-vanilla` DOM adapter and `quilt-react` binding provide views. Application data and persistence remain application-owned.
|
|
35
35
|
|
|
36
36
|
See [API documentation](https://github.com/niko-dellic/quilt/blob/main/docs/api.md) and [migration notes](https://github.com/niko-dellic/quilt/blob/main/docs/migration.md).
|
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,
|
|
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,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAyBzD;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
|
@@ -41,6 +41,8 @@ export function validate(input) {
|
|
|
41
41
|
fail(`panes.${id}`, 'Expected matching id, type, and title');
|
|
42
42
|
continue;
|
|
43
43
|
}
|
|
44
|
+
if (pane.confirmClose !== undefined && typeof pane.confirmClose !== 'boolean')
|
|
45
|
+
fail(`panes.${id}.confirmClose`, 'Expected boolean');
|
|
44
46
|
if (pane.icon !== undefined && typeof pane.icon !== 'string')
|
|
45
47
|
fail(`panes.${id}.icon`, 'Expected string');
|
|
46
48
|
if (pane.header !== undefined && typeof pane.header !== 'boolean')
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,GAAG,CAAC,CAAU,EAAgC,EAAE,CAC1D,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,MAAM,MAAM,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxF,SAAS,MAAM,CAAC,CAAU,EAAE,IAAI,GAAG,IAAI,GAAG,EAAW,EAAE,KAAK,GAAG,CAAC;IAC9D,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/E,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS;QAC7C,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;QAEjC,OAAO,KAAK,CAAC;IACf,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACZ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACf,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE;QAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAClC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC;QAAE,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QACtB,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,IACE,CAAC,MAAM,CAAC,IAAI,CAAC;YACb,IAAI,CAAC,EAAE,KAAK,EAAE;YACd,CAAC,EAAE;YACH,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC7B,CAAC,IAAI,CAAC,IAAI;YACV,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAC9B,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,uCAAuC,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC1D,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS;YAC/D,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;;gBAElF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;oBAC1D,IACE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACrE,OAAO,KAAK,KAAK,SAAS;wBAE1B,IAAI,CAAC,SAAS,EAAE,iBAAiB,GAAG,EAAE,EAAE,wCAAwC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;iBAC/D,CAAC;gBACJ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;oBAClD,IACE,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACjE,CAAC,MAAM,CAAC,KAAK,CAAC;wBACd,KAAK,GAAG,CAAC;wBAET,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;gBACxE,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;oBACpC,IACE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;wBAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;wBAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;wBAEjE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,GAAG,GAAG,CAAC,EAAW,EAAE,IAAY,EAAE,EAAE;QACxC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;aAC/E,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;;YAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC;IACF,SAAS,IAAI,CAAC,IAAa,EAAE,IAAY,EAAE,KAAa;QACtD,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAC7D,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,IACE,IAAI,CAAC,UAAU,KAAK,SAAS;gBAC7B,IAAI,CAAC,UAAU,KAAK,WAAW;gBAC/B,IAAI,CAAC,UAAU,KAAK,SAAS;gBAE7B,IAAI,CAAC,IAAI,GAAG,aAAa,EAAE,+BAA+B,CAAC,CAAC;YAC9D,IACE,IAAI,CAAC,YAAY,KAAK,SAAS;gBAC/B,IAAI,CAAC,YAAY,KAAK,KAAK;gBAC3B,IAAI,CAAC,YAAY,KAAK,MAAM;gBAE5B,IAAI,CAAC,IAAI,GAAG,eAAe,EAAE,sBAAsB,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI;gBAC9E,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE,8DAA8D,CAAC,CAAC;QAC3F,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC/D,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,oCAAoC,CAAC,CAAC;YAC5D,IAAI,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,iCAAiC,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;gBAC3D,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,gCAAgC,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAC7D,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,uBAAuB,CAAC,CAAC;;gBAC/C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC;;YAAM,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,yBAAyB,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;;QAEnE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;gBACpF,IAAI,CAAC,IAAI,EAAE,gDAAgD,CAAC,CAAC;YAC/D,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;oBAAE,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,2BAA2B,CAAC,CAAC;;oBAE/E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;wBACpD,IACE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;4BACjD,CAAC,MAAM,CAAC,KAAK,CAAC;4BACd,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;4BAEjD,IAAI,CAAC,IAAI,GAAG,aAAa,GAAG,GAAG,EAAE,0BAA0B,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACtE,IACE,KAAK,CAAC,SAAS,KAAK,IAAI;QACxB,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAErE,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,CAAC,CAAO,EAAE,EAAE;YACxB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAA0B,CAAC,CAAC;YAChD,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS;gBACtD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,gDAAgD,CAAC,CAAC;YAC/D,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,IAAuB,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,eAAe,CAAC,KAAK,CAAW,CAAC;AAC1C,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,EAAU;IAC7C,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE;QACnB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;YACrB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC,SAAS,CAAC;AAClB,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,EAAU;IAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAC3C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AACD,MAAM,UAAU,MAAM,CAAC,IAAU;IAC/B,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,IAAU;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AACD,SAAS,UAAU,CAAC,CAAO;IACzB,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC;QAC/B,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,QAAQ;QACtC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC;QACjC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,IAAI,QAAQ;KACzC,CAAC;AACJ,CAAC;AACD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,UAAU,MAAM,CAAC,IAAU,EAAE,MAAc;IAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC;QACrE,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACvD,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC9D,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACzD,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SACjE,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EACxC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,IAAI,KAAK,YAAY;QAC/B,CAAC,CAAC;YACE,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;YACzD,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;YACzD,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;YAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;SAC9C;QACH,CAAC,CAAC;YACE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;YAC5D,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC;YAC5D,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;YAC1C,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;SAC3C,CAAC;AACR,CAAC;AACD,+FAA+F;AAC/F,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,KAAa,EACb,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,GAAG,GAAG,OAAO;IAEb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,EACrC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,OAAO,GAAsC,EAAE;IAC1E,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3C,OAAO,WAAW,CAAC;QACjB,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE;QAC5F,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;QACtC,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;AACL,CAAC","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.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;\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"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export type Json = null | boolean | number | string | Json[] | {
|
|
|
9
9
|
export type Capability = 'resize' | 'move' | 'split' | 'join' | 'close' | 'popout';
|
|
10
10
|
export type Axis = 'horizontal' | 'vertical';
|
|
11
11
|
export interface Pane {
|
|
12
|
+
/** Override the pane-type close confirmation default. */
|
|
13
|
+
confirmClose?: boolean;
|
|
12
14
|
id: string;
|
|
13
15
|
type: string;
|
|
14
16
|
title: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiEA,MAAM,OAAO,WAAY,SAAQ,KAAK;IACR,MAAM;IAAlC,YAA4B,MAAe;QACzC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;sBADrC,MAAM;QAEhC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF","sourcesContent":["export type AutoCollapse = 'enabled' | 'protected' | 'disabled';\nexport interface LayoutStoreOptions {\n /** Session policy; omitted defaults to disabled. Not serialized in Layout JSON. */\n autoCollapse?: AutoCollapse;\n}\nexport type Json = null | boolean | number | string | Json[] | { [key: string]: Json };\nexport type Capability = 'resize' | 'move' | 'split' | 'join' | 'close' | 'popout';\nexport type Axis = 'horizontal' | 'vertical';\nexport interface Pane {\n /** Override the pane-type close confirmation default. */\n confirmClose?: boolean;\n id: string;\n type: string;\n title: string;\n /** Application-defined icon key, resolved by the view adapter. */\n icon?: string;\n params?: Json;\n capabilities?: Partial<Record<Capability, boolean>>;\n size?: { minWidth?: number; maxWidth?: number; minHeight?: number; maxHeight?: number };\n /** Hide chrome only for a one-tab group. Host commands can still operate on it. */\n header?: boolean;\n}\nexport interface Group {\n kind: 'group';\n id: string;\n panes: string[];\n active: string | null;\n /** Persisted tab orientation for this region; omitted inherits renderer settings. */\n tabPlacement?: 'top' | 'left';\n /** Omitted inherits the workspace tab display setting. */\n tabDisplay?: 'automatic' | 'compact';\n}\nexport interface Split {\n kind: 'split';\n id: string;\n axis: Axis;\n ratio: number;\n /** Divider space in pixels; zero removes fixed-bar gaps. Default 4. */\n gap?: number;\n children: [Node, Node];\n}\nexport type Node = Group | Split;\nexport interface WindowPlacement {\n width?: number;\n height?: number;\n left?: number;\n top?: number;\n}\nexport interface Popout {\n paneId: string;\n groupId: string;\n index: number;\n placement?: WindowPlacement;\n}\nexport interface Layout {\n version: 1;\n root: Node;\n panes: Record<string, Pane>;\n popouts: Popout[];\n maximized: string | null;\n}\nexport interface Issue {\n path: string;\n message: string;\n}\nexport class LayoutError extends Error {\n constructor(public readonly issues: Issue[]) {\n super(issues.map((i) => `${i.path}: ${i.message}`).join('; '));\n this.name = 'LayoutError';\n }\n}\nexport interface CommandOptions {\n /** Treat capability flags as user-interaction restrictions. */ source?: 'user' | 'api';\n}\nexport interface Change {\n action: string;\n layout: Layout;\n}\nexport interface Bounds {\n minWidth: number;\n maxWidth: number;\n minHeight: number;\n maxHeight: number;\n}\n\nexport interface JoinOptions extends CommandOptions {\n /** Optional rendered extents along the join axis, keyed by node ID, including splits.\n * Supply the complete row to retain actual sizes under constraints and custom dividers.\n * Without measurements, joins retain proportional shares of the row/column.\n */\n extents?: Record<string, number>;\n}\n"]}
|
package/package.json
CHANGED
package/src/model.ts
CHANGED
|
@@ -42,6 +42,8 @@ export function validate(input: unknown): Issue[] {
|
|
|
42
42
|
fail(`panes.${id}`, 'Expected matching id, type, and title');
|
|
43
43
|
continue;
|
|
44
44
|
}
|
|
45
|
+
if (pane.confirmClose !== undefined && typeof pane.confirmClose !== 'boolean')
|
|
46
|
+
fail(`panes.${id}.confirmClose`, 'Expected boolean');
|
|
45
47
|
if (pane.icon !== undefined && typeof pane.icon !== 'string')
|
|
46
48
|
fail(`panes.${id}.icon`, 'Expected string');
|
|
47
49
|
if (pane.header !== undefined && typeof pane.header !== 'boolean')
|
package/src/types.ts
CHANGED
|
@@ -7,6 +7,8 @@ export type Json = null | boolean | number | string | Json[] | { [key: string]:
|
|
|
7
7
|
export type Capability = 'resize' | 'move' | 'split' | 'join' | 'close' | 'popout';
|
|
8
8
|
export type Axis = 'horizontal' | 'vertical';
|
|
9
9
|
export interface Pane {
|
|
10
|
+
/** Override the pane-type close confirmation default. */
|
|
11
|
+
confirmClose?: boolean;
|
|
10
12
|
id: string;
|
|
11
13
|
type: string;
|
|
12
14
|
title: string;
|