@xeonr/console-shell 0.4.2 → 0.5.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/dist/CommandPalette.d.ts +3 -2
- package/dist/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette.js +78 -10
- package/dist/CommandPalette.js.map +1 -1
- package/dist/ConsoleProvider.d.ts +39 -4
- package/dist/ConsoleProvider.d.ts.map +1 -1
- package/dist/ConsoleProvider.js +19 -3
- package/dist/ConsoleProvider.js.map +1 -1
- package/dist/ConsoleShell.d.ts +63 -3
- package/dist/ConsoleShell.d.ts.map +1 -1
- package/dist/ConsoleShell.js +142 -8
- package/dist/ConsoleShell.js.map +1 -1
- package/dist/ContextRow.d.ts +2 -0
- package/dist/ContextRow.d.ts.map +1 -0
- package/dist/ContextRow.js +235 -0
- package/dist/ContextRow.js.map +1 -0
- package/dist/Gate.d.ts +25 -0
- package/dist/Gate.d.ts.map +1 -0
- package/dist/Gate.js +38 -0
- package/dist/Gate.js.map +1 -0
- package/dist/ScopeCard.d.ts +4 -0
- package/dist/ScopeCard.d.ts.map +1 -0
- package/dist/ScopeCard.js +228 -0
- package/dist/ScopeCard.js.map +1 -0
- package/dist/ScopeRail.d.ts.map +1 -1
- package/dist/ScopeRail.js +42 -1
- package/dist/ScopeRail.js.map +1 -1
- package/dist/SectionSidebar.d.ts +6 -4
- package/dist/SectionSidebar.d.ts.map +1 -1
- package/dist/SectionSidebar.js +68 -23
- package/dist/SectionSidebar.js.map +1 -1
- package/dist/TopBar.d.ts.map +1 -1
- package/dist/TopBar.js +16 -2
- package/dist/TopBar.js.map +1 -1
- package/dist/context.d.ts +82 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +65 -0
- package/dist/context.js.map +1 -0
- package/dist/crumb.d.ts +9 -0
- package/dist/crumb.d.ts.map +1 -1
- package/dist/crumb.js +20 -2
- package/dist/crumb.js.map +1 -1
- package/dist/crumbs.d.ts +19 -0
- package/dist/crumbs.d.ts.map +1 -0
- package/dist/crumbs.js +43 -0
- package/dist/crumbs.js.map +1 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/links.d.ts +5 -4
- package/dist/links.d.ts.map +1 -1
- package/dist/links.js +5 -15
- package/dist/links.js.map +1 -1
- package/dist/nav.d.ts +66 -4
- package/dist/nav.d.ts.map +1 -1
- package/dist/nav.js +99 -2
- package/dist/nav.js.map +1 -1
- package/dist/origin.d.ts +2 -0
- package/dist/origin.d.ts.map +1 -0
- package/dist/origin.js +14 -0
- package/dist/origin.js.map +1 -0
- package/dist/place.d.ts +26 -0
- package/dist/place.d.ts.map +1 -0
- package/dist/place.js +53 -0
- package/dist/place.js.map +1 -0
- package/dist/scope.d.ts +35 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +42 -0
- package/dist/scope.js.map +1 -0
- package/dist/screen.d.ts +38 -0
- package/dist/screen.d.ts.map +1 -0
- package/dist/screen.js +79 -0
- package/dist/screen.js.map +1 -0
- package/dist/shellConfig.d.ts +50 -0
- package/dist/shellConfig.d.ts.map +1 -0
- package/dist/shellConfig.js +24 -0
- package/dist/shellConfig.js.map +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -4
- package/dist/TeamCard.d.ts +0 -5
- package/dist/TeamCard.d.ts.map +0 -1
- package/dist/TeamCard.js +0 -152
- package/dist/TeamCard.js.map +0 -1
package/dist/TopBar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopBar.js","sourceRoot":"","sources":["../src/TopBar.tsx"],"names":[],"mappings":";AAAA,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAa,CAAC;AAExC,0EAA0E;AAC1E,uDAAuD;AAEvD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAA;;;;;;;6BAOI,CAAC,CAAC,IAAI;gBACnB,CAAC,CAAC,EAAE;;kBAEF,CAAC,CAAC,IAAI;CACvB,CAAC;AAEF,MAAM,SAAS,GAAG,GAAG,CAAA;;;;;CAKpB,CAAC;AAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAiC;IACtD,SAAS;WACF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;iBAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;CAC5C,CAAC;AAEF,8EAA8E;AAC9E,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAC5E,oEAAoE;AACpE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IAC/B,SAAS;WACF,CAAC,CAAC,KAAK;;;qBAGG,CAAC,CAAC,IAAI;CAC1B,CAAC;AAEF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAA,UAAU,CAAC,CAAC,KAAK,2CAA2C,CAAC;AAEpF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;;;;;mBAKT,CAAC,CAAC,IAAI;gBACT,CAAC,CAAC,KAAK;sBACD,CAAC,CAAC,SAAS;WACtB,CAAC,CAAC,KAAK;;;;4DAI0C,CAAC,CAAC,KAAK;4BACvC,CAAC,CAAC,OAAO;;CAEpC,CAAC;AAEF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA,iBAAiB,CAAC;AAE3C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;;CAEhC,CAAC;AAOF,MAAM,UAAU,MAAM,CAAC,EACrB,MAAM,EACN,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,aAAa,GAAG,CAAC,EACjB,eAAe,GAQhB;IACC,OAAO,CACL,MAAC,GAAG,eACF,KAAC,MAAM,IAAC,IAAI,EAAC,QAAQ,gBAAY,MAAM,EAAC,OAAO,EAAE,QAAQ,YAAE,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAG,GAAS,
|
|
1
|
+
{"version":3,"file":"TopBar.js","sourceRoot":"","sources":["../src/TopBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { NavGroup, NavItem, Requires } from "./nav.ts";
|
|
2
|
+
export interface ContextItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
/** a muted second line in the popover (a slug, an owner) */
|
|
6
|
+
sub?: string | undefined;
|
|
7
|
+
icon?: string | undefined;
|
|
8
|
+
avatarUrl?: string | undefined;
|
|
9
|
+
count?: number | string | undefined;
|
|
10
|
+
/** the context's root route, e.g. "/upl-im" or "/platform/01J8K…" */
|
|
11
|
+
href: string;
|
|
12
|
+
disabled?: boolean | undefined;
|
|
13
|
+
disabledReason?: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface NavContext {
|
|
16
|
+
/** "namespace" | "project" | "application" | … — keys Recent in storage */
|
|
17
|
+
kind: string;
|
|
18
|
+
/** the row's kicker and the empty state's noun: "Namespace" */
|
|
19
|
+
label: string;
|
|
20
|
+
/** "namespaces", for "All namespaces" and the search placeholder */
|
|
21
|
+
plural: string;
|
|
22
|
+
icon: string;
|
|
23
|
+
/** the list, or a first page when `search` is async */
|
|
24
|
+
items: ContextItem[];
|
|
25
|
+
/** the current item's id; null reads "Choose a <label>" */
|
|
26
|
+
current: string | null;
|
|
27
|
+
/** keep the row on a skeleton (the list, or the current item, is still loading) */
|
|
28
|
+
loading?: boolean | undefined;
|
|
29
|
+
/** ids floated to the top of the popover, e.g. auth's pinned applications */
|
|
30
|
+
pinned?: string[] | undefined;
|
|
31
|
+
/** search beyond `items` (an unbounded directory) */
|
|
32
|
+
search?: ((q: string) => Promise<ContextItem[]>) | undefined;
|
|
33
|
+
/** footer row: the list page, e.g. "All projects" / "Manage namespaces" */
|
|
34
|
+
all?: {
|
|
35
|
+
label: string;
|
|
36
|
+
href: string;
|
|
37
|
+
requires?: Requires | undefined;
|
|
38
|
+
} | undefined;
|
|
39
|
+
/** footer row: create one */
|
|
40
|
+
create?: {
|
|
41
|
+
label: string;
|
|
42
|
+
href?: string | undefined;
|
|
43
|
+
onClick?: (() => void) | undefined;
|
|
44
|
+
requires?: Requires | undefined;
|
|
45
|
+
} | undefined;
|
|
46
|
+
/** where picking `item` lands; default keeps the current section (contextHref) */
|
|
47
|
+
hrefFor?: ((item: ContextItem, place: {
|
|
48
|
+
sectionPath?: string | undefined;
|
|
49
|
+
}) => string) | undefined;
|
|
50
|
+
}
|
|
51
|
+
/** What the row shows: an item, a pending skeleton, or the empty state. */
|
|
52
|
+
export type CurrentContext = {
|
|
53
|
+
state: "item";
|
|
54
|
+
item: ContextItem;
|
|
55
|
+
} | {
|
|
56
|
+
state: "pending";
|
|
57
|
+
} | {
|
|
58
|
+
state: "none";
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* `published` is what a screen said through useActiveContext: an id, a whole
|
|
62
|
+
* item (for a context not in the list, e.g. an org-visible project), or
|
|
63
|
+
* "pending" (the screen is mounted but its data has not arrived).
|
|
64
|
+
*/
|
|
65
|
+
export declare function currentContext(ctx: NavContext, published?: string | ContextItem | "pending" | undefined): CurrentContext;
|
|
66
|
+
/**
|
|
67
|
+
* The current section's path relative to the context root, or undefined when
|
|
68
|
+
* it does not belong to the context (an `ofScope` group, or nothing lit).
|
|
69
|
+
*/
|
|
70
|
+
export declare function sectionPathOf(groups: NavGroup[], active: NavItem | undefined, current: ContextItem | undefined): string | undefined;
|
|
71
|
+
/** The default landing for picking `item`: the same section under it, else its root. */
|
|
72
|
+
export declare function contextHref(item: ContextItem, sectionPath: string | undefined): string;
|
|
73
|
+
/** Recent ids, most recent first, capped. */
|
|
74
|
+
export declare function pushRecent(recent: string[], id: string, cap?: number): string[];
|
|
75
|
+
/** Popover sections: pinned, recent, then the rest — no item twice. */
|
|
76
|
+
export declare function orderItems(items: ContextItem[], pinned?: string[], recent?: string[]): {
|
|
77
|
+
pinned: ContextItem[];
|
|
78
|
+
recent: ContextItem[];
|
|
79
|
+
all: ContextItem[];
|
|
80
|
+
};
|
|
81
|
+
export declare function filterItems(items: ContextItem[], q: string): ContextItem[];
|
|
82
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `published` is what a screen said through useActiveContext: an id, a whole
|
|
3
|
+
* item (for a context not in the list, e.g. an org-visible project), or
|
|
4
|
+
* "pending" (the screen is mounted but its data has not arrived).
|
|
5
|
+
*/
|
|
6
|
+
export function currentContext(ctx, published) {
|
|
7
|
+
if (published === "pending")
|
|
8
|
+
return { state: "pending" };
|
|
9
|
+
if (published !== undefined && typeof published !== "string")
|
|
10
|
+
return { state: "item", item: published };
|
|
11
|
+
const id = published ?? ctx.current;
|
|
12
|
+
if (id === null)
|
|
13
|
+
return ctx.loading ? { state: "pending" } : { state: "none" };
|
|
14
|
+
const item = ctx.items.find((i) => i.id === id);
|
|
15
|
+
if (item)
|
|
16
|
+
return { state: "item", item };
|
|
17
|
+
// The URL names a context the list has not delivered yet (a cold deep link):
|
|
18
|
+
// a skeleton, never "Choose a …" and never a flash of the wrong one.
|
|
19
|
+
return ctx.loading ? { state: "pending" } : { state: "item", item: { id, label: id, href: "" } };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The current section's path relative to the context root, or undefined when
|
|
23
|
+
* it does not belong to the context (an `ofScope` group, or nothing lit).
|
|
24
|
+
*/
|
|
25
|
+
export function sectionPathOf(groups, active, current) {
|
|
26
|
+
if (!active)
|
|
27
|
+
return undefined;
|
|
28
|
+
const group = groups.find((g) => g.items.includes(active));
|
|
29
|
+
if (group?.ofScope)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (active.to !== undefined) {
|
|
32
|
+
const root = current?.href.replace(/\/+$/, "");
|
|
33
|
+
if (!root || !active.to.startsWith(`${root}/`))
|
|
34
|
+
return undefined;
|
|
35
|
+
return active.to.slice(root.length + 1);
|
|
36
|
+
}
|
|
37
|
+
if (active.href !== undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
return active.path;
|
|
40
|
+
}
|
|
41
|
+
/** The default landing for picking `item`: the same section under it, else its root. */
|
|
42
|
+
export function contextHref(item, sectionPath) {
|
|
43
|
+
const root = item.href.replace(/\/+$/, "");
|
|
44
|
+
return sectionPath ? `${root}/${sectionPath}` : item.href;
|
|
45
|
+
}
|
|
46
|
+
/** Recent ids, most recent first, capped. */
|
|
47
|
+
export function pushRecent(recent, id, cap = 3) {
|
|
48
|
+
return [id, ...recent.filter((r) => r !== id)].slice(0, cap);
|
|
49
|
+
}
|
|
50
|
+
/** Popover sections: pinned, recent, then the rest — no item twice. */
|
|
51
|
+
export function orderItems(items, pinned = [], recent = []) {
|
|
52
|
+
const byId = new Map(items.map((i) => [i.id, i]));
|
|
53
|
+
const p = pinned.map((id) => byId.get(id)).filter((i) => !!i);
|
|
54
|
+
const seen = new Set(p.map((i) => i.id));
|
|
55
|
+
const r = recent.filter((id) => !seen.has(id)).map((id) => byId.get(id)).filter((i) => !!i);
|
|
56
|
+
r.forEach((i) => seen.add(i.id));
|
|
57
|
+
return { pinned: p, recent: r, all: items.filter((i) => !seen.has(i.id)) };
|
|
58
|
+
}
|
|
59
|
+
export function filterItems(items, q) {
|
|
60
|
+
const needle = q.trim().toLowerCase();
|
|
61
|
+
if (!needle)
|
|
62
|
+
return items;
|
|
63
|
+
return items.filter((i) => i.label.toLowerCase().includes(needle) || i.sub?.toLowerCase().includes(needle) || i.id.toLowerCase().includes(needle));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/crumb.d.ts
CHANGED
|
@@ -6,6 +6,15 @@ import type { Crumb } from "./TopBar.tsx";
|
|
|
6
6
|
* a test, a storybook — without a provider.
|
|
7
7
|
*/
|
|
8
8
|
export declare function useCrumb(label: ReactNode | undefined, href?: string | undefined): void;
|
|
9
|
+
/**
|
|
10
|
+
* Publish an ordered chain of crumbs for the current screen — a child route's
|
|
11
|
+
* parents (strata: Projects › Xeonr Auth › prod). Undefined publishes nothing,
|
|
12
|
+
* which is what a screen does while its data loads.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useCrumbs(crumbs: Array<{
|
|
15
|
+
label: ReactNode;
|
|
16
|
+
href?: string | undefined;
|
|
17
|
+
}> | undefined): void;
|
|
9
18
|
/** Wraps the shell's children; `published` is what the screens have set. */
|
|
10
19
|
export declare function CrumbProvider({ children }: {
|
|
11
20
|
children: (published: Crumb[]) => ReactNode;
|
package/dist/crumb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crumb.d.ts","sourceRoot":"","sources":["../src/crumb.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAuB1C;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUtF;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,SAAS,CAAA;CAAE,+BA4B1F"}
|
|
1
|
+
{"version":3,"file":"crumb.d.ts","sourceRoot":"","sources":["../src/crumb.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAuB1C;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUtF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,GAAG,SAAS,GAAG,IAAI,CAW1G;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,SAAS,CAAA;CAAE,+BA4B1F"}
|
package/dist/crumb.js
CHANGED
|
@@ -18,6 +18,24 @@ export function useCrumb(label, href) {
|
|
|
18
18
|
return () => sink.clear(id);
|
|
19
19
|
}, [sink, id, label, href]);
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Publish an ordered chain of crumbs for the current screen — a child route's
|
|
23
|
+
* parents (strata: Projects › Xeonr Auth › prod). Undefined publishes nothing,
|
|
24
|
+
* which is what a screen does while its data loads.
|
|
25
|
+
*/
|
|
26
|
+
export function useCrumbs(crumbs) {
|
|
27
|
+
const sink = useContext(SinkContext);
|
|
28
|
+
const id = useId();
|
|
29
|
+
const key = crumbs ? JSON.stringify(crumbs.map((c) => [String(c.label), c.href ?? null])) : "";
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!sink)
|
|
32
|
+
return;
|
|
33
|
+
sink.set(id, crumbs && crumbs.length ? crumbs.map((c) => ({ label: c.label, ...(c.href !== undefined ? { href: c.href } : {}) })) : undefined);
|
|
34
|
+
return () => sink.clear(id);
|
|
35
|
+
// keyed by value: an inline array must not re-publish every render
|
|
36
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
37
|
+
}, [sink, id, key]);
|
|
38
|
+
}
|
|
21
39
|
/** Wraps the shell's children; `published` is what the screens have set. */
|
|
22
40
|
export function CrumbProvider({ children }) {
|
|
23
41
|
const [map, setMap] = useState({});
|
|
@@ -26,7 +44,7 @@ export function CrumbProvider({ children }) {
|
|
|
26
44
|
const [order, setOrder] = useState([]);
|
|
27
45
|
const sink = useMemo(() => ({
|
|
28
46
|
set: (id, crumb) => {
|
|
29
|
-
setMap((m) => (m[id] === crumb ? m : { ...m, [id]: crumb }));
|
|
47
|
+
setMap((m) => (m[id] === crumb || (Array.isArray(crumb) && JSON.stringify(m[id]) === JSON.stringify(crumb)) ? m : { ...m, [id]: crumb }));
|
|
30
48
|
setOrder((o) => (o.includes(id) ? o : [...o, id]));
|
|
31
49
|
},
|
|
32
50
|
clear: (id) => {
|
|
@@ -40,7 +58,7 @@ export function CrumbProvider({ children }) {
|
|
|
40
58
|
setOrder((o) => (o.includes(id) ? o.filter((x) => x !== id) : o));
|
|
41
59
|
},
|
|
42
60
|
}), []);
|
|
43
|
-
const published = useMemo(() => order.
|
|
61
|
+
const published = useMemo(() => order.flatMap((id) => { const v = map[id]; return v === undefined ? [] : Array.isArray(v) ? v : [v]; }), [order, map]);
|
|
44
62
|
return _jsx(SinkContext.Provider, { value: sink, children: children(published) });
|
|
45
63
|
}
|
|
46
64
|
//# sourceMappingURL=crumb.js.map
|
package/dist/crumb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crumb.js","sourceRoot":"","sources":["../src/crumb.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAsBvG,MAAM,WAAW,GAAG,aAAa,CAAmB,IAAI,CAAC,CAAC;AAE1D;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAA4B,EAAE,IAAyB;IAC9E,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAChE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,KAAK,EAAE,KAAe,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAmD;IACzF,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"crumb.js","sourceRoot":"","sources":["../src/crumb.tsx"],"names":[],"mappings":"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"}
|
package/dist/crumbs.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Crumb } from "./TopBar.tsx";
|
|
2
|
+
export interface CrumbInputs {
|
|
3
|
+
scope?: Crumb | undefined;
|
|
4
|
+
product: Crumb;
|
|
5
|
+
context?: Crumb | undefined;
|
|
6
|
+
section?: (Crumb & {
|
|
7
|
+
index?: boolean | undefined;
|
|
8
|
+
}) | undefined;
|
|
9
|
+
layout?: Crumb[] | undefined;
|
|
10
|
+
published?: Crumb[] | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function deriveCrumbs({ scope, product, context, section, layout, published }: CrumbInputs): Crumb[];
|
|
13
|
+
/** Long trails keep the first crumb and the last `keep`; the rest fold into "…". */
|
|
14
|
+
export declare function foldCrumbs(crumbs: Crumb[], max?: number, keep?: number): {
|
|
15
|
+
visible: Crumb[];
|
|
16
|
+
folded: Crumb[];
|
|
17
|
+
at: number;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=crumbs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crumbs.d.ts","sourceRoot":"","sources":["../src/crumbs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAgB1C,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,KAAK,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IAChE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;CACjC;AAID,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAW,EAAE,SAAc,EAAE,EAAE,WAAW,GAAG,KAAK,EAAE,CA+BpH;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,SAAI,EAAE,IAAI,SAAI,GAAG;IAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAGhH"}
|
package/dist/crumbs.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const norm = (s) => s.trim().toLowerCase();
|
|
2
|
+
export function deriveCrumbs({ scope, product, context, section, layout = [], published = [] }) {
|
|
3
|
+
const tail = [...layout, ...published].filter((c) => c.label !== "");
|
|
4
|
+
let sec = section;
|
|
5
|
+
if (sec && tail.some((c) => norm(c.label) === norm(sec.label)))
|
|
6
|
+
sec = undefined;
|
|
7
|
+
if (sec?.index && tail.length === 0)
|
|
8
|
+
sec = undefined;
|
|
9
|
+
const head = [];
|
|
10
|
+
if (scope)
|
|
11
|
+
head.push(scope);
|
|
12
|
+
head.push(product);
|
|
13
|
+
const fixed = head.length; // scope and product are always rendered
|
|
14
|
+
const trail = [...head];
|
|
15
|
+
if (context)
|
|
16
|
+
trail.push(context);
|
|
17
|
+
if (sec)
|
|
18
|
+
trail.push({ label: sec.label, ...(sec.href !== undefined ? { href: sec.href } : {}) });
|
|
19
|
+
trail.push(...tail);
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const c of trail) {
|
|
22
|
+
const prev = out[out.length - 1];
|
|
23
|
+
const i = out.length; // index c would take
|
|
24
|
+
if (prev && norm(prev.label) === norm(c.label) && i - 1 >= (scope ? 1 : 0)) {
|
|
25
|
+
// merge: one crumb, the later (more specific) href
|
|
26
|
+
out[out.length - 1] = { label: prev.label, ...(c.href ?? prev.href ? { href: c.href ?? prev.href } : {}) };
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (prev && i - 1 >= fixed && prev.href !== undefined && prev.href === c.href) {
|
|
30
|
+
out[out.length - 1] = c;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
out.push(c);
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/** Long trails keep the first crumb and the last `keep`; the rest fold into "…". */
|
|
38
|
+
export function foldCrumbs(crumbs, max = 5, keep = 3) {
|
|
39
|
+
if (crumbs.length <= max)
|
|
40
|
+
return { visible: crumbs, folded: [], at: -1 };
|
|
41
|
+
return { visible: [crumbs[0], ...crumbs.slice(-keep)], folded: crumbs.slice(1, -keep), at: 1 };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=crumbs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crumbs.js","sourceRoot":"","sources":["../src/crumbs.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,16 @@ export { ConsoleShell, type ConsoleShellProps } from "./ConsoleShell.tsx";
|
|
|
3
3
|
export { connectConsoleClient, mockConsoleClient, type ConnectConsoleClientOptions, type MockFixtures } from "./client.ts";
|
|
4
4
|
export { ShellLink, isSameOrigin } from "./links.tsx";
|
|
5
5
|
export type { AccountMenuConfig, ConsoleAccount } from "./AccountMenu.tsx";
|
|
6
|
-
export { sectionFor, type NavGroup, type NavItem } from "./nav.ts";
|
|
6
|
+
export { sectionFor, resolveActive, itemTarget, isLegacySwitcher, type NavGroup, type NavItem, type Requires, type ItemKind } from "./nav.ts";
|
|
7
7
|
export type { Crumb } from "./TopBar.tsx";
|
|
8
|
-
export { useCrumb } from "./crumb.tsx";
|
|
8
|
+
export { useCrumb, useCrumbs } from "./crumb.tsx";
|
|
9
|
+
export { deriveCrumbs, foldCrumbs, type CrumbInputs } from "./crumbs.ts";
|
|
9
10
|
export type * from "./types.ts";
|
|
11
|
+
export { ScopeCard, TeamCard } from "./ScopeCard.tsx";
|
|
12
|
+
export { satisfies, shellSatisfies, availableScopes, scopeHref, type ScopeEntry, type ScopeMap, type Can } from "./scope.ts";
|
|
13
|
+
export { useActiveSection, useActiveContext, useScope, useActiveTeam, type ScreenTeam } from "./screen.tsx";
|
|
14
|
+
export { currentContext, contextHref, sectionPathOf, type ContextItem, type NavContext, type CurrentContext } from "./context.ts";
|
|
15
|
+
export { useShellLink } from "./shellConfig.tsx";
|
|
16
|
+
export { swapTeamBase, pickSearch, withCarry, joinPath, type Place } from "./place.ts";
|
|
17
|
+
export { Gate, EntityScreen } from "./Gate.tsx";
|
|
10
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/I,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,KAAK,2BAA2B,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/I,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,KAAK,2BAA2B,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9I,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACzE,mBAAmB,YAAY,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAClI,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,14 @@ export { ConsoleProvider, useConsole, useConsoleMaybe, MAX_PINNED } from "./Cons
|
|
|
3
3
|
export { ConsoleShell } from "./ConsoleShell.js";
|
|
4
4
|
export { connectConsoleClient, mockConsoleClient } from "./client.js";
|
|
5
5
|
export { ShellLink, isSameOrigin } from "./links.js";
|
|
6
|
-
export { sectionFor } from "./nav.js";
|
|
7
|
-
export { useCrumb } from "./crumb.js";
|
|
6
|
+
export { sectionFor, resolveActive, itemTarget, isLegacySwitcher } from "./nav.js";
|
|
7
|
+
export { useCrumb, useCrumbs } from "./crumb.js";
|
|
8
|
+
export { deriveCrumbs, foldCrumbs } from "./crumbs.js";
|
|
9
|
+
export { ScopeCard, TeamCard } from "./ScopeCard.js";
|
|
10
|
+
export { satisfies, shellSatisfies, availableScopes, scopeHref } from "./scope.js";
|
|
11
|
+
export { useActiveSection, useActiveContext, useScope, useActiveTeam } from "./screen.js";
|
|
12
|
+
export { currentContext, contextHref, sectionPathOf } from "./context.js";
|
|
13
|
+
export { useShellLink } from "./shellConfig.js";
|
|
14
|
+
export { swapTeamBase, pickSearch, withCarry, joinPath } from "./place.js";
|
|
15
|
+
export { Gate, EntityScreen } from "./Gate.js";
|
|
8
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAgD,MAAM,sBAAuB,CAAC;AAC/I,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAuD,MAAM,aAAa,CAAC;AAC3H,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAa,CAAC;AAEtD,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAgD,MAAM,sBAAuB,CAAC;AAC/I,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAuD,MAAM,aAAa,CAAC;AAC3H,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAa,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAA6D,MAAM,UAAU,CAAC;AAE9I,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAa,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAA4C,MAAM,YAAY,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAmB,MAAM,aAAc,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAA0D,MAAM,cAAc,CAAC;AAClI,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,WAAY,CAAC"}
|
package/dist/links.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import type { ReactNode } from "react";
|
|
2
|
-
|
|
1
|
+
import type { AnchorHTMLAttributes, ReactNode } from "react";
|
|
2
|
+
import { isSameOrigin } from "./origin.ts";
|
|
3
|
+
export { isSameOrigin };
|
|
3
4
|
/**
|
|
4
5
|
* One link that is a router link when it stays on this origin and an <a> when
|
|
5
6
|
* it leaves. `mark` is rendered only in the external case, so the external
|
|
6
7
|
* arrow disappears by itself on the auth portal.
|
|
7
8
|
*/
|
|
8
|
-
export declare function ShellLink({ href, className, onClick, mark, children, }: {
|
|
9
|
+
export declare function ShellLink({ href, className, onClick, mark, children, ...rest }: {
|
|
9
10
|
href: string;
|
|
10
11
|
className?: string | undefined;
|
|
11
12
|
onClick?: (() => void) | undefined;
|
|
12
13
|
mark?: ReactNode | undefined;
|
|
13
14
|
children: ReactNode;
|
|
14
|
-
}): import("react").JSX.Element;
|
|
15
|
+
} & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, "href" | "className" | "onClick" | "children">): import("react").JSX.Element;
|
|
15
16
|
//# sourceMappingURL=links.d.ts.map
|
package/dist/links.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,CAAC;AASxB;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACnC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC,+BAc/F"}
|
package/dist/links.js
CHANGED
|
@@ -1,32 +1,22 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Link } from "react-router-dom";
|
|
3
|
+
import { isSameOrigin } from "./origin.js";
|
|
4
|
+
export { isSameOrigin };
|
|
3
5
|
// The shell links out to the auth portal for identity and team management
|
|
4
6
|
// (`authOrigin`). On every product console that is another host, so the link is
|
|
5
7
|
// a plain <a> with the external mark. On the auth portal itself it is the
|
|
6
8
|
// *current* host — the portal mounts the shell with authOrigin="" — and the
|
|
7
9
|
// same link must be an in-router navigation with no external mark. isSameOrigin
|
|
8
10
|
// decides that once, so no caller has to special-case the portal.
|
|
9
|
-
export function isSameOrigin(href) {
|
|
10
|
-
if (!/^[a-z][a-z0-9+.-]*:|^\/\//i.test(href))
|
|
11
|
-
return true; // relative
|
|
12
|
-
if (typeof window === "undefined")
|
|
13
|
-
return false;
|
|
14
|
-
try {
|
|
15
|
-
return new URL(href, window.location.href).origin === window.location.origin;
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
11
|
/**
|
|
22
12
|
* One link that is a router link when it stays on this origin and an <a> when
|
|
23
13
|
* it leaves. `mark` is rendered only in the external case, so the external
|
|
24
14
|
* arrow disappears by itself on the auth portal.
|
|
25
15
|
*/
|
|
26
|
-
export function ShellLink({ href, className, onClick, mark, children, }) {
|
|
16
|
+
export function ShellLink({ href, className, onClick, mark, children, ...rest }) {
|
|
27
17
|
if (isSameOrigin(href)) {
|
|
28
|
-
return (_jsx(Link, { to: href, className: className, onClick: onClick, children: children }));
|
|
18
|
+
return (_jsx(Link, { to: href, className: className, onClick: onClick, ...rest, children: children }));
|
|
29
19
|
}
|
|
30
|
-
return (_jsxs("a", { href: href, className: className, onClick: onClick, children: [children, mark] }));
|
|
20
|
+
return (_jsxs("a", { href: href, className: className, onClick: onClick, ...rest, children: [children, mark] }));
|
|
31
21
|
}
|
|
32
22
|
//# sourceMappingURL=links.js.map
|
package/dist/links.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.js","sourceRoot":"","sources":["../src/links.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../src/links.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,0EAA0E;AAC1E,gFAAgF;AAChF,0EAA0E;AAC1E,4EAA4E;AAC5E,gFAAgF;AAChF,kEAAkE;AAElE;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,GAAG,IAAI,EAOuF;IAC9F,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,CACL,KAAC,IAAI,IAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAM,IAAI,YAC7D,QAAQ,GACJ,CACR,CAAC;IACJ,CAAC;IACD,OAAO,CACL,aAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAM,IAAI,aAC5D,QAAQ,EACR,IAAI,IACH,CACL,CAAC;AACJ,CAAC"}
|
package/dist/nav.d.ts
CHANGED
|
@@ -1,22 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an item or group needs before it is shown. The built-ins are
|
|
3
|
+
* namespaced; any other string is a team-typed application role
|
|
4
|
+
* (`team.roles.includes(s)`) unless the product's `can` predicate says
|
|
5
|
+
* otherwise. Evaluated by the shell from 0.5 (ScopeCard / `can`).
|
|
6
|
+
*/
|
|
7
|
+
export type Requires = "team:owner" | "org:admin" | (string & {});
|
|
1
8
|
export interface NavItem {
|
|
2
9
|
key: string;
|
|
3
10
|
label: string;
|
|
4
11
|
icon: string;
|
|
5
|
-
/** path relative to
|
|
12
|
+
/** path relative to `base` — "" is the index (always exact) */
|
|
6
13
|
path: string;
|
|
7
14
|
/** rendered as a count pill when the product knows it */
|
|
8
15
|
count?: number | string | undefined;
|
|
9
|
-
/**
|
|
16
|
+
/** looked up in ConsoleShell's `counts` map (0.5) when `count` is absent */
|
|
17
|
+
countKey?: string | undefined;
|
|
18
|
+
/** "attention" tints the pill: work waiting on the person, never an inventory size */
|
|
19
|
+
tone?: "quiet" | "attention" | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Another route base. A same-origin href is a router link with no external
|
|
22
|
+
* mark (0.5; before, it needed `internal`); another origin gets the mark.
|
|
23
|
+
*/
|
|
10
24
|
href?: string | undefined;
|
|
11
|
-
/**
|
|
25
|
+
/** @deprecated a same-origin `href` is internal on its own from 0.5; use `to` */
|
|
12
26
|
internal?: boolean | undefined;
|
|
13
|
-
/** force the
|
|
27
|
+
/** force the external mark and a document navigation on a same-origin href */
|
|
28
|
+
external?: boolean | undefined;
|
|
29
|
+
/** absolute same-origin router path, e.g. "/activity" (0.5) */
|
|
30
|
+
to?: string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Routes that also belong to this section although they are not under its
|
|
33
|
+
* path: react-router patterns relative to `base` ("trace/:id", "t/:name"),
|
|
34
|
+
* or a predicate over the path relative to base. The longest match wins.
|
|
35
|
+
*/
|
|
36
|
+
match?: string | string[] | ((relPath: string) => boolean) | undefined;
|
|
37
|
+
/** match the item's own path exactly, never as a prefix */
|
|
38
|
+
exact?: boolean | undefined;
|
|
39
|
+
/** force the active state; honoured on every kind of item from 0.5 */
|
|
14
40
|
active?: boolean | undefined;
|
|
15
41
|
hidden?: boolean | undefined;
|
|
42
|
+
/** shown only when satisfied (evaluated by the shell, 0.5) */
|
|
43
|
+
requires?: Requires | undefined;
|
|
44
|
+
/** the section crumb's label; null suppresses the section crumb */
|
|
45
|
+
crumb?: string | null | undefined;
|
|
16
46
|
}
|
|
17
47
|
export interface NavGroup {
|
|
18
48
|
label?: string | undefined;
|
|
19
49
|
items: NavItem[];
|
|
50
|
+
/** gate the whole group */
|
|
51
|
+
requires?: Requires | undefined;
|
|
52
|
+
/** belongs to the scope above the context: its items keep the context row as it is */
|
|
53
|
+
ofScope?: boolean | undefined;
|
|
54
|
+
/** a disclosure header, closed by default, open when it holds the resolved item */
|
|
55
|
+
collapsible?: boolean | undefined;
|
|
20
56
|
}
|
|
57
|
+
/** How the sidebar renders an item. */
|
|
58
|
+
export type ItemKind = "route" | "external";
|
|
59
|
+
/**
|
|
60
|
+
* A 0.4 switcher row: `href` + `internal`, whose highlight the product computes
|
|
61
|
+
* and passes as `active`. It keeps rendering its own flag and is left out of
|
|
62
|
+
* resolution, so a console that has not migrated (auth's scope picker, forest's
|
|
63
|
+
* project rows) looks exactly as it did before the bump.
|
|
64
|
+
*/
|
|
65
|
+
export declare function isLegacySwitcher(item: NavItem): boolean;
|
|
66
|
+
/** The item's destination and whether it stays in the router. */
|
|
67
|
+
export declare function itemTarget(item: NavItem, base: string): {
|
|
68
|
+
href: string;
|
|
69
|
+
kind: ItemKind;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* The one answer to "which section am I in". Order: a screen's override (by
|
|
73
|
+
* key) > `active` > the longest matching `match` pattern or path prefix. An
|
|
74
|
+
* item is exact — never a prefix — when it is the index (`path: ""`), when it
|
|
75
|
+
* says `exact`, or when its target is a prefix of a sibling's (so trail's
|
|
76
|
+
* project Overview stops lighting on every project page). External items are
|
|
77
|
+
* never resolved, nor are 0.4 switcher rows (isLegacySwitcher). Hidden items
|
|
78
|
+
* are resolved too: a screen whose item is hidden from the sidebar still names
|
|
79
|
+
* its section in the crumb. On a tie a section (`path`/`to`) beats an `href`.
|
|
80
|
+
*/
|
|
81
|
+
export declare function resolveActive(groups: NavGroup[], pathname: string, base: string, override?: string | undefined): NavItem | undefined;
|
|
82
|
+
/** @deprecated use resolveActive, which also honours `to`, `match`, `exact` and `active` */
|
|
21
83
|
export declare function sectionFor(groups: NavGroup[], relPath: string): NavItem | undefined;
|
|
22
84
|
//# sourceMappingURL=nav.d.ts.map
|
package/dist/nav.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../src/nav.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElE,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,sFAAsF;IACtF,IAAI,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IACzC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,+DAA+D;IAC/D,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;IACvE,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,mFAAmF;IACnF,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEvD;AAQD,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAOxF;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,EAAE,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,GAAG,SAAS,CA8CrB;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAInF"}
|