<html><head><base href="https://www.543x.com">

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>加密货币连接图</title>

    <style>

        body {

            font-family: Arial, sans-serif;

            background-color: #f0f0f0;

            margin: 0;

            padding: 20px;

            overflow: hidden;

        }

        .container {

            width: 100%;

            height: 100vh;

            position: relative;

        }

        .node {

            width: 100px;

            height: 60px;

            border-radius: 10px;

            position: absolute;

            cursor: move;

            display: flex;

            align-items: center;

            justify-content: center;

            font-weight: bold;

            color: white;

            text-shadow: 1px 1px 2px rgba(0,0,0,0.5);

            box-shadow: 0 4px 6px rgba(0,0,0,0.1);

            transition: box-shadow 0.3s ease;

        }

        .node:hover {

            box-shadow: 0 6px 8px rgba(0,0,0,0.2);

        }

        svg {

            position: absolute;

            top: 0;

            left: 0;

            width: 100%;

            height: 100%;

            pointer-events: none;

        }

        path {

            fill: none;

            stroke: #666;

            stroke-width: 2;

        }

    </style>

</head>

<body>

    <div class="container" id="container">

        <svg id="svg"></svg>

    </div>


    <script>

        const cryptos = ['BTC', 'ETH', 'ADA', 'SOL', 'DOGE', 'QQ', 'NO', 'PEPE', 'GF', 'PANDA', 'YAYA', 'SATOSHI', 'CAT', 'ORD', 'CLOWN', 'YY', 'JUMP', 'DONALD', 'A', 'MIMI', 'MIQI', 'RABBIT', 'SHEEP', 'SNAKE', 'PEACE', 'RAT', 'MONKEY', 'DRAGON', 'X', 'SEAL', 'COW', 'OTTER', 'ORD(', 'ORD{', 'ORD%', 'ORD<'];

        const container = document.getElementById('container');

        const svg = document.getElementById('svg');

        let nodes = [];


        function createNode(crypto, x, y) {

            const node = document.createElement('div');

            node.className = 'node';

            node.textContent = crypto;

            node.style.left = x + 'px';

            node.style.top = y + 'px';

            node.style.backgroundColor = getRandomColor();

            container.appendChild(node);

            nodes.push(node);


            let isDragging = false;

            let offsetX, offsetY;


            node.addEventListener('mousedown', startDragging);

            document.addEventListener('mousemove', drag);

            document.addEventListener('mouseup', stopDragging);


            function startDragging(e) {

                isDragging = true;

                offsetX = e.clientX - node.offsetLeft;

                offsetY = e.clientY - node.offsetTop;

            }


            function drag(e) {

                if (isDragging) {

                    const x = e.clientX - offsetX;

                    const y = e.clientY - offsetY;

                    node.style.left = x + 'px';

                    node.style.top = y + 'px';

                    updateConnections();

                }

            }


            function stopDragging() {

                isDragging = false;

            }

        }


        function getRandomColor() {

            const hue = Math.floor(Math.random() * 360);

            return `hsl(${hue}, 70%, 60%)`;

        }


        function updateConnections() {

            svg.innerHTML = '';

            for (let i = 0; i < nodes.length - 1; i++) {

                connectNodes(nodes[i], nodes[i + 1]);

            }

        }


        function connectNodes(node1, node2) {

            const x1 = node1.offsetLeft + node1.offsetWidth / 2;

            const y1 = node1.offsetTop + node1.offsetHeight / 2;

            const x2 = node2.offsetLeft + node2.offsetWidth / 2;

            const y2 = node2.offsetTop + node2.offsetHeight / 2;


            const dx = x2 - x1;

            const dy = y2 - y1;

            const curve = Math.min(Math.abs(dx), Math.abs(dy)) * 0.5;


            const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');

            path.setAttribute('d', `M${x1},${y1} C${x1+curve},${y1} ${x2-curve},${y2} ${x2},${y2}`);

            svg.appendChild(path);

        }


        // Create nodes in a grid layout

        const gridSize = Math.ceil(Math.sqrt(cryptos.length));

        const cellSize = Math.min(window.innerWidth, window.innerHeight) / (gridSize + 1);


        cryptos.forEach((crypto, index) => {

            const row = Math.floor(index / gridSize);

            const col = index % gridSize;

            const x = (col + 1) * cellSize - 50;

            const y = (row + 1) * cellSize - 30;

            createNode(crypto, x, y);

        });


        updateConnections();


        window.addEventListener('resize', () => {

            updateConnections();

        });

    </script>

</body>

</html>