@graview/embed 0.1.12 → 0.1.15

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/dist/where.js ADDED
@@ -0,0 +1,94 @@
1
+ import { addressOf, pathWithin, placeSlug } from "@graview/core";
2
+ import { aggregateId, AGGREGATE_PREFIX, fromUrl, kindOfCard, toUrl, withFocus } from "@graview/layout/view";
3
+ import { faceAtAddress, stopAtAddress } from "./address.js";
4
+ const slugOf = (schema, kind) => placeSlug(schema.tryDefinition(kind)?.plural ?? `${kind}s`);
5
+ /** Whether one of the app's own routes (`/survey`, `/desk/:id`) answers a path. */
6
+ function answers(route, parts) {
7
+ const own = route.split("/").filter(Boolean);
8
+ return own.length === parts.length && own.every((part, at) => part.startsWith(":") || part === "*" || part === parts[at]);
9
+ }
10
+ /** The framework's own pages, which every app has. */
11
+ const OWN = ["problems", "search", "map", "places"];
12
+ /**
13
+ * A place, settled in the app it is now in. What the change took away falls
14
+ * back to its nearest parent: a removed record to its kind's list (on Pages)
15
+ * or its kind's group (in the scene); a removed kind, place or lens to the
16
+ * home — a lens in the scene to its kind's group when the kind is still there.
17
+ * A path that is no kind's, the app's own routes, is kept.
18
+ */
19
+ export function settle(where, app, store, places, routes = []) {
20
+ const { schema } = app;
21
+ const kinds = schema.kinds;
22
+ const known = (id) => {
23
+ if (id.startsWith(AGGREGATE_PREFIX))
24
+ return (id.slice(AGGREGATE_PREFIX.length).split("|")[0] ?? "").split("+").every((kind) => kinds.includes(kind));
25
+ const card = kindOfCard(id);
26
+ if (card !== null)
27
+ return kinds.includes(card);
28
+ return id.startsWith("edge:") || store.graph.getNode(id) !== undefined;
29
+ };
30
+ // The page: `/<plural>`, `/<plural>/<id>`, `/places/<as>`.
31
+ const [pathname = "/", search] = where.path.split("?");
32
+ const parts = pathname.split("/").filter(Boolean);
33
+ const query = search ? `?${search}` : "";
34
+ const kind = parts.length > 0 && !OWN.includes(parts[0]) ? kinds.find((one) => slugOf(schema, one) === parts[0]) : undefined;
35
+ let path = where.path;
36
+ if (parts[0] === "places" && parts.length === 2) {
37
+ if (!places.some((place) => place.as === decodeURIComponent(parts[1])))
38
+ path = "/";
39
+ }
40
+ else if (kind) {
41
+ const id = parts[1] === undefined ? undefined : decodeURIComponent(parts[1]);
42
+ path = `/${slugOf(schema, kind)}${id !== undefined && store.graph.getNode(id)?.kind === kind ? `/${parts[1]}` : ""}${query}`;
43
+ }
44
+ else if (parts.length > 0 && parts.length <= 2 && !OWN.includes(parts[0]) && !routes.some((route) => answers(route.path, parts))) {
45
+ // No kind of the new app's, and none of its own pages: a kind the change took away.
46
+ path = "/";
47
+ }
48
+ // The stop: its focus, its lens, and what it holds open.
49
+ const was = fromUrl(where.stop);
50
+ const lens = was.within?.["view"];
51
+ const lensGone = lens !== undefined && !places.some((place) => place.as === lens);
52
+ let view = was;
53
+ if (lensGone) {
54
+ const { view: _gone, ...rest } = was.within ?? {};
55
+ view = { ...view, within: rest };
56
+ }
57
+ if (was.focusId && !known(was.focusId)) {
58
+ const parent = where.kind && kinds.includes(where.kind) ? aggregateId(where.kind) : null;
59
+ view = { ...withFocus(view, parent), zoom: false };
60
+ }
61
+ view = {
62
+ ...view,
63
+ relation: view.relation && (kinds.includes(view.relation) || schema.edgeKinds.includes(view.relation)) ? view.relation : null,
64
+ expanded: view.expanded.filter(known),
65
+ pins: Object.fromEntries(Object.entries(view.pins).filter(([id]) => known(id))),
66
+ ...(view.selection ? { selection: view.selection.filter(known) } : {}),
67
+ };
68
+ return { face: where.face, path, stop: toUrl(view), ...(where.kind ? { kind: where.kind } : {}) };
69
+ }
70
+ /**
71
+ * The place a host handed back, settled in the app the embed now draws.
72
+ * Under address routing the address is the source of truth, and when what
73
+ * it names is gone it is replaced, in place, by where the reader lands.
74
+ */
75
+ export function settleAt(props, store, places) {
76
+ const given = props.at;
77
+ const routes = props.pages?.routes() ?? [];
78
+ if (props.routing !== "address" || typeof window === "undefined")
79
+ return settle(given, props.app, store, places, routes);
80
+ const { pathname, search, hash } = window.location;
81
+ const within = pathWithin(pathname, props.basePath);
82
+ // The face too is the address's: a place handed back on the scene, at an address that names a page, is settled as that page.
83
+ const face = faceAtAddress({ routing: "address", ...(props.basePath === undefined ? {} : { basePath: props.basePath }), face: given.face });
84
+ const onPages = face === "pages";
85
+ const asked = { ...given, face, ...(within === null ? {} : onPages ? { path: within + search } : { stop: stopAtAddress(props.basePath) ?? given.stop }) };
86
+ const settled = settle(asked, props.app, store, places, routes);
87
+ const next = onPages
88
+ ? settled.path === asked.path ? null : addressOf(settled.path, props.basePath === undefined ? {} : { basePath: props.basePath })
89
+ : settled.stop === toUrl(fromUrl(asked.stop)) ? null : pathname + search + settled.stop;
90
+ if (within !== null && next !== null && next !== pathname + search + hash)
91
+ window.history.replaceState(window.history.state, "", next);
92
+ return settled;
93
+ }
94
+ //# sourceMappingURL=where.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.js","sourceRoot":"","sources":["../src/where.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graview/embed",
3
- "version": "0.1.12",
3
+ "version": "0.1.15",
4
4
  "type": "module",
5
5
  "description": "Mount a declared Graview app into any element — the scene, the Graview, or the routed pages — without the Shell, sized and themed within the element.",
6
6
  "keywords": [
@@ -25,13 +25,13 @@
25
25
  }
26
26
  },
27
27
  "dependencies": {
28
- "@graview/core": "0.1.12",
29
- "@graview/primitives": "0.1.12",
30
- "@graview/pages": "0.1.12",
31
- "@graview/react": "0.1.12",
32
- "@graview/studio": "0.1.12",
33
- "@graview/layout": "0.1.12",
34
- "@graview/tools": "0.1.12"
28
+ "@graview/layout": "0.1.15",
29
+ "@graview/core": "0.1.15",
30
+ "@graview/pages": "0.1.15",
31
+ "@graview/react": "0.1.15",
32
+ "@graview/primitives": "0.1.15",
33
+ "@graview/studio": "0.1.15",
34
+ "@graview/tools": "0.1.15"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "react": ">=18",