@gooddata/sdk-ui-catalog 11.22.0 → 11.23.0-alpha.1

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.
Files changed (99) hide show
  1. package/esm/catalogDetail/CatalogDetailContent.d.ts.map +1 -1
  2. package/esm/catalogDetail/CatalogDetailContent.js +33 -6
  3. package/esm/catalogDetail/CatalogDetailContent.js.map +1 -1
  4. package/esm/catalogDetail/CatalogDetailTabCertification.d.ts +9 -0
  5. package/esm/catalogDetail/CatalogDetailTabCertification.d.ts.map +1 -0
  6. package/esm/catalogDetail/CatalogDetailTabCertification.js +73 -0
  7. package/esm/catalogDetail/CatalogDetailTabCertification.js.map +1 -0
  8. package/esm/catalogDetail/CatalogDetailTabLineage.d.ts +7 -0
  9. package/esm/catalogDetail/CatalogDetailTabLineage.d.ts.map +1 -0
  10. package/esm/catalogDetail/CatalogDetailTabLineage.js +8 -0
  11. package/esm/catalogDetail/CatalogDetailTabLineage.js.map +1 -0
  12. package/esm/catalogDetail/hooks/useCatalogItemUpdate.d.ts +1 -0
  13. package/esm/catalogDetail/hooks/useCatalogItemUpdate.d.ts.map +1 -1
  14. package/esm/catalogDetail/hooks/useCatalogItemUpdate.js +34 -1
  15. package/esm/catalogDetail/hooks/useCatalogItemUpdate.js.map +1 -1
  16. package/esm/catalogItem/converter.d.ts.map +1 -1
  17. package/esm/catalogItem/converter.js +4 -1
  18. package/esm/catalogItem/converter.js.map +1 -1
  19. package/esm/catalogItem/query.d.ts +1 -0
  20. package/esm/catalogItem/query.d.ts.map +1 -1
  21. package/esm/catalogItem/query.js +14 -0
  22. package/esm/catalogItem/query.js.map +1 -1
  23. package/esm/catalogItem/types.d.ts +2 -1
  24. package/esm/catalogItem/types.d.ts.map +1 -1
  25. package/esm/catalogItem/types.js +1 -1
  26. package/esm/catalogItem/types.js.map +1 -1
  27. package/esm/certification/CertificationIcon.d.ts +10 -0
  28. package/esm/certification/CertificationIcon.d.ts.map +1 -0
  29. package/esm/certification/CertificationIcon.js +20 -0
  30. package/esm/certification/CertificationIcon.js.map +1 -0
  31. package/esm/certification/gate.d.ts +10 -0
  32. package/esm/certification/gate.d.ts.map +1 -0
  33. package/esm/certification/gate.js +20 -0
  34. package/esm/certification/gate.js.map +1 -0
  35. package/esm/lineage/Lineage.d.ts +9 -0
  36. package/esm/lineage/Lineage.d.ts.map +1 -0
  37. package/esm/lineage/Lineage.js +66 -0
  38. package/esm/lineage/Lineage.js.map +1 -0
  39. package/esm/lineage/const.d.ts +4 -0
  40. package/esm/lineage/const.d.ts.map +1 -0
  41. package/esm/lineage/const.js +25 -0
  42. package/esm/lineage/const.js.map +1 -0
  43. package/esm/lineage/gate.d.ts +5 -0
  44. package/esm/lineage/gate.d.ts.map +1 -0
  45. package/esm/lineage/gate.js +9 -0
  46. package/esm/lineage/gate.js.map +1 -0
  47. package/esm/lineage/graph/applyLayout.d.ts +3 -0
  48. package/esm/lineage/graph/applyLayout.d.ts.map +1 -0
  49. package/esm/lineage/graph/applyLayout.js +9 -0
  50. package/esm/lineage/graph/applyLayout.js.map +1 -0
  51. package/esm/lineage/graph/createEdge.d.ts +4 -0
  52. package/esm/lineage/graph/createEdge.d.ts.map +1 -0
  53. package/esm/lineage/graph/createEdge.js +29 -0
  54. package/esm/lineage/graph/createEdge.js.map +1 -0
  55. package/esm/lineage/graph/createGraph.d.ts +3 -0
  56. package/esm/lineage/graph/createGraph.d.ts.map +1 -0
  57. package/esm/lineage/graph/createGraph.js +6 -0
  58. package/esm/lineage/graph/createGraph.js.map +1 -0
  59. package/esm/lineage/graph/createIcon.d.ts +10 -0
  60. package/esm/lineage/graph/createIcon.d.ts.map +1 -0
  61. package/esm/lineage/graph/createIcon.js +48 -0
  62. package/esm/lineage/graph/createIcon.js.map +1 -0
  63. package/esm/lineage/graph/createNode.d.ts +5 -0
  64. package/esm/lineage/graph/createNode.d.ts.map +1 -0
  65. package/esm/lineage/graph/createNode.js +124 -0
  66. package/esm/lineage/graph/createNode.js.map +1 -0
  67. package/esm/lineage/graph/createPaper.d.ts +6 -0
  68. package/esm/lineage/graph/createPaper.d.ts.map +1 -0
  69. package/esm/lineage/graph/createPaper.js +27 -0
  70. package/esm/lineage/graph/createPaper.js.map +1 -0
  71. package/esm/lineage/graph/createScroller.d.ts +33 -0
  72. package/esm/lineage/graph/createScroller.d.ts.map +1 -0
  73. package/esm/lineage/graph/createScroller.js +149 -0
  74. package/esm/lineage/graph/createScroller.js.map +1 -0
  75. package/esm/lineage/useLineageGraph.d.ts +22 -0
  76. package/esm/lineage/useLineageGraph.d.ts.map +1 -0
  77. package/esm/lineage/useLineageGraph.js +85 -0
  78. package/esm/lineage/useLineageGraph.js.map +1 -0
  79. package/esm/lineage/utils.d.ts +13 -0
  80. package/esm/lineage/utils.d.ts.map +1 -0
  81. package/esm/lineage/utils.js +86 -0
  82. package/esm/lineage/utils.js.map +1 -0
  83. package/esm/localization/bundles/en-US.localization-bundle.d.ts +40 -0
  84. package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  85. package/esm/localization/bundles/en-US.localization-bundle.js +40 -0
  86. package/esm/localization/bundles/en-US.localization-bundle.js.map +1 -1
  87. package/esm/sdk-ui-catalog.d.ts +2 -0
  88. package/esm/table/columns/TitleColumn.d.ts.map +1 -1
  89. package/esm/table/columns/TitleColumn.js +2 -1
  90. package/esm/table/columns/TitleColumn.js.map +1 -1
  91. package/package.json +15 -13
  92. package/styles/css/detail.css +79 -3
  93. package/styles/css/detail.css.map +1 -1
  94. package/styles/css/main.css +104 -3
  95. package/styles/css/main.css.map +1 -1
  96. package/styles/css/objectType.css +3 -3
  97. package/styles/scss/detail.scss +88 -0
  98. package/styles/scss/main.scss +29 -0
  99. package/styles/scss/objectType.scss +3 -3
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // (C) 2026 GoodData Corporation
3
+ import { memo } from "react";
4
+ import { UiIcon, UiTooltip } from "@gooddata/sdk-ui-kit";
5
+ import { useIsCatalogCertificationEnabled } from "./gate.js";
6
+ import {} from "../catalogItem/types.js";
7
+ export const CertificationIconMemo = memo(function CertificationIcon(props) {
8
+ const { certification, intl, ...htmlProps } = props;
9
+ const isCertificationEnabled = useIsCatalogCertificationEnabled();
10
+ if (!isCertificationEnabled || certification?.status !== "CERTIFIED") {
11
+ return null;
12
+ }
13
+ return (_jsx("div", { ...htmlProps, children: _jsx(UiTooltip, { arrowPlacement: "top", optimalPlacement: true, triggerBy: ["hover", "focus"], variant: "none", showArrow: false, width: 200, offset: -6, anchor: _jsx(UiIcon, { type: "certification", size: 14, backgroundSize: 26, color: "success", layout: "block" }), content: _jsxs("div", { className: "gd-analytics-catalog__certification-tooltip", children: [
14
+ _jsxs("div", { className: "gd-analytics-catalog__certification-tooltip__header", children: [
15
+ _jsx(UiIcon, { type: "certification", size: 14, color: "success", layout: "block" }), _jsx("span", { className: "gd-analytics-catalog__certification-tooltip__title", children: intl.formatMessage({
16
+ id: "analyticsCatalog.certification.tooltip.title",
17
+ }) })
18
+ ] }), certification.message ? (_jsx("div", { className: "gd-analytics-catalog__certification-tooltip__message", children: certification.message })) : null] }) }) }));
19
+ });
20
+ //# sourceMappingURL=CertificationIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertificationIcon.js","sourceRoot":"","sources":["../../src/certification/CertificationIcon.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAEhC,OAAO,EAAuB,IAAI,EAAE,MAAM,OAAO,CAAC;AAIlD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,gCAAgC,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAqB,MAAM,yBAAyB,CAAC;AAO5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,iBAAiB,CAAC,KAA6B,EAAE;IAChG,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;IACpD,MAAM,sBAAsB,GAAG,gCAAgC,EAAE,CAAC;IAElE,IAAI,CAAC,sBAAsB,IAAI,aAAa,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CACH,iBAAS,SAAS,YACd,KAAC,SAAS,IACN,cAAc,EAAC,KAAK,EACpB,gBAAgB,QAChB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAC,MAAM,EACd,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,CAAC,CAAC,EACV,MAAM,EACF,KAAC,MAAM,IACH,IAAI,EAAC,eAAe,EACpB,IAAI,EAAE,EAAE,EACR,cAAc,EAAE,EAAE,EAClB,KAAK,EAAC,SAAS,EACf,MAAM,EAAC,OAAO,GAChB,EAEN,OAAO,EACH,eAAK,SAAS,EAAC,6CAA6C;oBACxD,eAAK,SAAS,EAAC,qDAAqD;4BAChE,KAAC,MAAM,IAAC,IAAI,EAAC,eAAe,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,SAAS,EAAC,MAAM,EAAC,OAAO,GAAG,EACxE,eAAM,SAAS,EAAC,oDAAoD,YAC/D,IAAI,CAAC,aAAa,CAAC;oCAChB,EAAE,EAAE,8CAA8C;iCACrD,CAAC,GACC;4BACL,EACL,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CACrB,cAAK,SAAS,EAAC,sDAAsD,YAChE,aAAa,CAAC,OAAO,GACpB,CACT,CAAC,CAAC,CAAC,IAAI,IACN,GAEZ,GACA,CACT,CAAC;AAAA,CACL,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ObjectType } from "../objectType/types.js";
2
+ /**
3
+ * Catalog certification feature gate.
4
+ */
5
+ export declare function useIsCatalogCertificationEnabled(): boolean;
6
+ /**
7
+ * Catalog certification is supported only for selected object types.
8
+ */
9
+ export declare function useIsCertificationAllowed(objectType?: ObjectType): boolean;
10
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/certification/gate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKzD;;GAEG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAM1E"}
@@ -0,0 +1,20 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useFeatureFlag } from "../permission/PermissionsContext.js";
3
+ const SUPPORTED_CERTIFICATION_TYPES = ["analyticalDashboard", "insight", "measure"];
4
+ /**
5
+ * Catalog certification feature gate.
6
+ */
7
+ export function useIsCatalogCertificationEnabled() {
8
+ return useFeatureFlag("enableCertification");
9
+ }
10
+ /**
11
+ * Catalog certification is supported only for selected object types.
12
+ */
13
+ export function useIsCertificationAllowed(objectType) {
14
+ const isCertificationEnabled = useIsCatalogCertificationEnabled();
15
+ if (!isCertificationEnabled || !objectType) {
16
+ return false;
17
+ }
18
+ return SUPPORTED_CERTIFICATION_TYPES.includes(objectType);
19
+ }
20
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/certification/gate.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAGhC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,MAAM,6BAA6B,GAAiB,CAAC,qBAAqB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAElG;;GAEG;AACH,MAAM,UAAU,gCAAgC,GAAY;IACxD,OAAO,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAAA,CAChD;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAuB,EAAW;IACxE,MAAM,sBAAsB,GAAG,gCAAgC,EAAE,CAAC;IAClE,IAAI,CAAC,sBAAsB,IAAI,CAAC,UAAU,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,6BAA6B,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAAA,CAC7D"}
@@ -0,0 +1,9 @@
1
+ import { type MouseEvent } from "react";
2
+ import { type ICatalogItem, type ICatalogItemRef } from "../catalogItem/types.js";
3
+ type Props = {
4
+ item: ICatalogItem;
5
+ onItemClick?: (event: MouseEvent, ref: ICatalogItemRef) => void;
6
+ };
7
+ export declare function Lineage({ item, onItemClick }: Props): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Lineage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lineage.d.ts","sourceRoot":"","sources":["../../src/lineage/Lineage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,OAAO,CAAC;AAuB3D,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAOlF,KAAK,KAAK,GAAG;IACT,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;CACnE,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,2CAoHnD"}
@@ -0,0 +1,66 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // (C) 2025-2026 GoodData Corporation
3
+ import { useMemo, useState } from "react";
4
+ import { defineMessages, useIntl } from "react-intl";
5
+ import {} from "@gooddata/sdk-backend-spi";
6
+ import { ErrorComponent, LoadingComponent, useBackendStrict, useCancelablePromise, useWorkspaceStrict, } from "@gooddata/sdk-ui";
7
+ import { UiButton, UiDropdown, UiIconButton, UiListbox, useElementSize, } from "@gooddata/sdk-ui-kit";
8
+ import { HIDDEN_ITEMS, LEAF_TYPES } from "./const.js";
9
+ import { useLineageGraph } from "./useLineageGraph.js";
10
+ import {} from "../catalogItem/types.js";
11
+ const messages = defineMessages({
12
+ up: { id: "analyticsCatalog.lineage.direction.up" },
13
+ down: { id: "analyticsCatalog.lineage.direction.down" },
14
+ });
15
+ export function Lineage({ item, onItemClick }) {
16
+ const backend = useBackendStrict();
17
+ const workspace = useWorkspaceStrict();
18
+ const intl = useIntl();
19
+ const [direction, setDirection] = useState("down");
20
+ const objRef = useMemo(() => ({ identifier: item.identifier, type: item.type }), [item]);
21
+ const { result, status, error } = useCancelablePromise({
22
+ promise: () => {
23
+ const refs = backend.workspace(workspace).references();
24
+ return refs.getReferences(objRef, {
25
+ direction,
26
+ });
27
+ },
28
+ }, [objRef, direction]);
29
+ const { ref, width, height } = useElementSize();
30
+ const { setContainer, zoomIn, zoomOut, reset, expand, zoomOutEnabled, zoomInEnabled } = useLineageGraph(result?.nodes, result?.edges, {
31
+ onItemClick,
32
+ typesToFilter: HIDDEN_ITEMS,
33
+ leafTypesToFilter: LEAF_TYPES,
34
+ direction,
35
+ });
36
+ const items = useMemo(() => {
37
+ return [
38
+ {
39
+ type: "interactive",
40
+ id: "up",
41
+ stringTitle: intl.formatMessage(messages["up"]),
42
+ },
43
+ {
44
+ type: "interactive",
45
+ id: "down",
46
+ stringTitle: intl.formatMessage(messages["down"]),
47
+ },
48
+ ];
49
+ }, [intl]);
50
+ const isLoading = status === "loading" || status === "pending";
51
+ const isLoadingOrSuccess = isLoading || status === "success";
52
+ return (_jsxs("div", { className: "lineage-container", ref: ref, children: [isLoadingOrSuccess ? (_jsxs(_Fragment, { children: [
53
+ _jsx("div", { className: "lineage-direction", children: _jsx(UiDropdown, { closeOnEscape: true, autofocusOnOpen: true, closeOnOutsideClick: true, renderButton: (props) => (_jsx(UiButton, { size: "medium", isDisabled: isLoading, label: intl.formatMessage(messages[direction]), iconAfter: props.isOpen ? "chevronUp" : "chevronDown", iconAfterSize: 11, onClick: props.toggleDropdown })), renderBody: (props) => (_jsx(UiListbox, { width: 200, items: items, ariaAttributes: {
54
+ id: props.ariaAttributes.id,
55
+ }, selectedItemId: direction, onSelect: (item) => {
56
+ setDirection(item.id);
57
+ props.closeDropdown();
58
+ } })) }) }), _jsxs("div", { className: "lineage-toolbar", children: [
59
+ _jsx(UiIconButton, { icon: "minimize", onClick: reset, isDisabled: isLoading }), _jsx(UiIconButton, { icon: "expand", onClick: expand, isDisabled: isLoading }), _jsx("div", { className: "lineage-toolbar-spacer" }), _jsx(UiIconButton, { icon: "minusCircle", onClick: zoomOut, isDisabled: !zoomOutEnabled || isLoading }), _jsx(UiIconButton, { icon: "plusCircle", onClick: zoomIn, isDisabled: !zoomInEnabled || isLoading })
60
+ ] })
61
+ ] })) : null, isLoading ? _jsx(LoadingComponent, {}) : null, status === "success" ? (_jsx("div", { className: "lineage-container-graph", ref: setContainer, style: {
62
+ width,
63
+ height,
64
+ } })) : null, status === "error" && error ? _jsx(ErrorComponent, { message: error.message, width: "100%" }) : null] }));
65
+ }
66
+ //# sourceMappingURL=Lineage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Lineage.js","sourceRoot":"","sources":["../../src/lineage/Lineage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ObjectType } from "@gooddata/sdk-model";
2
+ export declare const HIDDEN_ITEMS: ObjectType[];
3
+ export declare const LEAF_TYPES: ObjectType[];
4
+ //# sourceMappingURL=const.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../src/lineage/const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,eAAO,MAAM,YAAY,EAAE,UAAU,EAoBpC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAAU,EAAgB,CAAC"}
@@ -0,0 +1,25 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import {} from "@gooddata/sdk-model";
3
+ export const HIDDEN_ITEMS = [
4
+ "filterContext",
5
+ "filterView",
6
+ "tag",
7
+ "user",
8
+ "workspaceDataFilter",
9
+ "attribute",
10
+ "attributeHierarchy",
11
+ "automation",
12
+ "colorPalette",
13
+ "dashboardPlugin",
14
+ "dateAttributeHierarchy",
15
+ "dateHierarchyTemplate",
16
+ "exportDefinition",
17
+ "memoryItem",
18
+ "notificationChannel",
19
+ "theme",
20
+ "userGroup",
21
+ "variable",
22
+ "workspaceDataFilterSetting",
23
+ ];
24
+ export const LEAF_TYPES = ["dataSet"];
25
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/lineage/const.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,EAAmB,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,YAAY,GAAiB;IACtC,eAAe;IACf,YAAY;IACZ,KAAK;IACL,MAAM;IACN,qBAAqB;IACrB,WAAW;IACX,oBAAoB;IACpB,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,wBAAwB;IACxB,uBAAuB;IACvB,kBAAkB;IAClB,YAAY;IACZ,qBAAqB;IACrB,OAAO;IACP,WAAW;IACX,UAAU;IACV,4BAA4B;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAiB,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Checks whether lineage is enabled.
3
+ */
4
+ export declare function useIsLineageEnabled(): boolean;
5
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/lineage/gate.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
@@ -0,0 +1,9 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useFeatureFlag } from "../permission/PermissionsContext.js";
3
+ /**
4
+ * Checks whether lineage is enabled.
5
+ */
6
+ export function useIsLineageEnabled() {
7
+ return useFeatureFlag("enableCatalogLineage");
8
+ }
9
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/lineage/gate.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,mBAAmB,GAAY;IAC3C,OAAO,cAAc,CAAC,sBAAsB,CAAC,CAAC;AAAA,CACjD"}
@@ -0,0 +1,3 @@
1
+ import type * as joint from "@joint/core";
2
+ export declare function applyLayout(graph: joint.dia.Graph, direction?: "up" | "down"): void;
3
+ //# sourceMappingURL=applyLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyLayout.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/applyLayout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAC;AAG1C,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,GAAE,IAAI,GAAG,MAAe,QAKpF"}
@@ -0,0 +1,9 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import { DirectedGraph } from "@joint/layout-directed-graph";
3
+ export function applyLayout(graph, direction = "down") {
4
+ // Layout
5
+ DirectedGraph.layout(graph, {
6
+ rankDir: direction === "down" ? "LR" : "RL",
7
+ });
8
+ }
9
+ //# sourceMappingURL=applyLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyLayout.js","sourceRoot":"","sources":["../../../src/lineage/graph/applyLayout.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,MAAM,UAAU,WAAW,CAAC,KAAsB,EAAE,SAAS,GAAkB,MAAM,EAAE;IACnF,SAAS;IACT,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE;QACxB,OAAO,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KAC9C,CAAC,CAAC;AAAA,CACN"}
@@ -0,0 +1,4 @@
1
+ import * as joint from "@joint/core";
2
+ import { type IReferencesResult } from "@gooddata/sdk-backend-spi";
3
+ export declare function createEdge(edge: IReferencesResult["edges"][number]): joint.shapes.standard.Link;
4
+ //# sourceMappingURL=createEdge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createEdge.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createEdge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAInE,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,8BAyBlE"}
@@ -0,0 +1,29 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import * as joint from "@joint/core";
3
+ import {} from "@gooddata/sdk-backend-spi";
4
+ import { objRefToId } from "../utils.js";
5
+ export function createEdge(edge) {
6
+ return new joint.shapes.standard.Link({
7
+ source: {
8
+ id: objRefToId(edge.from),
9
+ },
10
+ target: {
11
+ id: objRefToId(edge.to),
12
+ },
13
+ connector: {
14
+ name: "rounded", // optional: smoother corners
15
+ args: { radius: 8 },
16
+ },
17
+ attrs: {
18
+ line: {
19
+ class: "edge-connector",
20
+ stroke: "transparent",
21
+ strokeWidth: 1.5,
22
+ targetMarker: {
23
+ type: "none", // tree style, no arrows
24
+ },
25
+ },
26
+ },
27
+ });
28
+ }
29
+ //# sourceMappingURL=createEdge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createEdge.js","sourceRoot":"","sources":["../../../src/lineage/graph/createEdge.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,OAAO,EAA0B,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,UAAU,CAAC,IAAwC,EAAE;IACjE,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,MAAM,EAAE;YACJ,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5B;QACD,MAAM,EAAE;YACJ,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;SAC1B;QAED,SAAS,EAAE;YACP,IAAI,EAAE,SAAS,EAAE,6BAA6B;YAC9C,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;SACtB;QAED,KAAK,EAAE;YACH,IAAI,EAAE;gBACF,KAAK,EAAE,gBAAgB;gBACvB,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,GAAG;gBAChB,YAAY,EAAE;oBACV,IAAI,EAAE,MAAM,EAAE,wBAAwB;iBACzC;aACJ;SACJ;KACJ,CAAC,CAAC;AAAA,CACN"}
@@ -0,0 +1,3 @@
1
+ import * as joint from "@joint/core";
2
+ export declare function createGraph(): joint.dia.Graph<joint.dia.Graph.Attributes, joint.dia.ModelSetOptions>;
3
+ //# sourceMappingURL=createGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createGraph.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createGraph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,wBAAgB,WAAW,2EAE1B"}
@@ -0,0 +1,6 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import * as joint from "@joint/core";
3
+ export function createGraph() {
4
+ return new joint.dia.Graph();
5
+ }
6
+ //# sourceMappingURL=createGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createGraph.js","sourceRoot":"","sources":["../../../src/lineage/graph/createGraph.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,WAAW,GAAG;IAC1B,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;AAAA,CAChC"}
@@ -0,0 +1,10 @@
1
+ export declare function getIconData(type: string): IBuiltIcon;
2
+ interface IBuiltIcon {
3
+ stroke: string;
4
+ clipRule?: string;
5
+ fillRule?: string;
6
+ d: string[];
7
+ viewBox: string;
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=createIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIcon.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createIcon.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,cAevC;AAED,UAAU,UAAU;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,48 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import { isValidElement } from "react";
3
+ import { iconPaths } from "@gooddata/sdk-ui-kit";
4
+ export function getIconData(type) {
5
+ const iconMap = {
6
+ dataSet: "date",
7
+ insight: "visualization",
8
+ analyticalDashboard: "dashboard",
9
+ measure: "metric",
10
+ fact: "fact",
11
+ attribute: "ldmAttribute",
12
+ displayForm: "ldmAttribute",
13
+ };
14
+ const iconType = iconMap[type] || "box";
15
+ const paths = iconPaths[iconType];
16
+ return processElement(paths);
17
+ }
18
+ function processElement(element, state = {
19
+ stroke: "none",
20
+ d: [],
21
+ viewBox: "0 0 20 20",
22
+ }) {
23
+ if (isValidElement(element)) {
24
+ const props = element.props ?? {};
25
+ if (props["d"]) {
26
+ state.d.push(props["d"]);
27
+ }
28
+ if (props["stroke"] && props["stroke"] !== "none") {
29
+ state.stroke = props["stroke"];
30
+ }
31
+ if (props["clipRule"]) {
32
+ state.clipRule = props["clipRule"];
33
+ }
34
+ if (props["fillRule"]) {
35
+ state.fillRule = props["fillRule"];
36
+ }
37
+ if (props["children"]) {
38
+ if (Array.isArray(props["children"])) {
39
+ props["children"].forEach((c) => processElement(c, state));
40
+ }
41
+ else {
42
+ processElement(props["children"]);
43
+ }
44
+ }
45
+ }
46
+ return state;
47
+ }
48
+ //# sourceMappingURL=createIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIcon.js","sourceRoot":"","sources":["../../../src/lineage/graph/createIcon.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,EAAkB,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAiB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE;IACtC,MAAM,OAAO,GAA6B;QACtC,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,eAAe;QACxB,mBAAmB,EAAE,WAAW;QAChC,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,cAAc;QACzB,WAAW,EAAE,cAAc;KAC9B,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IACxC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAElC,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAAA,CAChC;AAUD,SAAS,cAAc,CACnB,OAAkB,EAClB,KAAK,GAAe;IAChB,MAAM,EAAE,MAAM;IACd,CAAC,EAAE,EAAE;IACL,OAAO,EAAE,WAAW;CACvB,EACH;IACE,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAA4B,OAAO,CAAC,KAAgC,IAAI,EAAE,CAAC;QACtF,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM,EAAE,CAAC;YAChD,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACJ,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CAChB"}
@@ -0,0 +1,5 @@
1
+ import * as joint from "@joint/core";
2
+ import { type IReferencesResult } from "@gooddata/sdk-backend-spi";
3
+ export declare function createNode(node: IReferencesResult["nodes"][number]): joint.shapes.standard.Rectangle;
4
+ export declare function cleanupMeasurementElements(): void;
5
+ //# sourceMappingURL=createNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNode.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createNode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAUnE,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,mCA+BlE;AAED,wBAAgB,0BAA0B,SAMzC"}
@@ -0,0 +1,124 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import * as joint from "@joint/core";
3
+ import {} from "@gooddata/sdk-backend-spi";
4
+ import { objRefToId, objRefToType } from "../utils.js";
5
+ import { getIconData } from "./createIcon.js";
6
+ const BASE_HEIGHT = 24;
7
+ const BASE_ICON_SIZE = 16;
8
+ const PADDING = 8;
9
+ const GAP = 8;
10
+ export function createNode(node) {
11
+ const title = node.title;
12
+ const labelWidth = calculateTextWidth(title, 12);
13
+ const nodeWidth = PADDING + BASE_ICON_SIZE + GAP + labelWidth + PADDING;
14
+ const shape = new joint.shapes.standard.Rectangle({
15
+ id: objRefToId(node),
16
+ root: node.isRoot,
17
+ size: { width: nodeWidth, height: BASE_HEIGHT },
18
+ });
19
+ shape.attr(node.isRoot ? rootStyles(title) : nodeStyles(title));
20
+ shape.attr("icon", iconStyles(node));
21
+ // We need to define the icon markup for it to be rendered
22
+ shape.markup = [
23
+ {
24
+ tagName: "rect",
25
+ selector: "body",
26
+ },
27
+ {
28
+ tagName: "text",
29
+ selector: "label",
30
+ },
31
+ {
32
+ tagName: "path",
33
+ selector: "icon",
34
+ },
35
+ ];
36
+ return shape;
37
+ }
38
+ export function cleanupMeasurementElements() {
39
+ if (measurementSvg) {
40
+ document.body.removeChild(measurementSvg);
41
+ measurementSvg = null;
42
+ measurementText = null;
43
+ }
44
+ }
45
+ function calculateTextWidth(text, fontSize) {
46
+ const [_, textNode] = getMeasurementElements();
47
+ textNode.setAttribute("font-size", fontSize.toString());
48
+ textNode.textContent = text;
49
+ return textNode.getComputedTextLength();
50
+ }
51
+ function rootStyles(title) {
52
+ return {
53
+ body: {
54
+ fill: "transparent",
55
+ stroke: "#8f8f8f",
56
+ strokeWidth: 2,
57
+ rx: BASE_HEIGHT / 2,
58
+ ry: BASE_HEIGHT / 2,
59
+ },
60
+ label: {
61
+ text: title,
62
+ fill: "#333",
63
+ fontSize: 12,
64
+ textAnchor: "middle",
65
+ textVerticalAnchor: "middle",
66
+ refX: GAP,
67
+ },
68
+ };
69
+ }
70
+ function nodeStyles(title) {
71
+ return {
72
+ body: {
73
+ fill: "transparent",
74
+ stroke: "transparent",
75
+ strokeWidth: 2,
76
+ rx: 0,
77
+ ry: 0,
78
+ },
79
+ label: {
80
+ text: title,
81
+ fill: "#333",
82
+ fontSize: 12,
83
+ textAnchor: "middle",
84
+ textVerticalAnchor: "middle",
85
+ refX: GAP,
86
+ },
87
+ };
88
+ }
89
+ function iconStyles(node) {
90
+ // Add icon based on type
91
+ const type = objRefToType(node);
92
+ const iconData = getIconData(type);
93
+ const viewBox = iconData.viewBox.split(" ").map(Number);
94
+ const scaleX = BASE_ICON_SIZE / viewBox[2];
95
+ const scaleY = BASE_ICON_SIZE / viewBox[3];
96
+ return {
97
+ d: iconData.d.join(" "),
98
+ stroke: iconData.stroke ?? "none",
99
+ clipRule: iconData.clipRule,
100
+ fillRule: iconData.fillRule,
101
+ class: type,
102
+ refX: PADDING,
103
+ refY: "50%",
104
+ yAlignment: "middle",
105
+ transform: `translate(${-viewBox[0] * scaleX}, ${-viewBox[1] * scaleY}) scale(${scaleX}, ${scaleY})`,
106
+ };
107
+ }
108
+ //measure
109
+ let measurementSvg = null;
110
+ let measurementText = null;
111
+ function getMeasurementElements() {
112
+ if (!measurementSvg || !measurementText) {
113
+ measurementSvg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
114
+ measurementSvg.style.visibility = "hidden";
115
+ measurementSvg.style.position = "absolute";
116
+ measurementSvg.style.top = "-1000px";
117
+ measurementSvg.style.left = "-1000px";
118
+ measurementText = document.createElementNS("http://www.w3.org/2000/svg", "text");
119
+ measurementSvg.appendChild(measurementText);
120
+ document.body.appendChild(measurementSvg);
121
+ }
122
+ return [measurementSvg, measurementText];
123
+ }
124
+ //# sourceMappingURL=createNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNode.js","sourceRoot":"","sources":["../../../src/lineage/graph/createNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import * as joint from "@joint/core";
2
+ export interface IPaperInteractionCallback {
3
+ onClick?: (element: joint.dia.ElementView, event: joint.dia.Event, id: string) => void;
4
+ }
5
+ export declare function createPaper(graph: joint.dia.Graph, int: IPaperInteractionCallback): joint.dia.Paper;
6
+ //# sourceMappingURL=createPaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPaper.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createPaper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAKrC,MAAM,WAAW,yBAAyB;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,yBAAyB,mBAuBjF"}
@@ -0,0 +1,27 @@
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import * as joint from "@joint/core";
3
+ const BASE_WIDTH = 1000;
4
+ const BASE_HEIGHT = 1000;
5
+ export function createPaper(graph, int) {
6
+ //PAPER
7
+ const paper = new joint.dia.Paper({
8
+ model: graph,
9
+ width: BASE_WIDTH,
10
+ height: BASE_HEIGHT,
11
+ drawGrid: false,
12
+ async: true,
13
+ background: {
14
+ color: "transparent",
15
+ },
16
+ interactive: {
17
+ elementMove: false,
18
+ linkMove: false,
19
+ },
20
+ });
21
+ paper.on("element:pointerclick", (cellView, event) => {
22
+ const nodeId = cellView.model.id;
23
+ int.onClick?.(cellView, event, nodeId);
24
+ });
25
+ return paper;
26
+ }
27
+ //# sourceMappingURL=createPaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPaper.js","sourceRoot":"","sources":["../../../src/lineage/graph/createPaper.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,WAAW,GAAG,IAAI,CAAC;AAMzB,MAAM,UAAU,WAAW,CAAC,KAAsB,EAAE,GAA8B,EAAE;IAChF,OAAO;IACP,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,IAAI;QACX,UAAU,EAAE;YACR,KAAK,EAAE,aAAa;SACvB;QACD,WAAW,EAAE;YACT,WAAW,EAAE,KAAK;YAClB,QAAQ,EAAE,KAAK;SAClB;KACJ,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAY,CAAC;QAC3C,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAAA,CAC1C,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AAAA,CAChB"}
@@ -0,0 +1,33 @@
1
+ import type * as joint from "@joint/core";
2
+ declare class PaperScroller {
3
+ el: HTMLDivElement;
4
+ private onZoom;
5
+ private paper;
6
+ private isPanning;
7
+ private lastPointerPosition;
8
+ private resizeObserver;
9
+ private currentZoom;
10
+ private mouseMoveHandler;
11
+ private mouseUpHandler;
12
+ constructor(paper: joint.dia.Paper, opts?: {
13
+ onZoom?: (zoom: number) => void;
14
+ });
15
+ private setupResize;
16
+ private handleResize;
17
+ private setupPanning;
18
+ private onMouseMove;
19
+ private onMouseUp;
20
+ private setupZooming;
21
+ private zoom;
22
+ isZoomInEnable(): boolean;
23
+ zoomIn(): void;
24
+ isZoomOutEnable(): boolean;
25
+ zoomOut(): void;
26
+ reset(): void;
27
+ expand(): void;
28
+ center(x: number, y: number): void;
29
+ dispose(): void;
30
+ }
31
+ export declare function createScroller(paper: joint.dia.Paper, onZoom: (zoom: number) => void): PaperScroller;
32
+ export {};
33
+ //# sourceMappingURL=createScroller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createScroller.d.ts","sourceRoot":"","sources":["../../../src/lineage/graph/createScroller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAC;AAM1C,cAAM,aAAa;IACR,EAAE,EAAE,cAAc,CAAC;IAE1B,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAyC;IACpE,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAa;IAEhC,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,cAAc,CAA0B;IAEhD,YACI,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EACtB,IAAI,GAAE;QACF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KAC9B,EAgBT;IAED,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,IAAI;IAYL,cAAc,YAEpB;IAEM,MAAM,SAEZ;IAEM,eAAe,YAErB;IAEM,OAAO,SAEb;IAEM,KAAK,SAiBX;IAEM,MAAM,SA4BZ;IAEM,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,QAUjC;IAEM,OAAO,SAMb;CACJ;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,iBAIpF"}