@elevasis/ui 2.50.0 → 2.51.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.
@@ -1512,6 +1512,52 @@ interface KnowledgeBrowserProps {
1512
1512
  */
1513
1513
  declare function KnowledgeBrowser({ graph, knowledgeNodes, organizationModel, initialNodeId, onNavigateToNode, onSelectNode }: KnowledgeBrowserProps): react_jsx_runtime.JSX.Element;
1514
1514
 
1515
+ interface KnowledgeItemRouteId {
1516
+ domainKey: string;
1517
+ itemId: string;
1518
+ }
1519
+ type KnowledgeRouteTarget = {
1520
+ kind: 'domain';
1521
+ domainKey: string;
1522
+ } | {
1523
+ kind: 'group';
1524
+ groupKey: string;
1525
+ label?: string;
1526
+ domainKeys: readonly string[];
1527
+ } | {
1528
+ kind: 'folder';
1529
+ folderId: string;
1530
+ } | {
1531
+ kind: 'item';
1532
+ domainKey: string;
1533
+ itemId: string;
1534
+ } | {
1535
+ kind: 'knowledge';
1536
+ node: OrgKnowledgeNode;
1537
+ } | {
1538
+ kind: 'graph';
1539
+ node: OrganizationGraphNode;
1540
+ } | {
1541
+ kind: 'unresolved';
1542
+ nodeId: string;
1543
+ };
1544
+ declare function decodeKnowledgeRouteNodeId(nodeId: string): string;
1545
+ declare function formatKnowledgeRouteTitle(id: string): string;
1546
+ declare function formatKnowledgeDomainLabel(domainKey: string): string;
1547
+ declare function parseKnowledgeItemRouteId(nodeId: string): KnowledgeItemRouteId | undefined;
1548
+ declare function resolveKnowledgeGraphNodeByRouteId(graph: OrganizationGraph, routeNodeId: string): OrganizationGraphNode | undefined;
1549
+ declare function resolveKnowledgeRouteTarget(graph: OrganizationGraph, knowledgeNodes: OrgKnowledgeNode[], nodeId: string | undefined): KnowledgeRouteTarget | null;
1550
+ declare function getKnowledgeRouteBreadcrumbLabel(nodeId: string, graph: OrganizationGraph): string | undefined;
1551
+
1552
+ interface KnowledgeNodeDetailRouteViewProps {
1553
+ nodeId: string;
1554
+ graph: OrganizationGraph;
1555
+ knowledgeNodes: OrgKnowledgeNode[];
1556
+ organizationModel: OrganizationModel;
1557
+ onNavigateToNode?: (nodeId: string) => void;
1558
+ }
1559
+ declare function KnowledgeNodeDetailRouteView({ nodeId, graph, knowledgeNodes, organizationModel, onNavigateToNode }: KnowledgeNodeDetailRouteViewProps): react_jsx_runtime.JSX.Element;
1560
+
1515
1561
  /**
1516
1562
  * Identifies how to dispatch a favorited entry on click. Maps onto the
1517
1563
  * `onSelect*` callback surface that `KnowledgeTree` already exposes.
@@ -2030,5 +2076,5 @@ interface NodeDescribeShellProps {
2030
2076
  }
2031
2077
  declare function NodeDescribeShell({ header, content, relationships, footer }: NodeDescribeShellProps): react_jsx_runtime.JSX.Element;
2032
2078
 
2033
- export { DescribeNodeView, DomainPanelDispatcher, EdgeRelationshipGroup, FILTERABLE_DOMAIN_KEYS, GenericDescribeView, KNOWLEDGE_ALLOWLIST, KNOWLEDGE_BODIES, KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KNOWLEDGE_ITEMS, KindChip, KnowledgeBrowser, KnowledgeMDXProvider, KnowledgeNodeList, KnowledgeNodeView, KnowledgeSearchBar, KnowledgeTree, NodeDescribeShell, NodeHeader, NodeMetadataFooter, OM_NESTED_TREE_GROUPS, OM_TREE_GROUPS, OrganizationDescribeView, RelatedKnowledgeSection, ResourceDescribeView, SemanticIcon, SystemDescribeView, buildKnowledgeOmTreeData, extendSemanticIconRegistry, findKnowledgeTreeNodeByValue, findOmTreeGroup, getKnowledgeIconToken, getSemanticIconComponent, getSharedOrganizationGraph, resolveSemanticIconComponent, useKnowledgeAllowlist };
2034
- export type { DescribeNodeViewProps, DomainPanelDispatcherProps, DomainPanelKey, EdgeRelationshipGroupProps, GenericDescribeViewProps, KindChipProps, KindChipTone, KnowledgeBrowserProps, KnowledgeFacetStates, KnowledgeNodeListProps, KnowledgeNodeViewProps, KnowledgeSearchBarProps, KnowledgeTreeNodeData, KnowledgeTreeProps, NodeDescribeShellProps, NodeHeaderProps, NodeMetadataFooterProps, OrganizationDescribeViewProps, RelatedKnowledgeSectionProps, ResourceDescribeViewProps, SemanticIconProps, SemanticIconRegistry, SemanticIconToken, SystemDescribeViewProps };
2079
+ export { DescribeNodeView, DomainPanelDispatcher, EdgeRelationshipGroup, FILTERABLE_DOMAIN_KEYS, GenericDescribeView, KNOWLEDGE_ALLOWLIST, KNOWLEDGE_BODIES, KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KNOWLEDGE_ITEMS, KindChip, KnowledgeBrowser, KnowledgeMDXProvider, KnowledgeNodeDetailRouteView, KnowledgeNodeList, KnowledgeNodeView, KnowledgeSearchBar, KnowledgeTree, NodeDescribeShell, NodeHeader, NodeMetadataFooter, OM_NESTED_TREE_GROUPS, OM_TREE_GROUPS, OrganizationDescribeView, RelatedKnowledgeSection, ResourceDescribeView, SemanticIcon, SystemDescribeView, buildKnowledgeOmTreeData, decodeKnowledgeRouteNodeId, extendSemanticIconRegistry, findKnowledgeTreeNodeByValue, findOmTreeGroup, formatKnowledgeDomainLabel, formatKnowledgeRouteTitle, getKnowledgeIconToken, getKnowledgeRouteBreadcrumbLabel, getSemanticIconComponent, getSharedOrganizationGraph, parseKnowledgeItemRouteId, resolveKnowledgeGraphNodeByRouteId, resolveKnowledgeRouteTarget, resolveSemanticIconComponent, useKnowledgeAllowlist };
2080
+ export type { DescribeNodeViewProps, DomainPanelDispatcherProps, DomainPanelKey, EdgeRelationshipGroupProps, GenericDescribeViewProps, KindChipProps, KindChipTone, KnowledgeBrowserProps, KnowledgeFacetStates, KnowledgeItemRouteId, KnowledgeNodeDetailRouteViewProps, KnowledgeNodeListProps, KnowledgeNodeViewProps, KnowledgeRouteTarget, KnowledgeSearchBarProps, KnowledgeTreeNodeData, KnowledgeTreeProps, NodeDescribeShellProps, NodeHeaderProps, NodeMetadataFooterProps, OrganizationDescribeViewProps, RelatedKnowledgeSectionProps, ResourceDescribeViewProps, SemanticIconProps, SemanticIconRegistry, SemanticIconToken, SystemDescribeViewProps };
@@ -1,4 +1,4 @@
1
- import { getConceptDefinition, normaliseConceptKey, SemanticIcon, getKnowledgeIconToken, PageContainer, getKnowledgeGraphNodeCommand, IdentityDomainSchema, WorkflowResourceEntrySchema, AgentResourceEntrySchema, IntegrationResourceEntrySchema, ScriptResourceEntrySchema, getKnowledgeNodeReadCommand, getKnowledgeOntologyProjection, getPrimaryOntologyItemsForDomain, projectNavigationSurfaces, projectNavigationGroups, SurfaceDefinitionSchema, RoleSchema, PolicySchema, getOntologyDomainLabel, getKnowledgeDomainFolderCommand, getKnowledgeTreeFolderCommand, KNOWLEDGE_DOMAINS_WITH_PANELS } from '../chunk-SBNC3FRX.js';
1
+ import { getConceptDefinition, normaliseConceptKey, SemanticIcon, getKnowledgeIconToken, PageContainer, getKnowledgeGraphNodeCommand, IdentityDomainSchema, WorkflowResourceEntrySchema, AgentResourceEntrySchema, IntegrationResourceEntrySchema, ScriptResourceEntrySchema, findOmTreeGroup, SubshellContentContainer, getKnowledgeNodeReadCommand, getKnowledgeOntologyProjection, getPrimaryOntologyItemsForDomain, projectNavigationSurfaces, projectNavigationGroups, SurfaceDefinitionSchema, RoleSchema, PolicySchema, getOntologyDomainLabel, getKnowledgeDomainFolderCommand, buildKnowledgeOmTreeData, findKnowledgeTreeNodeByValue, getKnowledgeTreeFolderCommand, KNOWLEDGE_DOMAINS_WITH_PANELS } from '../chunk-SBNC3FRX.js';
2
2
  export { FILTERABLE_DOMAIN_KEYS, KNOWLEDGE_DOMAINS_WITH_PANELS, KNOWLEDGE_ICON_TOKEN_BY_KIND, KnowledgeSearchBar, KnowledgeTree, OM_NESTED_TREE_GROUPS, OM_TREE_GROUPS, SemanticIcon, buildKnowledgeOmTreeData, extendSemanticIconRegistry, findKnowledgeTreeNodeByValue, findOmTreeGroup, getKnowledgeIconToken, getSemanticIconComponent, getSharedOrganizationGraph, resolveSemanticIconComponent } from '../chunk-SBNC3FRX.js';
3
3
  import { usePresetsContext } from '../chunk-NZ2F5RQ4.js';
4
4
  import '../chunk-OJJK27GC.js';
@@ -10887,6 +10887,98 @@ function DescribeNodeView({
10887
10887
  ) });
10888
10888
  }
10889
10889
  }
10890
+
10891
+ // src/knowledge/KnowledgeRouteIds.ts
10892
+ var DOMAIN_PREFIX = "domain:";
10893
+ var GROUP_PREFIX = "group:";
10894
+ var FOLDER_PREFIX = "folder:";
10895
+ var ITEM_PREFIX = "item:";
10896
+ function decodeKnowledgeRouteNodeId(nodeId) {
10897
+ try {
10898
+ return decodeURIComponent(nodeId);
10899
+ } catch {
10900
+ return nodeId;
10901
+ }
10902
+ }
10903
+ function formatKnowledgeRouteTitle(id) {
10904
+ const localId = id.includes("/") ? id.slice(id.lastIndexOf("/") + 1) : id;
10905
+ return localId.replace(/[-_.]+/g, " ").replace(/\s+/g, " ").trim().replace(/\b\w/g, (char) => char.toUpperCase());
10906
+ }
10907
+ function formatKnowledgeDomainLabel(domainKey) {
10908
+ return domainKey.split("-").flatMap((part) => part.split("_")).map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`).join(" ");
10909
+ }
10910
+ function parseKnowledgeItemRouteId(nodeId) {
10911
+ if (!nodeId.startsWith(ITEM_PREFIX)) return void 0;
10912
+ const rest = nodeId.slice(ITEM_PREFIX.length);
10913
+ const separatorIndex = rest.indexOf(":");
10914
+ if (separatorIndex === -1) return void 0;
10915
+ return {
10916
+ domainKey: rest.slice(0, separatorIndex),
10917
+ itemId: rest.slice(separatorIndex + 1)
10918
+ };
10919
+ }
10920
+ function resolveBareOntologyGraphNodeId(nodeId) {
10921
+ const ontologyId = OntologyIdSchema.safeParse(nodeId);
10922
+ return ontologyId.success ? ontologyGraphNodeId(ontologyId.data) : void 0;
10923
+ }
10924
+ function resolveKnowledgeGraphNodeByRouteId(graph, routeNodeId) {
10925
+ const graphNodesById = new Map(graph.nodes.map((node) => [node.id, node]));
10926
+ return graphNodesById.get(routeNodeId) ?? graphNodesById.get(resolveBareOntologyGraphNodeId(routeNodeId) ?? "") ?? graphNodesById.get(`system:${routeNodeId}`) ?? graph.nodes.find((node) => node.sourceId === routeNodeId) ?? graphNodesById.get(`knowledge:${routeNodeId}`);
10927
+ }
10928
+ function resolveKnowledgeNodeFromGraphNode(graphNode, knowledgeNodesById) {
10929
+ if (graphNode.sourceId) return knowledgeNodesById.get(graphNode.sourceId);
10930
+ return graphNode.id.startsWith("knowledge:") ? knowledgeNodesById.get(graphNode.id.slice("knowledge:".length)) : void 0;
10931
+ }
10932
+ function resolveKnowledgeRouteTarget(graph, knowledgeNodes, nodeId) {
10933
+ if (!nodeId) return null;
10934
+ const routeNodeId = decodeKnowledgeRouteNodeId(nodeId);
10935
+ if (routeNodeId.startsWith(DOMAIN_PREFIX)) {
10936
+ return { kind: "domain", domainKey: routeNodeId.slice(DOMAIN_PREFIX.length) };
10937
+ }
10938
+ if (routeNodeId.startsWith(GROUP_PREFIX)) {
10939
+ const groupKey = routeNodeId.slice(GROUP_PREFIX.length);
10940
+ const group = findOmTreeGroup(groupKey);
10941
+ return group ? { kind: "group", groupKey: group.key, label: group.label, domainKeys: group.domains } : { kind: "unresolved", nodeId: routeNodeId };
10942
+ }
10943
+ if (routeNodeId.startsWith(FOLDER_PREFIX)) {
10944
+ return { kind: "folder", folderId: routeNodeId };
10945
+ }
10946
+ const itemRoute = parseKnowledgeItemRouteId(routeNodeId);
10947
+ if (itemRoute) {
10948
+ return { kind: "item", domainKey: itemRoute.domainKey, itemId: itemRoute.itemId };
10949
+ }
10950
+ const knowledgeNodesById = new Map(knowledgeNodes.map((node) => [node.id, node]));
10951
+ const directKnowledgeNode = knowledgeNodesById.get(routeNodeId);
10952
+ if (directKnowledgeNode) return { kind: "knowledge", node: directKnowledgeNode };
10953
+ const graphNode = resolveKnowledgeGraphNodeByRouteId(graph, routeNodeId);
10954
+ if (!graphNode) return { kind: "unresolved", nodeId: routeNodeId };
10955
+ if (graphNode.kind === "knowledge") {
10956
+ const knowledgeNode = resolveKnowledgeNodeFromGraphNode(graphNode, knowledgeNodesById);
10957
+ if (knowledgeNode) return { kind: "knowledge", node: knowledgeNode };
10958
+ }
10959
+ return { kind: "graph", node: graphNode };
10960
+ }
10961
+ function getKnowledgeRouteBreadcrumbLabel(nodeId, graph) {
10962
+ const routeNodeId = decodeKnowledgeRouteNodeId(nodeId);
10963
+ if (routeNodeId.startsWith(DOMAIN_PREFIX)) {
10964
+ return formatKnowledgeDomainLabel(routeNodeId.slice(DOMAIN_PREFIX.length));
10965
+ }
10966
+ if (routeNodeId.startsWith(GROUP_PREFIX)) {
10967
+ const groupKey = routeNodeId.slice(GROUP_PREFIX.length);
10968
+ return findOmTreeGroup(groupKey)?.label;
10969
+ }
10970
+ if (routeNodeId.startsWith(FOLDER_PREFIX)) {
10971
+ const segments = routeNodeId.slice(FOLDER_PREFIX.length).split(":");
10972
+ const last = segments[segments.length - 1];
10973
+ return formatKnowledgeRouteTitle(last);
10974
+ }
10975
+ const itemRoute = parseKnowledgeItemRouteId(routeNodeId);
10976
+ if (itemRoute) {
10977
+ return formatKnowledgeRouteTitle(itemRoute.itemId);
10978
+ }
10979
+ const node = resolveKnowledgeGraphNodeByRouteId(graph, routeNodeId);
10980
+ return node?.label;
10981
+ }
10890
10982
  function KnowledgeBrowser({
10891
10983
  graph,
10892
10984
  knowledgeNodes,
@@ -10940,35 +11032,12 @@ function createKindCounts(nodes) {
10940
11032
  { playbook: 0, strategy: 0, reference: 0 }
10941
11033
  );
10942
11034
  }
10943
- function resolveKnowledgeNodeFromGraphNode(graphNode, knowledgeNodesById) {
10944
- if (graphNode.sourceId) return knowledgeNodesById.get(graphNode.sourceId);
10945
- return graphNode.id.startsWith("knowledge:") ? knowledgeNodesById.get(graphNode.id.slice("knowledge:".length)) : void 0;
10946
- }
10947
- function resolveBareOntologyGraphNodeId(nodeId) {
10948
- const ontologyId = OntologyIdSchema.safeParse(nodeId);
10949
- return ontologyId.success ? ontologyGraphNodeId(ontologyId.data) : void 0;
10950
- }
10951
- function decodeInitialNodeId(nodeId) {
10952
- try {
10953
- return decodeURIComponent(nodeId);
10954
- } catch {
10955
- return nodeId;
10956
- }
10957
- }
10958
11035
  function resolveInitialFocus(graph, knowledgeNodes, initialNodeId) {
10959
- if (!initialNodeId) return null;
10960
- const routeNodeId = decodeInitialNodeId(initialNodeId);
10961
- const knowledgeNodesById = new Map(knowledgeNodes.map((node) => [node.id, node]));
10962
- const directKnowledgeNode = knowledgeNodesById.get(routeNodeId);
10963
- if (directKnowledgeNode) return { kind: "knowledge", node: directKnowledgeNode };
10964
- const graphNodesById = new Map(graph.nodes.map((node) => [node.id, node]));
10965
- const graphNode = graphNodesById.get(routeNodeId) ?? graphNodesById.get(resolveBareOntologyGraphNodeId(routeNodeId) ?? "") ?? graphNodesById.get(`system:${routeNodeId}`);
10966
- if (!graphNode) return null;
10967
- if (graphNode.kind === "knowledge") {
10968
- const knowledgeNode = resolveKnowledgeNodeFromGraphNode(graphNode, knowledgeNodesById);
10969
- if (knowledgeNode) return { kind: "knowledge", node: knowledgeNode };
10970
- }
10971
- return { kind: "graph", node: graphNode };
11036
+ const target = resolveKnowledgeRouteTarget(graph, knowledgeNodes, initialNodeId);
11037
+ if (!target) return null;
11038
+ if (target.kind === "knowledge") return { kind: "knowledge", node: target.node };
11039
+ if (target.kind === "graph") return { kind: "graph", node: target.node };
11040
+ return null;
10972
11041
  }
10973
11042
  function resolveKnowledgeGraphIds(graph) {
10974
11043
  return new Set(graph.nodes.filter((node) => node.kind === "knowledge").map((node) => node.id));
@@ -11183,6 +11252,228 @@ function KnowledgeOverviewRow({
11183
11252
  }
11184
11253
  );
11185
11254
  }
11255
+ function DomainPanelDispatcher({
11256
+ domainKey,
11257
+ model,
11258
+ onNavigateToNode,
11259
+ filterToItemId
11260
+ }) {
11261
+ switch (domainKey) {
11262
+ case "identity":
11263
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(IdentityPanel, { model, onNavigateToNode }) });
11264
+ case "branding":
11265
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(BrandingPanel, { model, onNavigateToNode }) });
11266
+ case "customers":
11267
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(CustomersPanel, { model, onNavigateToNode, filterToItemId }) });
11268
+ case "clients":
11269
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(ClientsPanel, { model, filterToItemId }) });
11270
+ case "offerings":
11271
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(OfferingsPanel, { model, onNavigateToNode, filterToItemId }) });
11272
+ case "goals":
11273
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(GoalsPanel, { model, onNavigateToNode, filterToItemId }) });
11274
+ case "roles":
11275
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(RolesPanel, { model, onNavigateToNode, filterToItemId }) });
11276
+ case "statuses":
11277
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(StatusesPanel, { model, onNavigateToNode, filterToItemId }) });
11278
+ case "navigation":
11279
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(NavigationPanel, { model, onNavigateToNode }) });
11280
+ case "policies":
11281
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(PoliciesPanel, { model, onNavigateToNode, filterToItemId }) });
11282
+ case "ontology-objects":
11283
+ case "ontology-links":
11284
+ case "ontology-actions":
11285
+ case "ontology-catalogs":
11286
+ case "ontology-events":
11287
+ case "ontology-interfaces":
11288
+ case "ontology-value-types":
11289
+ case "ontology-properties":
11290
+ case "ontology-groups":
11291
+ case "ontology-endpoints":
11292
+ case "ontology-resources":
11293
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(OntologyPanel, { model, domainKey, filterToItemId }) });
11294
+ default:
11295
+ return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsxs(Stack, { p: "md", gap: "xs", children: [
11296
+ /* @__PURE__ */ jsx(Text, { fw: 650, children: "Unknown domain" }),
11297
+ /* @__PURE__ */ jsxs(Text, { size: "sm", c: "dimmed", children: [
11298
+ "No panel for `",
11299
+ domainKey,
11300
+ "`."
11301
+ ] })
11302
+ ] }) });
11303
+ }
11304
+ }
11305
+ function treeNodeToDescribeChild(child) {
11306
+ const label = String(child.label);
11307
+ const value = typeof child.value === "string" ? child.value : void 0;
11308
+ const nodeType = child.nodeType === "group" ? "group" : child.nodeType === "domain" ? "domain" : child.nodeType === "item" ? "item" : "group";
11309
+ return {
11310
+ value,
11311
+ label,
11312
+ nodeType,
11313
+ domainKey: child.domainKey,
11314
+ itemId: child.itemId,
11315
+ children: child.children ? child.children.map(treeNodeToDescribeChild) : void 0
11316
+ };
11317
+ }
11318
+ function FolderDetailView({
11319
+ nodeId,
11320
+ graph,
11321
+ knowledgeNodes,
11322
+ organizationModel,
11323
+ onNavigateToNode
11324
+ }) {
11325
+ const treeData = useMemo(
11326
+ () => buildKnowledgeOmTreeData(graph, knowledgeNodes, {}, organizationModel),
11327
+ [graph, knowledgeNodes, organizationModel]
11328
+ );
11329
+ const folderNode = useMemo(() => findKnowledgeTreeNodeByValue(treeData, nodeId), [treeData, nodeId]);
11330
+ const folderLabel = folderNode ? String(folderNode.label) : formatKnowledgeRouteTitle(nodeId.slice("folder:".length));
11331
+ const children = folderNode?.children ? folderNode.children.map(treeNodeToDescribeChild) : [];
11332
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsx(
11333
+ DescribeNodeView,
11334
+ {
11335
+ node: {
11336
+ value: nodeId,
11337
+ label: folderLabel,
11338
+ nodeType: "group",
11339
+ children
11340
+ },
11341
+ graph,
11342
+ organizationModel,
11343
+ knowledgeNodes,
11344
+ onNavigateToNode
11345
+ }
11346
+ ) });
11347
+ }
11348
+ function KnowledgeNodeFallback({ missingId, graph, knowledgeNodes, onNavigateToNode }) {
11349
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsxs(Stack, { gap: "md", children: [
11350
+ /* @__PURE__ */ jsx(
11351
+ Alert,
11352
+ {
11353
+ variant: "light",
11354
+ color: "gray",
11355
+ icon: /* @__PURE__ */ jsx(IconInfoCircle, { size: 18 }),
11356
+ title: `${formatKnowledgeRouteTitle(missingId)} is not available`,
11357
+ children: "This knowledge item could not be found. It may have been renamed, moved, or not yet generated for this organization. Browse the full knowledge base below."
11358
+ }
11359
+ ),
11360
+ /* @__PURE__ */ jsx(KnowledgeBrowser, { graph, knowledgeNodes, onSelectNode: onNavigateToNode })
11361
+ ] }) });
11362
+ }
11363
+ function KnowledgeNodeDetailRouteView({
11364
+ nodeId,
11365
+ graph,
11366
+ knowledgeNodes,
11367
+ organizationModel,
11368
+ onNavigateToNode
11369
+ }) {
11370
+ const routeNodeId = useMemo(() => decodeKnowledgeRouteNodeId(nodeId), [nodeId]);
11371
+ const target = useMemo(
11372
+ () => resolveKnowledgeRouteTarget(graph, knowledgeNodes, routeNodeId),
11373
+ [graph, knowledgeNodes, routeNodeId]
11374
+ );
11375
+ if (!target) {
11376
+ return /* @__PURE__ */ jsx(
11377
+ KnowledgeNodeFallback,
11378
+ {
11379
+ missingId: routeNodeId,
11380
+ graph,
11381
+ knowledgeNodes,
11382
+ onNavigateToNode
11383
+ }
11384
+ );
11385
+ }
11386
+ switch (target.kind) {
11387
+ case "domain":
11388
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsx(
11389
+ DomainPanelDispatcher,
11390
+ {
11391
+ domainKey: target.domainKey,
11392
+ model: organizationModel,
11393
+ onNavigateToNode
11394
+ }
11395
+ ) });
11396
+ case "group":
11397
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsx(
11398
+ DescribeNodeView,
11399
+ {
11400
+ node: {
11401
+ value: `group:${target.groupKey}`,
11402
+ label: target.label ?? formatKnowledgeRouteTitle(target.groupKey),
11403
+ nodeType: "group",
11404
+ children: target.domainKeys.map((domainKey) => ({
11405
+ value: `domain:${domainKey}`,
11406
+ label: formatKnowledgeDomainLabel(domainKey),
11407
+ nodeType: "domain",
11408
+ domainKey
11409
+ }))
11410
+ },
11411
+ graph,
11412
+ organizationModel,
11413
+ knowledgeNodes,
11414
+ onNavigateToNode
11415
+ }
11416
+ ) });
11417
+ case "folder":
11418
+ return /* @__PURE__ */ jsx(
11419
+ FolderDetailView,
11420
+ {
11421
+ nodeId: target.folderId,
11422
+ graph,
11423
+ knowledgeNodes,
11424
+ organizationModel,
11425
+ onNavigateToNode
11426
+ }
11427
+ );
11428
+ case "item":
11429
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsx(
11430
+ DomainPanelDispatcher,
11431
+ {
11432
+ domainKey: target.domainKey,
11433
+ model: organizationModel,
11434
+ filterToItemId: target.itemId,
11435
+ onNavigateToNode
11436
+ }
11437
+ ) });
11438
+ case "knowledge":
11439
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsx(
11440
+ DescribeNodeView,
11441
+ {
11442
+ node: {
11443
+ id: `knowledge:${target.node.id}`,
11444
+ kind: "knowledge",
11445
+ label: target.node.title,
11446
+ sourceId: target.node.id
11447
+ },
11448
+ graph,
11449
+ organizationModel,
11450
+ knowledgeNodes,
11451
+ onNavigateToNode
11452
+ }
11453
+ ) });
11454
+ case "graph":
11455
+ return /* @__PURE__ */ jsx(SubshellContentContainer, { children: /* @__PURE__ */ jsx(
11456
+ DescribeNodeView,
11457
+ {
11458
+ node: target.node,
11459
+ graph,
11460
+ organizationModel,
11461
+ knowledgeNodes,
11462
+ onNavigateToNode
11463
+ }
11464
+ ) });
11465
+ case "unresolved":
11466
+ return /* @__PURE__ */ jsx(
11467
+ KnowledgeNodeFallback,
11468
+ {
11469
+ missingId: target.nodeId,
11470
+ graph,
11471
+ knowledgeNodes,
11472
+ onNavigateToNode
11473
+ }
11474
+ );
11475
+ }
11476
+ }
11186
11477
  function KnowledgeNodeList({ nodes, onSelect, selectedNodeId, label }) {
11187
11478
  if (nodes.length === 0) {
11188
11479
  return /* @__PURE__ */ jsxs(Stack, { gap: "xs", style: { padding: "var(--mantine-spacing-md)" }, children: [
@@ -11270,55 +11561,5 @@ function KnowledgeNodeList({ nodes, onSelect, selectedNodeId, label }) {
11270
11561
  ] });
11271
11562
  }
11272
11563
  var KNOWLEDGE_ITEMS = [{ label: "Knowledge", to: "/knowledge", icon: IconBook, exact: true }];
11273
- function DomainPanelDispatcher({
11274
- domainKey,
11275
- model,
11276
- onNavigateToNode,
11277
- filterToItemId
11278
- }) {
11279
- switch (domainKey) {
11280
- case "identity":
11281
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(IdentityPanel, { model, onNavigateToNode }) });
11282
- case "branding":
11283
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(BrandingPanel, { model, onNavigateToNode }) });
11284
- case "customers":
11285
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(CustomersPanel, { model, onNavigateToNode, filterToItemId }) });
11286
- case "clients":
11287
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(ClientsPanel, { model, filterToItemId }) });
11288
- case "offerings":
11289
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(OfferingsPanel, { model, onNavigateToNode, filterToItemId }) });
11290
- case "goals":
11291
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(GoalsPanel, { model, onNavigateToNode, filterToItemId }) });
11292
- case "roles":
11293
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(RolesPanel, { model, onNavigateToNode, filterToItemId }) });
11294
- case "statuses":
11295
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(StatusesPanel, { model, onNavigateToNode, filterToItemId }) });
11296
- case "navigation":
11297
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(NavigationPanel, { model, onNavigateToNode }) });
11298
- case "policies":
11299
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(PoliciesPanel, { model, onNavigateToNode, filterToItemId }) });
11300
- case "ontology-objects":
11301
- case "ontology-links":
11302
- case "ontology-actions":
11303
- case "ontology-catalogs":
11304
- case "ontology-events":
11305
- case "ontology-interfaces":
11306
- case "ontology-value-types":
11307
- case "ontology-properties":
11308
- case "ontology-groups":
11309
- case "ontology-endpoints":
11310
- case "ontology-resources":
11311
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsx(OntologyPanel, { model, domainKey, filterToItemId }) });
11312
- default:
11313
- return /* @__PURE__ */ jsx(DomainPanelFrame, { children: /* @__PURE__ */ jsxs(Stack, { p: "md", gap: "xs", children: [
11314
- /* @__PURE__ */ jsx(Text, { fw: 650, children: "Unknown domain" }),
11315
- /* @__PURE__ */ jsxs(Text, { size: "sm", c: "dimmed", children: [
11316
- "No panel for `",
11317
- domainKey,
11318
- "`."
11319
- ] })
11320
- ] }) });
11321
- }
11322
- }
11323
11564
 
