Responsiveness textContent (graphic)

I’m trying to adjust the textContent.width property so that it responds as follows:

When the screen size increases (CTRL +) the overflow: truncate and ellipsis: “...” appear gradually so as not to leave the element (vBox). And when it’s the other way around (CTRL -), the text appears normally inside vBox. In other words, the text must always adapt to the screen resize.

In other words, the textContent must match the size of the vBox in both cases. I managed to make the vBox responsive, but I need to adjust the text inside it as well.

document.addEventListener("DOMContentLoaded", () => {
    // rounded rectangle
    const valueBox = echarts.graphic.extendShape({
        type: "vBox",
        shape: {
            r: 5
        },
        style: {
            lineWidth: .5,
            stroke: "#000",
            lineDash: 'solid',
            shadowBlur: 7.5,
            shadowColor: '#000', 
            shadowOffsetX: 3,
            shadowOffsetY: 3
        },
        buildPath: (ctx, shape) => {
            echarts.graphic.Rect.prototype.buildPath.call(this, ctx, shape);
        }
    });

    // register shape
    echarts.graphic.registerShape("vBox", valueBox);

    // init
    const chartUse = echarts.init(document.getElementsByClassName("chart")[0]);

    // dimensions
    const dimensionsInit = [chartUse.getWidth(), chartUse.getHeight()];

    window.addEventListener("resize", () => {
        // plot resize
        chartUse.resize();
        // graphic resize
        const dimensionsResize = [chartUse.getWidth(), chartUse.getHeight()];
        chartUse.setOption({
            graphic: [
                {
                    children: [
                        {
                            shape: {
                                x: (dimensionsResize[0] - dimensionsResize[0] / 5) / 2, // Centraliza horizontalmente
                                y: (dimensionsResize[1] - dimensionsResize[1] / 5) / 2, // Centraliza verticalmente
                                width: dimensionsResize[0] / 5,
                                height: dimensionsResize[1] / 5
                            },
                            textContent: {
                                width: dimensionsResize[0],
                                overflow: 'truncate',
                                ellipsis: '...',
                                align: "center",
                                style: {
                                    rich: {
                                        text: {
                                            lineHeight: dimensionsResize[1] / 28,
                                            fill: '#000',
                                            fontSize: dimensionsResize[0] / 70
                                        }
                                    }
                                }
                            },
                            textConfig: {
                                position: 'inside'
                            }
                        }
                    ] 
                }
            ]
        });
    });

    function chartFrameSwitch0 () {

        const gradColor1 = new echarts.graphic.LinearGradient(0, 0, 1, 1, [
            { offset: .5, color: "#fafac0" },
            { offset: 1, color: "#008cba" }
        ])

        const graphic0 = [
            {
                type: "group",
                children: [
                    {
                        type: 'vBox',
                        shape: {
                            x: (dimensionsInit[0] - dimensionsInit[0] / 5) / 2, // Centraliza horizontalmente
                            y: (dimensionsInit[1] - dimensionsInit[1] / 5) / 2, // Centraliza verticalmente
                            width: dimensionsInit[0] / 5,
                            height: dimensionsInit[1] / 5
                        },
                        style: {
                            fill: gradColor1,
                            lineCap: "x",
                            lineWidth: 2,
                            stroke: '#000'
                        },
                        textContent: {
                            style: {
                                text: "{text|Overflowwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwn50%}",
                                width: ( (dimensionsInit[0] / 10) - (dimensionsInit[0] / 10) * .15 ),
                                overflow: 'truncate',
                                stroke: '#fff',
                                align: "center",
                                rich: {
                                    text: {
                                        lineHeight: dimensionsInit[1] / 28,
                                        fill: '#000',
                                        fontSize: dimensionsInit[0] / 70
                                    }
                                }
                            }
                        },
                        textConfig: {
                            position: "inside"
                        }
                    }
                ]
            }
        ];

        const option = {
            graphic: graphic0
        };

        chartUse.setOption(option);

    }

    chartFrameSwitch0();

});
<head>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
    <title>Custom Shape Example</title>
</head>

<div class="chart" style="width: 100%; height: 100vh;"></div>

So how do you make the text inside a graphic component always responsive to its size?

This is the way I found, I don’t know if there is another solution that is more robust than this and perhaps simpler.

Note that you will need to run this code in an IDE and process it in the browser to check for this resizing problem.