diff --git a/.prettierrc.js b/.prettierrc.js
index 3c39a5106..b79bdf3ee 100644
--- a/.prettierrc.js
+++ b/.prettierrc.js
@@ -1,7 +1,18 @@
module.exports = {
- semi: true,
- trailingComma: 'all',
- singleQuote: true,
+ plugins: [
+ require.resolve('prettier-plugin-organize-imports'),
+ require.resolve('prettier-plugin-packagejson'),
+ ],
printWidth: 120,
- arrowParens: 'avoid',
+ proseWrap: 'never',
+ singleQuote: true,
+ trailingComma: 'all',
+ overrides: [
+ {
+ files: '*.md',
+ options: {
+ proseWrap: 'preserve',
+ },
+ },
+ ],
};
diff --git a/package.json b/package.json
index 8f58aef7a..103c5e8b9 100644
--- a/package.json
+++ b/package.json
@@ -28,11 +28,12 @@
"eslint-plugin-jsdoc": "^48.2.7",
"husky": "^9.0.11",
"prettier": "^3.3.0",
+ "prettier-plugin-organize-imports": "^4.0.0",
+ "prettier-plugin-packagejson": "^2.5.1",
"typescript": "^5.3.3",
"vite": "^5.0.12"
},
"license": "MIT",
-
"commitlint": {
"extends": [
"@commitlint/config-conventional"
diff --git a/packages/gi-sdk/.eslintignore b/packages/gi-sdk/.eslintignore
index cc6f6d2b0..3c0bd7dec 100644
--- a/packages/gi-sdk/.eslintignore
+++ b/packages/gi-sdk/.eslintignore
@@ -2,4 +2,4 @@ dist
es
lib
node_modules
-tests
\ No newline at end of file
+tests
diff --git a/packages/gi-sdk/README.md b/packages/gi-sdk/README.md
new file mode 100644
index 000000000..b91273089
--- /dev/null
+++ b/packages/gi-sdk/README.md
@@ -0,0 +1,20 @@
+
GISDK
+
+
+
+SDK for Graph Insight App.
+
+## 🔨 快速使用
+
+```jsx | pure
+import React from 'react';
+import { GISDK } from '@antv/gi-sdk';
+import { myAssetPackage } from './assets';
+import { config } from './config';
+
+export default () => {
+ const assets = [myAssetPackage];
+
+ return
;
+};
+```
diff --git a/packages/gi-sdk/docs/assets/CustomCanvasComponent/Component.tsx b/packages/gi-sdk/docs/assets/CustomCanvasComponent/Component.tsx
new file mode 100644
index 000000000..24c5e950a
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/CustomCanvasComponent/Component.tsx
@@ -0,0 +1,32 @@
+import { CanvasEvent, NodeEvent } from '@antv/g6';
+import type { ImplementWidgetProps } from '@antv/gi-sdk';
+import { useGlobalModel, useGraph } from '@antv/gi-sdk';
+import React, { useEffect } from 'react';
+
+export const CustomCanvasComponent: React.FC
= () => {
+ const [, setGlobalModel] = useGlobalModel();
+ const [graph] = useGraph();
+
+ useEffect(() => {
+ if (!graph || graph.destroyed) return;
+
+ const clickNode = (e) => {
+ const nodeId = e.target.id;
+ setGlobalModel({ currentNode: graph?.getNodeData(nodeId), panel: true });
+ };
+
+ const clickCanvas = () => {
+ setGlobalModel({ currentNode: null, panel: false });
+ };
+
+ graph.on(NodeEvent.CLICK, clickNode);
+ graph.on(CanvasEvent.CLICK, clickCanvas);
+
+ return () => {
+ graph.off(NodeEvent.CLICK, clickNode);
+ graph.off(CanvasEvent.CLICK, clickCanvas);
+ };
+ }, [graph]);
+
+ return null;
+};
diff --git a/packages/gi-sdk/docs/assets/CustomCanvasComponent/index.tsx b/packages/gi-sdk/docs/assets/CustomCanvasComponent/index.tsx
new file mode 100644
index 000000000..594ef9463
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/CustomCanvasComponent/index.tsx
@@ -0,0 +1,12 @@
+import type { ImplementWidget, ImplementWidgetProps } from '@antv/gi-sdk';
+import { CustomCanvasComponent as CustomCanvasComponent2 } from './Component';
+
+export const CustomCanvasComponent: ImplementWidget = {
+ version: 'v0.1',
+ metadata: {
+ name: 'CustomCanvasComponent',
+ displayName: '自定义图表组件',
+ description: '这是一个自定义图表组件',
+ },
+ component: CustomCanvasComponent2,
+};
diff --git a/packages/gi-sdk/docs/assets/CustomPanel/Component.tsx b/packages/gi-sdk/docs/assets/CustomPanel/Component.tsx
new file mode 100644
index 000000000..e4afd2fdd
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/CustomPanel/Component.tsx
@@ -0,0 +1,24 @@
+import { ImplementWidgetProps, useGlobalModel } from '@antv/gi-sdk';
+import React from 'react';
+import { fontStyle } from '../../constant';
+
+export interface CustomPanelProps extends ImplementWidgetProps {
+ count: number;
+}
+
+export const CustomPanel: React.FC = (props) => {
+ const { count } = props;
+ const [{ currentNode }] = useGlobalModel();
+
+ const isSiderOpen = true;
+
+ return (
+
+
{count}...
+
Sider {isSiderOpen ? opened : closed}
+
+ current node: {currentNode?.id}
+
+
+ );
+};
diff --git a/packages/gi-sdk/docs/assets/CustomPanel/index.tsx b/packages/gi-sdk/docs/assets/CustomPanel/index.tsx
new file mode 100644
index 000000000..de94de55d
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/CustomPanel/index.tsx
@@ -0,0 +1,16 @@
+import type { ImplementWidget } from '@antv/gi-sdk';
+import type { CustomPanelProps } from './Component';
+import { CustomPanel as CustomPanelComponent } from './Component';
+
+export const CustomPanel: ImplementWidget = {
+ version: 'v0.1',
+ metadata: {
+ name: 'CustomPanel',
+ displayName: '自定义面板',
+ description: '这是一个自定义面板',
+ },
+ component: CustomPanelComponent,
+ defaultProperties: {
+ count: 200,
+ },
+};
diff --git a/packages/gi-sdk/docs/assets/CustomSiderbar/Component.tsx b/packages/gi-sdk/docs/assets/CustomSiderbar/Component.tsx
new file mode 100644
index 000000000..2391972fa
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/CustomSiderbar/Component.tsx
@@ -0,0 +1,41 @@
+import type { ImplementWidgetProps } from '@antv/gi-sdk';
+import { useGlobalModel, useGraphOptions, useWidgetProps } from '@antv/gi-sdk';
+import { Button } from 'antd';
+import React from 'react';
+import { fontStyle } from '../../constant';
+
+export const CustomSidebar: React.FC = (props) => {
+ const { slotElements } = props;
+ const [{ panel }, setGlobalModel] = useGlobalModel();
+ const [, updatePanelProperties] = useWidgetProps('custom-panel');
+ const [, updateOptions] = useGraphOptions();
+
+ const openPanel = () => {
+ setGlobalModel({ panel: true });
+ };
+
+ return (
+
+
Sider
+
+ Panel {panel ? 'opened' : 'closed'}
+
+
+
+
{slotElements.default}
+
+
+ );
+};
diff --git a/packages/gi-sdk/docs/assets/CustomSiderbar/index.tsx b/packages/gi-sdk/docs/assets/CustomSiderbar/index.tsx
new file mode 100644
index 000000000..fb6e86239
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/CustomSiderbar/index.tsx
@@ -0,0 +1,12 @@
+import type { ImplementWidget, ImplementWidgetProps } from '@antv/gi-sdk';
+import { CustomSidebar as CustomSidebarComponent } from './Component';
+
+export const CustomSidebar: ImplementWidget = {
+ version: 'v0.1',
+ metadata: {
+ name: 'CustomSidebar',
+ displayName: '自定义右侧栏',
+ description: '这是一个自定义右侧栏',
+ },
+ component: CustomSidebarComponent,
+};
diff --git a/packages/gi-sdk/docs/assets/MyAppLayout/Component.less b/packages/gi-sdk/docs/assets/MyAppLayout/Component.less
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/gi-sdk/docs/assets/MyAppLayout/Component.tsx b/packages/gi-sdk/docs/assets/MyAppLayout/Component.tsx
new file mode 100644
index 000000000..93bf36a37
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/Component.tsx
@@ -0,0 +1,27 @@
+import { GraphContainer, type ImplementWidgetProps } from '@antv/gi-sdk';
+import React from 'react';
+import { PREFIX } from '../../constant';
+import { Header, Panel, Sider } from './components';
+
+type Slot = 'header' | 'sider' | 'panel' | 'canvas';
+
+export interface MyAppLayoutProps extends ImplementWidgetProps {
+ showHeader: boolean;
+}
+
+export const MyAppLayout: React.FC = (props) => {
+ const { slotElements, showHeader } = props;
+
+ return (
+
+ {showHeader &&
}
+
+
{slotElements.sider}
+
+ {slotElements.canvas}
+
+
{slotElements.panel}
+
+
+ );
+};
diff --git a/packages/gi-sdk/src/assets/header/index.less b/packages/gi-sdk/docs/assets/MyAppLayout/components/header/index.less
similarity index 79%
rename from packages/gi-sdk/src/assets/header/index.less
rename to packages/gi-sdk/docs/assets/MyAppLayout/components/header/index.less
index 67a9ae0ec..624ec0c2a 100644
--- a/packages/gi-sdk/src/assets/header/index.less
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/components/header/index.less
@@ -1,4 +1,4 @@
-@import '../../global.less';
+@import '../../../../global.less';
.@{prefix}-header {
height: var(--header-height);
diff --git a/packages/gi-sdk/src/assets/header/index.tsx b/packages/gi-sdk/docs/assets/MyAppLayout/components/header/index.tsx
similarity index 60%
rename from packages/gi-sdk/src/assets/header/index.tsx
rename to packages/gi-sdk/docs/assets/MyAppLayout/components/header/index.tsx
index 510c81fbb..b164665f4 100644
--- a/packages/gi-sdk/src/assets/header/index.tsx
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/components/header/index.tsx
@@ -1,8 +1,8 @@
import React, { PropsWithChildren } from 'react';
-import { PREFIX } from '../../constants';
+import { PREFIX } from '../../../../constant';
import './index.less';
-export const Header: React.FC = props => {
+export const Header: React.FC = (props) => {
const { children } = props;
return {children}
;
diff --git a/packages/gi-sdk/docs/assets/MyAppLayout/components/index.ts b/packages/gi-sdk/docs/assets/MyAppLayout/components/index.ts
new file mode 100644
index 000000000..528228893
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/components/index.ts
@@ -0,0 +1,3 @@
+export { Header } from './header';
+export { Panel } from './panel';
+export { Sider } from './sider';
diff --git a/packages/gi-sdk/docs/assets/MyAppLayout/components/panel/index.tsx b/packages/gi-sdk/docs/assets/MyAppLayout/components/panel/index.tsx
new file mode 100644
index 000000000..8d8ac93e7
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/components/panel/index.tsx
@@ -0,0 +1,21 @@
+import { useGlobalModel } from '@antv/gi-sdk';
+import { Drawer } from 'antd';
+import React, { PropsWithChildren } from 'react';
+import { PREFIX } from '../../../../constant';
+
+export const Panel: React.FC = (props) => {
+ const { children } = props;
+ const [{ panel }, updateGlobalModel] = useGlobalModel();
+
+ const onClose = () => {
+ updateGlobalModel({ panel: false });
+ };
+
+ return (
+
+
+ {children}
+
+
+ );
+};
diff --git a/packages/gi-sdk/src/assets/sider/index.less b/packages/gi-sdk/docs/assets/MyAppLayout/components/sider/index.less
similarity index 96%
rename from packages/gi-sdk/src/assets/sider/index.less
rename to packages/gi-sdk/docs/assets/MyAppLayout/components/sider/index.less
index 763dbd3ed..acd5ed5fa 100644
--- a/packages/gi-sdk/src/assets/sider/index.less
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/components/sider/index.less
@@ -1,4 +1,4 @@
-@import '../../global.less';
+@import '../../../../global.less';
.@{prefix}-sider {
display: flex;
@@ -11,7 +11,7 @@
height: 100%;
border-right: 1px solid var(--border-color);
}
-
+
.@{prefix}-sider-icon {
position: absolute;
width: 24px;
diff --git a/packages/gi-sdk/src/assets/sider/index.tsx b/packages/gi-sdk/docs/assets/MyAppLayout/components/sider/index.tsx
similarity index 57%
rename from packages/gi-sdk/src/assets/sider/index.tsx
rename to packages/gi-sdk/docs/assets/MyAppLayout/components/sider/index.tsx
index 2466dcb0f..9ffad812e 100644
--- a/packages/gi-sdk/src/assets/sider/index.tsx
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/components/sider/index.tsx
@@ -1,14 +1,13 @@
-import React, { PropsWithChildren } from 'react';
import { DoubleLeftOutlined, DoubleRightOutlined } from '@ant-design/icons';
+import { useGlobalModel } from '@antv/gi-sdk';
+import React, { PropsWithChildren } from 'react';
import { CSSTransition } from 'react-transition-group';
-import { PREFIX } from '../../constants';
-import { useGlobalModel } from '../../context';
+import { PREFIX } from '../../../../constant';
import './index.less';
-export const Sider: React.FC = props => {
+export const Sider: React.FC = (props) => {
const { children } = props;
- const [globalModel, updateGlobalModel] = useGlobalModel();
- const isSiderOpen = Boolean(globalModel.sider);
+ const [{ sider }, updateGlobalModel] = useGlobalModel();
return (
@@ -17,13 +16,13 @@ export const Sider: React.FC = props => {
{
- updateGlobalModel({ sider: !globalModel.sider });
+ updateGlobalModel({ sider: !sider });
}}
>
- {isSiderOpen ? : }
+ {sider ? : }
-
+
{children}
diff --git a/packages/gi-sdk/docs/assets/MyAppLayout/index.tsx b/packages/gi-sdk/docs/assets/MyAppLayout/index.tsx
new file mode 100644
index 000000000..33e70255c
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/MyAppLayout/index.tsx
@@ -0,0 +1,16 @@
+import type { ImplementWidget } from '@antv/gi-sdk';
+import type { MyAppLayoutProps } from './Component';
+import { MyAppLayout as MyAppLayoutComponent } from './Component';
+
+export const MyAppLayout: ImplementWidget = {
+ version: 'v0.1',
+ metadata: {
+ name: 'MyAppLayout',
+ displayName: '我的布局组件',
+ description: '这是一个布局组件',
+ },
+ component: MyAppLayoutComponent,
+ defaultProperties: {
+ showHeader: true,
+ },
+};
diff --git a/packages/gi-sdk/docs/assets/index.tsx b/packages/gi-sdk/docs/assets/index.tsx
new file mode 100644
index 000000000..9b214fd54
--- /dev/null
+++ b/packages/gi-sdk/docs/assets/index.tsx
@@ -0,0 +1,43 @@
+import type { ImplementWidgetProps } from '@antv/gi-sdk';
+import { AssetPackage, ImplementWidget } from '@antv/gi-sdk';
+import React from 'react';
+import { CustomCanvasComponent } from './CustomCanvasComponent';
+import { CustomPanel } from './CustomPanel';
+import { CustomSidebar } from './CustomSiderbar';
+import { MyAppLayout } from './MyAppLayout';
+
+export const CustomHeader: ImplementWidget = {
+ version: 'v0.1',
+ metadata: {
+ name: 'CustomHeader',
+ displayName: '自定义头部',
+ description: '这是一个自定义头部',
+ },
+ component: () => {
+ return GI-SDK
;
+ },
+};
+
+export const StatisticCard: ImplementWidget = {
+ version: 'v0.1',
+ metadata: {
+ name: 'StatisticCard',
+ displayName: '统计卡片',
+ description: '用于展示统计数据的卡片',
+ },
+ component: () => {
+ return StatisticCard
;
+ },
+};
+
+export const myAssetPackage: AssetPackage = {
+ version: 'v0.1',
+ widgets: [
+ MyAppLayout,
+ CustomCanvasComponent,
+ CustomHeader,
+ CustomPanel,
+ CustomSidebar,
+ StatisticCard,
+ ] as ImplementWidget[],
+};
diff --git a/packages/gi-sdk/docs/config.ts b/packages/gi-sdk/docs/config.ts
new file mode 100644
index 000000000..1e060fa55
--- /dev/null
+++ b/packages/gi-sdk/docs/config.ts
@@ -0,0 +1,4359 @@
+import type { Application } from '@antv/gi-sdk';
+
+const data = {
+ nodes: [
+ {
+ id: 'Structural basis of PROTAC cooperative recognition for selective protein degradation.',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'The influence of rough lipopolysaccharide structure on molecular interactions with mammalian antimicrobial peptides',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'New Synthetic Routes to Triazolo-benzodiazepine Analogues: Expanding the Scope of the Bump-and-Hole Approach for Selective Bromo and Extra-Terminal (BET) Bromodomain Inhibition.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Cyclic and Macrocyclic Peptides as Chemical Tools To Recognise Protein Surfaces and Probe Protein-Protein Interactions.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: '8-Substituted Pyrido[3,4-d]pyrimidin-4(3H)-one Derivatives As Potent, Cell Permeable, KDM4 (JMJD2) and KDM5 (JARID1) Histone Lysine Demethylase Inhibitors.',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Discovery of Type II Inhibitors of TGFβ-Activated Kinase 1 (TAK1) and Mitogen-Activated Protein Kinase Kinase Kinase Kinase 2 (MAP4K2)',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'SIK2 regulates CRTCs, HDAC4 and glucose uptake in adipocytes',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Metabotropic Glutamate Receptor 5 Negative Allosteric Modulators: Discovery of 2-Chloro-4-[1-(4-fluorophenyl)-2,5-dimethyl-1H-imidazol-4-ylethynyl]pyridine (Basimglurant, RO4917523), a Promising Novel Medicine for Psychiatric Diseases',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Nrf2 regulates ROS production by mitochondria and NADPH oxidase.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'The clinically approved drugs dasatinib and bosutinib induce anti-inflammatory macrophages by inhibiting the salt-inducible kinases',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'New Monocyclic, Bicyclic, and Tricyclic Ethynylcyanodienones as Activators of the Keap1/Nrf2/ARE Pathway and Inhibitors of Inducible Nitric Oxide Synthase',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Palmitoylation of the Na/Ca exchanger cytoplasmic loop controls its inactivation and internalization during stress signaling',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Molecular Cloning and Functional Characterization of Components of the Capsule Biosynthesis Complex of Neisseria meningitidis Serogroup A TOWARD IN VITRO VACCINE PRODUCTION',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ data: {
+ group: 'Cited Works',
+ radius: 7,
+ citing_patents_count: 7,
+ },
+ },
+ {
+ id: 'An unexpected twist to the activation of IKKβ: TAK1 primes IKKβ for activation by autophosphorylation',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Crystallographic analysis of Neisseria meningitidis PorB extracellular loops potentially implicated in TLR2 recognition',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'The LKB1-salt-inducible kinase pathway functions as a key gluconeogenic suppressor in the liver',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Characterization of VPS34-IN1, a selective inhibitor of Vps34, reveals that the phosphatidylinositol 3-phosphate-binding SGK3 protein kinase is a downstream target of class III phosphoinositide 3-kinase',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: '3-(2-oxoethylidene)indolin-2-one derivatives activate Nrf2 and inhibit NF-κB: potential candidates for chemoprevention.',
+ data: {
+ group: 'Cited Works',
+ radius: 6,
+ citing_patents_count: 6,
+ },
+ },
+ {
+ id: 'Carnosic acid stimulates glucose uptake in skeletal muscle cells via a PME-1/PP2A/PKB signalling axis',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Kv1.3 inhibitors have differential effects on glucose uptake and AMPK activity in skeletal muscle cell lines and mouse ex vivo skeletal muscle',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Restoration of CFTR function in patients with cystic fibrosis carrying the F508del-CFTR mutation',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Parkin is activated by PINK1-dependent phosphorylation of ubiquitin at Ser65',
+ data: {
+ group: 'Cited Works',
+ radius: 4,
+ citing_patents_count: 4,
+ },
+ },
+ {
+ id: 'Substrate recognition by the cell surface palmitoyl transferase DHHC5.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Dysregulation of ubiquitin homeostasis and β-catenin signaling promote spinal muscular atrophy',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Structure-Guided Design and Optimization of Small Molecules Targeting the Protein–Protein Interaction between the von Hippel–Lindau (VHL) E3 Ubiquitin Ligase and the Hypoxia Inducible Factor (HIF) Alpha Subunit with in Vitro Nanomolar Affinities',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'The Nrf2 regulatory network provides an interface between redox and intermediary metabolism',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Characterization of WZ4003 and HTH-01-015 as selective inhibitors of the LKB1-tumour-suppressor-activated NUAK kinases',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Synthesis of vitamin D3 analogues with A-ring modifications to directly measure vitamin D levels in biological samples',
+ data: {
+ group: 'Cited Works',
+ radius: 6,
+ citing_patents_count: 6,
+ },
+ },
+ {
+ id: 'Structure-activity relationship studies of pyrrolone antimalarial agents',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'The Concise Guide to Pharmacology 2013/14.: The Concise Guide to Pharmacology 2013/14: G Protein-Coupled Receptors',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Elevated SGK1 predicts resistance of breast cancer cells to Akt inhibitors',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Metabolism of inflammation limited by AMPK and pseudo-starvation',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Nrf2 impacts cellular bioenergetics by controlling substrate availability for mitochondrial respiration',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'The anti-inflammatory compound BAY 11-7082 is a potent inhibitor of Protein Tyrosine Phosphatases',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'BslA is a self-assembling bacterial hydrophobin that coats the Bacillus subtilis biofilm',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Investigation of acyclic uridine amide and 5′-amido nucleoside analogues as potential inhibitors of the Plasmodium falciparum dUTPase',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Discovery and structure-activity relationships of pyrrolone antimalarials',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'De Novo Design of Protein Kinase Inhibitors by in Silico Identification of Hinge Region-Binding Fragments',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Comprehensive characterization and optimization of anti-LRRK2 (leucine-rich repeat kinase 2) monoclonal antibodies',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'From On-Target to Off-Target Activity: Identification and Optimisation of Trypanosoma brucei GSK3 Inhibitors and Their Characterisation as Anti-Trypanosoma brucei Drug Discovery Lead Molecules',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'HIF-independent role of prolyl hydroxylases in the cellular response to amino acids',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ data: {
+ group: 'Cited Works',
+ radius: 11,
+ citing_patents_count: 11,
+ },
+ },
+ {
+ id: 'A novel shogaol analog suppresses cancer cell invasion and inflammation, and displays cytoprotective effects through modulation of NF-κB and Nrf2-Keap1 signaling pathways',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'X-ray Crystal Structure of ERK5 (MAPK7) in Complex with a Specific Inhibitor',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'The endosome-lysosome pathway and information generation in the immune system.',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'GSK2578215A; a potent and highly selective 2-arylmethyloxy-5-substitutent-N-arylbenzamide LRRK2 kinase inhibitor.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Structure of the TatC core of the twin-arginine protein transport system',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'The Ancient Drug Salicylate Directly Activates AMP-Activated Protein Kinase',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Application of a novel highly sensitive activity-based probe for detection of cathepsin G',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Analysis of the role of Nrf2 in the expression of liver proteins in mice using two-dimensional gel-based proteomics',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'PINK1 is activated by mitochondrial membrane potential depolarization and stimulates Parkin E3 ligase activity by phosphorylating Serine 65',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Synthesis, Chemical Reactivity as Michael Acceptors, and Biological Potency of Monocyclic Cyanoenones, Novel and Highly Potent Anti-inflammatory and Cytoprotective Agents(1)',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Design, Synthesis and Biological Evaluation of Trypanosoma brucei Trypanothione Synthetase Inhibitors',
+ data: {
+ group: 'Cited Works',
+ radius: 5,
+ citing_patents_count: 5,
+ },
+ },
+ {
+ id: 'Mitogen-activated protein kinase-activated protein kinase 2 (MAPKAP-K2) as an antiinflammatory target: discovery and in vivo activity of selective pyrazolo[1,5-a]pyrimidine inhibitors using a focused library and structure-based optimization approach.',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Chemical Proteomic Analysis Reveals the Drugability of the Kinome of Trypanosoma brucei',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Avirulence Protein 3a (AVR3a) from the Potato Pathogen Phytophthora infestans Forms Homodimers through Its Predicted Translocation Region and Does Not Specifically Bind Phospholipids',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'NEDD8 overexpression results in neddylation of ubiquitin substrates by the ubiquitin pathway.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Kinome-wide Selectivity Profiling of ATP-competitive Mammalian Target of Rapamycin (mTOR) Inhibitors and Characterization of Their Binding Kinetics',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'The ubiquitin E1 enzyme Ube1 mediates NEDD8 activation under diverse stress conditions',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Acinetobacter baumannii FolD ligand complexes – potent inhibitors of folate metabolism and a re‐evaluation of the structure of LY374571',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Aurora kinase inhibitors: Progress towards the clinic',
+ data: {
+ group: 'Cited Works',
+ radius: 12,
+ citing_patents_count: 12,
+ },
+ },
+ {
+ id: 'The AMPK-related kinase SIK2 is regulated by cAMP via phosphorylation at Ser(358) in adipocytes',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Synergy of Peptide and Sugar in O-GlcNAcase Substrate Recognition',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Discovery of potent and selective covalent inhibitors of JNK',
+ data: {
+ group: 'Cited Works',
+ radius: 6,
+ citing_patents_count: 6,
+ },
+ },
+ {
+ id: 'Phosphorylation of FOXO3a on Ser-7 by p38 Promotes Its Nuclear Localization in Response to Doxorubicin',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'AMPK: a nutrient and energy sensor that maintains energy homeostasis',
+ data: {
+ group: 'Cited Works',
+ radius: 6,
+ citing_patents_count: 6,
+ },
+ },
+ {
+ id: 'Synthesis and structure-activity relationships of a novel series of pyrimidines as potent inhibitors of TBK1/IKKε kinases.',
+ data: {
+ group: 'Cited Works',
+ radius: 4,
+ citing_patents_count: 4,
+ },
+ },
+ {
+ id: 'Peptide inhibitors of the Keap1-Nrf2 protein-protein interaction',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Small molecules that bind the Mdm2 RING stabilize and activate p53',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ data: {
+ group: 'Cited Works',
+ radius: 29,
+ citing_patents_count: 29,
+ },
+ },
+ {
+ id: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ data: {
+ group: 'Cited Works',
+ radius: 11,
+ citing_patents_count: 11,
+ },
+ },
+ {
+ id: 'Changes in the ratio of free NEDD8 to ubiquitin triggers NEDDylation by ubiquitin enzymes',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Fragment-based discovery of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors.',
+ data: {
+ group: 'Cited Works',
+ radius: 4,
+ citing_patents_count: 4,
+ },
+ },
+ {
+ id: 'A multifunctional protease inhibitor to regulate endolysosomal function.',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Design, Synthesis, and Structure−Activity Relationship Exploration of 1-Substituted 4-Aroyl-3-hydroxy-5-phenyl-1H-pyrrol-2(5H)-one Analogues as Inhibitors of the Annexin A2−S100A10 Protein Interaction',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: '4-benzimidazolyl-3-phenylbutanoic acids as novel PIF-pocket-targeting allosteric inhibitors of protein kinase PKCζ.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Optimisation of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors',
+ data: {
+ group: 'Cited Works',
+ radius: 4,
+ citing_patents_count: 4,
+ },
+ },
+ {
+ id: 'Design, Synthesis and Biological Evaluation of Novel Inhibitors of Trypanosoma brucei Pteridine Reductase 1',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'The inhibitory effect of phospholemman on the sodium pump requires its palmitoylation.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'SCF/β-TrCP promotes glycogen synthase kinase 3-dependent degradation of the Nrf2 transcription factor in a keap1-independent manner',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Immunosuppressive but Non-LasR-Inducing Analogues of the Pseudomonas aeruginosa Quorum-Sensing Molecule N-(3-Oxododecanoyl)-L-homoserine Lactone',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Absolute SILAC-Compatible Expression Strain Allows Sumo-2 Copy Number Determination in Clinical Samples',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Collateral sensitivity of multidrug-resistant cells to the orphan drug tiopronin.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ data: {
+ group: 'Cited Works',
+ radius: 11,
+ citing_patents_count: 11,
+ },
+ },
+ {
+ id: 'ATP site-directed inhibitors of protein kinase CK2: an update.',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Identification of Inhibitors of the Leishmania cdc2-Related Protein Kinase CRK3',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Polyubiquitin binding to optineurin is required for optimal activation of TANK-binding kinase 1 and production of interferon β.',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'Substrate and Product Analogues as Human O-Glcnac Transferase Inhibitors.',
+ data: {
+ group: 'Cited Works',
+ radius: 4,
+ citing_patents_count: 4,
+ },
+ },
+ {
+ id: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ data: {
+ group: 'Cited Works',
+ radius: 7,
+ citing_patents_count: 7,
+ },
+ },
+ {
+ id: 'Design, synthesis and biological evaluation of 6-pyridylmethylaminopurines as CDK inhibitors',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Analgesic omega-Conotoxins CVIE and CVIF Selectively and Voltage-Dependently Block Recombinant and Native N-Type Calcium Channels (vol 77, pg 139, 2010)',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'NF-κB controls energy homeostasis and metabolic adaptation by upregulating mitochondrial respiration',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'Development of 18F-fluorinatable dendrons and their application to cancer cell targeting',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: 'The specificities of small molecule inhibitors of the TGFß and BMP pathways',
+ data: {
+ group: 'Cited Works',
+ radius: 3,
+ citing_patents_count: 3,
+ },
+ },
+ {
+ id: 'Catalysis by the nucleolytic ribozymes',
+ data: {
+ group: 'Cited Works',
+ radius: 5,
+ citing_patents_count: 5,
+ },
+ },
+ {
+ id: 'Characterization of GSK2334470, a novel and highly specific inhibitor of PDK1',
+ data: {
+ group: 'Cited Works',
+ radius: 2,
+ citing_patents_count: 2,
+ },
+ },
+ {
+ id: 'N1-Benzyl substituted cambinol analogues as isozyme selective inhibitors of the sirtuin family of protein deacetylases',
+ data: {
+ group: 'Cited Works',
+ radius: 4,
+ citing_patents_count: 4,
+ },
+ },
+ {
+ id: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ data: {
+ group: 'Cited Works',
+ radius: 7,
+ citing_patents_count: 7,
+ },
+ },
+ {
+ id: 'Optimisation of the Anti-Trypanosoma brucei Activity of the Opioid Agonist U50488',
+ data: {
+ group: 'Cited Works',
+ radius: 1,
+ citing_patents_count: 1,
+ },
+ },
+ {
+ id: '109-294-662-661-65X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '074-937-457-594-345',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '081-355-367-506-27X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '048-634-530-447-798',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '137-231-469-269-151',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '031-072-815-607-16X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '105-312-070-982-098',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '018-515-082-074-296',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '027-228-373-793-594',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '016-712-604-622-721',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '086-316-087-480-933',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '118-309-833-112-117',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '134-672-819-080-83X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '036-789-224-520-054',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '106-594-488-484-12X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '125-726-727-125-409',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '161-487-188-181-03X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '076-538-237-089-675',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '051-324-518-696-462',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '198-017-973-913-570',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '156-653-831-632-101',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '178-739-712-688-618',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '131-486-498-702-07X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '010-031-167-075-106',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '119-453-428-180-987',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '153-595-914-216-97X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '148-353-591-913-750',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '019-827-938-996-490',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '184-646-935-269-773',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '186-230-275-872-748',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '165-291-395-706-725',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '047-113-007-956-15X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '089-019-916-582-397',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '136-000-598-663-919',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '051-072-189-723-758',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '040-766-915-457-886',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '141-482-415-400-338',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '149-129-599-518-595',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '156-286-485-464-499',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '001-353-214-346-040',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '118-479-143-842-720',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '007-641-959-106-118',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '189-040-066-278-226',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '026-244-336-682-442',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '168-286-254-597-740',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '109-916-358-959-05X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '002-458-268-309-533',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '038-310-729-099-192',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '179-033-965-606-598',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '113-229-447-433-64X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '077-771-399-719-227',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '183-966-651-664-305',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '013-467-292-050-692',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '079-314-054-163-947',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '110-082-309-221-187',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '128-382-566-327-896',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '143-543-676-408-839',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '005-743-260-244-802',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '026-638-223-054-804',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '048-208-660-423-215',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '159-658-602-048-982',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '077-811-145-153-079',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '170-781-236-728-970',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '144-284-594-583-951',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '139-409-891-293-77X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '081-017-751-048-013',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '114-963-910-586-828',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '162-513-842-046-362',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '188-803-921-043-695',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '191-147-881-232-285',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '081-817-015-173-962',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '106-530-060-683-82X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '133-935-409-400-672',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '046-588-899-387-353',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '049-222-171-973-678',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '074-598-665-914-143',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '190-195-697-065-907',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '031-461-589-086-771',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '167-851-091-520-257',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '151-760-923-304-502',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '097-019-537-894-104',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '170-696-774-214-700',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '084-807-525-209-072',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '044-648-704-787-12X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '150-822-190-827-131',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '051-919-508-851-10X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '036-251-116-198-69X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '149-946-446-737-586',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '075-397-286-033-085',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '028-992-308-265-357',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '044-207-676-689-405',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '030-350-713-791-200',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '093-997-239-092-949',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '046-345-437-716-689',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '146-411-731-640-871',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '000-266-572-036-366',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '186-389-876-954-313',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '168-483-508-794-377',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '029-748-240-628-036',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '184-507-509-452-559',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '069-961-069-943-549',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '017-777-392-752-199',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '000-150-893-948-804',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '027-437-502-794-894',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '074-789-039-135-70X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '063-617-165-524-327',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '019-872-586-012-269',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '103-648-347-913-447',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '007-245-406-573-328',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '008-337-248-044-723',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '197-071-041-313-103',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '098-538-513-984-747',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '019-125-805-246-964',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '172-064-016-145-117',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '007-417-942-335-284',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '005-947-025-410-764',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '116-404-026-640-450',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '090-437-295-781-023',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '197-158-559-918-854',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '076-225-263-850-117',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '049-199-509-181-561',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '179-045-041-176-506',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '004-301-778-674-378',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '111-313-231-732-367',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '092-197-031-561-353',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '192-019-786-423-841',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '076-608-180-638-59X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '175-263-797-963-040',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '141-694-167-791-759',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '081-203-444-563-604',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '125-348-249-762-351',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '125-850-986-196-787',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '119-397-162-706-860',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '133-023-408-974-285',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '039-847-299-166-952',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '076-641-402-312-988',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '102-485-198-725-150',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '168-829-456-947-639',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '098-813-369-162-741',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '023-180-369-416-862',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '189-473-046-734-005',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '019-633-684-883-828',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '174-501-376-407-235',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '129-062-448-949-030',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '162-916-741-322-002',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '080-026-305-809-343',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '016-698-167-713-829',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '091-325-080-234-401',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '032-206-614-235-635',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '143-271-017-351-983',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '169-312-245-869-778',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '089-818-979-077-305',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '187-517-157-601-239',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '111-583-988-147-450',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '058-026-435-099-506',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '153-651-762-444-327',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '159-766-711-047-610',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '058-933-099-316-100',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '023-452-662-674-373',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '047-432-030-246-04X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '139-008-712-602-518',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '137-720-748-139-162',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '192-136-893-476-749',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '172-890-893-515-719',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '104-472-615-006-481',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '097-374-332-908-898',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '034-416-075-094-770',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '127-642-274-375-054',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '036-708-909-192-156',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '193-863-590-855-263',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '150-028-859-997-047',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '132-394-716-226-832',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '131-238-819-455-784',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '155-402-461-387-483',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '040-389-070-176-191',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '076-478-479-475-120',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '034-190-802-321-708',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '130-316-719-983-242',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '036-668-261-470-040',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '183-767-289-461-131',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '107-556-164-321-147',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '066-190-726-252-149',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '140-900-012-438-14X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '058-438-690-312-096',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '004-889-112-130-518',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '193-040-307-473-220',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '188-718-220-131-362',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '087-577-350-425-176',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '191-670-060-004-126',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '041-699-843-843-567',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '180-366-233-781-99X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '122-739-962-072-793',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '109-274-898-147-341',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '124-179-501-005-870',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '008-694-981-426-172',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '109-611-546-954-080',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '004-378-254-734-355',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '133-997-520-845-569',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '115-381-943-359-61X',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '022-078-711-389-998',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '132-854-391-972-865',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '171-143-110-884-468',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '003-946-199-636-328',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '009-649-401-227-606',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '170-042-571-881-121',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '033-301-273-471-462',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '040-826-560-477-838',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '135-293-472-746-415',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '153-999-081-812-523',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '000-498-778-953-787',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '085-065-777-135-758',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '152-366-692-522-975',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '167-869-142-610-582',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '191-676-336-200-724',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '056-387-403-639-935',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '066-841-401-628-941',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '069-503-782-573-055',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '028-137-796-142-577',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '197-678-301-596-236',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '147-466-934-435-143',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '114-647-123-099-321',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '058-829-130-504-901',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '169-953-034-717-264',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '028-012-588-449-727',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '038-839-140-589-623',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '194-924-906-201-593',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '195-611-964-620-410',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '025-014-524-538-421',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '120-667-268-642-909',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '163-117-320-460-138',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '191-290-593-697-506',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '118-339-847-530-982',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '073-318-370-112-877',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '113-828-920-381-078',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '048-983-957-537-421',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ {
+ id: '073-531-962-083-670',
+ data: {
+ group: 'Citing Patents',
+ },
+ },
+ ],
+ edges: [
+ {
+ source: 'Structural basis of PROTAC cooperative recognition for selective protein degradation.',
+ target: '109-294-662-661-65X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Structural basis of PROTAC cooperative recognition for selective protein degradation.',
+ target: '074-937-457-594-345',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'The influence of rough lipopolysaccharide structure on molecular interactions with mammalian antimicrobial peptides',
+ target: '081-355-367-506-27X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'New Synthetic Routes to Triazolo-benzodiazepine Analogues: Expanding the Scope of the Bump-and-Hole Approach for Selective Bromo and Extra-Terminal (BET) Bromodomain Inhibition.',
+ target: '048-634-530-447-798',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Cyclic and Macrocyclic Peptides as Chemical Tools To Recognise Protein Surfaces and Probe Protein-Protein Interactions.',
+ target: '137-231-469-269-151',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '8-Substituted Pyrido[3,4-d]pyrimidin-4(3H)-one Derivatives As Potent, Cell Permeable, KDM4 (JMJD2) and KDM5 (JARID1) Histone Lysine Demethylase Inhibitors.',
+ target: '031-072-815-607-16X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '8-Substituted Pyrido[3,4-d]pyrimidin-4(3H)-one Derivatives As Potent, Cell Permeable, KDM4 (JMJD2) and KDM5 (JARID1) Histone Lysine Demethylase Inhibitors.',
+ target: '105-312-070-982-098',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '8-Substituted Pyrido[3,4-d]pyrimidin-4(3H)-one Derivatives As Potent, Cell Permeable, KDM4 (JMJD2) and KDM5 (JARID1) Histone Lysine Demethylase Inhibitors.',
+ target: '018-515-082-074-296',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Discovery of Type II Inhibitors of TGFβ-Activated Kinase 1 (TAK1) and Mitogen-Activated Protein Kinase Kinase Kinase Kinase 2 (MAP4K2)',
+ target: '027-228-373-793-594',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'SIK2 regulates CRTCs, HDAC4 and glucose uptake in adipocytes',
+ target: '016-712-604-622-721',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Metabotropic Glutamate Receptor 5 Negative Allosteric Modulators: Discovery of 2-Chloro-4-[1-(4-fluorophenyl)-2,5-dimethyl-1H-imidazol-4-ylethynyl]pyridine (Basimglurant, RO4917523), a Promising Novel Medicine for Psychiatric Diseases',
+ target: '086-316-087-480-933',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Nrf2 regulates ROS production by mitochondria and NADPH oxidase.',
+ target: '118-309-833-112-117',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'The clinically approved drugs dasatinib and bosutinib induce anti-inflammatory macrophages by inhibiting the salt-inducible kinases',
+ target: '134-672-819-080-83X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'New Monocyclic, Bicyclic, and Tricyclic Ethynylcyanodienones as Activators of the Keap1/Nrf2/ARE Pathway and Inhibitors of Inducible Nitric Oxide Synthase',
+ target: '036-789-224-520-054',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Palmitoylation of the Na/Ca exchanger cytoplasmic loop controls its inactivation and internalization during stress signaling',
+ target: '106-594-488-484-12X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Molecular Cloning and Functional Characterization of Components of the Capsule Biosynthesis Complex of Neisseria meningitidis Serogroup A TOWARD IN VITRO VACCINE PRODUCTION',
+ target: '125-726-727-125-409',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ target: '161-487-188-181-03X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ target: '076-538-237-089-675',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ target: '051-324-518-696-462',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ target: '198-017-973-913-570',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ target: '156-653-831-632-101',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ target: '178-739-712-688-618',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A bump-and-hole approach to engineer controlled selectivity of BET bromodomain chemical probes',
+ target: '048-634-530-447-798',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'An unexpected twist to the activation of IKKβ: TAK1 primes IKKβ for activation by autophosphorylation',
+ target: '131-486-498-702-07X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'An unexpected twist to the activation of IKKβ: TAK1 primes IKKβ for activation by autophosphorylation',
+ target: '010-031-167-075-106',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Crystallographic analysis of Neisseria meningitidis PorB extracellular loops potentially implicated in TLR2 recognition',
+ target: '119-453-428-180-987',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The LKB1-salt-inducible kinase pathway functions as a key gluconeogenic suppressor in the liver',
+ target: '016-712-604-622-721',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Characterization of VPS34-IN1, a selective inhibitor of Vps34, reveals that the phosphatidylinositol 3-phosphate-binding SGK3 protein kinase is a downstream target of class III phosphoinositide 3-kinase',
+ target: '153-595-914-216-97X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Characterization of VPS34-IN1, a selective inhibitor of Vps34, reveals that the phosphatidylinositol 3-phosphate-binding SGK3 protein kinase is a downstream target of class III phosphoinositide 3-kinase',
+ target: '148-353-591-913-750',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Characterization of VPS34-IN1, a selective inhibitor of Vps34, reveals that the phosphatidylinositol 3-phosphate-binding SGK3 protein kinase is a downstream target of class III phosphoinositide 3-kinase',
+ target: '019-827-938-996-490',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '3-(2-oxoethylidene)indolin-2-one derivatives activate Nrf2 and inhibit NF-κB: potential candidates for chemoprevention.',
+ target: '184-646-935-269-773',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '3-(2-oxoethylidene)indolin-2-one derivatives activate Nrf2 and inhibit NF-κB: potential candidates for chemoprevention.',
+ target: '186-230-275-872-748',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '3-(2-oxoethylidene)indolin-2-one derivatives activate Nrf2 and inhibit NF-κB: potential candidates for chemoprevention.',
+ target: '165-291-395-706-725',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '3-(2-oxoethylidene)indolin-2-one derivatives activate Nrf2 and inhibit NF-κB: potential candidates for chemoprevention.',
+ target: '047-113-007-956-15X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '3-(2-oxoethylidene)indolin-2-one derivatives activate Nrf2 and inhibit NF-κB: potential candidates for chemoprevention.',
+ target: '089-019-916-582-397',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '3-(2-oxoethylidene)indolin-2-one derivatives activate Nrf2 and inhibit NF-κB: potential candidates for chemoprevention.',
+ target: '136-000-598-663-919',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Carnosic acid stimulates glucose uptake in skeletal muscle cells via a PME-1/PP2A/PKB signalling axis',
+ target: '051-072-189-723-758',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Kv1.3 inhibitors have differential effects on glucose uptake and AMPK activity in skeletal muscle cell lines and mouse ex vivo skeletal muscle',
+ target: '040-766-915-457-886',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Kv1.3 inhibitors have differential effects on glucose uptake and AMPK activity in skeletal muscle cell lines and mouse ex vivo skeletal muscle',
+ target: '141-482-415-400-338',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Restoration of CFTR function in patients with cystic fibrosis carrying the F508del-CFTR mutation',
+ target: '149-129-599-518-595',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Restoration of CFTR function in patients with cystic fibrosis carrying the F508del-CFTR mutation',
+ target: '156-286-485-464-499',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Parkin is activated by PINK1-dependent phosphorylation of ubiquitin at Ser65',
+ target: '001-353-214-346-040',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Parkin is activated by PINK1-dependent phosphorylation of ubiquitin at Ser65',
+ target: '118-479-143-842-720',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Parkin is activated by PINK1-dependent phosphorylation of ubiquitin at Ser65',
+ target: '007-641-959-106-118',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Parkin is activated by PINK1-dependent phosphorylation of ubiquitin at Ser65',
+ target: '189-040-066-278-226',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Substrate recognition by the cell surface palmitoyl transferase DHHC5.',
+ target: '106-594-488-484-12X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Dysregulation of ubiquitin homeostasis and β-catenin signaling promote spinal muscular atrophy',
+ target: '026-244-336-682-442',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structure-Guided Design and Optimization of Small Molecules Targeting the Protein–Protein Interaction between the von Hippel–Lindau (VHL) E3 Ubiquitin Ligase and the Hypoxia Inducible Factor (HIF) Alpha Subunit with in Vitro Nanomolar Affinities',
+ target: '074-937-457-594-345',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structure-Guided Design and Optimization of Small Molecules Targeting the Protein–Protein Interaction between the von Hippel–Lindau (VHL) E3 Ubiquitin Ligase and the Hypoxia Inducible Factor (HIF) Alpha Subunit with in Vitro Nanomolar Affinities',
+ target: '168-286-254-597-740',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The Nrf2 regulatory network provides an interface between redox and intermediary metabolism',
+ target: '109-916-358-959-05X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Characterization of WZ4003 and HTH-01-015 as selective inhibitors of the LKB1-tumour-suppressor-activated NUAK kinases',
+ target: '002-458-268-309-533',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis of vitamin D3 analogues with A-ring modifications to directly measure vitamin D levels in biological samples',
+ target: '038-310-729-099-192',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis of vitamin D3 analogues with A-ring modifications to directly measure vitamin D levels in biological samples',
+ target: '179-033-965-606-598',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis of vitamin D3 analogues with A-ring modifications to directly measure vitamin D levels in biological samples',
+ target: '113-229-447-433-64X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis of vitamin D3 analogues with A-ring modifications to directly measure vitamin D levels in biological samples',
+ target: '077-771-399-719-227',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis of vitamin D3 analogues with A-ring modifications to directly measure vitamin D levels in biological samples',
+ target: '183-966-651-664-305',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis of vitamin D3 analogues with A-ring modifications to directly measure vitamin D levels in biological samples',
+ target: '013-467-292-050-692',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Structure-activity relationship studies of pyrrolone antimalarial agents',
+ target: '079-314-054-163-947',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Structure-activity relationship studies of pyrrolone antimalarial agents',
+ target: '110-082-309-221-187',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'The Concise Guide to Pharmacology 2013/14.: The Concise Guide to Pharmacology 2013/14: G Protein-Coupled Receptors',
+ target: '128-382-566-327-896',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'The Concise Guide to Pharmacology 2013/14.: The Concise Guide to Pharmacology 2013/14: G Protein-Coupled Receptors',
+ target: '143-543-676-408-839',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Elevated SGK1 predicts resistance of breast cancer cells to Akt inhibitors',
+ target: '005-743-260-244-802',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Metabolism of inflammation limited by AMPK and pseudo-starvation',
+ target: '026-638-223-054-804',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Nrf2 impacts cellular bioenergetics by controlling substrate availability for mitochondrial respiration',
+ target: '048-208-660-423-215',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The anti-inflammatory compound BAY 11-7082 is a potent inhibitor of Protein Tyrosine Phosphatases',
+ target: '159-658-602-048-982',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'BslA is a self-assembling bacterial hydrophobin that coats the Bacillus subtilis biofilm',
+ target: '077-811-145-153-079',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'BslA is a self-assembling bacterial hydrophobin that coats the Bacillus subtilis biofilm',
+ target: '170-781-236-728-970',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'BslA is a self-assembling bacterial hydrophobin that coats the Bacillus subtilis biofilm',
+ target: '144-284-594-583-951',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Investigation of acyclic uridine amide and 5′-amido nucleoside analogues as potential inhibitors of the Plasmodium falciparum dUTPase',
+ target: '139-409-891-293-77X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Discovery and structure-activity relationships of pyrrolone antimalarials',
+ target: '110-082-309-221-187',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'De Novo Design of Protein Kinase Inhibitors by in Silico Identification of Hinge Region-Binding Fragments',
+ target: '081-017-751-048-013',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'De Novo Design of Protein Kinase Inhibitors by in Silico Identification of Hinge Region-Binding Fragments',
+ target: '114-963-910-586-828',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'De Novo Design of Protein Kinase Inhibitors by in Silico Identification of Hinge Region-Binding Fragments',
+ target: '162-513-842-046-362',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Comprehensive characterization and optimization of anti-LRRK2 (leucine-rich repeat kinase 2) monoclonal antibodies',
+ target: '188-803-921-043-695',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'From On-Target to Off-Target Activity: Identification and Optimisation of Trypanosoma brucei GSK3 Inhibitors and Their Characterisation as Anti-Trypanosoma brucei Drug Discovery Lead Molecules',
+ target: '191-147-881-232-285',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'From On-Target to Off-Target Activity: Identification and Optimisation of Trypanosoma brucei GSK3 Inhibitors and Their Characterisation as Anti-Trypanosoma brucei Drug Discovery Lead Molecules',
+ target: '081-817-015-173-962',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'HIF-independent role of prolyl hydroxylases in the cellular response to amino acids',
+ target: '106-530-060-683-82X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'HIF-independent role of prolyl hydroxylases in the cellular response to amino acids',
+ target: '133-935-409-400-672',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '046-588-899-387-353',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '051-324-518-696-462',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '161-487-188-181-03X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '156-653-831-632-101',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '198-017-973-913-570',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '076-538-237-089-675',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '198-017-973-913-570',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '076-538-237-089-675',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '051-324-518-696-462',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '161-487-188-181-03X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Structural determinants for ERK5 (MAPK7) and leucine rich repeat kinase 2 activities of benzo[e]pyrimido-[5,4-b]diazepine-6(11H)-ones',
+ target: '156-653-831-632-101',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'A novel shogaol analog suppresses cancer cell invasion and inflammation, and displays cytoprotective effects through modulation of NF-κB and Nrf2-Keap1 signaling pathways',
+ target: '049-222-171-973-678',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'A novel shogaol analog suppresses cancer cell invasion and inflammation, and displays cytoprotective effects through modulation of NF-κB and Nrf2-Keap1 signaling pathways',
+ target: '074-598-665-914-143',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'X-ray Crystal Structure of ERK5 (MAPK7) in Complex with a Specific Inhibitor',
+ target: '161-487-188-181-03X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'X-ray Crystal Structure of ERK5 (MAPK7) in Complex with a Specific Inhibitor',
+ target: '156-653-831-632-101',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'X-ray Crystal Structure of ERK5 (MAPK7) in Complex with a Specific Inhibitor',
+ target: '051-324-518-696-462',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The endosome-lysosome pathway and information generation in the immune system.',
+ target: '190-195-697-065-907',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The endosome-lysosome pathway and information generation in the immune system.',
+ target: '031-461-589-086-771',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'GSK2578215A; a potent and highly selective 2-arylmethyloxy-5-substitutent-N-arylbenzamide LRRK2 kinase inhibitor.',
+ target: '167-851-091-520-257',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Structure of the TatC core of the twin-arginine protein transport system',
+ target: '151-760-923-304-502',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The Ancient Drug Salicylate Directly Activates AMP-Activated Protein Kinase',
+ target: '097-019-537-894-104',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The Ancient Drug Salicylate Directly Activates AMP-Activated Protein Kinase',
+ target: '170-696-774-214-700',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Application of a novel highly sensitive activity-based probe for detection of cathepsin G',
+ target: '084-807-525-209-072',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Analysis of the role of Nrf2 in the expression of liver proteins in mice using two-dimensional gel-based proteomics',
+ target: '044-648-704-787-12X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'PINK1 is activated by mitochondrial membrane potential depolarization and stimulates Parkin E3 ligase activity by phosphorylating Serine 65',
+ target: '001-353-214-346-040',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'PINK1 is activated by mitochondrial membrane potential depolarization and stimulates Parkin E3 ligase activity by phosphorylating Serine 65',
+ target: '150-822-190-827-131',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'PINK1 is activated by mitochondrial membrane potential depolarization and stimulates Parkin E3 ligase activity by phosphorylating Serine 65',
+ target: '051-919-508-851-10X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis, Chemical Reactivity as Michael Acceptors, and Biological Potency of Monocyclic Cyanoenones, Novel and Highly Potent Anti-inflammatory and Cytoprotective Agents(1)',
+ target: '036-789-224-520-054',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis, Chemical Reactivity as Michael Acceptors, and Biological Potency of Monocyclic Cyanoenones, Novel and Highly Potent Anti-inflammatory and Cytoprotective Agents(1)',
+ target: '036-251-116-198-69X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, Synthesis and Biological Evaluation of Trypanosoma brucei Trypanothione Synthetase Inhibitors',
+ target: '149-946-446-737-586',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, Synthesis and Biological Evaluation of Trypanosoma brucei Trypanothione Synthetase Inhibitors',
+ target: '075-397-286-033-085',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, Synthesis and Biological Evaluation of Trypanosoma brucei Trypanothione Synthetase Inhibitors',
+ target: '028-992-308-265-357',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, Synthesis and Biological Evaluation of Trypanosoma brucei Trypanothione Synthetase Inhibitors',
+ target: '044-207-676-689-405',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, Synthesis and Biological Evaluation of Trypanosoma brucei Trypanothione Synthetase Inhibitors',
+ target: '030-350-713-791-200',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Mitogen-activated protein kinase-activated protein kinase 2 (MAPKAP-K2) as an antiinflammatory target: discovery and in vivo activity of selective pyrazolo[1,5-a]pyrimidine inhibitors using a focused library and structure-based optimization approach.',
+ target: '093-997-239-092-949',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Mitogen-activated protein kinase-activated protein kinase 2 (MAPKAP-K2) as an antiinflammatory target: discovery and in vivo activity of selective pyrazolo[1,5-a]pyrimidine inhibitors using a focused library and structure-based optimization approach.',
+ target: '046-345-437-716-689',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Mitogen-activated protein kinase-activated protein kinase 2 (MAPKAP-K2) as an antiinflammatory target: discovery and in vivo activity of selective pyrazolo[1,5-a]pyrimidine inhibitors using a focused library and structure-based optimization approach.',
+ target: '146-411-731-640-871',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Chemical Proteomic Analysis Reveals the Drugability of the Kinome of Trypanosoma brucei',
+ target: '000-266-572-036-366',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Avirulence Protein 3a (AVR3a) from the Potato Pathogen Phytophthora infestans Forms Homodimers through Its Predicted Translocation Region and Does Not Specifically Bind Phospholipids',
+ target: '186-389-876-954-313',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'NEDD8 overexpression results in neddylation of ubiquitin substrates by the ubiquitin pathway.',
+ target: '168-483-508-794-377',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Kinome-wide Selectivity Profiling of ATP-competitive Mammalian Target of Rapamycin (mTOR) Inhibitors and Characterization of Their Binding Kinetics',
+ target: '029-748-240-628-036',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The ubiquitin E1 enzyme Ube1 mediates NEDD8 activation under diverse stress conditions',
+ target: '184-507-509-452-559',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Acinetobacter baumannii FolD ligand complexes – potent inhibitors of folate metabolism and a re‐evaluation of the structure of LY374571',
+ target: '069-961-069-943-549',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '017-777-392-752-199',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '000-150-893-948-804',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '027-437-502-794-894',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '074-789-039-135-70X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '063-617-165-524-327',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '019-872-586-012-269',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '103-648-347-913-447',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '007-245-406-573-328',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '027-437-502-794-894',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '008-337-248-044-723',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '197-071-041-313-103',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Aurora kinase inhibitors: Progress towards the clinic',
+ target: '098-538-513-984-747',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The AMPK-related kinase SIK2 is regulated by cAMP via phosphorylation at Ser(358) in adipocytes',
+ target: '019-125-805-246-964',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The AMPK-related kinase SIK2 is regulated by cAMP via phosphorylation at Ser(358) in adipocytes',
+ target: '172-064-016-145-117',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The AMPK-related kinase SIK2 is regulated by cAMP via phosphorylation at Ser(358) in adipocytes',
+ target: '007-417-942-335-284',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Synergy of Peptide and Sugar in O-GlcNAcase Substrate Recognition',
+ target: '005-947-025-410-764',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Synergy of Peptide and Sugar in O-GlcNAcase Substrate Recognition',
+ target: '116-404-026-640-450',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Discovery of potent and selective covalent inhibitors of JNK',
+ target: '090-437-295-781-023',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Discovery of potent and selective covalent inhibitors of JNK',
+ target: '197-158-559-918-854',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Discovery of potent and selective covalent inhibitors of JNK',
+ target: '076-225-263-850-117',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Discovery of potent and selective covalent inhibitors of JNK',
+ target: '049-199-509-181-561',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Discovery of potent and selective covalent inhibitors of JNK',
+ target: '179-045-041-176-506',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Discovery of potent and selective covalent inhibitors of JNK',
+ target: '004-301-778-674-378',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Phosphorylation of FOXO3a on Ser-7 by p38 Promotes Its Nuclear Localization in Response to Doxorubicin',
+ target: '111-313-231-732-367',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMPK: a nutrient and energy sensor that maintains energy homeostasis',
+ target: '092-197-031-561-353',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMPK: a nutrient and energy sensor that maintains energy homeostasis',
+ target: '192-019-786-423-841',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMPK: a nutrient and energy sensor that maintains energy homeostasis',
+ target: '192-019-786-423-841',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMPK: a nutrient and energy sensor that maintains energy homeostasis',
+ target: '076-608-180-638-59X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMPK: a nutrient and energy sensor that maintains energy homeostasis',
+ target: '175-263-797-963-040',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMPK: a nutrient and energy sensor that maintains energy homeostasis',
+ target: '092-197-031-561-353',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis and structure-activity relationships of a novel series of pyrimidines as potent inhibitors of TBK1/IKKε kinases.',
+ target: '141-694-167-791-759',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis and structure-activity relationships of a novel series of pyrimidines as potent inhibitors of TBK1/IKKε kinases.',
+ target: '081-203-444-563-604',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis and structure-activity relationships of a novel series of pyrimidines as potent inhibitors of TBK1/IKKε kinases.',
+ target: '125-348-249-762-351',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Synthesis and structure-activity relationships of a novel series of pyrimidines as potent inhibitors of TBK1/IKKε kinases.',
+ target: '125-850-986-196-787',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Peptide inhibitors of the Keap1-Nrf2 protein-protein interaction',
+ target: '119-397-162-706-860',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Small molecules that bind the Mdm2 RING stabilize and activate p53',
+ target: '133-023-408-974-285',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Small molecules that bind the Mdm2 RING stabilize and activate p53',
+ target: '039-847-299-166-952',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '076-641-402-312-988',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '102-485-198-725-150',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '168-829-456-947-639',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '098-813-369-162-741',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '023-180-369-416-862',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '189-473-046-734-005',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '019-633-684-883-828',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '174-501-376-407-235',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '129-062-448-949-030',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '162-916-741-322-002',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '080-026-305-809-343',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '016-698-167-713-829',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '091-325-080-234-401',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '032-206-614-235-635',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '143-271-017-351-983',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '169-312-245-869-778',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '089-818-979-077-305',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '187-517-157-601-239',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '111-583-988-147-450',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '058-026-435-099-506',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '153-651-762-444-327',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '159-766-711-047-610',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '058-933-099-316-100',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '023-452-662-674-373',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '047-432-030-246-04X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '139-008-712-602-518',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '137-720-748-139-162',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '192-136-893-476-749',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Reduction in BACE1 decreases body weight, protects against diet-induced obesity and enhances insulin sensitivity in mice',
+ target: '172-890-893-515-719',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '104-472-615-006-481',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '097-374-332-908-898',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '034-416-075-094-770',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '127-642-274-375-054',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '036-708-909-192-156',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '193-863-590-855-263',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '150-028-859-997-047',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '034-416-075-094-770',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '097-374-332-908-898',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '104-472-615-006-481',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-Activated Protein Kinase: A Target for Drugs both Ancient and Modern',
+ target: '132-394-716-226-832',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Changes in the ratio of free NEDD8 to ubiquitin triggers NEDDylation by ubiquitin enzymes',
+ target: '168-483-508-794-377',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Fragment-based discovery of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors.',
+ target: '131-238-819-455-784',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Fragment-based discovery of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors.',
+ target: '155-402-461-387-483',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Fragment-based discovery of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors.',
+ target: '040-389-070-176-191',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Fragment-based discovery of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors.',
+ target: '076-478-479-475-120',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A multifunctional protease inhibitor to regulate endolysosomal function.',
+ target: '031-461-589-086-771',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'A multifunctional protease inhibitor to regulate endolysosomal function.',
+ target: '190-195-697-065-907',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Design, Synthesis, and Structure−Activity Relationship Exploration of 1-Substituted 4-Aroyl-3-hydroxy-5-phenyl-1H-pyrrol-2(5H)-one Analogues as Inhibitors of the Annexin A2−S100A10 Protein Interaction',
+ target: '034-190-802-321-708',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ '4-benzimidazolyl-3-phenylbutanoic acids as novel PIF-pocket-targeting allosteric inhibitors of protein kinase PKCζ.',
+ target: '130-316-719-983-242',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Optimisation of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors',
+ target: '076-478-479-475-120',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Optimisation of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors',
+ target: '040-389-070-176-191',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Optimisation of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors',
+ target: '036-668-261-470-040',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Optimisation of 6-substituted isoquinolin-1-amine based ROCK-I inhibitors',
+ target: '183-767-289-461-131',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Design, Synthesis and Biological Evaluation of Novel Inhibitors of Trypanosoma brucei Pteridine Reductase 1',
+ target: '107-556-164-321-147',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The inhibitory effect of phospholemman on the sodium pump requires its palmitoylation.',
+ target: '106-594-488-484-12X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'SCF/β-TrCP promotes glycogen synthase kinase 3-dependent degradation of the Nrf2 transcription factor in a keap1-independent manner',
+ target: '066-190-726-252-149',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Immunosuppressive but Non-LasR-Inducing Analogues of the Pseudomonas aeruginosa Quorum-Sensing Molecule N-(3-Oxododecanoyl)-L-homoserine Lactone',
+ target: '140-900-012-438-14X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Absolute SILAC-Compatible Expression Strain Allows Sumo-2 Copy Number Determination in Clinical Samples',
+ target: '058-438-690-312-096',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Absolute SILAC-Compatible Expression Strain Allows Sumo-2 Copy Number Determination in Clinical Samples',
+ target: '004-889-112-130-518',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Collateral sensitivity of multidrug-resistant cells to the orphan drug tiopronin.',
+ target: '193-040-307-473-220',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '188-718-220-131-362',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '087-577-350-425-176',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '191-670-060-004-126',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '188-803-921-043-695',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '041-699-843-843-567',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '180-366-233-781-99X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '156-653-831-632-101',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '051-324-518-696-462',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '161-487-188-181-03X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '167-851-091-520-257',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: "Characterization of a selective inhibitor of the Parkinson's disease kinase LRRK2",
+ target: '122-739-962-072-793',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'ATP site-directed inhibitors of protein kinase CK2: an update.',
+ target: '109-274-898-147-341',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Identification of Inhibitors of the Leishmania cdc2-Related Protein Kinase CRK3',
+ target: '124-179-501-005-870',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Identification of Inhibitors of the Leishmania cdc2-Related Protein Kinase CRK3',
+ target: '008-694-981-426-172',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Identification of Inhibitors of the Leishmania cdc2-Related Protein Kinase CRK3',
+ target: '109-611-546-954-080',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Polyubiquitin binding to optineurin is required for optimal activation of TANK-binding kinase 1 and production of interferon β.',
+ target: '004-378-254-734-355',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Polyubiquitin binding to optineurin is required for optimal activation of TANK-binding kinase 1 and production of interferon β.',
+ target: '133-997-520-845-569',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Substrate and Product Analogues as Human O-Glcnac Transferase Inhibitors.',
+ target: '115-381-943-359-61X',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Substrate and Product Analogues as Human O-Glcnac Transferase Inhibitors.',
+ target: '022-078-711-389-998',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Substrate and Product Analogues as Human O-Glcnac Transferase Inhibitors.',
+ target: '132-854-391-972-865',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Substrate and Product Analogues as Human O-Glcnac Transferase Inhibitors.',
+ target: '171-143-110-884-468',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ target: '003-946-199-636-328',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ target: '009-649-401-227-606',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ target: '170-042-571-881-121',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ target: '033-301-273-471-462',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ target: '040-826-560-477-838',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ target: '048-208-660-423-215',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The cytoprotective role of the Keap1–Nrf2 pathway',
+ target: '135-293-472-746-415',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, synthesis and biological evaluation of 6-pyridylmethylaminopurines as CDK inhibitors',
+ target: '153-999-081-812-523',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, synthesis and biological evaluation of 6-pyridylmethylaminopurines as CDK inhibitors',
+ target: '000-498-778-953-787',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Design, synthesis and biological evaluation of 6-pyridylmethylaminopurines as CDK inhibitors',
+ target: '085-065-777-135-758',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Analgesic omega-Conotoxins CVIE and CVIF Selectively and Voltage-Dependently Block Recombinant and Native N-Type Calcium Channels (vol 77, pg 139, 2010)',
+ target: '152-366-692-522-975',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'Analgesic omega-Conotoxins CVIE and CVIF Selectively and Voltage-Dependently Block Recombinant and Native N-Type Calcium Channels (vol 77, pg 139, 2010)',
+ target: '167-869-142-610-582',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'NF-κB controls energy homeostasis and metabolic adaptation by upregulating mitochondrial respiration',
+ target: '191-676-336-200-724',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Development of 18F-fluorinatable dendrons and their application to cancer cell targeting',
+ target: '056-387-403-639-935',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The specificities of small molecule inhibitors of the TGFß and BMP pathways',
+ target: '066-841-401-628-941',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The specificities of small molecule inhibitors of the TGFß and BMP pathways',
+ target: '069-503-782-573-055',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'The specificities of small molecule inhibitors of the TGFß and BMP pathways',
+ target: '028-137-796-142-577',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Catalysis by the nucleolytic ribozymes',
+ target: '197-678-301-596-236',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Catalysis by the nucleolytic ribozymes',
+ target: '147-466-934-435-143',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Catalysis by the nucleolytic ribozymes',
+ target: '114-647-123-099-321',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Catalysis by the nucleolytic ribozymes',
+ target: '058-829-130-504-901',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Catalysis by the nucleolytic ribozymes',
+ target: '169-953-034-717-264',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Characterization of GSK2334470, a novel and highly specific inhibitor of PDK1',
+ target: '028-012-588-449-727',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Characterization of GSK2334470, a novel and highly specific inhibitor of PDK1',
+ target: '038-839-140-589-623',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'N1-Benzyl substituted cambinol analogues as isozyme selective inhibitors of the sirtuin family of protein deacetylases',
+ target: '194-924-906-201-593',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'N1-Benzyl substituted cambinol analogues as isozyme selective inhibitors of the sirtuin family of protein deacetylases',
+ target: '195-611-964-620-410',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'N1-Benzyl substituted cambinol analogues as isozyme selective inhibitors of the sirtuin family of protein deacetylases',
+ target: '025-014-524-538-421',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source:
+ 'N1-Benzyl substituted cambinol analogues as isozyme selective inhibitors of the sirtuin family of protein deacetylases',
+ target: '025-014-524-538-421',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ target: '120-667-268-642-909',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ target: '163-117-320-460-138',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ target: '191-290-593-697-506',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ target: '118-339-847-530-982',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ target: '073-318-370-112-877',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ target: '113-828-920-381-078',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'AMP-activated protein kinase—an energy sensor that regulates all aspects of cell function',
+ target: '048-983-957-537-421',
+ data: {
+ value: 2,
+ },
+ },
+ {
+ source: 'Optimisation of the Anti-Trypanosoma brucei Activity of the Opioid Agonist U50488',
+ target: '073-531-962-083-670',
+ data: {
+ value: 2,
+ },
+ },
+ ],
+};
+
+export const config: Application = {
+ version: 'v0.1',
+ metadata: {
+ name: '测试应用',
+ },
+ dataset: {
+ id: '4a4fee6d-f4e8-403b-a1e6-19fc7fcad418',
+ metadata: {
+ name: '本地测试数据',
+ },
+ type: 'local',
+ data,
+ },
+ spec: {
+ graph: {
+ autoResize: true,
+ layout: { type: 'd3-force' },
+ behaviors: ['drag-canvas', 'zoom-canvas', 'drag-element', 'click-select', 'hover-activate'],
+ animation: false,
+ autoFit: 'view',
+ },
+ widgets: [
+ {
+ id: 'my-app-layout',
+ type: 'MyAppLayout',
+ properties: {
+ showHeader: true,
+ },
+ slots: {
+ header: ['custom-header'],
+ sider: ['custom-sidebar'],
+ panel: ['custom-panel'],
+ canvas: ['custom-canvas-component'],
+ },
+ },
+ {
+ id: 'custom-header',
+ type: 'CustomHeader',
+ },
+ {
+ id: 'custom-sidebar',
+ type: 'CustomSidebar',
+ slots: ['statistic-card'],
+ },
+ {
+ id: 'custom-panel',
+ type: 'CustomPanel',
+ properties: {
+ count: 100,
+ },
+ },
+ {
+ id: 'custom-canvas-component',
+ type: 'CustomCanvasComponent',
+ },
+ {
+ id: 'statistic-card',
+ type: 'StatisticCard',
+ },
+ // },
+ // {
+ // id: 'copyright',
+ // type: 'Copyright',
+ // properties: {
+ // position: 'bottom-right',
+ // },
+ // },
+ // {
+ // id: 'toolbar',
+ // type: 'Toolbar',
+ // properties: {
+ // position: 'top-left',
+ // },
+ // slots: ['zoom-in', 'zoom-out'],
+ // },
+ // {
+ // id: 'zoom-in',
+ // type: 'ZoomIn',
+ // properties: {},
+ // },
+ // {
+ // id: 'zoom-out',
+ // type: 'ZoomOut',
+ // properties: {},
+ // },
+ // {
+ // id: 'property-panel',
+ // type: 'PropertyPanel',
+ // properties: {
+ // count: 100,
+ // },
+ // },
+ ],
+ },
+};
diff --git a/packages/gi-sdk/docs/constant.ts b/packages/gi-sdk/docs/constant.ts
new file mode 100644
index 000000000..30b83ced9
--- /dev/null
+++ b/packages/gi-sdk/docs/constant.ts
@@ -0,0 +1,6 @@
+export const PREFIX = 'my-app';
+
+export const fontStyle = {
+ fontSize: 32,
+ color: 'green',
+};
diff --git a/packages/gi-sdk/src/global.less b/packages/gi-sdk/docs/global.less
similarity index 93%
rename from packages/gi-sdk/src/global.less
rename to packages/gi-sdk/docs/global.less
index dbf18754e..17b2401e4 100644
--- a/packages/gi-sdk/src/global.less
+++ b/packages/gi-sdk/docs/global.less
@@ -1,4 +1,4 @@
-@prefix: ~'gi-sdk';
+@prefix: my-app;
:root {
--background-color: rgba(255, 255, 255, 0.6);
diff --git a/packages/gi-sdk/public/index.html b/packages/gi-sdk/docs/index.html
similarity index 100%
rename from packages/gi-sdk/public/index.html
rename to packages/gi-sdk/docs/index.html
diff --git a/packages/gi-sdk/src/index.less b/packages/gi-sdk/docs/index.less
similarity index 86%
rename from packages/gi-sdk/src/index.less
rename to packages/gi-sdk/docs/index.less
index 75556d2f5..aebf5c656 100644
--- a/packages/gi-sdk/src/index.less
+++ b/packages/gi-sdk/docs/index.less
@@ -9,7 +9,7 @@
flex: 1;
display: flex;
- .@{prefix}-scene {
+ .@{prefix}-graph-container {
height: 100%;
width: 100%;
}
diff --git a/packages/gi-sdk/docs/main.tsx b/packages/gi-sdk/docs/main.tsx
new file mode 100644
index 000000000..8ca646f1a
--- /dev/null
+++ b/packages/gi-sdk/docs/main.tsx
@@ -0,0 +1,22 @@
+import { GISDK } from '@antv/gi-sdk';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { myAssetPackage } from './assets';
+import { config } from './config';
+import './index.less';
+
+export const Demo: React.FC = () => {
+ const assets = [myAssetPackage];
+
+ return (
+
+ );
+};
+
+ReactDOM.render(, document.getElementById('root'));
diff --git a/packages/gi-sdk/package.json b/packages/gi-sdk/package.json
index d9dc0653c..1d3fc2ecf 100644
--- a/packages/gi-sdk/package.json
+++ b/packages/gi-sdk/package.json
@@ -1,14 +1,15 @@
{
"name": "@antv/gi-sdk",
"version": "3.0.0-alpha.0",
- "description": "the react toolkit for graph analysis based on g6",
- "main": "lib/index.js",
- "module": "es/index.js",
- "types": "lib/index.d.ts",
+ "description": "SDK for Graph Insight Application",
"repository": {
"type": "git",
"url": "https://github.com/antvis/Graphin.git"
},
+ "license": "ISC",
+ "main": "lib/index.js",
+ "module": "es/index.js",
+ "types": "lib/index.d.ts",
"files": [
"src",
"es",
@@ -19,20 +20,22 @@
"ci": "run-s type-check lint build",
"clean": "rimraf lib es",
"dev": "vite",
+ "lib": "run-p lib:*",
"lib:cjs": "tsc -p tsconfig.build.json --target ES5 --module commonjs --outDir lib",
"lib:es": "tsc -p tsconfig.build.json --target ES5 --module ESNext --outDir es",
- "lib": "run-p lib:*",
"lint": "eslint ./src --quiet && prettier ./src --check",
"prepublishOnly": "npm run ci",
"type-check": "tsc --noEmit",
"watch": "pnpm lib:es --w"
},
- "license": "ISC",
"dependencies": {
"@ant-design/icons": "^4.8.1",
+ "@antv/event-emitter": "^0.1.3",
"@antv/g6": "^5.0.0",
"@antv/graphin": "^3.0.0",
+ "@antv/util": "^3.3.7",
"antd": "^5.13.2",
+ "classnames": "^2.5.1",
"react-transition-group": "^4.4.5"
},
"devDependencies": {
@@ -45,8 +48,8 @@
"react-dom": ">=16.9.0"
},
"publishConfig": {
- "registry": "https://registry.npmjs.org/",
"access": "public",
+ "registry": "https://registry.npmjs.org/",
"tag": "alpha"
}
}
diff --git a/packages/gi-sdk/public/main.tsx b/packages/gi-sdk/public/main.tsx
deleted file mode 100644
index 3a454bacf..000000000
--- a/packages/gi-sdk/public/main.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import React, { useEffect, useMemo, useState } from 'react';
-import ReactDOM from 'react-dom';
-import { GISDK, registerWidget, useEventSubscribe, useGlobalModel, useGraph, useWidgets } from '@antv/gi-sdk';
-import type { WidgetItem } from '@antv/gi-sdk';
-import type { GraphinProps } from '@antv/graphin';
-import { Button, Spin } from 'antd';
-import { CanvasEvent, NodeEvent } from '@antv/g6';
-import type { IPointerEvent, Node } from '@antv/g6';
-
-const style = {
- fontSize: 32,
- color: 'green',
-};
-
-const CustomSidebar: React.FC = () => {
- const [globalModel] = useGlobalModel();
- const [, updateWidget] = useWidgets();
- const isPanelOpen = globalModel?.panel;
-
- return (
-
-
Sider
-
Panel {isPanelOpen ? opened : closed}
-
-
- );
-};
-
-const CustomPanel: React.FC<{ count: number }> = props => {
- const { count } = props;
- const [globalModel] = useGlobalModel();
- const isSiderOpen = globalModel?.sider;
-
- return (
-
-
{count}...
-
Sider {isSiderOpen ? opened : closed}
-
- current node: {globalModel.currentNode?.id}
-
-
- );
-};
-
-const CustomHeader: React.FC = () => {
- return GI-SDK
;
-};
-
-const CustomCanvasComponent: React.FC = () => {
- const [, updateGlobalModel] = useGlobalModel();
- const graph = useGraph();
-
- useEventSubscribe>(NodeEvent.CLICK, e => {
- const nodeId = e.target.id;
- updateGlobalModel({ currentNode: graph?.getNodeData(nodeId), panel: true });
- });
-
- useEventSubscribe(CanvasEvent.CLICK, e => {
- updateGlobalModel({ currentNode: null, panel: false });
- });
-
- return null;
-};
-
-registerWidget('custom-sidebar', CustomSidebar);
-registerWidget('custom-panel', CustomPanel);
-registerWidget('custom-header', CustomHeader);
-registerWidget('custom-canvas-component', CustomCanvasComponent);
-
-const Demo: React.FC = () => {
- const [data, setData] = useState(undefined);
-
- useEffect(() => {
- fetch('https://assets.antv.antgroup.com/g6/graph.json')
- .then(res => res.json())
- .then(data => setData(data));
- }, []);
-
- const graphinProps: GraphinProps = useMemo(
- () => ({
- options: {
- autoResize: true,
- data,
- layout: { type: 'd3-force' },
- behaviors: ['drag-canvas', 'zoom-canvas', 'drag-element', 'click-select', 'hover-activate'],
- animation: false,
- },
- }),
- [data],
- );
-
- const widgets: WidgetItem[] = [
- {
- name: 'custom-header',
- slot: 'header',
- },
- {
- name: 'custom-sidebar',
- slot: 'sider',
- },
- {
- name: 'custom-panel',
- slot: 'panel',
- properties: {
- count: 100,
- },
- },
- {
- name: 'custom-canvas-component',
- slot: 'canvas',
- },
- ];
-
- if (!data) return ;
-
- return ;
-};
-
-ReactDOM.render(, document.getElementById('root'));
diff --git a/packages/gi-sdk/src/GISDK.tsx b/packages/gi-sdk/src/GISDK.tsx
index 671773773..bfc05c825 100644
--- a/packages/gi-sdk/src/GISDK.tsx
+++ b/packages/gi-sdk/src/GISDK.tsx
@@ -1,48 +1,15 @@
-import React, { useRef, useState } from 'react';
-import { Graphin } from '@antv/graphin';
-import type { Graph as G6Graph } from '@antv/g6';
-import { PREFIX } from './constants';
-import { Panel, Sider, Header } from './assets';
-import { useComponent } from './hooks';
-import type { GISDKProps, GlobalModel, WidgetItem } from './types';
-import { GISDKContext } from './context';
-import './index.less';
+import React, { useMemo } from 'react';
+import type { GIRuntimeAppProps } from './runtime';
+import { GIRuntimeApp } from './runtime';
+import type { GIRenderProps } from './runtime/Render';
-const defaultGlobalModel: Partial = { sider: true, panel: false };
+export interface GISDKProps extends GIRenderProps, GIRuntimeAppProps {}
-export const GISDK: React.FC = props => {
- const { graph: graphinProps } = props;
- const graphRef = useRef(null);
- const [isReady, setIsReady] = useState(false);
- const [globalModel, setGlobalModel] = useState(defaultGlobalModel);
+export const GISDK: React.FC = (props) => {
+ const { assets, initialGlobalState, ...restProps } = props;
- const [widgets, setWidgets] = useState(props.widgets);
- const { renderComponents } = useComponent(widgets);
+ const runtime = useMemo(() => new GIRuntimeApp({ assets, initialGlobalState }), [assets, initialGlobalState]);
+ const { App } = runtime;
- return (
-
-
-
{isReady && renderComponents('header')}
-
-
{isReady && renderComponents('sider')}
-
- {
- setIsReady(true);
- graphinProps.onInit?.(graph);
- }}
- >
- {renderComponents('canvas')}
-
-
-
{isReady && renderComponents('panel')}
-
-
-
- );
+ return ;
};
diff --git a/packages/gi-sdk/src/assets/index.ts b/packages/gi-sdk/src/assets/index.ts
index d2577c6c7..e69de29bb 100644
--- a/packages/gi-sdk/src/assets/index.ts
+++ b/packages/gi-sdk/src/assets/index.ts
@@ -1,4 +0,0 @@
-export { Panel } from './panel';
-export { Sider } from './sider';
-export { Header } from './header';
-export { registerWidget, getWidget } from './widgets';
diff --git a/packages/gi-sdk/src/assets/panel/index.tsx b/packages/gi-sdk/src/assets/panel/index.tsx
deleted file mode 100644
index f96b6ffc9..000000000
--- a/packages/gi-sdk/src/assets/panel/index.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React, { PropsWithChildren } from 'react';
-import { Drawer } from 'antd';
-import { PREFIX } from '../../constants';
-import { useGlobalModel } from '../../context';
-
-export const Panel: React.FC = props => {
- const { children } = props;
- const [globalModel, updateGlobalModel] = useGlobalModel();
- const isPanelOpen = Boolean(globalModel.panel);
-
- const onClose = () => {
- updateGlobalModel({ panel: false });
- };
-
- return (
-
-
- {children}
-
-
- );
-};
diff --git a/packages/gi-sdk/src/assets/widgets.ts b/packages/gi-sdk/src/assets/widgets.ts
deleted file mode 100644
index ab3557015..000000000
--- a/packages/gi-sdk/src/assets/widgets.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import type { WidgetItem } from '../types';
-
-const WIDGET_REGISTRY: { [key: string]: React.FC } = {};
-
-export const BuiltInWidgets: WidgetItem[] = [];
-
-/**
- * Register a new widget
- * @param name - widget name
- * @param widget - widget component
- * @param override - whether to override existing widget with the same name
- */
-export function registerWidget(name: string, widget: React.FC, override = false) {
- if (!override && name in WIDGET_REGISTRY) {
- // eslint-disable-next-line no-console
- console.warn(`Widget with name ${name} already exists. Use override flag to replace it.`);
- } else {
- WIDGET_REGISTRY[name] = widget;
- }
-}
-
-/**
- * Get a widget by name
- * @param name - widget name
- * @returns widget component
- */
-export function getWidget(name: string): React.FC | undefined {
- return WIDGET_REGISTRY[name];
-}
diff --git a/packages/gi-sdk/src/components/GraphContainer/index.tsx b/packages/gi-sdk/src/components/GraphContainer/index.tsx
new file mode 100644
index 000000000..ae51c5ed6
--- /dev/null
+++ b/packages/gi-sdk/src/components/GraphContainer/index.tsx
@@ -0,0 +1,44 @@
+import type { Graph as G6Graph } from '@antv/g6';
+import { Graphin } from '@antv/graphin';
+import classnames from 'classnames';
+import React, { PropsWithChildren, useEffect, useRef, useState } from 'react';
+import { PREFIX } from '../../constants';
+import { useDataset, useGraph, useGraphOptions } from '../../hooks';
+import { isLocalDataset } from '../../utils/dataset';
+
+export interface GraphContainerProps extends Pick, 'id' | 'className' | 'style'> {}
+
+export const GraphContainer: React.FC> = (props) => {
+ const { className, style, children } = props;
+ const [options, setOptions] = useGraphOptions();
+ const [, setGraphInstance] = useGraph();
+ const [isReady, setIsReady] = useState(false);
+ const [dataset] = useDataset();
+ const graphRef = useRef(null);
+
+ useEffect(() => {
+ if (!isReady || !graphRef.current || graphRef.current.destroyed) return;
+
+ setGraphInstance(graphRef.current);
+ }, [isReady]);
+
+ useEffect(() => {
+ if (isLocalDataset(dataset)) {
+ setOptions({
+ data: dataset.data,
+ });
+ }
+ }, [dataset]);
+
+ return (
+ setIsReady(true)}
+ >
+ {children}
+
+ );
+};
diff --git a/packages/gi-sdk/src/components/ImplWidget/index.tsx b/packages/gi-sdk/src/components/ImplWidget/index.tsx
new file mode 100644
index 000000000..ccf831598
--- /dev/null
+++ b/packages/gi-sdk/src/components/ImplWidget/index.tsx
@@ -0,0 +1,51 @@
+import React, { useMemo } from 'react';
+import { useRegistryManger, useStateManger, useWidgetProps } from '../../hooks';
+import type { WidgetSchema } from '../../spec';
+import type { SlotElements } from '../../types';
+import { parseSlot } from '../../utils/slot';
+
+export interface ImplWidgetProps {
+ /**
+ * 组件配置
+ */
+ widget: WidgetSchema;
+}
+
+export const ImplWidget: React.FC = ({ widget }) => {
+ const { id: widgetId, type, slots } = widget;
+
+ const { defaultProperties, component: Comp, metadata } = useRegistryManger().getWidget(type);
+
+ const [properties] = useWidgetProps(widgetId);
+ const mergedProperties = useMemo(() => Object.assign({}, defaultProperties, properties), [properties]);
+
+ const widgets = useStateManger().widgetStore.getWidgets();
+
+ const slotElements: SlotElements = useMemo(() => {
+ let elements = {};
+
+ if (slots) {
+ const parsedSlots = parseSlot(slots);
+ elements = Object.entries(parsedSlots).reduce((acc, [slotName, slotIds]) => {
+ const slotWidgets = slotIds.map((id) => widgets.find((w) => w.id === id)).filter(Boolean) as WidgetSchema[];
+
+ if (!slotWidgets.length) return acc;
+
+ acc[slotName] = slotWidgets.map((slotWidget) => );
+ return acc;
+ }, {});
+ }
+ return elements;
+ }, [widgets, slots]);
+
+ return (
+
+
+
+ );
+};
diff --git a/packages/gi-sdk/src/components/index.ts b/packages/gi-sdk/src/components/index.ts
new file mode 100644
index 000000000..000c222e4
--- /dev/null
+++ b/packages/gi-sdk/src/components/index.ts
@@ -0,0 +1,5 @@
+export { GraphContainer } from './GraphContainer';
+export { ImplWidget } from './ImplWidget';
+
+export type { GraphContainerProps } from './GraphContainer';
+export type { ImplWidgetProps } from './ImplWidget';
diff --git a/packages/gi-sdk/src/constants/index.ts b/packages/gi-sdk/src/constants/index.ts
index 7165d7a94..3c0ac6f81 100644
--- a/packages/gi-sdk/src/constants/index.ts
+++ b/packages/gi-sdk/src/constants/index.ts
@@ -1,2 +1 @@
export { PREFIX } from './prefix';
-export { SlotEnum } from './slot';
diff --git a/packages/gi-sdk/src/constants/slot.ts b/packages/gi-sdk/src/constants/slot.ts
deleted file mode 100644
index 48cf66b07..000000000
--- a/packages/gi-sdk/src/constants/slot.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const enum SlotEnum {
- HEADER = 'header',
- SIDER = 'sider',
- CANVAS = 'canvas',
- PANEL = 'panel',
-}
diff --git a/packages/gi-sdk/src/context/index.ts b/packages/gi-sdk/src/context/index.ts
index df9b78514..4c82bc59b 100644
--- a/packages/gi-sdk/src/context/index.ts
+++ b/packages/gi-sdk/src/context/index.ts
@@ -1,55 +1,18 @@
import React from 'react';
-import type { GISDKContextProps, GlobalModel, WidgetItem } from '../types';
+import type RegistryManager from '../registry';
+import type StateManager from '../state';
-export const GISDKContext = React.createContext({
- graph: null,
- isReady: false,
- globalModel: {},
- setGlobalModel: () => {},
- widgets: [],
- setWidgets: () => {},
-});
+export interface GIContextProps {
+ registry: RegistryManager;
+ state: StateManager;
+}
-export const useGISDK = () => {
- const context = React.useContext(GISDKContext);
+export const GIContext = React.createContext(null as any);
+
+export const useGIContext = () => {
+ const context = React.useContext(GIContext);
if (context === undefined || Object.keys(context).length === 0) {
- throw new Error('useGISDK must be used within a GISDKProvider.');
+ throw new Error('useGIContext must be used within a GIContext.Provider');
}
return context;
};
-
-/**
- * The hook to get the G6 graph instance.
- * @returns The G6 graph instance.
- */
-export const useGraph = () => useGISDK().graph;
-
-/**
- * The hook to operate the global model.
- * @returns The global model and the setter of the global model.
- */
-export const useGlobalModel = () => {
- const { globalModel, setGlobalModel } = useGISDK();
-
- const updateGlobalModel = (newModel: Partial) => {
- setGlobalModel(prev => ({ ...prev, ...newModel }));
- };
-
- return [globalModel, updateGlobalModel] as const;
-};
-
-/**
- * The hook to organize the widgets.
- * @returns The widgets and the setter of the widgets.
- */
-export const useWidgets = () => {
- const { widgets, setWidgets } = useGISDK();
-
- const updateWidget = (newWidget: Partial) => {
- setWidgets(prevWidgets =>
- prevWidgets.map(widget => (widget.name === newWidget.name ? { ...widget, ...newWidget } : widget)),
- );
- };
-
- return [widgets, updateWidget, setWidgets] as const;
-};
diff --git a/packages/gi-sdk/src/context/types.ts b/packages/gi-sdk/src/context/types.ts
new file mode 100644
index 000000000..1afbcca28
--- /dev/null
+++ b/packages/gi-sdk/src/context/types.ts
@@ -0,0 +1 @@
+export type GlobalModel = Record;
diff --git a/packages/gi-sdk/src/hooks/index.ts b/packages/gi-sdk/src/hooks/index.ts
index 377284609..ac9221227 100644
--- a/packages/gi-sdk/src/hooks/index.ts
+++ b/packages/gi-sdk/src/hooks/index.ts
@@ -1,3 +1,7 @@
-export { useComponent } from './useComponent';
-export { useEventSubscribe } from './useEventSubscribe';
-export { useEventPublish } from './useEventPublish';
+export { useDataset } from './useDataset';
+export { useGlobalModel } from './useGlobalModel';
+export { useGraph } from './useGraph';
+export { useGraphOptions } from './useGraphOptions';
+export { useRegistryManger } from './useRegistryManger';
+export { useStateManger } from './useStateManger';
+export { useWidgetProps } from './useWidgetProps';
diff --git a/packages/gi-sdk/src/hooks/useComponent.tsx b/packages/gi-sdk/src/hooks/useComponent.tsx
deleted file mode 100644
index cd6ae50f2..000000000
--- a/packages/gi-sdk/src/hooks/useComponent.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import React from 'react';
-import type { Slot, WidgetItem } from '../types';
-import { getWidget } from '../assets';
-import { BuiltInWidgets } from '../assets/widgets';
-
-export const useComponent = (widgets: WidgetItem[]) => {
- const allWidgets = [...BuiltInWidgets, ...widgets];
-
- const renderComponents = (slot: Slot) => {
- const slotWidgets = allWidgets.filter(item => item.slot === slot);
-
- return slotWidgets.map((item, index) => {
- const { name, properties } = item;
- const Component = getWidget(name);
-
- if (!Component) return null;
-
- return ;
- });
- };
-
- return { renderComponents };
-};
diff --git a/packages/gi-sdk/src/hooks/useDataset.ts b/packages/gi-sdk/src/hooks/useDataset.ts
new file mode 100644
index 000000000..967f7e339
--- /dev/null
+++ b/packages/gi-sdk/src/hooks/useDataset.ts
@@ -0,0 +1,30 @@
+import { isFunction } from '@antv/util';
+import { useCallback, useEffect, useState } from 'react';
+import type { DatasetSchema } from '../spec';
+import { CallableValue } from '../types';
+import { useStateManger } from './useStateManger';
+
+export const useDataset = () => {
+ const { datasetStore } = useStateManger();
+ const [dataset, setDataset] = useState(datasetStore.getDataset());
+
+ useEffect(() => {
+ const updateInternalDataset = (dataset: DatasetSchema) => {
+ setDataset(dataset);
+ };
+ datasetStore.on('dataset:update', updateInternalDataset);
+ return () => {
+ datasetStore.off('dataset:update', updateInternalDataset);
+ };
+ }, [datasetStore]);
+
+ const updateDataset = useCallback(
+ (dataset: CallableValue) => {
+ const newDataset = isFunction(dataset) ? dataset(datasetStore.getDataset()) : dataset;
+ datasetStore.setDataset(newDataset);
+ },
+ [datasetStore],
+ );
+
+ return [dataset, updateDataset] as const;
+};
diff --git a/packages/gi-sdk/src/hooks/useEventPublish.ts b/packages/gi-sdk/src/hooks/useEventPublish.ts
deleted file mode 100644
index b6d8ee146..000000000
--- a/packages/gi-sdk/src/hooks/useEventPublish.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useEffect } from 'react';
-import { useGraph } from '../context';
-import type { IEvent } from '@antv/g6';
-
-/**
- * Emit an event
- * @param eventName - event name
- * @param event - event object
- */
-export const useEventPublish = (eventName: string, event: T) => {
- const graph = useGraph();
-
- useEffect(() => {
- if (!graph || graph.destroyed) return;
-
- graph.emit(eventName, event);
- }, [graph]);
-};
diff --git a/packages/gi-sdk/src/hooks/useEventSubscribe.ts b/packages/gi-sdk/src/hooks/useEventSubscribe.ts
deleted file mode 100644
index 2365b5066..000000000
--- a/packages/gi-sdk/src/hooks/useEventSubscribe.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import type { IEvent } from '@antv/g6';
-import { useEffect } from 'react';
-import { useGraph } from '../context';
-
-/**
- * Subscribe to an event
- * @param eventName - event name
- * @param callback - callback for the event
- * @param once - whether to listen only once
- */
-export const useEventSubscribe = (
- eventName: string,
- callback: (event: T) => void,
- once?: boolean,
-) => {
- const graph = useGraph();
-
- useEffect(() => {
- if (!graph || graph.destroyed) return;
-
- graph.on(eventName, callback, once);
-
- return () => {
- graph.off(eventName, callback);
- };
- }, [graph]);
-};
diff --git a/packages/gi-sdk/src/hooks/useGlobalModel.ts b/packages/gi-sdk/src/hooks/useGlobalModel.ts
new file mode 100644
index 000000000..9cbb8094f
--- /dev/null
+++ b/packages/gi-sdk/src/hooks/useGlobalModel.ts
@@ -0,0 +1,41 @@
+import { isFunction, isObject } from '@antv/util';
+import { useCallback, useEffect, useState } from 'react';
+import type { GlobalModel } from '../context/types';
+import { GlobalStoreEvent } from '../state/constants';
+import type { CallableValue } from '../types';
+import { useStateManger } from './useStateManger';
+
+export const useGlobalModel = () => {
+ const { globalStore } = useStateManger();
+ const [model, setModel] = useState(globalStore.getGlobal());
+
+ useEffect(() => {
+ const updateState = (model: GlobalModel) => {
+ setModel(model);
+ };
+
+ globalStore.on(GlobalStoreEvent.UPDATE, updateState);
+ return () => {
+ globalStore.off(GlobalStoreEvent.UPDATE, updateState);
+ };
+ }, [globalStore]);
+
+ const updatePartialModel = useCallback(
+ (partialModel: Partial) => {
+ const updatedModel = { ...model, ...partialModel };
+ globalStore.setGlobal(updatedModel);
+ },
+ [model, globalStore],
+ );
+
+ const updateModel = useCallback(
+ (newModel: CallableValue) => {
+ const updatedModel = isFunction(newModel) ? newModel(model) : newModel;
+ if (!isObject(updatedModel)) throw new Error('The new global model must be an object');
+ globalStore.setGlobal(updatedModel);
+ },
+ [model, globalStore],
+ );
+
+ return [model, updatePartialModel, updateModel] as const;
+};
diff --git a/packages/gi-sdk/src/hooks/useGraph.ts b/packages/gi-sdk/src/hooks/useGraph.ts
new file mode 100644
index 000000000..4baa1e1b1
--- /dev/null
+++ b/packages/gi-sdk/src/hooks/useGraph.ts
@@ -0,0 +1,25 @@
+import type { Graph as G6Graph } from '@antv/g6';
+import { useEffect, useState } from 'react';
+import { GraphStoreEvent } from '../state/constants';
+import { useStateManger } from './useStateManger';
+
+export const useGraph = () => {
+ const { graphStore } = useStateManger();
+ const [graph, setGraph] = useState(graphStore.getGraphInstance());
+
+ useEffect(() => {
+ const updateInternalGraph = (graph: G6Graph) => {
+ setGraph(graph);
+ };
+ graphStore.on(GraphStoreEvent.UPDATE, updateInternalGraph);
+ return () => {
+ graphStore.off(GraphStoreEvent.UPDATE, updateInternalGraph);
+ };
+ }, [graphStore]);
+
+ const updateGraph = (graph: G6Graph) => {
+ graphStore.setGraphInstance(graph);
+ };
+
+ return [graph, updateGraph] as const;
+};
diff --git a/packages/gi-sdk/src/hooks/useGraphOptions.ts b/packages/gi-sdk/src/hooks/useGraphOptions.ts
new file mode 100644
index 000000000..46186431f
--- /dev/null
+++ b/packages/gi-sdk/src/hooks/useGraphOptions.ts
@@ -0,0 +1,28 @@
+import type { GraphOptions } from '@antv/g6';
+import { isFunction } from '@antv/util';
+import { useEffect, useState } from 'react';
+import { GraphStoreEvent } from '../state/constants';
+import { CallableValue } from '../types';
+import { useStateManger } from './useStateManger';
+
+export const useGraphOptions = () => {
+ const { graphStore } = useStateManger();
+ const [options, setOptions] = useState(graphStore.getGraphOptions());
+
+ useEffect(() => {
+ const updateInternalOptions = (options: GraphOptions) => {
+ setOptions(options);
+ };
+ graphStore.on(GraphStoreEvent.UPDATE_OPTIONS, updateInternalOptions);
+ return () => {
+ graphStore.off(GraphStoreEvent.UPDATE_OPTIONS, updateInternalOptions);
+ };
+ }, [graphStore]);
+
+ const updateOptions = (options: CallableValue) => {
+ const newOptions = isFunction(options) ? options(graphStore.getGraphOptions()) : options;
+ graphStore.setGraphOptions(newOptions);
+ };
+
+ return [options, updateOptions] as const;
+};
diff --git a/packages/gi-sdk/src/hooks/useRegistryManger.ts b/packages/gi-sdk/src/hooks/useRegistryManger.ts
new file mode 100644
index 000000000..4a7b3716a
--- /dev/null
+++ b/packages/gi-sdk/src/hooks/useRegistryManger.ts
@@ -0,0 +1,7 @@
+import { useGIContext } from '../context';
+
+export const useRegistryManger = () => {
+ const { registry } = useGIContext();
+
+ return registry;
+};
diff --git a/packages/gi-sdk/src/hooks/useStateManger.ts b/packages/gi-sdk/src/hooks/useStateManger.ts
new file mode 100644
index 000000000..9efe601a5
--- /dev/null
+++ b/packages/gi-sdk/src/hooks/useStateManger.ts
@@ -0,0 +1,7 @@
+import { useGIContext } from '../context';
+
+export const useStateManger = () => {
+ const { state } = useGIContext();
+
+ return state;
+};
diff --git a/packages/gi-sdk/src/hooks/useWidgetProps.ts b/packages/gi-sdk/src/hooks/useWidgetProps.ts
new file mode 100644
index 000000000..80c9371ff
--- /dev/null
+++ b/packages/gi-sdk/src/hooks/useWidgetProps.ts
@@ -0,0 +1,33 @@
+import { useCallback, useEffect, useState } from 'react';
+import { WidgetStoreEvent } from '../state/constants';
+import type { ID } from '../types';
+import { useStateManger } from './useStateManger';
+
+export const useWidgetProps = = Record>(widgetId: ID) => {
+ const { widgetStore } = useStateManger();
+
+ const [properties, setProperties] = useState(widgetStore.getWidgetProperties(widgetId));
+
+ useEffect(() => {
+ const updateInternalProperties = ({ widgetId: id, properties: newProperties }) => {
+ if (id === widgetId) {
+ setProperties(newProperties);
+ }
+ };
+
+ widgetStore.on(WidgetStoreEvent.UPDATE_PROPS, updateInternalProperties);
+
+ return () => {
+ widgetStore.off(WidgetStoreEvent.UPDATE_PROPS, updateInternalProperties);
+ };
+ }, [widgetStore]);
+
+ const updateProperties = useCallback(
+ (newProperties: Properties) => {
+ widgetStore.setWidgetProperties(widgetId, newProperties);
+ },
+ [widgetStore],
+ );
+
+ return [properties, updateProperties] as const;
+};
diff --git a/packages/gi-sdk/src/index.ts b/packages/gi-sdk/src/index.ts
index 73c1fe17b..e8c591ce7 100644
--- a/packages/gi-sdk/src/index.ts
+++ b/packages/gi-sdk/src/index.ts
@@ -1,5 +1,14 @@
+export { GraphContainer } from './components/GraphContainer';
export { GISDK } from './GISDK';
-export { registerWidget, getWidget } from './assets';
-export { useGISDK, useGraph, useGlobalModel, useWidgets } from './context';
-export { useEventSubscribe, useEventPublish } from './hooks';
+export { GIRuntimeApp } from './runtime';
+
+export { useGIContext } from './context';
+export { useGlobalModel, useGraph, useGraphOptions, useRegistryManger, useStateManger, useWidgetProps } from './hooks';
+
+export type { GraphContainerProps } from './components/GraphContainer';
+export type * from './context/types';
+export type { GIRuntimeAppProps } from './runtime';
+export type { GIRenderProps } from './runtime/Render';
+export type * from './runtime/types';
+export type * from './spec';
export type * from './types';
diff --git a/packages/gi-sdk/src/registry/index.ts b/packages/gi-sdk/src/registry/index.ts
new file mode 100644
index 000000000..e20336be3
--- /dev/null
+++ b/packages/gi-sdk/src/registry/index.ts
@@ -0,0 +1,54 @@
+import type { AssetPackage, ImplementWidget } from '../types';
+
+class RegistryManager {
+ public widgets = new Map();
+
+ constructor(assets: AssetPackage[]) {
+ assets.forEach((asset) => this.installAsset(asset));
+ }
+
+ /**
+ * 注册组件资产
+ * @param widget - 组件资产
+ * @param override - 是否覆盖同名组件
+ */
+ public registerWidget(widget: ImplementWidget, override = false) {
+ const name = widget.metadata.name;
+ if (!override && this.widgets.has(name)) {
+ // eslint-disable-next-line no-console
+ console.warn(`Widget with name ${name} already exists. Use override flag to replace it.`);
+ } else {
+ this.widgets.set(name, widget);
+ }
+ }
+
+ /**
+ * 获取组件资产
+ * @param name - 组件名称
+ * @returns 组件资产
+ */
+ public getWidget(name: string): ImplementWidget {
+ const w = this.widgets.get(name);
+ if (!w) {
+ const empty = { metadata: { name: '' }, version: 'v0.1', component: () => `Widget with name ${name} not found.` };
+ // eslint-disable-next-line no-console
+ console.error(`[gi-sdk]: Widget with name ${name} not found.`);
+ return empty as ImplementWidget;
+ }
+ return w;
+ }
+
+ public getWidgets() {
+ return this.widgets;
+ }
+
+ /**
+ * 安装资产包
+ * @param asset - 资产包
+ */
+ public installAsset(asset: AssetPackage) {
+ asset.widgets.forEach((widget) => this.registerWidget(widget));
+ }
+}
+
+export default RegistryManager;
diff --git a/packages/gi-sdk/src/runtime/Render.tsx b/packages/gi-sdk/src/runtime/Render.tsx
new file mode 100644
index 000000000..ba7327315
--- /dev/null
+++ b/packages/gi-sdk/src/runtime/Render.tsx
@@ -0,0 +1,33 @@
+/**
+ * 图应用渲染组件
+ */
+import classnames from 'classnames';
+import React, { CSSProperties, PropsWithChildren } from 'react';
+import { PREFIX } from '../constants';
+import type { Application } from '../spec';
+import { useImplementWidgets } from '../utils/widget';
+
+export interface GIRenderProps extends Pick, 'className' | 'style'> {
+ /**
+ * 图应用配置描述
+ */
+ config: Application;
+}
+
+export const GIRender: React.FC> = (props) => {
+ const { className, style, config, children } = props;
+ const renderWidgets = useImplementWidgets(config.spec.widgets);
+
+ const containerStyle: CSSProperties = {
+ height: 'inherit',
+ position: 'relative',
+ ...style,
+ };
+
+ return (
+
+ {renderWidgets}
+ {children}
+
+ );
+};
diff --git a/packages/gi-sdk/src/runtime/index.tsx b/packages/gi-sdk/src/runtime/index.tsx
new file mode 100644
index 000000000..2afe7d7e1
--- /dev/null
+++ b/packages/gi-sdk/src/runtime/index.tsx
@@ -0,0 +1,54 @@
+import React, { memo } from 'react';
+import type { GIContextProps } from '../context';
+import { GIContext } from '../context';
+import type { GlobalModel } from '../context/types';
+import RegistryManager from '../registry';
+import StateManager from '../state';
+import type { AssetPackage } from '../types';
+import type { GIRenderProps } from './Render';
+import { GIRender } from './Render';
+import type { RuntimeContext } from './types';
+
+export interface GIRuntimeAppProps {
+ /**
+ * 图应用资产包
+ */
+ assets?: AssetPackage[];
+ /**
+ * 初始全局状态
+ */
+ initialGlobalState?: GlobalModel;
+}
+
+export class GIRuntimeApp {
+ public context: RuntimeContext = {};
+
+ public App: React.FC;
+
+ constructor({ assets, initialGlobalState }) {
+ this.initRuntime(assets, initialGlobalState);
+
+ this.App = this.getApp();
+ }
+
+ private initRuntime(assets: AssetPackage[], initialGlobalState: GlobalModel) {
+ if (!this.context.registry) this.context.registry = new RegistryManager(assets);
+ if (!this.context.state) this.context.state = new StateManager(initialGlobalState);
+ }
+
+ private getApp() {
+ const { registry, state } = this.context;
+
+ return memo((props: GIRenderProps) => {
+ state?.initState(props.config);
+
+ const contextValue = { registry, state } as GIContextProps;
+
+ return (
+
+
+
+ );
+ });
+ }
+}
diff --git a/packages/gi-sdk/src/runtime/types.ts b/packages/gi-sdk/src/runtime/types.ts
new file mode 100644
index 000000000..fc587023b
--- /dev/null
+++ b/packages/gi-sdk/src/runtime/types.ts
@@ -0,0 +1,13 @@
+import type RegistryManager from '../registry';
+import type StateManager from '../state';
+
+export interface RuntimeContext {
+ /**
+ * 注册管理器
+ */
+ registry?: RegistryManager;
+ /**
+ * 全局状态管理器
+ */
+ state?: StateManager;
+}
diff --git a/packages/gi-sdk/src/spec/application.ts b/packages/gi-sdk/src/spec/application.ts
new file mode 100644
index 000000000..36ac3ac60
--- /dev/null
+++ b/packages/gi-sdk/src/spec/application.ts
@@ -0,0 +1,32 @@
+import type { DatasetSchema } from './dataset';
+import type { GraphSchema } from './graph';
+import type { ApplicationMetadata } from './metadata';
+import type { WidgetSchema } from './widget';
+
+export interface Application {
+ /**
+ * 应用版本号
+ */
+ version: string;
+ /**
+ * 应用元数据
+ */
+ metadata: ApplicationMetadata;
+ /**
+ * 数据集
+ */
+ dataset: DatasetSchema;
+ /**
+ * 应用配置
+ */
+ spec: {
+ /**
+ * 图配置
+ */
+ graph: GraphSchema;
+ /**
+ * 组件
+ */
+ widgets: WidgetSchema[];
+ };
+}
diff --git a/packages/gi-sdk/src/spec/dataset.ts b/packages/gi-sdk/src/spec/dataset.ts
new file mode 100644
index 000000000..9dd25cfef
--- /dev/null
+++ b/packages/gi-sdk/src/spec/dataset.ts
@@ -0,0 +1,50 @@
+import type { GraphData } from '@antv/g6';
+import type { Metadata } from './metadata';
+
+/**
+ * 数据集基础类型
+ */
+export interface BaseDataset {
+ /**
+ * 数据集 ID
+ */
+ id: string;
+ /**
+ * 数据集元数据
+ */
+ metadata: Metadata;
+}
+
+/**
+ * 静态数据源类型
+ */
+export interface LocalDatasetSchema extends BaseDataset {
+ /**
+ * 数据类型
+ */
+ type: 'local';
+ /**
+ * 图数据
+ */
+ data: GraphData;
+}
+
+/**
+ * 动态数据源类型
+ */
+export interface RemoteDatasetSchema extends BaseDataset {
+ /**
+ * 数据类型
+ */
+ type: 'remote';
+ /**
+ * 关联的服务类型
+ */
+ serviceType: string;
+ /**
+ * 服务属性配置
+ */
+ properties: Record;
+}
+
+export type DatasetSchema = LocalDatasetSchema | RemoteDatasetSchema;
diff --git a/packages/gi-sdk/src/spec/graph.ts b/packages/gi-sdk/src/spec/graph.ts
new file mode 100644
index 000000000..0e49fed5d
--- /dev/null
+++ b/packages/gi-sdk/src/spec/graph.ts
@@ -0,0 +1,3 @@
+import type { GraphOptions } from '@antv/g6';
+
+export type GraphSchema = GraphOptions;
diff --git a/packages/gi-sdk/src/spec/index.ts b/packages/gi-sdk/src/spec/index.ts
new file mode 100644
index 000000000..54057d79d
--- /dev/null
+++ b/packages/gi-sdk/src/spec/index.ts
@@ -0,0 +1,5 @@
+export type * from './application';
+export type * from './dataset';
+export type * from './graph';
+export type * from './metadata';
+export type * from './widget';
diff --git a/packages/gi-sdk/src/spec/metadata.ts b/packages/gi-sdk/src/spec/metadata.ts
new file mode 100644
index 000000000..c81b401d0
--- /dev/null
+++ b/packages/gi-sdk/src/spec/metadata.ts
@@ -0,0 +1,20 @@
+export interface Metadata {
+ /**
+ * 名称
+ */
+ name: string;
+ /**
+ * 描述
+ */
+ description?: string;
+ /**
+ * 其他属性
+ */
+ [key: string]: unknown;
+}
+
+export interface ApplicationMetadata extends Metadata {}
+
+export interface WidgetMetadata extends Metadata {}
+
+export interface ServiceMetadata extends Metadata {}
diff --git a/packages/gi-sdk/src/spec/widget.ts b/packages/gi-sdk/src/spec/widget.ts
new file mode 100644
index 000000000..01240ca48
--- /dev/null
+++ b/packages/gi-sdk/src/spec/widget.ts
@@ -0,0 +1,30 @@
+import type { ID, Slot } from '../types';
+import type { WidgetMetadata } from './metadata';
+
+export interface WidgetSchema {
+ /**
+ * 组件 ID
+ */
+ id: ID;
+ /**
+ * 组件资产类型,组件资产名
+ * @description
+ * 【协议规范】对应 ImplementWidget.metadata.name
+ */
+ type: string;
+ /**
+ * 元数据信息,用于存储组件元数据信息
+ */
+ metadata?: WidgetMetadata;
+ /*
+ * 组件属性
+ */
+ properties?: Record;
+ /**
+ * 插槽子组件
+ * @description
+ * - 只有子组件时: string[],子组件的 ID
+ * - 有多个插槽子组件: Record,插槽名: 子组件的 ID,{default: [], left: []}
+ */
+ slots?: Slot;
+}
diff --git a/packages/gi-sdk/src/state/base-state.ts b/packages/gi-sdk/src/state/base-state.ts
new file mode 100644
index 000000000..e7d06b5ea
--- /dev/null
+++ b/packages/gi-sdk/src/state/base-state.ts
@@ -0,0 +1,5 @@
+import EventEmitter from '@antv/event-emitter';
+
+export abstract class BaseState extends EventEmitter {
+ protected abstract state: S;
+}
diff --git a/packages/gi-sdk/src/state/constants.ts b/packages/gi-sdk/src/state/constants.ts
new file mode 100644
index 000000000..e31f3363b
--- /dev/null
+++ b/packages/gi-sdk/src/state/constants.ts
@@ -0,0 +1,25 @@
+/**
+ * 全局扩展状态事件
+ */
+export enum GlobalStoreEvent {
+ 'UPDATE' = 'global:update',
+}
+
+/**
+ * 组件状态管理事件
+ */
+export enum WidgetStoreEvent {
+ 'UPDATE_PROPS' = 'widget:update-properties',
+}
+
+/**
+ * 图状态管理事件
+ */
+export enum GraphStoreEvent {
+ 'UPDATE' = 'graph:update',
+ 'UPDATE_OPTIONS' = 'graph:update-options',
+}
+
+export enum DatasetStoreEvent {
+ 'UPDATE' = 'dataset:update',
+}
diff --git a/packages/gi-sdk/src/state/dataset.ts b/packages/gi-sdk/src/state/dataset.ts
new file mode 100644
index 000000000..2adbdd163
--- /dev/null
+++ b/packages/gi-sdk/src/state/dataset.ts
@@ -0,0 +1,18 @@
+import type { DatasetSchema } from '../spec';
+import { BaseState } from './base-state';
+import { DatasetStoreEvent } from './constants';
+
+type DatasetState = DatasetSchema;
+
+export class DatasetStore extends BaseState {
+ protected state!: DatasetSchema;
+
+ public setDataset(dataset: DatasetSchema) {
+ this.state = dataset;
+ this.emit(DatasetStoreEvent.UPDATE, dataset);
+ }
+
+ public getDataset() {
+ return this.state;
+ }
+}
diff --git a/packages/gi-sdk/src/state/global.ts b/packages/gi-sdk/src/state/global.ts
new file mode 100644
index 000000000..cd5918263
--- /dev/null
+++ b/packages/gi-sdk/src/state/global.ts
@@ -0,0 +1,21 @@
+import type { GlobalModel } from '../context/types';
+import { BaseState } from './base-state';
+import { GlobalStoreEvent } from './constants';
+
+export class GlobalStore extends BaseState {
+ protected state: GlobalModel = {};
+
+ constructor(initialState?: GlobalModel) {
+ super();
+ if (initialState) this.state = initialState;
+ }
+
+ public setGlobal(global: GlobalModel): void {
+ this.state = global;
+ this.emit(GlobalStoreEvent.UPDATE, this.state);
+ }
+
+ public getGlobal() {
+ return this.state;
+ }
+}
diff --git a/packages/gi-sdk/src/state/graph.ts b/packages/gi-sdk/src/state/graph.ts
new file mode 100644
index 000000000..ae4939723
--- /dev/null
+++ b/packages/gi-sdk/src/state/graph.ts
@@ -0,0 +1,40 @@
+import type { GraphOptions } from '@antv/g6';
+import { Graph as G6Graph } from '@antv/g6';
+import { BaseState } from './base-state';
+import { GraphStoreEvent } from './constants';
+
+type GraphState = {
+ /**
+ * 图实例
+ */
+ graph: G6Graph | null;
+ /**
+ * 图配置项
+ */
+ options: GraphOptions;
+};
+
+export class GraphStore extends BaseState {
+ protected state: GraphState = {
+ graph: null,
+ options: {},
+ };
+
+ public getGraphInstance() {
+ return this.state.graph;
+ }
+
+ public getGraphOptions() {
+ return this.state.options;
+ }
+
+ public setGraphInstance(graph: G6Graph) {
+ this.state.graph = graph;
+ this.emit(GraphStoreEvent.UPDATE, graph);
+ }
+
+ public setGraphOptions(options: GraphOptions) {
+ this.state.options = options;
+ this.emit(GraphStoreEvent.UPDATE_OPTIONS, options);
+ }
+}
diff --git a/packages/gi-sdk/src/state/index.ts b/packages/gi-sdk/src/state/index.ts
new file mode 100644
index 000000000..77977fb29
--- /dev/null
+++ b/packages/gi-sdk/src/state/index.ts
@@ -0,0 +1,32 @@
+import type { GlobalModel } from '../context/types';
+import type { Application } from '../spec';
+import { DatasetStore } from './dataset';
+import { GlobalStore } from './global';
+import { GraphStore } from './graph';
+import { WidgetStore } from './widget';
+
+class StateManager {
+ public globalStore: GlobalStore = new GlobalStore();
+
+ public widgetStore: WidgetStore = new WidgetStore();
+
+ public graphStore: GraphStore = new GraphStore();
+
+ public datasetStore: DatasetStore = new DatasetStore();
+
+ constructor(initialGlobalState: GlobalModel) {
+ this.initGlobalStore(initialGlobalState);
+ }
+
+ private initGlobalStore(initialGlobalState: GlobalModel) {
+ this.globalStore.setGlobal(initialGlobalState);
+ }
+
+ public initState(config: Application) {
+ this.widgetStore.setWidgets(config.spec.widgets);
+ this.graphStore.setGraphOptions(config.spec.graph);
+ this.datasetStore.setDataset(config.dataset);
+ }
+}
+
+export default StateManager;
diff --git a/packages/gi-sdk/src/state/widget.ts b/packages/gi-sdk/src/state/widget.ts
new file mode 100644
index 000000000..9b6b83402
--- /dev/null
+++ b/packages/gi-sdk/src/state/widget.ts
@@ -0,0 +1,43 @@
+import type { WidgetSchema } from '../spec';
+import type { ID } from '../types';
+import { BaseState } from './base-state';
+import { WidgetStoreEvent } from './constants';
+
+type WidgetState = Map;
+
+export class WidgetStore extends BaseState {
+ protected state: WidgetState = new Map();
+
+ public setWidgets(widgets: WidgetSchema[]) {
+ widgets.forEach((widget) => this.setWidget(widget));
+ }
+
+ public setWidget(widget: WidgetSchema) {
+ this.state.set(widget.id, widget);
+ }
+
+ public setWidgetProperties = Record>(
+ widgetId: ID,
+ properties: Properties,
+ ) {
+ const widget = this.getWidget(widgetId);
+ if (widget) {
+ widget.properties = { ...widget.properties, ...properties };
+ this.state.set(widgetId, widget);
+ this.emit(WidgetStoreEvent.UPDATE_PROPS, { widgetId, properties });
+ }
+ }
+
+ public getWidgets(): WidgetSchema[] {
+ return Array.from(this.state.values());
+ }
+
+ public getWidget(widgetId: ID): WidgetSchema | undefined {
+ return this.state.get(widgetId);
+ }
+
+ public getWidgetProperties = Record>(widgetId: ID) {
+ const widget = this.getWidget(widgetId);
+ return widget?.properties as Properties;
+ }
+}
diff --git a/packages/gi-sdk/src/types/asset.ts b/packages/gi-sdk/src/types/asset.ts
new file mode 100644
index 000000000..9d159e1fe
--- /dev/null
+++ b/packages/gi-sdk/src/types/asset.ts
@@ -0,0 +1,25 @@
+import type { Metadata } from '../spec';
+import type { ImplementService } from './service';
+import type { ImplementWidget } from './widget';
+
+/**
+ * 资产包
+ */
+export interface AssetPackage {
+ /**
+ * 资产包版本号
+ */
+ version: string;
+ /**
+ * 资产包元数据信息
+ */
+ metadata?: Metadata;
+ /**
+ * 组件资产列表
+ */
+ widgets: ImplementWidget[];
+ /**
+ * 服务资产列表
+ */
+ services?: ImplementService[];
+}
diff --git a/packages/gi-sdk/src/types/callable.ts b/packages/gi-sdk/src/types/callable.ts
new file mode 100644
index 000000000..f1392e53b
--- /dev/null
+++ b/packages/gi-sdk/src/types/callable.ts
@@ -0,0 +1,4 @@
+/**
+ * 可回调值
+ */
+export type CallableValue = Returns | ((args: Param) => Returns);
diff --git a/packages/gi-sdk/src/types/gisdk.ts b/packages/gi-sdk/src/types/gisdk.ts
deleted file mode 100644
index ade40923e..000000000
--- a/packages/gi-sdk/src/types/gisdk.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import type { GraphinContextProps, GraphinProps } from '@antv/graphin';
-import type { WidgetItem } from './widget';
-
-export interface GISDKProps {
- /**
- * The properties of the graph component.
- */
- graph: GraphinProps;
- /**
- * The widgets related to the graph.
- */
- widgets: WidgetItem[];
-}
-
-export interface GISDKContextProps extends GraphinContextProps {
- /*
- * The global model.
- */
- globalModel: GlobalModel;
- /**
- * The setter of the global model.
- */
- setGlobalModel: (value: Partial | ((prevState: Partial) => GlobalModel)) => void;
- /**
- * The peer widgets related to the graph.
- */
- widgets: WidgetItem[];
- /**
- * The setter of the widgets.
- */
- setWidgets: (value: WidgetItem[] | ((prevState: WidgetItem[]) => WidgetItem[])) => void;
-}
-
-export type GlobalModel = {
- /**
- * Whether the sider is open.
- */
- sider?: boolean;
- /**
- * Whether the panel is open.
- */
- panel?: boolean;
- /**
- * Other properties.
- */
- [key: string]: any;
-};
diff --git a/packages/gi-sdk/src/types/id.ts b/packages/gi-sdk/src/types/id.ts
new file mode 100644
index 000000000..e4a0f9568
--- /dev/null
+++ b/packages/gi-sdk/src/types/id.ts
@@ -0,0 +1 @@
+export type ID = string;
diff --git a/packages/gi-sdk/src/types/index.ts b/packages/gi-sdk/src/types/index.ts
index 65d859cf4..d6a46d436 100644
--- a/packages/gi-sdk/src/types/index.ts
+++ b/packages/gi-sdk/src/types/index.ts
@@ -1,3 +1,5 @@
-export type * from './gisdk';
+export type * from './asset';
+export type * from './callable';
+export type * from './id';
export type * from './slot';
export type * from './widget';
diff --git a/packages/gi-sdk/src/types/service.ts b/packages/gi-sdk/src/types/service.ts
new file mode 100644
index 000000000..ac8ac64d2
--- /dev/null
+++ b/packages/gi-sdk/src/types/service.ts
@@ -0,0 +1,16 @@
+import type { ServiceMetadata } from '../spec';
+
+export interface ImplementService {
+ /**
+ * 服务资产版本号
+ */
+ version: string;
+ /**
+ * 服务元数据信息
+ */
+ metadata: ServiceMetadata;
+ /**
+ * 服务具体调用实现
+ */
+ service: (...params: any[]) => Promise;
+}
diff --git a/packages/gi-sdk/src/types/slot.ts b/packages/gi-sdk/src/types/slot.ts
index 56486f72b..34c0d1e1e 100644
--- a/packages/gi-sdk/src/types/slot.ts
+++ b/packages/gi-sdk/src/types/slot.ts
@@ -1,3 +1,8 @@
-import { SlotEnum } from '../constants';
+import { ReactNode } from 'react';
+import type { ID } from './id';
-export type Slot = `${SlotEnum}`;
+export type Slot = ID[] | Record;
+
+export type SlotElements = {
+ [key in K]?: ReactNode;
+};
diff --git a/packages/gi-sdk/src/types/widget.ts b/packages/gi-sdk/src/types/widget.ts
index 85e76c0b6..ef1f8a220 100644
--- a/packages/gi-sdk/src/types/widget.ts
+++ b/packages/gi-sdk/src/types/widget.ts
@@ -1,20 +1,37 @@
-import type { Slot } from './slot';
+import type { WidgetMetadata } from '../spec';
+import type { ID } from './id';
+import type { SlotElements } from './slot';
-export type WidgetItem = {
+export interface ImplementWidget {
/**
- * The widget name.
+ * 组件版本号
*/
- name: string;
+ version: string;
/**
- * Indicates the slot where the widget is placed.
+ * 组件元数据信息
*/
- slot: Slot;
+ metadata: WidgetMetadata;
/**
- * The order of the widget.
+ * 组件实现类
*/
- order?: number;
+ component: React.FC;
/**
- * The properties of the widget.
+ * 组件默认属性值
*/
- properties?: Record;
-};
+ defaultProperties?: Partial;
+}
+
+export interface ImplementWidgetProps {
+ /**
+ * 渲染组件 ID
+ */
+ 'data-widget-id': ID;
+ /**
+ * 渲染组件名称
+ */
+ 'data-widget-name': string;
+ /**
+ * 插槽子组件
+ */
+ slotElements: SlotElements;
+}
diff --git a/packages/gi-sdk/src/utils/dataset.ts b/packages/gi-sdk/src/utils/dataset.ts
new file mode 100644
index 000000000..02548f422
--- /dev/null
+++ b/packages/gi-sdk/src/utils/dataset.ts
@@ -0,0 +1,5 @@
+import type { DatasetSchema, LocalDatasetSchema, RemoteDatasetSchema } from '../spec';
+
+export const isLocalDataset = (dataset: DatasetSchema): dataset is LocalDatasetSchema => dataset.type === 'local';
+
+export const isRemoteDataset = (dataset: DatasetSchema): dataset is RemoteDatasetSchema => dataset.type === 'remote';
diff --git a/packages/gi-sdk/src/utils/slot.ts b/packages/gi-sdk/src/utils/slot.ts
new file mode 100644
index 000000000..bb85e1517
--- /dev/null
+++ b/packages/gi-sdk/src/utils/slot.ts
@@ -0,0 +1,11 @@
+import type { ID, Slot } from '../types';
+
+/**
+ * 解析插槽配置
+ * @param slot 插槽配置
+ * @returns 标准化插槽配置
+ */
+export function parseSlot(slot?: Slot): Record {
+ if (!slot) return { default: [] };
+ return Array.isArray(slot) ? { default: slot } : slot;
+}
diff --git a/packages/gi-sdk/src/utils/widget.tsx b/packages/gi-sdk/src/utils/widget.tsx
new file mode 100644
index 000000000..1ccb91d45
--- /dev/null
+++ b/packages/gi-sdk/src/utils/widget.tsx
@@ -0,0 +1,46 @@
+import React, { useMemo } from 'react';
+import { ImplWidget } from '../components';
+import type { WidgetSchema } from '../spec';
+import { parseSlot } from './slot';
+
+/**
+ * 提取组件的所有插槽 ID
+ * @param widget - 组件配置
+ * @returns 插槽 ID 列表
+ */
+export function extractSlotIds(widget: WidgetSchema) {
+ return Object.values(parseSlot(widget.slots)).flat();
+}
+
+/**
+ * 获取顶层组件(没有被其他组件作为插槽使用)
+ * @param widgets - 组件配置列表
+ * @returns 顶层组件列表
+ */
+export function getTopLevelWidgets(widgets: WidgetSchema[]): WidgetSchema[] {
+ const childWidgetIds = new Set();
+
+ widgets.forEach((widget) => {
+ const slotIds = extractSlotIds(widget);
+ slotIds.forEach((childId) => childWidgetIds.add(childId));
+ });
+
+ return widgets.filter((widget) => !childWidgetIds.has(widget.id));
+}
+
+/**
+ * 根据组件配置递归渲染组件以及插槽
+ * @param widgets - 组件配置列表
+ * @returns 组件树
+ */
+export const useImplementWidgets = (widgets: WidgetSchema[]): React.ReactNode => {
+ const topLevelWidgets = useMemo(() => getTopLevelWidgets(widgets), [widgets]);
+
+ return (
+
+ {topLevelWidgets.map((widget) => (
+
+ ))}
+
+ );
+};
diff --git a/packages/gi-sdk/tsconfig.json b/packages/gi-sdk/tsconfig.json
index d6861c4a7..b86b32a33 100644
--- a/packages/gi-sdk/tsconfig.json
+++ b/packages/gi-sdk/tsconfig.json
@@ -7,5 +7,5 @@
}
},
"extends": "../../tsconfig.json",
- "include": ["src", "public"]
+ "include": ["src", "docs"]
}
diff --git a/packages/gi-sdk/vite.config.ts b/packages/gi-sdk/vite.config.ts
index 78b4b11da..fc0f8497c 100644
--- a/packages/gi-sdk/vite.config.ts
+++ b/packages/gi-sdk/vite.config.ts
@@ -3,7 +3,7 @@ import react from '@vitejs/plugin-react';
import { join } from 'path';
export default defineConfig({
- root: './public',
+ root: './docs',
server: {
port: 8001,
open: '/',