11324
- export { DescribeNodeView, DomainPanelDispatcher, EdgeRelationshipGroup, GenericDescribeView, KNOWLEDGE_ALLOWLIST, KNOWLEDGE_BODIES, KNOWLEDGE_ITEMS, KindChip, KnowledgeBrowser, KnowledgeMDXProvider, KnowledgeNodeList, KnowledgeNodeView, NodeDescribeShell, NodeHeader, NodeMetadataFooter, OrganizationDescribeView, RelatedKnowledgeSection, ResourceDescribeView, SystemDescribeView, useKnowledgeAllowlist };
11565
+ export { DescribeNodeView, DomainPanelDispatcher, EdgeRelationshipGroup, GenericDescribeView, KNOWLEDGE_ALLOWLIST, KNOWLEDGE_BODIES, KNOWLEDGE_ITEMS, KindChip, KnowledgeBrowser, KnowledgeMDXProvider, KnowledgeNodeDetailRouteView, KnowledgeNodeList, KnowledgeNodeView, NodeDescribeShell, NodeHeader, NodeMetadataFooter, OrganizationDescribeView, RelatedKnowledgeSection, ResourceDescribeView, SystemDescribeView, decodeKnowledgeRouteNodeId, formatKnowledgeDomainLabel, formatKnowledgeRouteTitle, getKnowledgeRouteBreadcrumbLabel, parseKnowledgeItemRouteId, resolveKnowledgeGraphNodeByRouteId, resolveKnowledgeRouteTarget, useKnowledgeAllowlist };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/ui",
3
- "version": "2.50.0",
3
+ "version": "2.51.0",
4
4
  "description": "UI components and platform-aware hooks for building custom frontends on the Elevasis platform",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -274,11 +274,11 @@
