@ankhorage/studio 0.0.6 → 0.0.8

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 CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @ankhorage/studio
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v0.0.5](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v0.0.7](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Standalone Studio authoring package for Ankhorage apps.
9
9
 
@@ -0,0 +1,22 @@
1
+ import type { UiNode } from '@ankhorage/contracts';
2
+ import type { NodePlacement, PlacementKind, StudioComponentMetaRegistry } from './index';
3
+ export interface ValidCanvasDropZoneResolution {
4
+ kind: PlacementKind;
5
+ status: 'valid';
6
+ placement: NodePlacement;
7
+ }
8
+ interface InvalidCanvasDropZoneResolution {
9
+ kind: PlacementKind;
10
+ status: 'invalid';
11
+ reason: string;
12
+ }
13
+ export type CanvasDropZoneResolution = ValidCanvasDropZoneResolution | InvalidCanvasDropZoneResolution;
14
+ export declare function resolveCanvasDropZones(args: {
15
+ root: UiNode;
16
+ targetNodeId: string;
17
+ draggedNode: UiNode;
18
+ componentMeta: StudioComponentMetaRegistry;
19
+ }): readonly CanvasDropZoneResolution[];
20
+ export declare function getValidCanvasDropZones(zones: readonly CanvasDropZoneResolution[]): readonly ValidCanvasDropZoneResolution[];
21
+ export {};
22
+ //# sourceMappingURL=canvasDropZones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasDropZones.d.ts","sourceRoot":"","sources":["../src/canvasDropZones.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAGzF,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,UAAU,+BAA+B;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,wBAAwB,GAClC,6BAA6B,GAAG,+BAA+B,CAAC;AAIlE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,2BAA2B,CAAC;CAC5C,GAAG,SAAS,wBAAwB,EAAE,CAkCtC;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,wBAAwB,EAAE,GACzC,SAAS,6BAA6B,EAAE,CAE1C"}
@@ -0,0 +1,37 @@
1
+ import { resolveInsertPlacement } from './index';
2
+ const DROP_ZONE_KINDS = ['before', 'inside', 'after'];
3
+ export function resolveCanvasDropZones(args) {
4
+ const { root, targetNodeId, draggedNode, componentMeta } = args;
5
+ return DROP_ZONE_KINDS.map((kind) => {
6
+ if (draggedNode.id === targetNodeId) {
7
+ return {
8
+ kind,
9
+ status: 'invalid',
10
+ reason: 'Cannot drop a node onto itself.',
11
+ };
12
+ }
13
+ const placement = resolveInsertPlacement({
14
+ root,
15
+ targetNodeId,
16
+ childType: draggedNode.type,
17
+ componentMeta,
18
+ kind,
19
+ });
20
+ if (!placement.ok) {
21
+ return {
22
+ kind,
23
+ status: 'invalid',
24
+ reason: placement.reason.message,
25
+ };
26
+ }
27
+ return {
28
+ kind,
29
+ status: 'valid',
30
+ placement: placement.placement,
31
+ };
32
+ });
33
+ }
34
+ export function getValidCanvasDropZones(zones) {
35
+ return zones.filter((zone) => zone.status === 'valid');
36
+ }
37
+ //# sourceMappingURL=canvasDropZones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasDropZones.js","sourceRoot":"","sources":["../src/canvasDropZones.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAiBjD,MAAM,eAAe,GAA6B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAEhF,MAAM,UAAU,sBAAsB,CAAC,IAKtC;IACC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAEhE,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,WAAW,CAAC,EAAE,KAAK,YAAY,EAAE,CAAC;YACpC,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,iCAAiC;aAC1C,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,sBAAsB,CAAC;YACvC,IAAI;YACJ,YAAY;YACZ,SAAS,EAAE,WAAW,CAAC,IAAI;YAC3B,aAAa;YACb,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO;aACjC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAA0C;IAE1C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAyC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;AAChG,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RouteDefinition } from '@ankhorage/contracts';
2
+ export type { ScreenRouteEntry, ScreenRouteGroup } from './manifestState';
3
+ export { collectScreenRouteEntries, findNavigatorAtPath, findParentPathForScreenId, findRoutesAtParentPath, getPrimaryNavigatorPath, groupScreenRouteEntries, insertRouteAtParentPath, isRouteGroupSegment, listScreenIdsInRouteOrder, makeUniqueRouteNameForParent, makeUniqueSiblingRouteName, pathToKey, removeScreenIdFromRoutes, toCanonicalRoutePattern, updateNavigatorAtPath, } from './manifestState';
4
+ export declare function reorderLeafRoutesWithinParent(routes: RouteDefinition[], parentPath: string[], orderedRouteNames: string[]): RouteDefinition[];
5
+ //# sourceMappingURL=routeUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routeUtils.d.ts","sourceRoot":"","sources":["../src/routeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,SAAS,EACT,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,eAAe,EAAE,EACzB,UAAU,EAAE,MAAM,EAAE,EACpB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,eAAe,EAAE,CAoBnB"}
@@ -0,0 +1,43 @@
1
+ export { collectScreenRouteEntries, findNavigatorAtPath, findParentPathForScreenId, findRoutesAtParentPath, getPrimaryNavigatorPath, groupScreenRouteEntries, insertRouteAtParentPath, isRouteGroupSegment, listScreenIdsInRouteOrder, makeUniqueRouteNameForParent, makeUniqueSiblingRouteName, pathToKey, removeScreenIdFromRoutes, toCanonicalRoutePattern, updateNavigatorAtPath, } from './manifestState';
2
+ export function reorderLeafRoutesWithinParent(routes, parentPath, orderedRouteNames) {
3
+ if (parentPath.length === 0) {
4
+ return reorderMatchingRoutes(routes, orderedRouteNames);
5
+ }
6
+ const [segment, ...rest] = parentPath;
7
+ return routes.map((route) => {
8
+ if (route.name !== segment || !route.navigator?.routes) {
9
+ return route;
10
+ }
11
+ return {
12
+ ...route,
13
+ navigator: {
14
+ ...route.navigator,
15
+ routes: reorderLeafRoutesWithinParent(route.navigator.routes, rest, orderedRouteNames),
16
+ },
17
+ };
18
+ });
19
+ }
20
+ function reorderMatchingRoutes(routes, orderedRouteNames) {
21
+ const rank = new Map(orderedRouteNames.map((name, index) => [name, index]));
22
+ const sortableRoutes = routes
23
+ .filter((route) => rank.has(route.name))
24
+ .sort((a, b) => (rank.get(a.name) ?? 0) - (rank.get(b.name) ?? 0));
25
+ if (sortableRoutes.length <= 1) {
26
+ return routes;
27
+ }
28
+ let cursor = 0;
29
+ return routes.map((route) => {
30
+ if (!rank.has(route.name))
31
+ return route;
32
+ if (cursor >= sortableRoutes.length) {
33
+ return route;
34
+ }
35
+ const next = sortableRoutes[cursor];
36
+ if (!next) {
37
+ return route;
38
+ }
39
+ cursor += 1;
40
+ return next;
41
+ });
42
+ }
43
+ //# sourceMappingURL=routeUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routeUtils.js","sourceRoot":"","sources":["../src/routeUtils.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,SAAS,EACT,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,UAAU,6BAA6B,CAC3C,MAAyB,EACzB,UAAoB,EACpB,iBAA2B;IAE3B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC;IAEtC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO;YACL,GAAG,KAAK;YACR,SAAS,EAAE;gBACT,GAAG,KAAK,CAAC,SAAS;gBAClB,MAAM,EAAE,6BAA6B,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC;aACvF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAyB,EACzB,iBAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,MAAM;SAC1B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAErE,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,CAAC,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhorage/studio",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "Studio authoring package for Ankhorage apps",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/ankhorage/studio#readme",
@@ -28,6 +28,10 @@
28
28
  "types": "./dist/index.d.ts",
29
29
  "import": "./dist/index.js"
30
30
  },
31
+ "./canvasDropZones": {
32
+ "types": "./dist/canvasDropZones.d.ts",
33
+ "import": "./dist/canvasDropZones.js"
34
+ },
31
35
  "./manifestState": {
32
36
  "types": "./dist/manifestState.d.ts",
33
37
  "import": "./dist/manifestState.js"
@@ -35,6 +39,10 @@
35
39
  "./manifestSync": {
36
40
  "types": "./dist/manifestSync.d.ts",
37
41
  "import": "./dist/manifestSync.js"
42
+ },
43
+ "./routeUtils": {
44
+ "types": "./dist/routeUtils.d.ts",
45
+ "import": "./dist/routeUtils.js"
38
46
  }
39
47
  },
40
48
  "scripts": {