diff --git a/.github/workflows/lint-and-build.yml b/.github/workflows/lint-and-build.yml new file mode 100644 index 00000000000..4d387cd64c9 --- /dev/null +++ b/.github/workflows/lint-and-build.yml @@ -0,0 +1,22 @@ +name: Lint & Build Custom Plotly.js +on: [push] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + - run: npm ci + - run: npm run lint + - run: npm run custom-bundle -- --traces pie,bar,sunburst,waterfall --transforms none + - id: get-short-sha + run: | + sha=$(echo ${{github.sha}} | cut -c-7) + echo "sha=$sha" >> $GITHUB_OUTPUT + - run: mv dist/plotly-custom.min.js dist/plotly-custom-${{steps.get-short-sha.outputs.sha}}.min.js + - uses: actions/upload-artifact@v4 + with: + name: plotly-custom-${{steps.get-short-sha.outputs.sha}}.min.js + path: dist/plotly-custom-${{steps.get-short-sha.outputs.sha}}.min.js diff --git a/.gitignore b/.gitignore index 40e49228498..37e0a0bd2d4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ tags !.npmignore !.eslintrc !.eslintignore +!.github \ No newline at end of file diff --git a/src/components/modebar/buttons.js b/src/components/modebar/buttons.js index 67bc00abf55..1e0300a8458 100644 --- a/src/components/modebar/buttons.js +++ b/src/components/modebar/buttons.js @@ -41,8 +41,10 @@ modeBarButtons.toImage = { var opts = gd._context.toImageButtonOptions || {}; var format = opts.format || 'png'; return format === 'png' ? - _(gd, 'Download plot as a png') : // legacy text - _(gd, 'Download plot'); // generic non-PNG text + // Overriding title; revert to "Download plot as a png" to support localization + _(gd, 'Download chart') : // legacy text + // Overriding title; revert to "Download plot" to support localization + _(gd, 'Download chart'); // generic non-PNG text }, icon: Icons.camera, click: function(gd) { diff --git a/src/traces/pie/plot.js b/src/traces/pie/plot.js index 450b8c4a09f..4a8be486da8 100644 --- a/src/traces/pie/plot.js +++ b/src/traces/pie/plot.js @@ -167,7 +167,7 @@ function plot(gd, cdModule) { if(textPosition === 'outside') { transform = transformOutsideText(textBB, pt); } else { - transform = transformInsideText(textBB, pt, cd0); + transform = transformInsideText(textBB, pt, cd0, fullLayout); if(textPosition === 'auto' && transform.scale < 1) { var newFont = Lib.ensureUniformFontSize(gd, trace.outsidetextfont); @@ -635,7 +635,7 @@ function prerenderTitles(cdModule, gd) { } } -function transformInsideText(textBB, pt, cd0) { +function transformInsideText(textBB, pt, cd0, fullLayout) { var r = cd0.r || pt.rpx1; var rInscribed = pt.rInscribed; @@ -660,6 +660,7 @@ function transformInsideText(textBB, pt, cd0) { var isTangential = orientation === 'tangential'; var isRadial = orientation === 'radial'; var isAuto = orientation === 'auto'; + var isUniformModeHide = fullLayout.uniformtext.mode === 'hide'; var allTransforms = []; var newT; @@ -677,7 +678,7 @@ function transformInsideText(textBB, pt, cd0) { if(key === 'tan') { newT = calcTanTransform(textBB, r, ring, closestEdge, 0); } else { // case of 'rad' - newT = calcRadTransform(textBB, r, ring, closestEdge, Math.PI / 2); + newT = calcRadTransform(textBB, r, ring, closestEdge, Math.PI / 2, isUniformModeHide); } newT.textPosAngle = angle; @@ -723,7 +724,7 @@ function transformInsideText(textBB, pt, cd0) { } if(isAuto || isRadial) { - newT = calcRadTransform(textBB, r, ring, halfAngle, midAngle); + newT = calcRadTransform(textBB, r, ring, halfAngle, midAngle, isUniformModeHide); newT.textPosAngle = (pt.startangle + pt.stopangle) / 2; allTransforms.push(newT); } @@ -738,15 +739,10 @@ function transformInsideText(textBB, pt, cd0) { var maxScale = 0; for(var k = 0; k < allTransforms.length; k++) { var s = allTransforms[k].scale; - if(maxScale < s) { + if(s - maxScale > 0.01) { maxScale = s; id = k; } - - if(!isAuto && maxScale >= 1) { - // respect test order for non-auto options - break; - } } return allTransforms[id]; } @@ -760,7 +756,7 @@ function isCrossing(pt, angle) { ); } -function calcRadTransform(textBB, r, ring, halfAngle, midAngle) { +function calcRadTransform(textBB, r, ring, halfAngle, midAngle, isUniformModeHide) { r = Math.max(0, r - 2 * TEXTPAD); // max size if text is rotated radially @@ -768,7 +764,7 @@ function calcRadTransform(textBB, r, ring, halfAngle, midAngle) { var s = calcMaxHalfSize(a, halfAngle, r, ring); return { scale: s * 2 / textBB.height, - rCenter: calcRCenter(a, s / r), + rCenter: isUniformModeHide ? calcRingCenter(ring) : calcRCenter(a, s / r), rotate: calcRotate(midAngle) }; } @@ -790,6 +786,10 @@ function calcRCenter(a, b) { return Math.cos(b) - a * b; } +function calcRingCenter(ring) { + return 1 - ring / 2; +} + function calcRotate(t) { return (180 / Math.PI * t + 720) % 180 - 90; } diff --git a/src/traces/sunburst/plot.js b/src/traces/sunburst/plot.js index 386dc1bf4ce..e83478c346e 100644 --- a/src/traces/sunburst/plot.js +++ b/src/traces/sunburst/plot.js @@ -275,7 +275,7 @@ function plotOne(gd, cd, element, transitionOpts) { // position the text relative to the slice var textBB = Drawing.bBox(sliceText.node()); - pt.transform = transformInsideText(textBB, pt, cd0); + pt.transform = transformInsideText(textBB, pt, cd0, fullLayout); pt.transform.targetX = getTargetX(pt); pt.transform.targetY = getTargetY(pt);