274
274
  "typescript": "5.9.2",
275
275
  "vite": "^7.0.0",
276
276
  "vitest": "^3.2.4",
277
- "@elevasis/sdk": "1.34.0",
278
- "@repo/eslint-config": "0.0.0",
279
- "@repo/core": "0.47.0",
277
+ "@repo/core": "0.48.0",
280
278
  "@repo/elevasis-core": "1.0.0",
281
- "@repo/typescript-config": "0.0.0"
279
+ "@repo/typescript-config": "0.0.0",
280
+ "@elevasis/sdk": "1.35.0",
281
+ "@repo/eslint-config": "0.0.0"
282
282
  },
283
283
  "dependencies": {
284
284
  "@dagrejs/dagre": "^1.1.4",
@@ -10,8 +10,10 @@ Read-only browser primitives for the Organization Model knowledge graph.
10
10
  | `KnowledgeTree` | By-feature primary tree with hierarchical features and multi-governance duplication. |
11
11
  | `KnowledgeNodeList` | Legacy flat list of node summary cards; exported for compatibility. |
12
12
  | `KnowledgeNodeView` | Single knowledge-node detail view using `NodeDescribeShell` and relationship groups. |
13
- | `KnowledgeSearchBar` | Client-side search over `_generated/knowledge-search-index.json`. |
14
- | `KnowledgeSidebarMiddle` | Deprecated legacy sidebar middle section; active sidebar lives under `features/knowledge/sidebar`. |
13
+ | `KnowledgeSearchBar` | Client-side search over `_generated/knowledge-search-index.json`. |
14
+ | `KnowledgeNodeDetailRouteView` | Shared `/knowledge/$nodeId` content route view; apps keep TanStack route adapters and navigation wiring local. |
15
+ | `KnowledgeRouteIds` helpers | Decode route ids, resolve Knowledge route targets, and derive route labels for app-local breadcrumbs. |
16
+ | `KnowledgeSidebarMiddle` | Deprecated legacy sidebar middle section; active sidebar lives under `features/knowledge/sidebar`. |
15
17
  | `KNOWLEDGE_ITEMS` | Deprecated default sidebar nav items retained for compatibility. |
16
18
  | `KnowledgeMDXProvider`, `useKnowledgeAllowlist`, `KNOWLEDGE_ALLOWLIST` | MDX runtime allowlist (`Card`, `Cards`, `Step`, `Steps`, `Callout`, `Tab`, `Tabs`). |
17
19
  | `KNOWLEDGE_BODIES` | Build-time-compiled MDX components keyed by node id. |