@elixpo/lixsketch 5.6.9 → 5.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/{CopyPaste-PPDS3AD6.js → CopyPaste-N4U2NTQT.js} +5 -5
- package/dist/react/{EventDispatcher-UV7LFSAS.js → EventDispatcher-J657SDW4.js} +12 -12
- package/dist/react/{EventDispatcher-UV7LFSAS.js.map → EventDispatcher-J657SDW4.js.map} +1 -1
- package/dist/react/{Frame-DELCMYV6.js → Frame-NHPESH4Y.js} +2 -2
- package/dist/react/IconShape-RN5HJDUF.js +10 -0
- package/dist/react/ImageShape-L7U64AVP.js +10 -0
- package/dist/react/Line-LPRTGPUQ.js +10 -0
- package/dist/react/{SceneSerializer-H6KMQCO2.js → SceneSerializer-Y6QABGZY.js} +5 -5
- package/dist/react/{Selection-CFWRGVKH.js → Selection-GCZWCNAR.js} +3 -3
- package/dist/react/{SketchEngine-UFLZJQXS.js → SketchEngine-PCMCE63L.js} +19 -19
- package/dist/react/{arrowTool-DO327FKU.js → arrowTool-UN3TNJFP.js} +2 -2
- package/dist/react/{chunk-O7KXLFZN.js → chunk-3FCIBY54.js} +2 -2
- package/dist/react/{chunk-6LWUR7XB.js → chunk-3PFVMNDJ.js} +3 -3
- package/dist/react/{chunk-6LWUR7XB.js.map → chunk-3PFVMNDJ.js.map} +1 -1
- package/dist/react/{chunk-2ALS5JGS.js → chunk-5XGQ3CMT.js} +2 -2
- package/dist/react/{chunk-KZBKYHZO.js → chunk-7NHZYKYB.js} +3 -3
- package/dist/react/{chunk-KZBKYHZO.js.map → chunk-7NHZYKYB.js.map} +1 -1
- package/dist/react/{chunk-I7TVGJFF.js → chunk-7WXEWDRL.js} +3 -3
- package/dist/react/{chunk-I7TVGJFF.js.map → chunk-7WXEWDRL.js.map} +1 -1
- package/dist/react/{chunk-CGMUXYPJ.js → chunk-JVHZVV5U.js} +3 -3
- package/dist/react/{chunk-CGMUXYPJ.js.map → chunk-JVHZVV5U.js.map} +1 -1
- package/dist/react/{chunk-37PF7FG2.js → chunk-KACRJ6AJ.js} +2 -2
- package/dist/react/{chunk-X5ENBMGL.js → chunk-KXLNEFN5.js} +2 -2
- package/dist/react/{chunk-X5ENBMGL.js.map → chunk-KXLNEFN5.js.map} +1 -1
- package/dist/react/{chunk-DODPOWNX.js → chunk-P5476S5I.js} +3 -3
- package/dist/react/{chunk-DODPOWNX.js.map → chunk-P5476S5I.js.map} +1 -1
- package/dist/react/{chunk-BOZEDUAF.js → chunk-TAJ5E6KI.js} +3 -3
- package/dist/react/chunk-TAJ5E6KI.js.map +7 -0
- package/dist/react/{chunk-KC26KJW4.js → chunk-UERV53R7.js} +2 -2
- package/dist/react/{chunk-7DD2JRBC.js → chunk-ULZW5PXM.js} +2 -2
- package/dist/react/{chunk-RK3NVAER.js → chunk-YHQ4ZAJQ.js} +4 -4
- package/dist/react/{chunk-RK3NVAER.js.map → chunk-YHQ4ZAJQ.js.map} +1 -1
- package/dist/react/{circleTool-NK4RVDAR.js → circleTool-YDTQDGYX.js} +3 -3
- package/dist/react/{codeTool-3WF4HEOW.js → codeTool-U6SYKHHD.js} +3 -3
- package/dist/react/{frameTool-VCNV2NG2.js → frameTool-VRI7OODN.js} +2 -2
- package/dist/react/{freehandTool-TBAOD46K.js → freehandTool-2ICCQHVY.js} +3 -3
- package/dist/react/{iconTool-65JCAKYF.js → iconTool-32D5NJ4I.js} +3 -3
- package/dist/react/{imageTool-UQZUBOK2.js → imageTool-Z6Y4OXBG.js} +3 -3
- package/dist/react/index.js +21 -9
- package/dist/react/index.js.map +2 -2
- package/dist/react/{lineTool-762KBYOM.js → lineTool-BUWVQ666.js} +3 -3
- package/dist/react/{rectangleTool-IQK3HZK6.js → rectangleTool-NJYG6Y6L.js} +3 -3
- package/dist/react/styles.css +4 -0
- package/dist/react/{textTool-ITG2SBJK.js → textTool-CIJCF4Z3.js} +4 -4
- package/package.json +1 -1
- package/src/react/components/sidebars/TextSidebar.jsx +10 -4
- package/src/react/store/useUIStore.js +1 -1
- package/src/react/styles.css +13 -0
- package/src/react/utils/canvasBackgrounds.js +11 -2
- package/src/shapes/Line.js +2 -2
- package/src/tools/arrowTool.js +1 -1
- package/src/tools/circleTool.js +1 -1
- package/src/tools/codeTool.js +1 -1
- package/src/tools/freehandTool.js +1 -1
- package/src/tools/lineTool.js +1 -1
- package/src/tools/rectangleTool.js +1 -1
- package/src/tools/shapeRecognitionTool.js +1 -1
- package/src/tools/textTool.js +1 -1
- package/dist/react/IconShape-PZHMZSLR.js +0 -10
- package/dist/react/ImageShape-ZMBZARRI.js +0 -10
- package/dist/react/Line-VPVPL6ET.js +0 -10
- package/dist/react/chunk-BOZEDUAF.js.map +0 -7
- /package/dist/react/{CopyPaste-PPDS3AD6.js.map → CopyPaste-N4U2NTQT.js.map} +0 -0
- /package/dist/react/{Frame-DELCMYV6.js.map → Frame-NHPESH4Y.js.map} +0 -0
- /package/dist/react/{IconShape-PZHMZSLR.js.map → IconShape-RN5HJDUF.js.map} +0 -0
- /package/dist/react/{ImageShape-ZMBZARRI.js.map → ImageShape-L7U64AVP.js.map} +0 -0
- /package/dist/react/{Line-VPVPL6ET.js.map → Line-LPRTGPUQ.js.map} +0 -0
- /package/dist/react/{SceneSerializer-H6KMQCO2.js.map → SceneSerializer-Y6QABGZY.js.map} +0 -0
- /package/dist/react/{Selection-CFWRGVKH.js.map → Selection-GCZWCNAR.js.map} +0 -0
- /package/dist/react/{SketchEngine-UFLZJQXS.js.map → SketchEngine-PCMCE63L.js.map} +0 -0
- /package/dist/react/{arrowTool-DO327FKU.js.map → arrowTool-UN3TNJFP.js.map} +0 -0
- /package/dist/react/{chunk-O7KXLFZN.js.map → chunk-3FCIBY54.js.map} +0 -0
- /package/dist/react/{chunk-2ALS5JGS.js.map → chunk-5XGQ3CMT.js.map} +0 -0
- /package/dist/react/{chunk-37PF7FG2.js.map → chunk-KACRJ6AJ.js.map} +0 -0
- /package/dist/react/{chunk-KC26KJW4.js.map → chunk-UERV53R7.js.map} +0 -0
- /package/dist/react/{chunk-7DD2JRBC.js.map → chunk-ULZW5PXM.js.map} +0 -0
- /package/dist/react/{circleTool-NK4RVDAR.js.map → circleTool-YDTQDGYX.js.map} +0 -0
- /package/dist/react/{codeTool-3WF4HEOW.js.map → codeTool-U6SYKHHD.js.map} +0 -0
- /package/dist/react/{frameTool-VCNV2NG2.js.map → frameTool-VRI7OODN.js.map} +0 -0
- /package/dist/react/{freehandTool-TBAOD46K.js.map → freehandTool-2ICCQHVY.js.map} +0 -0
- /package/dist/react/{iconTool-65JCAKYF.js.map → iconTool-32D5NJ4I.js.map} +0 -0
- /package/dist/react/{imageTool-UQZUBOK2.js.map → imageTool-Z6Y4OXBG.js.map} +0 -0
- /package/dist/react/{lineTool-762KBYOM.js.map → lineTool-BUWVQ666.js.map} +0 -0
- /package/dist/react/{rectangleTool-IQK3HZK6.js.map → rectangleTool-NJYG6Y6L.js.map} +0 -0
- /package/dist/react/{textTool-ITG2SBJK.js.map → textTool-CIJCF4Z3.js.map} +0 -0
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
handleMouseDown,
|
|
4
4
|
handleMouseMove,
|
|
5
5
|
handleMouseUp
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-JVHZVV5U.js";
|
|
7
|
+
import "./chunk-KXLNEFN5.js";
|
|
8
8
|
import "./chunk-VZX55VQL.js";
|
|
9
9
|
export {
|
|
10
10
|
handleMouseDown as handleMouseDownLine,
|
|
11
11
|
handleMouseMove as handleMouseMoveLine,
|
|
12
12
|
handleMouseUp as handleMouseUpLine
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=lineTool-
|
|
14
|
+
//# sourceMappingURL=lineTool-BUWVQ666.js.map
|
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
handleMouseDownRect,
|
|
4
4
|
handleMouseMoveRect,
|
|
5
5
|
handleMouseUpRect
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-7WXEWDRL.js";
|
|
7
|
+
import "./chunk-KXLNEFN5.js";
|
|
8
8
|
import "./chunk-VZX55VQL.js";
|
|
9
9
|
export {
|
|
10
10
|
handleMouseDownRect,
|
|
11
11
|
handleMouseMoveRect,
|
|
12
12
|
handleMouseUpRect
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=rectangleTool-
|
|
14
|
+
//# sourceMappingURL=rectangleTool-NJYG6Y6L.js.map
|
package/dist/react/styles.css
CHANGED
|
@@ -6499,6 +6499,10 @@
|
|
|
6499
6499
|
}
|
|
6500
6500
|
.theme-light .lixsketch-canvas-root {
|
|
6501
6501
|
--lix-icon-filter: none;
|
|
6502
|
+
--lixsketch-bg: #ffffff;
|
|
6503
|
+
}
|
|
6504
|
+
.theme-light .lixsketch-canvas-root :is(.anchor, .resize-anchor, .resize-handle, .rotate-anchor, .rotation-anchor, .multi-selection-anchor, .multi-selection-rotation-anchor) {
|
|
6505
|
+
fill: #ffffff !important;
|
|
6502
6506
|
}
|
|
6503
6507
|
.theme-dark .lixsketch-canvas-root {
|
|
6504
6508
|
--lix-icon-filter: brightness(0) invert(1);
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
handleTextMouseMove,
|
|
7
7
|
handleTextMouseUp,
|
|
8
8
|
updateCodeToggleForShape
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-YHQ4ZAJQ.js";
|
|
10
|
+
import "./chunk-P5476S5I.js";
|
|
11
11
|
import "./chunk-PAKA6HUX.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-KXLNEFN5.js";
|
|
13
13
|
import "./chunk-VZX55VQL.js";
|
|
14
14
|
export {
|
|
15
15
|
deselectElement as deselectTextElement,
|
|
@@ -19,4 +19,4 @@ export {
|
|
|
19
19
|
handleTextMouseUp,
|
|
20
20
|
updateCodeToggleForShape
|
|
21
21
|
};
|
|
22
|
-
//# sourceMappingURL=textTool-
|
|
22
|
+
//# sourceMappingURL=textTool-CIJCF4Z3.js.map
|
package/package.json
CHANGED
|
@@ -4,8 +4,9 @@ import useSketchStore, { TOOLS } from '../../store/useSketchStore'
|
|
|
4
4
|
import ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'
|
|
5
5
|
import { useState, useCallback, useEffect } from 'react'
|
|
6
6
|
import { useTranslation } from '../../hooks/useTranslation'
|
|
7
|
+
import useUIStore from '../../store/useUIStore'
|
|
7
8
|
|
|
8
|
-
const TEXT_COLORS = ['#
|
|
9
|
+
const TEXT_COLORS = ['#000000', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']
|
|
9
10
|
|
|
10
11
|
const FONTS = [
|
|
11
12
|
{ value: 'lixFont', label: 'Lix' },
|
|
@@ -26,7 +27,12 @@ export default function TextSidebar() {
|
|
|
26
27
|
const { t } = useTranslation()
|
|
27
28
|
const activeTool = useSketchStore((s) => s.activeTool)
|
|
28
29
|
const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)
|
|
29
|
-
const
|
|
30
|
+
const theme = useUIStore((s) => s.theme)
|
|
31
|
+
const resolvedTheme = theme === 'system' && typeof window !== 'undefined'
|
|
32
|
+
? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')
|
|
33
|
+
: theme
|
|
34
|
+
const [textColor, setTextColor] = useState(null)
|
|
35
|
+
const displayedTextColor = textColor ?? (resolvedTheme === 'light' ? '#000000' : '#ffffff')
|
|
30
36
|
const [fontSize, setFontSize] = useState('S')
|
|
31
37
|
const [font, setFont] = useState('lixFont')
|
|
32
38
|
const [codeMode, setCodeMode] = useState(false)
|
|
@@ -81,13 +87,13 @@ export default function TextSidebar() {
|
|
|
81
87
|
<ShapeSidebar visible={visible}>
|
|
82
88
|
{/* Color */}
|
|
83
89
|
<ToolbarButton tooltip={t('sidebar.textColor')}
|
|
84
|
-
preview={<span className="w-4 h-4 rounded-md border border-white/20" style={{ backgroundColor:
|
|
90
|
+
preview={<span className="w-4 h-4 rounded-md border border-white/20" style={{ backgroundColor: displayedTextColor }} />}
|
|
85
91
|
>
|
|
86
92
|
<p className="text-xs text-text-muted uppercase tracking-wider mb-2">{t('sidebar.color')}</p>
|
|
87
93
|
<div className="grid grid-cols-4 gap-1.5">
|
|
88
94
|
{TEXT_COLORS.map((c) => (
|
|
89
95
|
<button key={c} onClick={() => updateColor(c)}
|
|
90
|
-
className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${
|
|
96
|
+
className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${displayedTextColor.toLowerCase() === c.toLowerCase() ? 'border-[#7667a8] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}
|
|
91
97
|
style={{ backgroundColor: c }}
|
|
92
98
|
/>
|
|
93
99
|
))}
|
|
@@ -140,7 +140,7 @@ function applyTheme(theme) {
|
|
|
140
140
|
body.classList.add(`theme-${resolved}`)
|
|
141
141
|
|
|
142
142
|
const svgEl = window.svg
|
|
143
|
-
if (svgEl) svgEl.style.background = resolved === 'light' ? '#
|
|
143
|
+
if (svgEl) svgEl.style.background = resolved === 'light' ? '#ffffff' : '#15111f'
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
const useUIStore = create((set, get) => ({
|
package/src/react/styles.css
CHANGED
|
@@ -35,6 +35,19 @@
|
|
|
35
35
|
|
|
36
36
|
.theme-light .lixsketch-canvas-root {
|
|
37
37
|
--lix-icon-filter: none;
|
|
38
|
+
--lixsketch-bg: #ffffff;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.theme-light .lixsketch-canvas-root :is(
|
|
42
|
+
.anchor,
|
|
43
|
+
.resize-anchor,
|
|
44
|
+
.resize-handle,
|
|
45
|
+
.rotate-anchor,
|
|
46
|
+
.rotation-anchor,
|
|
47
|
+
.multi-selection-anchor,
|
|
48
|
+
.multi-selection-rotation-anchor
|
|
49
|
+
) {
|
|
50
|
+
fill: #ffffff !important;
|
|
38
51
|
}
|
|
39
52
|
|
|
40
53
|
.theme-dark .lixsketch-canvas-root {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const CANVAS_BACKGROUNDS = {
|
|
2
2
|
light: [
|
|
3
|
-
{ color: '#
|
|
3
|
+
{ color: '#FFFFFF', label: 'menu.canvasBg.white' },
|
|
4
4
|
{ color: '#F6DBC0', label: 'menu.canvasBg.cream' },
|
|
5
5
|
{ color: '#F5EED2', label: 'menu.canvasBg.paper' },
|
|
6
6
|
{ color: '#F5F2ED', label: 'menu.canvasBg.skyTint' },
|
|
@@ -15,13 +15,22 @@ export const CANVAS_BACKGROUNDS = {
|
|
|
15
15
|
],
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export const DEFAULT_CANVAS_BACKGROUNDS = { dark: '#15111f', light: '#
|
|
18
|
+
export const DEFAULT_CANVAS_BACKGROUNDS = { dark: '#15111f', light: '#FFFFFF' }
|
|
19
|
+
const LEGACY_LIGHT_DEFAULT = '#F5F2ED'
|
|
20
|
+
const LIGHT_DEFAULT_MIGRATION_KEY = 'lixsketch-canvas-light-default-v2'
|
|
19
21
|
export const canvasBackgroundStorageKey = (theme) => `lixsketch-canvas-background-${theme}`
|
|
20
22
|
|
|
21
23
|
export function readCanvasBackground(theme, storage) {
|
|
22
24
|
const resolved = theme === 'light' ? 'light' : 'dark'
|
|
23
25
|
try {
|
|
24
26
|
const stored = storage?.getItem(canvasBackgroundStorageKey(resolved))
|
|
27
|
+
if (resolved === 'light' && storage?.getItem(LIGHT_DEFAULT_MIGRATION_KEY) !== '1') {
|
|
28
|
+
storage?.setItem?.(LIGHT_DEFAULT_MIGRATION_KEY, '1')
|
|
29
|
+
if (stored?.toLowerCase() === LEGACY_LIGHT_DEFAULT.toLowerCase()) {
|
|
30
|
+
storage?.setItem?.(canvasBackgroundStorageKey(resolved), DEFAULT_CANVAS_BACKGROUNDS.light)
|
|
31
|
+
return DEFAULT_CANVAS_BACKGROUNDS.light
|
|
32
|
+
}
|
|
33
|
+
}
|
|
25
34
|
const match = CANVAS_BACKGROUNDS[resolved].find(({ color }) => color.toLowerCase() === stored?.toLowerCase())
|
|
26
35
|
if (match) return match.color
|
|
27
36
|
} catch {}
|
package/src/shapes/Line.js
CHANGED
|
@@ -6,10 +6,10 @@ import { updateAttachedArrows as updateArrowsForShape } from '../tools/arrowTool
|
|
|
6
6
|
const rc = rough.svg(svg);
|
|
7
7
|
// Issue #38 follow-up: read the default stroke from the active theme
|
|
8
8
|
// instead of pinning to a single colour. White was invisible on the new
|
|
9
|
-
// light canvas,
|
|
9
|
+
// light canvas, black is invisible if the user toggles dark.
|
|
10
10
|
function getThemeStroke() {
|
|
11
11
|
if (typeof document === 'undefined') return '#fff';
|
|
12
|
-
return document.body && document.body.classList.contains('theme-dark') ? '#fff' : '#
|
|
12
|
+
return document.body && document.body.classList.contains('theme-dark') ? '#fff' : '#000000';
|
|
13
13
|
}
|
|
14
14
|
const lineStrokeWidth = 2;
|
|
15
15
|
let hoveredFrameLine = null;
|
package/src/tools/arrowTool.js
CHANGED
|
@@ -4,7 +4,7 @@ import { pushCreateAction, pushDeleteAction, pushOptionsChangeAction, pushTransf
|
|
|
4
4
|
import { calculateSnap, clearSnapGuides } from '../core/SnapGuides.js';
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#
|
|
7
|
+
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#000000"; }
|
|
8
8
|
|
|
9
9
|
let arrowStartX, arrowStartY;
|
|
10
10
|
let currentArrow = null;
|
package/src/tools/circleTool.js
CHANGED
|
@@ -4,7 +4,7 @@ import { pushCreateAction, pushDeleteAction, pushOptionsChangeAction, pushTransf
|
|
|
4
4
|
import { cleanupAttachments } from './arrowTool.js';
|
|
5
5
|
import { calculateSnap, clearSnapGuides } from '../core/SnapGuides.js';
|
|
6
6
|
|
|
7
|
-
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#
|
|
7
|
+
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#000000"; }
|
|
8
8
|
|
|
9
9
|
let isDrawingCircle = false;
|
|
10
10
|
let isDraggingShapeCircle = false;
|
package/src/tools/codeTool.js
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import { cleanupAttachments, updateAttachedArrows } from './arrowTool.js';
|
|
13
13
|
import { registerRotationAnchor } from '../core/ScreenSpaceControls.js';
|
|
14
14
|
|
|
15
|
-
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#
|
|
15
|
+
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#000000"; }
|
|
16
16
|
|
|
17
17
|
let codeTextSize = "25px";
|
|
18
18
|
let codeTextFont = "lixCode";
|
|
@@ -4,7 +4,7 @@ import { pushCreateAction, pushDeleteAction, pushOptionsChangeAction, pushTransf
|
|
|
4
4
|
import { updateAttachedArrows as updateArrowsForShape, cleanupAttachments } from './arrowTool.js';
|
|
5
5
|
import { calculateSnap, clearSnapGuides } from '../core/SnapGuides.js';
|
|
6
6
|
|
|
7
|
-
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#
|
|
7
|
+
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#000000"; }
|
|
8
8
|
|
|
9
9
|
// Expose updateArrowsForShape globally so FreehandStroke.updateAttachedArrows() can call it
|
|
10
10
|
// (FreehandStroke.js is a separate module and cannot import freehandTool's local bindings)
|
package/src/tools/lineTool.js
CHANGED
|
@@ -4,7 +4,7 @@ import { pushCreateAction, pushDeleteAction, pushOptionsChangeAction, pushTransf
|
|
|
4
4
|
import { updateAttachedArrows as updateArrowsForShape, cleanupAttachments } from './arrowTool.js';
|
|
5
5
|
import { calculateSnap, clearSnapGuides } from '../core/SnapGuides.js';
|
|
6
6
|
|
|
7
|
-
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#
|
|
7
|
+
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#000000"; }
|
|
8
8
|
|
|
9
9
|
let isDrawingLine = false;
|
|
10
10
|
let currentLine = null;
|
|
@@ -23,7 +23,7 @@ let startX, startY;
|
|
|
23
23
|
// from the sidebar this var holds that value verbatim.
|
|
24
24
|
function getThemeStroke() {
|
|
25
25
|
if (typeof document === 'undefined') return '#fff';
|
|
26
|
-
return document.body && document.body.classList.contains('theme-dark') ? '#fff' : '#
|
|
26
|
+
return document.body && document.body.classList.contains('theme-dark') ? '#fff' : '#000000';
|
|
27
27
|
}
|
|
28
28
|
let squareStrokecolor = null;
|
|
29
29
|
let squareBackgroundColor = "transparent";
|
|
@@ -22,7 +22,7 @@ let previewFrame = 0;
|
|
|
22
22
|
let latestPrediction = null;
|
|
23
23
|
|
|
24
24
|
function getThemeStroke() {
|
|
25
|
-
return document.body?.classList.contains('theme-dark') ? '#f7f4ff' : '#
|
|
25
|
+
return document.body?.classList.contains('theme-dark') ? '#f7f4ff' : '#000000';
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
function getSVGPoint(event) {
|
package/src/tools/textTool.js
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
import { cleanupAttachments, updateAttachedArrows } from './arrowTool.js';
|
|
14
14
|
import { registerRotationAnchor } from '../core/ScreenSpaceControls.js';
|
|
15
15
|
|
|
16
|
-
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#
|
|
16
|
+
function getThemeStroke() { if (typeof document === "undefined") return "#fff"; return document.body && document.body.classList.contains("theme-dark") ? "#fff" : "#000000"; }
|
|
17
17
|
import {
|
|
18
18
|
addCodeBlock,
|
|
19
19
|
wrapCodeElement,
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/shapes/Line.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// Line shape class - extracted from lineTool.js\n// Depends on globals: svg, shapes, rough, currentShape, currentZoom\nimport { updateAttachedArrows as updateArrowsForShape } from '../tools/arrowTool.js';\n\nconst rc = rough.svg(svg);\n// Issue #38 follow-up: read the default stroke from the active theme\n// instead of pinning to a single colour. White was invisible on the new\n// light canvas, near-black is invisible if the user toggles dark.\nfunction getThemeStroke() {\n if (typeof document === 'undefined') return '#fff';\n return document.body && document.body.classList.contains('theme-dark') ? '#fff' : '#1a1a2e';\n}\nconst lineStrokeWidth = 2;\nlet hoveredFrameLine = null;\n\nclass Line {\n constructor(startPoint, endPoint, options = {}) {\n this.startPoint = startPoint;\n this.endPoint = endPoint;\n this.options = { ...options };\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.isSelected = false;\n this.anchors = [];\n this.selectionOutline = null;\n this.shapeName = \"line\"; \n this.shapeID = `line-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`; \n this.group.setAttribute('id', this.shapeID);\n \n // Curve properties\n this.isCurved = false;\n this.controlPoint = null;\n \n // Frame attachment properties\n this.parentFrame = null;\n\n // Embedded label support\n this.label = options.label || '';\n this.labelElement = null;\n this.labelColor = options.labelColor || '#e0e0e0';\n this.labelFontSize = options.labelFontSize || 12;\n this._isEditingLabel = false;\n this._hitArea = null;\n this._labelBg = null;\n\n svg.appendChild(this.group);\n this._setupLabelDblClick();\n this.draw();\n }\n\n // Add position and dimension properties for frame compatibility\n get x() {\n return Math.min(this.startPoint.x, this.endPoint.x);\n }\n \n set x(value) {\n const currentX = this.x;\n const dx = value - currentX;\n this.startPoint.x += dx;\n this.endPoint.x += dx;\n if (this.controlPoint) {\n this.controlPoint.x += dx;\n }\n }\n \n get y() {\n return Math.min(this.startPoint.y, this.endPoint.y);\n }\n \n set y(value) {\n const currentY = this.y;\n const dy = value - currentY;\n this.startPoint.y += dy;\n this.endPoint.y += dy;\n if (this.controlPoint) {\n this.controlPoint.y += dy;\n }\n }\n \n get width() {\n return Math.abs(this.endPoint.x - this.startPoint.x);\n }\n \n set width(value) {\n const centerX = (this.startPoint.x + this.endPoint.x) / 2;\n this.startPoint.x = centerX - value / 2;\n this.endPoint.x = centerX + value / 2;\n }\n \n get height() {\n return Math.abs(this.endPoint.y - this.startPoint.y);\n }\n \n set height(value) {\n const centerY = (this.startPoint.y + this.endPoint.y) / 2;\n this.startPoint.y = centerY - value / 2;\n this.endPoint.y = centerY + value / 2;\n }\n\n initializeCurveControlPoint() {\n const midX = (this.startPoint.x + this.endPoint.x) / 2;\n const midY = (this.startPoint.y + this.endPoint.y) / 2;\n \n // Calculate perpendicular offset for curve\n const dx = this.endPoint.x - this.startPoint.x;\n const dy = this.endPoint.y - this.startPoint.y;\n const length = Math.sqrt(dx * dx + dy * dy);\n \n if (length === 0) {\n this.controlPoint = { x: midX, y: midY - 20 };\n return;\n }\n \n // Perpendicular vector\n const perpX = -dy / length;\n const perpY = dx / length;\n const curveOffset = 30; // Default curve amount\n \n this.controlPoint = {\n x: midX + perpX * curveOffset,\n y: midY + perpY * curveOffset\n };\n }\n\n draw() {\n // Clear existing elements but preserve label, hit area, and anchors during active resize\n const childrenToRemove = [];\n const preserveSet = this._skipAnchors ? new Set([...this.anchors, this.selectionOutline].filter(Boolean)) : null;\n for (let i = 0; i < this.group.children.length; i++) {\n const child = this.group.children[i];\n if (child !== this.labelElement && child !== this._hitArea && child !== this._labelBg) {\n if (preserveSet && preserveSet.has(child)) continue;\n childrenToRemove.push(child);\n }\n }\n childrenToRemove.forEach(child => this.group.removeChild(child));\n\n const rc = rough.svg(svg);\n let lineElement;\n\n if (this.isCurved && this.controlPoint) {\n const pathData = `M ${this.startPoint.x} ${this.startPoint.y} Q ${this.controlPoint.x} ${this.controlPoint.y} ${this.endPoint.x} ${this.endPoint.y}`;\n lineElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n lineElement.setAttribute('d', pathData);\n lineElement.setAttribute('stroke', this.options.stroke || getThemeStroke());\n lineElement.setAttribute('stroke-width', this.options.strokeWidth || lineStrokeWidth);\n lineElement.setAttribute('fill', 'none');\n lineElement.setAttribute('stroke-linecap', 'round');\n if (this.options.strokeDasharray) {\n lineElement.setAttribute('stroke-dasharray', this.options.strokeDasharray);\n }\n } else if (this.isBeingDrawn || this.options.strokeDasharray) {\n // Use plain SVG for lines being drawn OR dashed/dotted lines\n // (RoughJS ignores strokeDasharray, so dashed styles must bypass it)\n lineElement = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n lineElement.setAttribute('x1', this.startPoint.x);\n lineElement.setAttribute('y1', this.startPoint.y);\n lineElement.setAttribute('x2', this.endPoint.x);\n lineElement.setAttribute('y2', this.endPoint.y);\n lineElement.setAttribute('stroke', this.options.stroke || getThemeStroke());\n lineElement.setAttribute('stroke-width', this.options.strokeWidth || lineStrokeWidth);\n lineElement.setAttribute('stroke-linecap', 'round');\n if (this.options.strokeDasharray) {\n lineElement.setAttribute('stroke-dasharray', this.options.strokeDasharray);\n }\n } else {\n lineElement = rc.line(\n this.startPoint.x, this.startPoint.y,\n this.endPoint.x, this.endPoint.y,\n this.options\n );\n }\n\n this.element = lineElement;\n this.group.appendChild(lineElement);\n\n // Hit area - thicker invisible path for dblclick detection\n if (!this._hitArea) {\n this._hitArea = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this._hitArea.setAttribute('fill', 'none');\n this._hitArea.setAttribute('stroke', 'transparent');\n this._hitArea.setAttribute('stroke-width', '20');\n this._hitArea.setAttribute('style', 'pointer-events: stroke;');\n this.group.appendChild(this._hitArea);\n }\n if (this.isCurved && this.controlPoint) {\n this._hitArea.setAttribute('d', `M ${this.startPoint.x} ${this.startPoint.y} Q ${this.controlPoint.x} ${this.controlPoint.y} ${this.endPoint.x} ${this.endPoint.y}`);\n } else {\n this._hitArea.setAttribute('d', `M ${this.startPoint.x} ${this.startPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`);\n }\n\n // Update embedded label at midpoint\n this._updateLabelElement();\n\n if (this.isSelected) {\n if (this._skipAnchors) {\n this.updateSelectionControls();\n } else {\n this.addAnchors();\n }\n }\n }\n\n _getMidpoint() {\n if (this.isCurved && this.controlPoint) {\n // Quadratic bezier midpoint at t=0.5\n const t = 0.5;\n const mx = (1 - t) * (1 - t) * this.startPoint.x + 2 * (1 - t) * t * this.controlPoint.x + t * t * this.endPoint.x;\n const my = (1 - t) * (1 - t) * this.startPoint.y + 2 * (1 - t) * t * this.controlPoint.y + t * t * this.endPoint.y;\n return { x: mx, y: my };\n }\n return {\n x: (this.startPoint.x + this.endPoint.x) / 2,\n y: (this.startPoint.y + this.endPoint.y) / 2\n };\n }\n\n _updateLabelElement() {\n if (!this.label) {\n if (this.labelElement && this.labelElement.parentNode === this.group) {\n this.group.removeChild(this.labelElement);\n this.labelElement = null;\n }\n if (this._labelBg && this._labelBg.parentNode === this.group) {\n this.group.removeChild(this._labelBg);\n this._labelBg = null;\n }\n return;\n }\n\n if (!this.labelElement) {\n this.labelElement = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n this.labelElement.setAttribute('class', 'shape-label');\n this.labelElement.setAttribute('pointer-events', 'none');\n }\n\n const mid = this._getMidpoint();\n this.labelElement.setAttribute('x', mid.x);\n this.labelElement.setAttribute('y', mid.y);\n this.labelElement.setAttribute('text-anchor', 'middle');\n this.labelElement.setAttribute('dominant-baseline', 'central');\n this.labelElement.setAttribute('fill', this.labelColor);\n this.labelElement.setAttribute('font-size', this.labelFontSize);\n this.labelElement.setAttribute('font-family', 'lixFont, sans-serif');\n this.labelElement.textContent = this.label;\n\n // Background knockout rect - hides the line behind the text\n const canvasBg = window.getComputedStyle(svg).backgroundColor || '#000';\n if (!this._labelBg) {\n this._labelBg = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n this._labelBg.setAttribute('pointer-events', 'none');\n }\n this._labelBg.setAttribute('fill', canvasBg);\n const hPadding = 4;\n const vPadding = 1;\n const charWidth = this.labelFontSize * 0.6;\n const bgW = this.label.length * charWidth + hPadding * 2;\n const bgH = this.labelFontSize + vPadding * 2;\n this._labelBg.setAttribute('x', mid.x - bgW / 2);\n this._labelBg.setAttribute('y', mid.y - bgH / 2);\n this._labelBg.setAttribute('width', bgW);\n this._labelBg.setAttribute('height', bgH);\n this._labelBg.setAttribute('rx', 2);\n\n // Re-append bg then text at end so they render ON TOP of the line path\n if (this._labelBg.parentNode === this.group) this.group.removeChild(this._labelBg);\n if (this.labelElement.parentNode === this.group) this.group.removeChild(this.labelElement);\n this.group.appendChild(this._labelBg);\n this.group.appendChild(this.labelElement);\n }\n\n _setupLabelDblClick() {\n this.group.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.startLabelEdit();\n });\n }\n\n startLabelEdit() {\n if (this._isEditingLabel) return;\n this._isEditingLabel = true;\n\n if (this.labelElement) {\n this.labelElement.setAttribute('visibility', 'hidden');\n }\n if (this._labelBg) {\n this._labelBg.setAttribute('visibility', 'hidden');\n }\n\n // Get midpoint in screen coords via CTM\n const mid = this._getMidpoint();\n const ctm = this.group.getScreenCTM();\n if (!ctm) { this._isEditingLabel = false; return; }\n\n const pt = svg.createSVGPoint();\n pt.x = mid.x; pt.y = mid.y;\n const screenMid = pt.matrixTransform(ctm);\n\n const editW = 160;\n const editH = 28;\n\n // Create HTML overlay centered on the midpoint\n const overlay = document.createElement('div');\n overlay.className = 'shape-label-editor';\n overlay.style.cssText = `\n position: fixed; z-index: 10000;\n left: ${screenMid.x - editW / 2}px; top: ${screenMid.y - editH / 2}px;\n width: ${editW}px; height: ${editH}px;\n display: flex; align-items: center; justify-content: center;\n pointer-events: auto;\n `;\n\n const canvasBg = window.getComputedStyle(svg).backgroundColor || '#000';\n const input = document.createElement('div');\n input.setAttribute('contenteditable', 'true');\n input.style.cssText = `\n width: 100%; height: 100%;\n background: ${canvasBg}; border: none;\n outline: none; padding: 2px 6px;\n color: ${this.labelColor}; font-size: ${this.labelFontSize}px;\n font-family: lixFont, sans-serif; text-align: center;\n display: flex; align-items: center; justify-content: center;\n white-space: pre-wrap; word-break: break-word;\n cursor: text;\n `;\n if (this.label) {\n input.textContent = this.label;\n } else {\n input.innerHTML = ' ';\n }\n\n overlay.appendChild(input);\n document.body.appendChild(overlay);\n\n setTimeout(() => {\n input.focus();\n const sel = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(input);\n sel.removeAllRanges();\n sel.addRange(range);\n }, 10);\n\n const finishEdit = () => {\n const newText = input.textContent.trim().replace(/\\u00A0/g, '');\n this.label = newText;\n this._isEditingLabel = false;\n if (overlay.parentNode) overlay.parentNode.removeChild(overlay);\n if (this.labelElement) this.labelElement.removeAttribute('visibility');\n if (this._labelBg) this._labelBg.removeAttribute('visibility');\n this.draw();\n };\n\n input.addEventListener('blur', finishEdit);\n input.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); input.blur(); }\n if (e.key === 'Escape') { input.textContent = this.label; input.blur(); }\n });\n input.addEventListener('pointerdown', (e) => e.stopPropagation());\n input.addEventListener('pointermove', (e) => e.stopPropagation());\n input.addEventListener('pointerup', (e) => e.stopPropagation());\n }\n\n setLabel(text, color, fontSize) {\n this.label = text || '';\n if (color) this.labelColor = color;\n if (fontSize) this.labelFontSize = fontSize;\n this.draw();\n }\n\n updateSelectionControls() {\n if (this.anchors.length === 0) return;\n\n // Update start anchor\n if (this.anchors[0]) {\n this.anchors[0].setAttribute('cx', this.startPoint.x);\n this.anchors[0].setAttribute('cy', this.startPoint.y);\n }\n\n // Update end anchor\n if (this.anchors[1]) {\n this.anchors[1].setAttribute('cx', this.endPoint.x);\n this.anchors[1].setAttribute('cy', this.endPoint.y);\n }\n\n // Update middle anchor\n if (this.anchors[2]) {\n const midX = (this.startPoint.x + this.endPoint.x) / 2;\n const midY = (this.startPoint.y + this.endPoint.y) / 2;\n let anchorMidX = midX, anchorMidY = midY;\n if (this.isCurved && this.controlPoint) {\n anchorMidX = 0.25 * this.startPoint.x + 0.5 * this.controlPoint.x + 0.25 * this.endPoint.x;\n anchorMidY = 0.25 * this.startPoint.y + 0.5 * this.controlPoint.y + 0.25 * this.endPoint.y;\n }\n this.anchors[2].setAttribute('cx', anchorMidX);\n this.anchors[2].setAttribute('cy', anchorMidY);\n }\n }\n\n selectLine() {\n this.isSelected = true;\n this.addAnchors();\n}\n\ndeselectLine() {\n this.isSelected = false;\n this.removeSelection();\n}\n\n// Update the complete removeSelection method\nremoveSelection() {\n // Remove anchors\n this.anchors.forEach(anchor => {\n if (anchor && anchor.parentNode === this.group) {\n this.group.removeChild(anchor);\n }\n });\n this.anchors = [];\n this.isSelected = false; // Only set to false when actually deselecting\n}\n\n addAnchors() {\n // Only remove existing anchors if they exist, don't call full removeSelection\n this.anchors.forEach(anchor => {\n if (anchor && anchor.parentNode === this.group) {\n this.group.removeChild(anchor);\n }\n });\n this.anchors = [];\n \n const anchorSize = 10 / (currentZoom || 1);\n const anchorStrokeWidth = 2 / (currentZoom || 1);\n \n // Start point anchor\n const startAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n startAnchor.setAttribute('cx', this.startPoint.x);\n startAnchor.setAttribute('cy', this.startPoint.y);\n startAnchor.setAttribute('r', anchorSize / 2);\n startAnchor.setAttribute('fill', '#121212');\n startAnchor.setAttribute('stroke', '#5B57D1');\n startAnchor.setAttribute('stroke-width', anchorStrokeWidth);\n startAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n startAnchor.setAttribute('class', 'anchor line-anchor');\n startAnchor.style.cursor = 'grab';\n startAnchor.style.pointerEvents = 'all';\n startAnchor.dataset.index = 0;\n this.group.appendChild(startAnchor);\n this.anchors[0] = startAnchor;\n\n // End point anchor\n const endAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n endAnchor.setAttribute('cx', this.endPoint.x);\n endAnchor.setAttribute('cy', this.endPoint.y);\n endAnchor.setAttribute('r', anchorSize / 2);\n endAnchor.setAttribute('fill', '#121212');\n endAnchor.setAttribute('stroke', '#5B57D1');\n endAnchor.setAttribute('stroke-width', anchorStrokeWidth);\n endAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n endAnchor.setAttribute('class', 'anchor line-anchor');\n endAnchor.style.cursor = 'grab';\n endAnchor.style.pointerEvents = 'all';\n endAnchor.dataset.index = 1;\n this.group.appendChild(endAnchor);\n this.anchors[1] = endAnchor;\n\n // Middle anchor for curving - positioned ON the bezier curve at t=0.5\n const midX = (this.startPoint.x + this.endPoint.x) / 2;\n const midY = (this.startPoint.y + this.endPoint.y) / 2;\n let anchorMidX = midX, anchorMidY = midY;\n if (this.isCurved && this.controlPoint) {\n // Bezier point at t=0.5: 0.25*P0 + 0.5*CP + 0.25*P1\n anchorMidX = 0.25 * this.startPoint.x + 0.5 * this.controlPoint.x + 0.25 * this.endPoint.x;\n anchorMidY = 0.25 * this.startPoint.y + 0.5 * this.controlPoint.y + 0.25 * this.endPoint.y;\n }\n\n const middleAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n middleAnchor.setAttribute('cx', anchorMidX);\n middleAnchor.setAttribute('cy', anchorMidY);\n middleAnchor.setAttribute('r', anchorSize / 2);\n middleAnchor.setAttribute('fill', this.isCurved ? '#5B57D1' : '#121212');\n middleAnchor.setAttribute('stroke', '#5B57D1');\n middleAnchor.setAttribute('stroke-width', anchorStrokeWidth);\n middleAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n middleAnchor.setAttribute('class', 'anchor line-middle-anchor');\n middleAnchor.style.cursor = 'grab';\n middleAnchor.style.pointerEvents = 'all';\n middleAnchor.dataset.index = 2;\n this.group.appendChild(middleAnchor);\n this.anchors[2] = middleAnchor;\n\n // Show line sidebar\n disableAllSideBars();\n lineSideBar.classList.remove(\"hidden\");\n if (window.__showSidebarForShape) window.__showSidebarForShape('line');\n this.updateSidebar();\n }\n\n isNearAnchor(x, y) {\n if (!this.isSelected) return null;\n const buffer = 15; // Increased buffer for easier selection\n const anchorSize = 10 / (currentZoom || 1);\n\n // Check anchors\n for (let i = 0; i < this.anchors.length; i++) {\n const anchor = this.anchors[i];\n if (anchor) {\n const anchorX = parseFloat(anchor.getAttribute('cx'));\n const anchorY = parseFloat(anchor.getAttribute('cy'));\n const distance = Math.sqrt(Math.pow(x - anchorX, 2) + Math.pow(y - anchorY, 2));\n if (distance <= anchorSize / 2 + buffer) {\n return { type: 'anchor', index: i };\n }\n }\n }\n \n return null;\n }\n\n updatePosition(anchorIndex, newX, newY) {\n if (anchorIndex === 0) {\n this.startPoint.x = newX;\n this.startPoint.y = newY;\n } else if (anchorIndex === 1) {\n this.endPoint.x = newX;\n this.endPoint.y = newY;\n } else if (anchorIndex === 2) {\n // Middle anchor - dragged position is ON the curve (bezier t=0.5)\n if (!this.isCurved) {\n this.isCurved = true;\n }\n // Invert bezier formula: CP = 2*M - 0.5*(P0+P1)\n this.controlPoint = {\n x: 2 * newX - 0.5 * (this.startPoint.x + this.endPoint.x),\n y: 2 * newY - 0.5 * (this.startPoint.y + this.endPoint.y)\n };\n }\n\n // Full redraw to keep anchors, hit area, and label in sync\n this.draw();\n }\n\n updateLineElement() {\n // Update just the line element without rebuilding entire structure\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n\n const rc = rough.svg(svg);\n let lineElement;\n\n if (this.isCurved && this.controlPoint) {\n const pathData = `M ${this.startPoint.x} ${this.startPoint.y} Q ${this.controlPoint.x} ${this.controlPoint.y} ${this.endPoint.x} ${this.endPoint.y}`;\n lineElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n lineElement.setAttribute('d', pathData);\n lineElement.setAttribute('stroke', this.options.stroke || getThemeStroke());\n lineElement.setAttribute('stroke-width', this.options.strokeWidth || lineStrokeWidth);\n lineElement.setAttribute('fill', 'none');\n lineElement.setAttribute('stroke-linecap', 'round');\n if (this.options.strokeDasharray) {\n lineElement.setAttribute('stroke-dasharray', this.options.strokeDasharray);\n }\n } else if (this.options.strokeDasharray) {\n // Dashed/dotted lines must use plain SVG (RoughJS ignores strokeDasharray)\n lineElement = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n lineElement.setAttribute('x1', this.startPoint.x);\n lineElement.setAttribute('y1', this.startPoint.y);\n lineElement.setAttribute('x2', this.endPoint.x);\n lineElement.setAttribute('y2', this.endPoint.y);\n lineElement.setAttribute('stroke', this.options.stroke || getThemeStroke());\n lineElement.setAttribute('stroke-width', this.options.strokeWidth || lineStrokeWidth);\n lineElement.setAttribute('stroke-linecap', 'round');\n lineElement.setAttribute('stroke-dasharray', this.options.strokeDasharray);\n } else {\n lineElement = rc.line(\n this.startPoint.x, this.startPoint.y,\n this.endPoint.x, this.endPoint.y,\n this.options\n );\n }\n\n this.element = lineElement;\n this.group.insertBefore(lineElement, this.group.firstChild);\n }\n\n updateAnchorPositions() {\n // Update anchor positions without rebuilding them\n if (this.anchors[0]) {\n this.anchors[0].setAttribute('cx', this.startPoint.x);\n this.anchors[0].setAttribute('cy', this.startPoint.y);\n }\n if (this.anchors[1]) {\n this.anchors[1].setAttribute('cx', this.endPoint.x);\n this.anchors[1].setAttribute('cy', this.endPoint.y);\n }\n if (this.anchors[2]) {\n const midX = (this.startPoint.x + this.endPoint.x) / 2;\n const midY = (this.startPoint.y + this.endPoint.y) / 2;\n let anchorMidX = midX, anchorMidY = midY;\n if (this.isCurved && this.controlPoint) {\n // Bezier point at t=0.5: 0.25*P0 + 0.5*CP + 0.25*P1\n anchorMidX = 0.25 * this.startPoint.x + 0.5 * this.controlPoint.x + 0.25 * this.endPoint.x;\n anchorMidY = 0.25 * this.startPoint.y + 0.5 * this.controlPoint.y + 0.25 * this.endPoint.y;\n }\n this.anchors[2].setAttribute('cx', anchorMidX);\n this.anchors[2].setAttribute('cy', anchorMidY);\n this.anchors[2].setAttribute('fill', this.isCurved ? '#5B57D1' : '#121212');\n }\n }\n\n // Add move method for dragging the entire line\n move(dx, dy) {\n this.startPoint.x += dx;\n this.startPoint.y += dy;\n this.endPoint.x += dx;\n this.endPoint.y += dy;\n if (this.controlPoint) {\n this.controlPoint.x += dx;\n this.controlPoint.y += dy;\n }\n\n // Update without full redraw to prevent jitter\n this.updateLineElement();\n this.updateAnchorPositions();\n\n // Update hit area path\n if (this._hitArea) {\n if (this.isCurved && this.controlPoint) {\n this._hitArea.setAttribute('d', `M ${this.startPoint.x} ${this.startPoint.y} Q ${this.controlPoint.x} ${this.controlPoint.y} ${this.endPoint.x} ${this.endPoint.y}`);\n } else {\n this._hitArea.setAttribute('d', `M ${this.startPoint.x} ${this.startPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`);\n }\n }\n\n // Update label position\n this._updateLabelElement();\n\n // Only update frame containment if not being moved by a parent frame\n if (!this.isBeingMovedByFrame) {\n this.updateFrameContainment();\n }\n\n this.updateAttachedArrows();\n }\n\n updateAttachedArrows() {\n updateArrowsForShape(this);\n }\n\n updateFrameContainment() {\n // Don't update if we're being moved by a frame\n if (this.isBeingMovedByFrame) return;\n \n let targetFrame = null;\n \n // Find which frame this shape is over\n shapes.forEach(shape => {\n if (shape.shapeName === 'frame' && shape.isShapeInFrame(this)) {\n targetFrame = shape;\n }\n });\n \n // If we have a parent frame and we're being dragged, temporarily remove clipping\n if (this.parentFrame) {\n this.parentFrame.temporarilyRemoveFromFrame(this);\n }\n \n // Update frame highlighting\n if (hoveredFrameLine && hoveredFrameLine !== targetFrame) {\n hoveredFrameLine.removeHighlight();\n }\n \n if (targetFrame && targetFrame !== hoveredFrameLine) {\n targetFrame.highlightFrame();\n }\n \n hoveredFrameLine = targetFrame;\n }\n\n contains(x, y) {\n const tolerance = 8 / (currentZoom || 1); // Slightly larger tolerance for easier selection\n \n if (this.isCurved && this.controlPoint) {\n return this.pointToQuadraticBezierDistance(x, y) <= tolerance;\n } else {\n return this.pointToLineDistance(x, y, this.startPoint.x, this.startPoint.y, this.endPoint.x, this.endPoint.y) <= tolerance;\n }\n }\n\n pointToQuadraticBezierDistance(x, y) {\n let minDistance = Infinity;\n const steps = 50; // Reduced steps for better performance\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const point = this.getQuadraticBezierPoint(t);\n const distance = Math.sqrt(Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2));\n minDistance = Math.min(minDistance, distance);\n }\n\n return minDistance;\n }\n\n getQuadraticBezierPoint(t) {\n if (!this.controlPoint) return this.startPoint;\n \n const mt = 1 - t;\n return {\n x: mt * mt * this.startPoint.x + 2 * mt * t * this.controlPoint.x + t * t * this.endPoint.x,\n y: mt * mt * this.startPoint.y + 2 * mt * t * this.controlPoint.y + t * t * this.endPoint.y\n };\n }\n\n pointToLineDistance(x, y, x1, y1, x2, y2) {\n const A = x - x1;\n const B = y - y1;\n const C = x2 - x1;\n const D = y2 - y1;\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n let param = -1;\n if (lenSq !== 0) param = dot / lenSq;\n let xx, yy;\n if (param < 0) {\n xx = x1;\n yy = y1;\n } else if (param > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + param * C;\n yy = y1 + param * D;\n }\n const dx = x - xx;\n const dy = y - yy;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n // No-op: React sidebar handles UI updates via Zustand store\n updateSidebar() {}\n}\n\nexport { Line };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["rc"]
|
|
7
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|