diff --git a/src/pages/editor/components/SettingsPanel.tsx b/src/pages/editor/components/SettingsPanel.tsx index f911962..dd3b794 100644 --- a/src/pages/editor/components/SettingsPanel.tsx +++ b/src/pages/editor/components/SettingsPanel.tsx @@ -7,6 +7,7 @@ import { useSingleUpload } from '@/pages/uploader/hooks/useUploaderData' import ColorsImage from '@/assets/images/colors.png' import ColorPicker from '@/components/ColorPicker' import Select from '@/components/Select' +import { toCssLinearGradient } from '../utils/gradient' const PRESET_COLORS = [ '#a8edcf', @@ -322,7 +323,7 @@ const SettingsPanel = () => {
diff --git a/src/pages/editor/utils/gradient.ts b/src/pages/editor/utils/gradient.ts index 28a6bbb..7775599 100644 --- a/src/pages/editor/utils/gradient.ts +++ b/src/pages/editor/utils/gradient.ts @@ -25,23 +25,24 @@ const getGradientPoints = ( ): { start: Point; end: Point } => { const safeWidth = Math.max(1, width); const safeHeight = Math.max(1, height); + // App/UI angle: 0° = top→bottom, 90° = left→right (clockwise). const rad = toRadians(normalizeAngle(angle)); - const dx = Math.cos(rad); - const dy = Math.sin(rad); const half = Math.sqrt(safeWidth * safeWidth + safeHeight * safeHeight) / 2; + const halfX = Math.sin(rad) * half; + const halfY = Math.cos(rad) * half; if (mode === "centered") { return { - start: { x: -dx * half, y: -dy * half }, - end: { x: dx * half, y: dy * half }, + start: { x: -halfX, y: -halfY }, + end: { x: halfX, y: halfY }, }; } const cx = safeWidth / 2; const cy = safeHeight / 2; return { - start: { x: cx - dx * half, y: cy - dy * half }, - end: { x: cx + dx * half, y: cy + dy * half }, + start: { x: cx - halfX, y: cy - halfY }, + end: { x: cx + halfX, y: cy + halfY }, }; }; @@ -91,7 +92,11 @@ export const getSvgGradientEndpoints = ( }; }; +/** Convert app/UI angle to CSS linear-gradient degrees (0deg = upward in CSS). */ +export const toCssGradientAngle = (angle: number) => + normalizeAngle(180 - normalizeAngle(angle)); + export const toCssLinearGradient = (gradient: LinearGradient | undefined) => { if (!gradient) return undefined; - return `linear-gradient(${normalizeAngle(gradient.angle)}deg, ${gradient.from} 0%, ${gradient.to} 100%)`; + return `linear-gradient(${toCssGradientAngle(gradient.angle)}deg, ${gradient.from} 0%, ${gradient.to} 100%)`; }; diff --git a/src/pages/viewer/components/BookPage.tsx b/src/pages/viewer/components/BookPage.tsx index 5331dc4..d03f85e 100644 --- a/src/pages/viewer/components/BookPage.tsx +++ b/src/pages/viewer/components/BookPage.tsx @@ -549,6 +549,16 @@ const BookPage = memo(forwardRef