@graview/layout 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 +96 -0
- package/README.md +20 -0
- package/dist/band.d.ts +103 -0
- package/dist/band.d.ts.map +1 -0
- package/dist/band.js +344 -0
- package/dist/band.js.map +1 -0
- package/dist/city.d.ts +161 -0
- package/dist/city.d.ts.map +1 -0
- package/dist/city.js +319 -0
- package/dist/city.js.map +1 -0
- package/dist/ids.d.ts +79 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +115 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolate.d.ts +27 -0
- package/dist/interpolate.d.ts.map +1 -0
- package/dist/interpolate.js +217 -0
- package/dist/interpolate.js.map +1 -0
- package/dist/label-fit.d.ts +115 -0
- package/dist/label-fit.d.ts.map +1 -0
- package/dist/label-fit.js +162 -0
- package/dist/label-fit.js.map +1 -0
- package/dist/layout.d.ts +99 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +1391 -0
- package/dist/layout.js.map +1 -0
- package/dist/rank.d.ts +35 -0
- package/dist/rank.d.ts.map +1 -0
- package/dist/rank.js +84 -0
- package/dist/rank.js.map +1 -0
- package/dist/related.d.ts +42 -0
- package/dist/related.d.ts.map +1 -0
- package/dist/related.js +207 -0
- package/dist/related.js.map +1 -0
- package/dist/types.d.ts +404 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +27 -0
- package/dist/types.js.map +1 -0
- package/dist/view-state.d.ts +189 -0
- package/dist/view-state.d.ts.map +1 -0
- package/dist/view-state.js +350 -0
- package/dist/view-state.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
export const EMPTY_VIEW = {
|
|
2
|
+
focusId: null,
|
|
3
|
+
relation: null,
|
|
4
|
+
expanded: [],
|
|
5
|
+
pins: {},
|
|
6
|
+
};
|
|
7
|
+
const num = (value) => {
|
|
8
|
+
const parsed = Number(value);
|
|
9
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Serialises a view to a URL fragment. Keys are sorted and lists are sorted,
|
|
13
|
+
* so the same view always produces the same string — which is what makes
|
|
14
|
+
* "did the view change?" a string comparison and history entries stable.
|
|
15
|
+
*/
|
|
16
|
+
export function toUrl(state) {
|
|
17
|
+
const params = new URLSearchParams();
|
|
18
|
+
if (state.focusId)
|
|
19
|
+
params.set("focus", state.focusId);
|
|
20
|
+
if (state.relation)
|
|
21
|
+
params.set("relation", state.relation);
|
|
22
|
+
if (state.overview)
|
|
23
|
+
params.set("overview", "1");
|
|
24
|
+
if (state.zoom)
|
|
25
|
+
params.set("zoom", "1");
|
|
26
|
+
if (state.past)
|
|
27
|
+
params.set("past", "1");
|
|
28
|
+
if (state.shown && state.shown.length > 0)
|
|
29
|
+
params.set("show", [...state.shown].sort().join(","));
|
|
30
|
+
if (state.selection !== undefined && state.selection.length > 0) {
|
|
31
|
+
params.set("sel", [...state.selection].sort().join(","));
|
|
32
|
+
}
|
|
33
|
+
if (state.expanded.length > 0) {
|
|
34
|
+
params.set("expand", [...state.expanded].sort().join(","));
|
|
35
|
+
}
|
|
36
|
+
for (const id of Object.keys(state.pins).sort()) {
|
|
37
|
+
const pin = state.pins[id];
|
|
38
|
+
params.set(`pin.${id}`, `${round(pin.x)},${round(pin.y)}`);
|
|
39
|
+
}
|
|
40
|
+
if (state.pan && (state.pan.x !== 0 || state.pan.y !== 0)) {
|
|
41
|
+
params.set("pan", `${round(state.pan.x)},${round(state.pan.y)}`);
|
|
42
|
+
}
|
|
43
|
+
for (const key of Object.keys(state.within ?? {}).sort()) {
|
|
44
|
+
const value = state.within[key];
|
|
45
|
+
if (value.length > 0)
|
|
46
|
+
params.set(`in.${key}`, value);
|
|
47
|
+
}
|
|
48
|
+
if (state.q && state.q.trim().length > 0)
|
|
49
|
+
params.set("q", state.q);
|
|
50
|
+
const query = params.toString();
|
|
51
|
+
return query ? `#${query}` : "#";
|
|
52
|
+
}
|
|
53
|
+
/** Parses a fragment back. Unknown or malformed parts are dropped, not thrown. */
|
|
54
|
+
/**
|
|
55
|
+
* A stop may name a group by its kind in short: `focus=agg:plot` is
|
|
56
|
+
* `focus=aggregate:plot`. The long form is what the layout mints and what
|
|
57
|
+
* `toUrl` writes; the short form is what a person or a page writes by hand.
|
|
58
|
+
*/
|
|
59
|
+
function unabbreviated(id) {
|
|
60
|
+
return id && id.startsWith("agg:") ? `aggregate:${id.slice(4)}` : id;
|
|
61
|
+
}
|
|
62
|
+
export function fromUrl(url) {
|
|
63
|
+
const hash = url.includes("#") ? url.slice(url.indexOf("#") + 1) : url;
|
|
64
|
+
const params = new URLSearchParams(hash);
|
|
65
|
+
const pins = {};
|
|
66
|
+
for (const [key, value] of params) {
|
|
67
|
+
if (!key.startsWith("pin."))
|
|
68
|
+
continue;
|
|
69
|
+
const [rawX, rawY] = value.split(",");
|
|
70
|
+
const x = rawX === undefined ? null : num(rawX);
|
|
71
|
+
const y = rawY === undefined ? null : num(rawY);
|
|
72
|
+
if (x === null || y === null)
|
|
73
|
+
continue;
|
|
74
|
+
pins[key.slice(4)] = { x, y };
|
|
75
|
+
}
|
|
76
|
+
const within = {};
|
|
77
|
+
for (const [key, value] of params) {
|
|
78
|
+
if (!key.startsWith("in.") || value.length === 0)
|
|
79
|
+
continue;
|
|
80
|
+
within[key.slice(3)] = value;
|
|
81
|
+
}
|
|
82
|
+
/*
|
|
83
|
+
* `#view=grounds-map` is the SHORT FORM of `#in.view=grounds-map`, and the
|
|
84
|
+
* only part of a stop a page can write without knowing how the layout
|
|
85
|
+
* spells an aggregate's id.
|
|
86
|
+
*
|
|
87
|
+
* A page that has just drawn three areas wants to link to the map. The
|
|
88
|
+
* long form needs the group too — `focus=aggregate:zone&in.view=grounds-map`
|
|
89
|
+
* — so the page has to know the kind behind the picture and the layout's
|
|
90
|
+
* own id grammar, and a link that lands on the default view and asks the
|
|
91
|
+
* person to press a button is the pasted-link problem all over again. Named
|
|
92
|
+
* places are unique across an app, so naming one is enough: whoever adopts
|
|
93
|
+
* the stop looks the place up and focuses the group it is a picture of.
|
|
94
|
+
*
|
|
95
|
+
* The long form wins when both are written, because it is what toUrl mints.
|
|
96
|
+
*/
|
|
97
|
+
const shorthand = params.get("view");
|
|
98
|
+
if (shorthand && shorthand.length > 0 && within["view"] === undefined)
|
|
99
|
+
within["view"] = shorthand;
|
|
100
|
+
const rawPan = params.get("pan")?.split(",") ?? [];
|
|
101
|
+
const panX = rawPan[0] === undefined ? null : num(rawPan[0]);
|
|
102
|
+
const panY = rawPan[1] === undefined ? null : num(rawPan[1]);
|
|
103
|
+
const sel = (params.get("sel") ?? "")
|
|
104
|
+
.split(",")
|
|
105
|
+
.filter((id) => id.length > 0)
|
|
106
|
+
.sort();
|
|
107
|
+
/*
|
|
108
|
+
* A district stays a district. `expand=kind:*` written from altitude
|
|
109
|
+
* means "this district is open on the ring"; the same key inside the
|
|
110
|
+
* stack dissolves the shelf card into loose members — a reading no
|
|
111
|
+
* control offers, which history and bookmarks kept re-importing as a
|
|
112
|
+
* chip soup across the bottom band. An in-stack address simply cannot
|
|
113
|
+
* say it; carried back up to the ring, the overview stop still can.
|
|
114
|
+
*/
|
|
115
|
+
const overview = params.get("overview") === "1";
|
|
116
|
+
return {
|
|
117
|
+
...(sel.length > 0 ? { selection: sel } : {}),
|
|
118
|
+
...(overview ? { overview: true } : {}),
|
|
119
|
+
...(params.get("zoom") === "1" ? { zoom: true } : {}),
|
|
120
|
+
...(params.get("past") === "1" ? { past: true } : {}),
|
|
121
|
+
...(params.get("show")
|
|
122
|
+
? { shown: [...new Set(params.get("show").split(",").filter(Boolean))].sort() }
|
|
123
|
+
: {}),
|
|
124
|
+
...(panX !== null && panY !== null ? { pan: { x: panX, y: panY } } : {}),
|
|
125
|
+
...(Object.keys(within).length > 0 ? { within } : {}),
|
|
126
|
+
...(params.get("q")?.trim() ? { q: params.get("q") } : {}),
|
|
127
|
+
focusId: unabbreviated(params.get("focus")),
|
|
128
|
+
relation: params.get("relation"),
|
|
129
|
+
expanded: (params.get("expand") ?? "")
|
|
130
|
+
.split(",")
|
|
131
|
+
.filter((id) => id.length > 0 && (overview || !id.startsWith("kind:")))
|
|
132
|
+
.sort(),
|
|
133
|
+
pins,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function round(value) {
|
|
137
|
+
return Math.round(value * 100) / 100;
|
|
138
|
+
}
|
|
139
|
+
/** Two views are the same stop when they serialise the same. */
|
|
140
|
+
export function sameView(a, b) {
|
|
141
|
+
return toUrl(a) === toUrl(b);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* A RELATION in the selection: `edge:<kind>:<from>:<to>`, each part escaped.
|
|
145
|
+
*
|
|
146
|
+
* Lines joined the selection model after nodes did, and for the same
|
|
147
|
+
* reason the selection is in the URL at all — an inspector about a thing
|
|
148
|
+
* you cannot name is an inspector you cannot share or return to.
|
|
149
|
+
*
|
|
150
|
+
* THE SEPARATOR CANNOT BE A CHARACTER AN ID MAY CONTAIN. This used to say
|
|
151
|
+
* that node ids never hold a ":" and leave it there, and the framework's own
|
|
152
|
+
* `ctx.freshId(label, kind)` mints "item:buy-milk" — so in every scaffolded
|
|
153
|
+
* app the three-part split came back with five parts, `edgeOfSelection`
|
|
154
|
+
* returned null, and a selected line fell through to the inspector's
|
|
155
|
+
* "nothing can be done with this mix of kinds" while the strip's title was
|
|
156
|
+
* the raw selection string. Escaping each part is the fix that does not
|
|
157
|
+
* depend on what an app calls things.
|
|
158
|
+
*/
|
|
159
|
+
export const EDGE_SELECTION_PREFIX = "edge:";
|
|
160
|
+
export function edgeSelectionId(kind, from, to) {
|
|
161
|
+
const part = (value) => encodeURIComponent(value);
|
|
162
|
+
return `${EDGE_SELECTION_PREFIX}${part(kind)}:${part(from)}:${part(to)}`;
|
|
163
|
+
}
|
|
164
|
+
/** The edge a selection entry names, or null when it names a node. */
|
|
165
|
+
export function edgeOfSelection(id) {
|
|
166
|
+
if (!id.startsWith(EDGE_SELECTION_PREFIX))
|
|
167
|
+
return null;
|
|
168
|
+
const parts = id.slice(EDGE_SELECTION_PREFIX.length).split(":");
|
|
169
|
+
if (parts.length !== 3)
|
|
170
|
+
return null;
|
|
171
|
+
const [kind, from, to] = parts;
|
|
172
|
+
if (!kind || !from || !to)
|
|
173
|
+
return null;
|
|
174
|
+
try {
|
|
175
|
+
return { kind: decodeURIComponent(kind), from: decodeURIComponent(from), to: decodeURIComponent(to) };
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// A half-typed or truncated address is a selection of nothing, not a crash.
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/*
|
|
183
|
+
* A MOVE BELONGS TO THE STOP IT WAS MADE AT.
|
|
184
|
+
*
|
|
185
|
+
* A pin and a pan adjust the picture you are looking at: this card a little
|
|
186
|
+
* to the left, the whole scene nudged up. They are stored by node id and in
|
|
187
|
+
* canvas pixels, which say nothing once the picture is a different one — the
|
|
188
|
+
* card you dragged as the focus is a neighbour at the next stop, and holding
|
|
189
|
+
* it at the focus's old coordinates draws it over the new focus. So a new
|
|
190
|
+
* stop starts where the layout puts things: changing the focus, rising or
|
|
191
|
+
* descending, and zooming in or out all leave the moves behind. The old stop
|
|
192
|
+
* keeps them in its own address, so Back returns to the picture you arranged.
|
|
193
|
+
*/
|
|
194
|
+
function leavingTheStop(state) {
|
|
195
|
+
const { pan: _drop, ...rest } = state;
|
|
196
|
+
return { ...rest, pins: {} };
|
|
197
|
+
}
|
|
198
|
+
export function withFocus(state, focusId) {
|
|
199
|
+
if (focusId === state.focusId)
|
|
200
|
+
return { ...state, focusId };
|
|
201
|
+
/*
|
|
202
|
+
* A ROW'S WORDS BELONG TO THE PICTURE THEY NARROW. `in.q` carried into a
|
|
203
|
+
* lit district narrowed THAT district; kept across a change of focus it
|
|
204
|
+
* opened the next one — People, say — narrowed by "van" with no search
|
|
205
|
+
* in sight. The search itself (`q`) is the whole picture's and stays.
|
|
206
|
+
*/
|
|
207
|
+
const left = leavingTheStop(state);
|
|
208
|
+
return { ...(left.within?.["q"] !== undefined ? withWithin(left, "q", null) : left), focusId };
|
|
209
|
+
}
|
|
210
|
+
export function withRelation(state, relation) {
|
|
211
|
+
return { ...state, relation };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Moves a view along its own dimension — the month a calendar is showing,
|
|
215
|
+
* the range it is showing it in.
|
|
216
|
+
*
|
|
217
|
+
* A stop like any other: it goes in the address, Back returns to it, and a
|
|
218
|
+
* link carries it. `null` clears the key rather than writing an empty one,
|
|
219
|
+
* so "no answer" and "the answer is empty" stay different things.
|
|
220
|
+
*/
|
|
221
|
+
export function withWithin(state, key, value) {
|
|
222
|
+
const within = { ...(state.within ?? {}) };
|
|
223
|
+
if (value === null)
|
|
224
|
+
delete within[key];
|
|
225
|
+
else
|
|
226
|
+
within[key] = value;
|
|
227
|
+
if (Object.keys(within).length === 0) {
|
|
228
|
+
const { within: _gone, ...rest } = state;
|
|
229
|
+
return rest;
|
|
230
|
+
}
|
|
231
|
+
return { ...state, within };
|
|
232
|
+
}
|
|
233
|
+
export function withOverview(state, overview) {
|
|
234
|
+
if (overview !== state.overview)
|
|
235
|
+
state = leavingTheStop(state);
|
|
236
|
+
if (!overview) {
|
|
237
|
+
/*
|
|
238
|
+
* OPEN DISTRICTS STAY AT ALTITUDE. Opening a kind card up on the ring
|
|
239
|
+
* means "show this district's members in place"; the same expansion key
|
|
240
|
+
* inside the stack means "dissolve the shelf card into loose members",
|
|
241
|
+
* which nobody asked for on the way down — descending with districts
|
|
242
|
+
* open scattered their whole rosters across the shelf as a chip soup.
|
|
243
|
+
* The overview stop keeps the state, so going back up reopens them.
|
|
244
|
+
*/
|
|
245
|
+
// "kind:" is KIND_PREFIX in layout.ts — written out here to keep this
|
|
246
|
+
// module import-free (layout already type-imports from this file).
|
|
247
|
+
const expanded = state.expanded.filter((id) => !id.startsWith("kind:"));
|
|
248
|
+
return { ...state, overview: false, expanded };
|
|
249
|
+
}
|
|
250
|
+
return { ...state, overview };
|
|
251
|
+
}
|
|
252
|
+
/** Show or hide a module drawn only for those who administer it. */
|
|
253
|
+
export function withShown(state, module, shown) {
|
|
254
|
+
const held = new Set(state.shown ?? []);
|
|
255
|
+
if (shown)
|
|
256
|
+
held.add(module);
|
|
257
|
+
else
|
|
258
|
+
held.delete(module);
|
|
259
|
+
if (held.size === 0) {
|
|
260
|
+
const { shown: _drop, ...rest } = state;
|
|
261
|
+
return rest;
|
|
262
|
+
}
|
|
263
|
+
return { ...state, shown: [...held].sort() };
|
|
264
|
+
}
|
|
265
|
+
/** Look for words across the picture, or stop looking. Blank is no search. */
|
|
266
|
+
export function withQuery(state, q) {
|
|
267
|
+
if (q === null || q.trim().length === 0) {
|
|
268
|
+
const { q: _drop, ...rest } = state;
|
|
269
|
+
return rest;
|
|
270
|
+
}
|
|
271
|
+
return { ...state, q };
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Stop looking: the search, and the words it carried into the district it
|
|
275
|
+
* lit. A row's own words — typed there, different from the search — stay.
|
|
276
|
+
*/
|
|
277
|
+
export function withoutSearch(state) {
|
|
278
|
+
const carried = state.q !== undefined && state.within?.["q"] === state.q;
|
|
279
|
+
return withQuery(carried ? withWithin(state, "q", null) : state, null);
|
|
280
|
+
}
|
|
281
|
+
/** Widen the horizon to include the past, or narrow it back to now. */
|
|
282
|
+
export function withPast(state, past) {
|
|
283
|
+
if (!past) {
|
|
284
|
+
const { past: _drop, ...rest } = state;
|
|
285
|
+
return rest;
|
|
286
|
+
}
|
|
287
|
+
return { ...state, past: true };
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Change what is selected. An empty selection leaves no key behind — the
|
|
291
|
+
* default state serialises to the default URL.
|
|
292
|
+
*/
|
|
293
|
+
export function withSelection(state, selection) {
|
|
294
|
+
if (selection.length === 0) {
|
|
295
|
+
const { selection: _drop, ...rest } = state;
|
|
296
|
+
return rest;
|
|
297
|
+
}
|
|
298
|
+
return { ...state, selection: [...selection] };
|
|
299
|
+
}
|
|
300
|
+
/** Zoom the focus in close, or back out. */
|
|
301
|
+
export function withZoom(state, zoom) {
|
|
302
|
+
if (zoom !== (state.zoom === true))
|
|
303
|
+
state = leavingTheStop(state);
|
|
304
|
+
if (!zoom) {
|
|
305
|
+
const { zoom: _drop, ...rest } = state;
|
|
306
|
+
return rest;
|
|
307
|
+
}
|
|
308
|
+
return { ...state, zoom: true };
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Expanding an aggregate and collapsing it are the same operation in two
|
|
312
|
+
* directions — one code path, so semantic zoom and grouping cannot drift
|
|
313
|
+
* apart.
|
|
314
|
+
*/
|
|
315
|
+
export function toggleExpanded(state, aggregateId) {
|
|
316
|
+
const open = new Set(state.expanded);
|
|
317
|
+
if (open.has(aggregateId))
|
|
318
|
+
open.delete(aggregateId);
|
|
319
|
+
else
|
|
320
|
+
open.add(aggregateId);
|
|
321
|
+
return { ...state, expanded: [...open].sort() };
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Move the camera. `null` puts it back.
|
|
325
|
+
*
|
|
326
|
+
* Panning is an ADJUSTMENT of the stop you are on rather than a new stop —
|
|
327
|
+
* the same reason a pin is. `useUrlSync` replaces rather than pushes for both,
|
|
328
|
+
* so one drag is one history entry rather than sixty, and Back still means
|
|
329
|
+
* "the place I was before", not "one pixel ago".
|
|
330
|
+
*/
|
|
331
|
+
export function withPan(state, pan) {
|
|
332
|
+
if (pan === null || (pan.x === 0 && pan.y === 0)) {
|
|
333
|
+
const { pan: _drop, ...rest } = state;
|
|
334
|
+
return rest;
|
|
335
|
+
}
|
|
336
|
+
return { ...state, pan };
|
|
337
|
+
}
|
|
338
|
+
/** Put everything the user moved back where the layout wanted it. */
|
|
339
|
+
export function withoutMoves(state) {
|
|
340
|
+
return leavingTheStop(state);
|
|
341
|
+
}
|
|
342
|
+
export function withPin(state, id, pin) {
|
|
343
|
+
const pins = { ...state.pins };
|
|
344
|
+
if (pin === null)
|
|
345
|
+
delete pins[id];
|
|
346
|
+
else
|
|
347
|
+
pins[id] = pin;
|
|
348
|
+
return { ...state, pins };
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=view-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-state.js","sourceRoot":"","sources":["../src/view-state.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@graview/layout",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@graview/core": "0.1.0"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"zod": "^4.4.3"
|
|
18
|
+
},
|
|
19
|
+
"description": "Where every node goes: three planes, one pure function of the graph and the view state.",
|
|
20
|
+
"keywords": [
|
|
21
|
+
"graview",
|
|
22
|
+
"context-graph",
|
|
23
|
+
"typed-graph",
|
|
24
|
+
"interface",
|
|
25
|
+
"declarative",
|
|
26
|
+
"layout",
|
|
27
|
+
"graph-layout",
|
|
28
|
+
"spatial"
|
|
29
|
+
],
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md"
|
|
33
|
+
],
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/en-dash-consulting/graview.git",
|
|
38
|
+
"directory": "packages/layout"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"license": "Elastic-2.0",
|
|
44
|
+
"homepage": "https://graview.dev/docs/packages/layout.html",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/en-dash-consulting/graview/issues"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=22"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsc -b"
|
|
53
|
+
}
|
|
54
|
+
}
|