@pinkpixel/marzipan 1.1.0 → 1.1.2
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/README.md +72 -37
- package/dist/_basePickBy-D4kyG5Tu.js +152 -0
- package/dist/_basePickBy-D4kyG5Tu.js.map +1 -0
- package/dist/_baseUniq-s5uZhHMt.js +615 -0
- package/dist/_baseUniq-s5uZhHMt.js.map +1 -0
- package/dist/arc-Cd2Fw3V6.js +84 -0
- package/dist/arc-Cd2Fw3V6.js.map +1 -0
- package/dist/architectureDiagram-VXUJARFQ-ylT61Lln.js +4663 -0
- package/dist/architectureDiagram-VXUJARFQ-ylT61Lln.js.map +1 -0
- package/dist/blockDiagram-VD42YOAC-CoIxLSyQ.js +2257 -0
- package/dist/blockDiagram-VD42YOAC-CoIxLSyQ.js.map +1 -0
- package/dist/c4Diagram-YG6GDRKO-CsQimMM6.js +1581 -0
- package/dist/c4Diagram-YG6GDRKO-CsQimMM6.js.map +1 -0
- package/dist/channel-0tZUlnqz.js +6 -0
- package/dist/channel-0tZUlnqz.js.map +1 -0
- package/dist/chunk-4BX2VUAB-DVkBhLxy.js +9 -0
- package/dist/chunk-4BX2VUAB-DVkBhLxy.js.map +1 -0
- package/dist/chunk-55IACEB6-CVQcegI-.js +9 -0
- package/dist/chunk-55IACEB6-CVQcegI-.js.map +1 -0
- package/dist/chunk-B4BG7PRW-DPUTNckV.js +1376 -0
- package/dist/chunk-B4BG7PRW-DPUTNckV.js.map +1 -0
- package/dist/chunk-DI55MBZ5-F7DI2N9R.js +1371 -0
- package/dist/chunk-DI55MBZ5-F7DI2N9R.js.map +1 -0
- package/dist/chunk-FMBD7UC4-C3wNpU7V.js +20 -0
- package/dist/chunk-FMBD7UC4-C3wNpU7V.js.map +1 -0
- package/dist/chunk-QN33PNHL-BOdqrixJ.js +20 -0
- package/dist/chunk-QN33PNHL-BOdqrixJ.js.map +1 -0
- package/dist/chunk-QZHKN3VN-BFPNdgmW.js +16 -0
- package/dist/chunk-QZHKN3VN-BFPNdgmW.js.map +1 -0
- package/dist/chunk-TZMSLE5B-BZuxNW58.js +65 -0
- package/dist/chunk-TZMSLE5B-BZuxNW58.js.map +1 -0
- package/dist/classDiagram-2ON5EDUG-CiRjpBEe.js +17 -0
- package/dist/classDiagram-2ON5EDUG-CiRjpBEe.js.map +1 -0
- package/dist/classDiagram-v2-WZHVMYZB-CiRjpBEe.js +17 -0
- package/dist/classDiagram-v2-WZHVMYZB-CiRjpBEe.js.map +1 -0
- package/dist/clone-Bm_onhkP.js +9 -0
- package/dist/clone-Bm_onhkP.js.map +1 -0
- package/dist/cose-bilkent-S5V4N54A-D9xMKgKB.js +2609 -0
- package/dist/cose-bilkent-S5V4N54A-D9xMKgKB.js.map +1 -0
- package/dist/dagre-6UL2VRFP-BhIQJjaK.js +445 -0
- package/dist/dagre-6UL2VRFP-BhIQJjaK.js.map +1 -0
- package/dist/diagram-PSM6KHXK-h4YEzD1S.js +532 -0
- package/dist/diagram-PSM6KHXK-h4YEzD1S.js.map +1 -0
- package/dist/diagram-QEK2KX5R-spuV0akZ.js +218 -0
- package/dist/diagram-QEK2KX5R-spuV0akZ.js.map +1 -0
- package/dist/diagram-S2PKOQOG-CQx-wsyw.js +143 -0
- package/dist/diagram-S2PKOQOG-CQx-wsyw.js.map +1 -0
- package/dist/erDiagram-Q2GNP2WA-Cqkjjf2a.js +842 -0
- package/dist/erDiagram-Q2GNP2WA-Cqkjjf2a.js.map +1 -0
- package/dist/flowDiagram-NV44I4VS-mCXE9u9b.js +1621 -0
- package/dist/flowDiagram-NV44I4VS-mCXE9u9b.js.map +1 -0
- package/dist/ganttDiagram-JELNMOA3-Bz1GBIHE.js +2671 -0
- package/dist/ganttDiagram-JELNMOA3-Bz1GBIHE.js.map +1 -0
- package/dist/gitGraphDiagram-V2S2FVAM-Be01Oq15.js +700 -0
- package/dist/gitGraphDiagram-V2S2FVAM-Be01Oq15.js.map +1 -0
- package/dist/graph-DVWVTM7e.js +248 -0
- package/dist/graph-DVWVTM7e.js.map +1 -0
- package/dist/index-kKw24iiA.js +34 -0
- package/dist/index-kKw24iiA.js.map +1 -0
- package/dist/index.d.ts +0 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +270 -277
- package/dist/index.js.map +1 -1
- package/dist/infoDiagram-HS3SLOUP-joTtnw9j.js +25 -0
- package/dist/infoDiagram-HS3SLOUP-joTtnw9j.js.map +1 -0
- package/dist/journeyDiagram-XKPGCS4Q-CMVu7VEd.js +835 -0
- package/dist/journeyDiagram-XKPGCS4Q-CMVu7VEd.js.map +1 -0
- package/dist/kanban-definition-3W4ZIXB7-CfanK5Eg.js +720 -0
- package/dist/kanban-definition-3W4ZIXB7-CfanK5Eg.js.map +1 -0
- package/dist/katex-Cj93GM5Y.js +11605 -0
- package/dist/katex-Cj93GM5Y.js.map +1 -0
- package/dist/layout-BC8VSiQq.js +1336 -0
- package/dist/layout-BC8VSiQq.js.map +1 -0
- package/dist/linear-GV5CIa17.js +260 -0
- package/dist/linear-GV5CIa17.js.map +1 -0
- package/dist/marzipan.d.ts +1 -2
- package/dist/marzipan.d.ts.map +1 -1
- package/dist/marzipan.js +1 -19
- package/dist/marzipan.js.map +1 -1
- package/dist/mermaid.core-cSWK5aGH.js +15302 -0
- package/dist/mermaid.core-cSWK5aGH.js.map +1 -0
- package/dist/mindmap-definition-VGOIOE7T-Vu_RTZar.js +785 -0
- package/dist/mindmap-definition-VGOIOE7T-Vu_RTZar.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +6 -5
- package/dist/parser.js.map +1 -1
- package/dist/pieDiagram-ADFJNKIX-BUcd1l-6.js +162 -0
- package/dist/pieDiagram-ADFJNKIX-BUcd1l-6.js.map +1 -0
- package/dist/plugins/accentSwatchPlugin.d.ts +1 -1
- package/dist/plugins/accentSwatchPlugin.d.ts.map +1 -1
- package/dist/plugins/accentSwatchPlugin.js +162 -81
- package/dist/plugins/accentSwatchPlugin.js.map +1 -1
- package/dist/plugins/block-handles.d.ts +10 -2
- package/dist/plugins/block-handles.d.ts.map +1 -1
- package/dist/plugins/block-handles.js +77 -51
- package/dist/plugins/block-handles.js.map +1 -1
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +27 -29
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/mermaidPlugin.js +1 -1
- package/dist/plugins/tinyHighlight.d.ts.map +1 -1
- package/dist/plugins/tinyHighlight.js +34 -22
- package/dist/plugins/tinyHighlight.js.map +1 -1
- package/dist/quadrantDiagram-AYHSOK5B-B1ekOH99.js +1023 -0
- package/dist/quadrantDiagram-AYHSOK5B-B1ekOH99.js.map +1 -0
- package/dist/requirementDiagram-UZGBJVZJ-BNcVcwNf.js +851 -0
- package/dist/requirementDiagram-UZGBJVZJ-BNcVcwNf.js.map +1 -0
- package/dist/sankeyDiagram-TZEHDZUN-BpHcdj5K.js +811 -0
- package/dist/sankeyDiagram-TZEHDZUN-BpHcdj5K.js.map +1 -0
- package/dist/sequenceDiagram-WL72ISMW-D5UyNvsv.js +2512 -0
- package/dist/sequenceDiagram-WL72ISMW-D5UyNvsv.js.map +1 -0
- package/dist/stateDiagram-FKZM4ZOC-C8DBscXu.js +264 -0
- package/dist/stateDiagram-FKZM4ZOC-C8DBscXu.js.map +1 -0
- package/dist/stateDiagram-v2-4FDKWEC3-CHqwUDPY.js +17 -0
- package/dist/stateDiagram-v2-4FDKWEC3-CHqwUDPY.js.map +1 -0
- package/dist/timeline-definition-IT6M3QCI-Dtg0oJbr.js +796 -0
- package/dist/timeline-definition-IT6M3QCI-Dtg0oJbr.js.map +1 -0
- package/dist/treemap-GDKQZRPO-rbQo3Em-.js +17926 -0
- package/dist/treemap-GDKQZRPO-rbQo3Em-.js.map +1 -0
- package/dist/xychartDiagram-PRI3JC2R-uNpgYSnV.js +1341 -0
- package/dist/xychartDiagram-PRI3JC2R-uNpgYSnV.js.map +1 -0
- package/docs/.vitepress/config.ts +1 -1
- package/docs/README.md +6 -8
- package/docs/TABLE_OF_CONTENTS.md +4 -1
- package/docs/api.md +262 -202
- package/docs/index.md +22 -19
- package/docs/plugins.md +27 -23
- package/package.json +1 -1
- package/docs/block-handles.md +0 -325
|
@@ -1,142 +1,223 @@
|
|
|
1
|
-
const
|
|
2
|
-
function
|
|
3
|
-
if (!
|
|
4
|
-
let
|
|
5
|
-
return
|
|
1
|
+
const k = "marzipan.accent.colors";
|
|
2
|
+
function f(e) {
|
|
3
|
+
if (!e) return null;
|
|
4
|
+
let o = e.trim().toLowerCase();
|
|
5
|
+
return o.startsWith("#") || (o = "#" + o), /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(o) ? (o.length === 4 && (o = "#" + [...o.slice(1)].map((m) => m + m).join("")), o) : null;
|
|
6
6
|
}
|
|
7
|
-
function
|
|
7
|
+
function j() {
|
|
8
8
|
try {
|
|
9
|
-
return JSON.parse(localStorage.getItem(
|
|
9
|
+
return JSON.parse(localStorage.getItem(k) || "[]");
|
|
10
10
|
} catch {
|
|
11
11
|
return [];
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
function
|
|
14
|
+
function x(e) {
|
|
15
15
|
try {
|
|
16
|
-
localStorage.setItem(
|
|
16
|
+
localStorage.setItem(k, JSON.stringify(e));
|
|
17
17
|
} catch {
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
async function
|
|
21
|
-
const
|
|
22
|
-
if (!
|
|
20
|
+
async function A() {
|
|
21
|
+
const e = window;
|
|
22
|
+
if (!e.EyeDropper) return null;
|
|
23
23
|
try {
|
|
24
|
-
const
|
|
25
|
-
return
|
|
24
|
+
const m = await new e.EyeDropper().open();
|
|
25
|
+
return f(m.sRGBHex);
|
|
26
26
|
} catch {
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
function
|
|
31
|
-
typeof
|
|
30
|
+
function h(e, o) {
|
|
31
|
+
typeof e.setAccent == "function" && e.setAccent(o), document.documentElement.style.setProperty("--mz-accent", o), e.container.style.setProperty("--mz-accent", o), e.container.dispatchEvent(new CustomEvent("marzipan:accent", { detail: { color: o } }));
|
|
32
32
|
}
|
|
33
|
-
function
|
|
34
|
-
const
|
|
35
|
-
return (
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
let
|
|
39
|
-
!r.length &&
|
|
40
|
-
function
|
|
41
|
-
const
|
|
42
|
-
return
|
|
33
|
+
function L(e) {
|
|
34
|
+
const o = Math.max(1, e?.max ?? 12), m = e?.title ?? "Accent color", E = e?.label ?? "⭘";
|
|
35
|
+
return (p) => {
|
|
36
|
+
const C = p.container.querySelector(".marzipan-toolbar") ?? p.container, s = document.createElement("button");
|
|
37
|
+
s.type = "button", s.className = "marzipan-toolbar-button mz-btn-accent", s.title = m, s.textContent = E, s.setAttribute("aria-label", m);
|
|
38
|
+
let t = null, r = j();
|
|
39
|
+
!r.length && e?.defaults?.length && (r = e.defaults.map(f).filter((n) => !!n).slice(0, o), x(r));
|
|
40
|
+
function w() {
|
|
41
|
+
const u = getComputedStyle(p.container).getPropertyValue("--mz-accent").trim() || getComputedStyle(document.documentElement).getPropertyValue("--mz-accent").trim();
|
|
42
|
+
return f(u) || "#8b5cf6";
|
|
43
43
|
}
|
|
44
|
-
function
|
|
45
|
-
r = [
|
|
44
|
+
function y(n) {
|
|
45
|
+
r = [n, ...r.filter((u) => u !== n)].slice(0, o), x(r);
|
|
46
46
|
}
|
|
47
|
-
function
|
|
48
|
-
|
|
47
|
+
function b() {
|
|
48
|
+
t && (t.remove(), t = null, document.removeEventListener("click", S, !0), window.removeEventListener("resize", b), window.removeEventListener("scroll", b, !0));
|
|
49
49
|
}
|
|
50
|
-
function
|
|
51
|
-
|
|
50
|
+
function S(n) {
|
|
51
|
+
t && (n.target instanceof Node && (t.contains(n.target) || s.contains(n.target)) || b());
|
|
52
52
|
}
|
|
53
|
-
function
|
|
54
|
-
if (!
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
r.forEach((
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
53
|
+
function d() {
|
|
54
|
+
if (!t) return;
|
|
55
|
+
const n = t.querySelector(".mz-accent-grid");
|
|
56
|
+
n.innerHTML = "";
|
|
57
|
+
const u = w();
|
|
58
|
+
r.forEach((i, l) => {
|
|
59
|
+
const c = document.createElement("button");
|
|
60
|
+
c.type = "button", c.className = "mz-swatch", Object.assign(c.style, {
|
|
61
|
+
width: "28px",
|
|
62
|
+
height: "28px",
|
|
63
|
+
borderRadius: "50%",
|
|
64
|
+
border: "1px solid #333",
|
|
65
|
+
background: i,
|
|
66
|
+
cursor: "pointer",
|
|
67
|
+
boxShadow: "inset 0 0 0 2px rgba(0,0,0,.2)",
|
|
68
|
+
padding: "0",
|
|
69
|
+
margin: "0",
|
|
70
|
+
boxSizing: "border-box"
|
|
71
|
+
}), i === u && (c.style.outline = "2px solid var(--mz-accent, #8b5cf6)"), c.title = i, c.onclick = () => {
|
|
72
|
+
h(p, i), y(i), d();
|
|
73
|
+
}, c.oncontextmenu = (g) => {
|
|
74
|
+
g.preventDefault(), r.splice(l, 1), x(r), d();
|
|
75
|
+
}, n.appendChild(c);
|
|
65
76
|
});
|
|
66
|
-
const
|
|
67
|
-
|
|
77
|
+
const a = document.createElement("button");
|
|
78
|
+
a.type = "button", a.className = "mz-swatch mz-swatch-add", a.textContent = "+", a.title = "Add color (click to pick, ⇧click to type, ⌥click eyedropper)", Object.assign(a.style, {
|
|
79
|
+
width: "28px",
|
|
80
|
+
height: "28px",
|
|
81
|
+
borderRadius: "50%",
|
|
82
|
+
background: "linear-gradient(135deg, #222, #2b2f36)",
|
|
83
|
+
color: "#e7e7e7",
|
|
84
|
+
display: "flex",
|
|
85
|
+
alignItems: "center",
|
|
86
|
+
justifyContent: "center",
|
|
87
|
+
fontWeight: "700",
|
|
88
|
+
fontSize: "16px",
|
|
89
|
+
cursor: "pointer",
|
|
90
|
+
border: "1px solid #333",
|
|
91
|
+
padding: "0",
|
|
92
|
+
margin: "0",
|
|
93
|
+
boxSizing: "border-box"
|
|
94
|
+
}), a.onclick = async (i) => {
|
|
68
95
|
let l = null;
|
|
69
|
-
if (
|
|
70
|
-
l =
|
|
71
|
-
else if (
|
|
72
|
-
l = await
|
|
96
|
+
if (i.shiftKey)
|
|
97
|
+
l = f(prompt("Enter hex color (#RRGGBB or RRGGBB):") || "");
|
|
98
|
+
else if (i.altKey)
|
|
99
|
+
l = await A(), l || (l = f(prompt("Enter hex color:") || ""));
|
|
73
100
|
else {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
},
|
|
101
|
+
const c = document.createElement("input");
|
|
102
|
+
c.type = "color", c.value = w(), c.onchange = () => {
|
|
103
|
+
const g = f(c.value);
|
|
104
|
+
g && (h(p, g), y(g), d());
|
|
105
|
+
}, c.click();
|
|
79
106
|
return;
|
|
80
107
|
}
|
|
81
|
-
l && (
|
|
82
|
-
},
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
|
|
108
|
+
l && (h(p, l), y(l), d());
|
|
109
|
+
}, n.appendChild(a);
|
|
110
|
+
const z = t.querySelector(".mz-accent-usecur");
|
|
111
|
+
z.onclick = () => {
|
|
112
|
+
const i = w();
|
|
113
|
+
y(i), d();
|
|
87
114
|
};
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
if (!
|
|
91
|
-
r = [],
|
|
115
|
+
const v = t.querySelector(".mz-accent-reset");
|
|
116
|
+
v.onclick = () => {
|
|
117
|
+
if (!e?.defaults?.length) {
|
|
118
|
+
r = [], x(r), d();
|
|
92
119
|
return;
|
|
93
120
|
}
|
|
94
|
-
r =
|
|
121
|
+
r = e.defaults.map(f).filter(Boolean), x(r), d();
|
|
95
122
|
};
|
|
96
123
|
}
|
|
97
|
-
function
|
|
98
|
-
if (
|
|
99
|
-
|
|
124
|
+
function R() {
|
|
125
|
+
if (t) {
|
|
126
|
+
b();
|
|
100
127
|
return;
|
|
101
128
|
}
|
|
102
|
-
|
|
129
|
+
t = document.createElement("div"), t.className = "mz-pop mz-accent-pop", t.innerHTML = `
|
|
103
130
|
<div class="mz-accent-grid"></div>
|
|
104
131
|
<div class="mz-accent-row">
|
|
105
132
|
<button type="button" class="mz-accent-usecur">Add current</button>
|
|
106
133
|
<button type="button" class="mz-accent-reset">Reset</button>
|
|
107
134
|
</div>
|
|
108
135
|
<div class="mz-accent-hint">Tip: Right-click a swatch to remove. Alt-click “+” for eyedropper.</div>
|
|
109
|
-
`, document.body.appendChild(
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
136
|
+
`, document.body.appendChild(t);
|
|
137
|
+
const n = s.getBoundingClientRect();
|
|
138
|
+
Object.assign(t.style, {
|
|
139
|
+
position: "absolute",
|
|
140
|
+
left: `${Math.round(window.scrollX + n.left)}px`,
|
|
141
|
+
top: `${Math.round(window.scrollY + n.bottom + 6)}px`,
|
|
142
|
+
width: "280px",
|
|
143
|
+
maxWidth: "calc(100vw - 24px)",
|
|
144
|
+
background: "#1a1e24",
|
|
145
|
+
border: "1px solid #333",
|
|
146
|
+
borderRadius: "10px",
|
|
147
|
+
boxShadow: "0 4px 16px rgba(0,0,0,.35)",
|
|
148
|
+
zIndex: "10000",
|
|
149
|
+
padding: "8px",
|
|
150
|
+
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
151
|
+
fontSize: "14px",
|
|
152
|
+
color: "#e7e7e7",
|
|
153
|
+
boxSizing: "border-box"
|
|
154
|
+
});
|
|
155
|
+
const u = t.querySelector(".mz-accent-grid");
|
|
156
|
+
u && Object.assign(u.style, {
|
|
157
|
+
display: "grid",
|
|
158
|
+
gridTemplateColumns: "repeat(auto-fill, 28px)",
|
|
159
|
+
gap: "8px",
|
|
160
|
+
padding: "6px"
|
|
161
|
+
});
|
|
162
|
+
const a = t.querySelector(".mz-accent-row");
|
|
163
|
+
a && Object.assign(a.style, { display: "flex", gap: "8px", padding: "6px" }), t.querySelectorAll(".mz-accent-row button").forEach((v) => {
|
|
164
|
+
Object.assign(v.style, {
|
|
165
|
+
flex: "1",
|
|
166
|
+
padding: "6px 8px",
|
|
167
|
+
borderRadius: "8px",
|
|
168
|
+
border: "1px solid #2b2f36",
|
|
169
|
+
background: "#1a1e24",
|
|
170
|
+
color: "#e7e7e7",
|
|
171
|
+
cursor: "pointer",
|
|
172
|
+
fontSize: "13px",
|
|
173
|
+
fontFamily: "inherit"
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
const z = t.querySelector(".mz-accent-hint");
|
|
177
|
+
z && Object.assign(z.style, { fontSize: "12px", opacity: "0.7", padding: "0 6px 6px" }), d(), setTimeout(() => {
|
|
178
|
+
document.addEventListener("click", S, !0), window.addEventListener("resize", b), window.addEventListener("scroll", b, !0);
|
|
113
179
|
}, 0);
|
|
114
180
|
}
|
|
115
|
-
if (
|
|
116
|
-
const
|
|
117
|
-
|
|
181
|
+
if (s.onclick = R, C.appendChild(s), !getComputedStyle(p.container).getPropertyValue("--mz-accent").trim()) {
|
|
182
|
+
const n = r[0] || e?.defaults?.[0] || "#8b5cf6";
|
|
183
|
+
h(p, n);
|
|
118
184
|
}
|
|
119
185
|
};
|
|
120
186
|
}
|
|
121
187
|
const B = `
|
|
122
|
-
.mz-accent-pop {
|
|
123
|
-
|
|
188
|
+
.mz-accent-pop {
|
|
189
|
+
width: 280px; max-width: calc(100vw - 24px);
|
|
190
|
+
background: var(--mz-pop-bg, #1a1e24);
|
|
191
|
+
border: 1px solid var(--mz-pop-bd, #333);
|
|
192
|
+
border-radius: 10px;
|
|
193
|
+
box-shadow: 0 4px 16px rgba(0,0,0,.35);
|
|
194
|
+
z-index: 10000;
|
|
195
|
+
padding: 8px;
|
|
196
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
197
|
+
font-size: 14px;
|
|
198
|
+
color: var(--mz-pop-fg, #e7e7e7);
|
|
199
|
+
}
|
|
200
|
+
.mz-accent-grid { display: grid; grid-template-columns: repeat(auto-fill, 28px); gap: 8px; padding: 6px; }
|
|
124
201
|
.mz-swatch {
|
|
125
202
|
width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--mz-pop-bd, #333);
|
|
126
203
|
background: var(--sw, #777); cursor: pointer; box-shadow: inset 0 0 0 2px rgba(0,0,0,.2);
|
|
204
|
+
transition: transform .1s;
|
|
127
205
|
}
|
|
206
|
+
.mz-swatch:hover { transform: scale(1.15); }
|
|
128
207
|
.mz-swatch.sel { outline: 2px solid var(--mz-accent, #8b5cf6); outline-offset: 2px; }
|
|
129
208
|
.mz-swatch-add { background: linear-gradient(135deg, #222, #2b2f36); color: #e7e7e7;
|
|
130
|
-
display:flex; align-items:center; justify-content:center; font-weight:700; }
|
|
209
|
+
display:flex; align-items:center; justify-content:center; font-weight:700; font-size:16px; }
|
|
131
210
|
.mz-accent-row { display:flex; gap:8px; padding: 6px; }
|
|
132
211
|
.mz-accent-row button {
|
|
133
212
|
flex:1; padding:6px 8px; border-radius:8px; border:1px solid var(--mz-bd, #2b2f36);
|
|
134
213
|
background: var(--mz-btn-bg, #1a1e24); color: var(--mz-btn-fg, #e7e7e7); cursor:pointer;
|
|
214
|
+
font-size: 13px; transition: background .15s;
|
|
135
215
|
}
|
|
216
|
+
.mz-accent-row button:hover { background: var(--mz-btn-hover, #2b2f36); }
|
|
136
217
|
.mz-accent-hint { font-size: 12px; opacity: .7; padding: 0 6px 6px; }
|
|
137
218
|
`;
|
|
138
219
|
export {
|
|
139
|
-
|
|
220
|
+
L as accentSwatchPlugin,
|
|
140
221
|
B as accentSwatchStyles
|
|
141
222
|
};
|
|
142
223
|
//# sourceMappingURL=accentSwatchPlugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accentSwatchPlugin.js","sources":["../../src/plugins/accentSwatchPlugin.ts"],"sourcesContent":["// plugins/accentSwatchPlugin.ts\n// Tiny recent-colors palette with Eyedropper support (if available).\n// Persists to localStorage. No deps.\n\ntype MzEditor = {\n container: HTMLElement;\n textarea: HTMLTextAreaElement;\n updatePreview: () => void;\n // Optional if your core exposes it\n setAccent?: (hex: string) => void;\n};\n\nconst LS_KEY = 'marzipan.accent.colors';\n\nfunction normHex(hex: string): string | null {\n if (!hex) return null;\n let h = hex.trim().toLowerCase();\n if (!h.startsWith('#')) h = '#' + h;\n if (!/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(h)) return null;\n // Expand #abc -> #aabbcc\n if (h.length === 4) h = '#' + [...h.slice(1)].map(c => c + c).join('');\n return h;\n}\n\nfunction load(): string[] {\n try { return JSON.parse(localStorage.getItem(LS_KEY) || '[]'); } catch { return []; }\n}\nfunction save(arr: string[]) {\n try { localStorage.setItem(LS_KEY, JSON.stringify(arr)); } catch { /* localStorage not available */ }\n}\n\nasync function pickWithEyedropper(): Promise<string | null> {\n const anyWin = window as any;\n if (!anyWin.EyeDropper) return null;\n try {\n const eye = new anyWin.EyeDropper();\n const res = await eye.open();\n return normHex(res.sRGBHex);\n } catch { return null; }\n}\n\nfunction setAccent(editor: MzEditor, hex: string) {\n // Prefer core hook if you have one\n if (typeof editor.setAccent === 'function') editor.setAccent(hex);\n // Always set CSS var as a fallback\n document.documentElement.style.setProperty('--mz-accent', hex);\n editor.container.style.setProperty('--mz-accent', hex);\n // Broadcast (optional) for any listeners\n editor.container.dispatchEvent(new CustomEvent('marzipan:accent', { detail: { color: hex } }));\n}\n\nexport function accentSwatchPlugin(opts?: {\n max?: number; // max swatches to keep (default 12)\n defaults?: string[]; // seed colors if none saved\n title?: string; // toolbar tooltip\n label?: string; // toolbar button label/icon\n}) {\n const max = Math.max(1, opts?.max ?? 12);\n const title = opts?.title ?? 'Accent color';\n const label = opts?.label ?? '⭘';\n\n return (editor: MzEditor) => {\n const bar = editor.container.querySelector('.marzipan-toolbar') as HTMLElement ?? editor.container;\n\n // Button that opens the palette popover\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'marzipan-toolbar-button mz-btn-accent';\n btn.title = title;\n btn.textContent = label;\n btn.setAttribute('aria-label', title);\n\n // Popover elements\n let pop: HTMLElement | null = null;\n let colors: string[] = load();\n if (!colors.length && opts?.defaults?.length) {\n colors = opts.defaults\n .map(normHex)\n .filter((x): x is string => !!x)\n .slice(0, max);\n save(colors);\n }\n\n function currentAccent(): string {\n const css = getComputedStyle(editor.container);\n const v = css.getPropertyValue('--mz-accent').trim() ||\n getComputedStyle(document.documentElement).getPropertyValue('--mz-accent').trim();\n return normHex(v) || '#8b5cf6'; // fallback purple\n }\n\n function ensureFront(hex: string) {\n colors = [hex, ...colors.filter(c => c !== hex)].slice(0, max);\n save(colors);\n }\n\n function closePop() {\n if (!pop) return;\n pop.remove(); pop = null;\n document.removeEventListener('click', outsideClose, true);\n window.removeEventListener('resize', closePop);\n window.removeEventListener('scroll', closePop, true);\n }\n\n function outsideClose(e: MouseEvent) {\n if (!pop) return;\n if (e.target instanceof Node && (pop.contains(e.target) || btn.contains(e.target))) return;\n closePop();\n }\n\n function render() {\n if (!pop) return;\n const grid = pop.querySelector('.mz-accent-grid') as HTMLElement;\n grid.innerHTML = '';\n\n const cur = currentAccent();\n\n // Existing swatches\n colors.forEach((hex, i) => {\n const sw = document.createElement('button');\n sw.type = 'button';\n sw.className = 'mz-swatch';\n sw.style.setProperty('--sw', hex);\n sw.title = hex;\n if (hex === cur) sw.classList.add('sel');\n sw.onclick = () => {\n setAccent(editor, hex);\n ensureFront(hex);\n render();\n };\n sw.oncontextmenu = (e) => {\n e.preventDefault();\n colors.splice(i, 1);\n save(colors);\n render();\n };\n grid.appendChild(sw);\n });\n\n // “+” swatch to add new color\n const plus = document.createElement('button');\n plus.type = 'button';\n plus.className = 'mz-swatch mz-swatch-add';\n plus.textContent = '+';\n plus.title = 'Add color (click to pick, ⇧click to type, ⌥click eyedropper)';\n plus.onclick = async (e) => {\n let hex: string | null = null;\n\n if (e.shiftKey) {\n hex = normHex(prompt('Enter hex color (#RRGGBB or RRGGBB):') || '');\n } else if (e.altKey) {\n hex = await pickWithEyedropper();\n if (!hex) hex = normHex(prompt('Enter hex color:') || '');\n } else {\n // Native color input for broad support\n const input = document.createElement('input');\n input.type = 'color';\n input.value = currentAccent();\n input.onchange = () => {\n const v = normHex(input.value);\n if (!v) return;\n setAccent(editor, v);\n ensureFront(v);\n render();\n };\n input.click();\n return;\n }\n\n if (hex) {\n setAccent(editor, hex);\n ensureFront(hex);\n render();\n }\n };\n grid.appendChild(plus);\n\n // Controls: “Use current”, “Reset”\n const useCur = pop.querySelector('.mz-accent-usecur') as HTMLButtonElement;\n useCur.onclick = () => {\n const hex = currentAccent();\n ensureFront(hex);\n render();\n };\n\n const reset = pop.querySelector('.mz-accent-reset') as HTMLButtonElement;\n reset.onclick = () => {\n if (!opts?.defaults?.length) { colors = []; save(colors); render(); return; }\n colors = opts.defaults.map(normHex).filter(Boolean) as string[];\n save(colors);\n render();\n };\n }\n\n function openPop() {\n if (pop) { closePop(); return; }\n\n pop = document.createElement('div');\n pop.className = 'mz-pop mz-accent-pop';\n pop.innerHTML = `\n <div class=\"mz-accent-grid\"></div>\n <div class=\"mz-accent-row\">\n <button type=\"button\" class=\"mz-accent-usecur\">Add current</button>\n <button type=\"button\" class=\"mz-accent-reset\">Reset</button>\n </div>\n <div class=\"mz-accent-hint\">Tip: Right-click a swatch to remove. Alt-click “+” for eyedropper.</div>\n `;\n document.body.appendChild(pop);\n\n const r = btn.getBoundingClientRect();\n pop.style.position = 'absolute';\n pop.style.left = `${Math.round(window.scrollX + r.left)}px`;\n pop.style.top = `${Math.round(window.scrollY + r.bottom + 6)}px`;\n\n render();\n\n setTimeout(() => {\n document.addEventListener('click', outsideClose, true);\n window.addEventListener('resize', closePop);\n window.addEventListener('scroll', closePop, true);\n }, 0);\n }\n\n btn.onclick = openPop;\n bar.appendChild(btn);\n\n // Initialize CSS var if missing\n if (!getComputedStyle(editor.container).getPropertyValue('--mz-accent').trim()) {\n const seed = colors[0] || opts?.defaults?.[0] || '#8b5cf6';\n setAccent(editor, seed);\n }\n };\n}\n\n// Minimal CSS you can inject once in your app\nexport const accentSwatchStyles = `\n.mz-accent-pop { width: 280px; max-width: calc(100vw - 24px); }\n.mz-accent-grid { display: grid; grid-template-columns: repeat(8, 28px); gap: 8px; padding: 6px; }\n.mz-swatch {\n width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--mz-pop-bd, #333);\n background: var(--sw, #777); cursor: pointer; box-shadow: inset 0 0 0 2px rgba(0,0,0,.2);\n}\n.mz-swatch.sel { outline: 2px solid var(--mz-accent, #8b5cf6); outline-offset: 2px; }\n.mz-swatch-add { background: linear-gradient(135deg, #222, #2b2f36); color: #e7e7e7;\n display:flex; align-items:center; justify-content:center; font-weight:700; }\n.mz-accent-row { display:flex; gap:8px; padding: 6px; }\n.mz-accent-row button {\n flex:1; padding:6px 8px; border-radius:8px; border:1px solid var(--mz-bd, #2b2f36);\n background: var(--mz-btn-bg, #1a1e24); color: var(--mz-btn-fg, #e7e7e7); cursor:pointer;\n}\n.mz-accent-hint { font-size: 12px; opacity: .7; padding: 0 6px 6px; }\n`;"],"names":["LS_KEY","normHex","hex","h","c","load","save","arr","pickWithEyedropper","anyWin","res","setAccent","editor","accentSwatchPlugin","opts","max","title","label","bar","btn","pop","colors","x","currentAccent","v","ensureFront","closePop","outsideClose","render","grid","cur","i","sw","e","plus","input","useCur","reset","openPop","r","seed","accentSwatchStyles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"accentSwatchPlugin.js","sources":["../../src/plugins/accentSwatchPlugin.ts"],"sourcesContent":["// plugins/accentSwatchPlugin.ts\n// Tiny recent-colors palette with Eyedropper support (if available).\n// Persists to localStorage. No deps.\n\ntype MzEditor = {\n container: HTMLElement;\n textarea: HTMLTextAreaElement;\n updatePreview: () => void;\n // Optional if your core exposes it\n setAccent?: (hex: string) => void;\n};\n\nconst LS_KEY = 'marzipan.accent.colors';\n\nfunction normHex(hex: string): string | null {\n if (!hex) return null;\n let h = hex.trim().toLowerCase();\n if (!h.startsWith('#')) h = '#' + h;\n if (!/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(h)) return null;\n // Expand #abc -> #aabbcc\n if (h.length === 4) h = '#' + [...h.slice(1)].map(c => c + c).join('');\n return h;\n}\n\nfunction load(): string[] {\n try { return JSON.parse(localStorage.getItem(LS_KEY) || '[]'); } catch { return []; }\n}\nfunction save(arr: string[]) {\n try { localStorage.setItem(LS_KEY, JSON.stringify(arr)); } catch { /* localStorage not available */ }\n}\n\nasync function pickWithEyedropper(): Promise<string | null> {\n const anyWin = window as any;\n if (!anyWin.EyeDropper) return null;\n try {\n const eye = new anyWin.EyeDropper();\n const res = await eye.open();\n return normHex(res.sRGBHex);\n } catch { return null; }\n}\n\nfunction setAccent(editor: MzEditor, hex: string) {\n // Prefer core hook if you have one\n if (typeof editor.setAccent === 'function') editor.setAccent(hex);\n // Always set CSS var as a fallback\n document.documentElement.style.setProperty('--mz-accent', hex);\n editor.container.style.setProperty('--mz-accent', hex);\n // Broadcast (optional) for any listeners\n editor.container.dispatchEvent(new CustomEvent('marzipan:accent', { detail: { color: hex } }));\n}\n\nexport function accentSwatchPlugin(opts?: {\n max?: number; // max swatches to keep (default 12)\n defaults?: string[]; // seed colors if none saved\n title?: string; // toolbar tooltip\n label?: string; // toolbar button label/icon\n}) {\n const max = Math.max(1, opts?.max ?? 12);\n const title = opts?.title ?? 'Accent color';\n const label = opts?.label ?? '⭘';\n\n return (editor: MzEditor) => {\n const bar = editor.container.querySelector('.marzipan-toolbar') as HTMLElement ?? editor.container;\n\n // Button that opens the palette popover\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'marzipan-toolbar-button mz-btn-accent';\n btn.title = title;\n btn.textContent = label;\n btn.setAttribute('aria-label', title);\n\n // Popover elements\n let pop: HTMLElement | null = null;\n let colors: string[] = load();\n if (!colors.length && opts?.defaults?.length) {\n colors = opts.defaults\n .map(normHex)\n .filter((x): x is string => !!x)\n .slice(0, max);\n save(colors);\n }\n\n function currentAccent(): string {\n const css = getComputedStyle(editor.container);\n const v = css.getPropertyValue('--mz-accent').trim() ||\n getComputedStyle(document.documentElement).getPropertyValue('--mz-accent').trim();\n return normHex(v) || '#8b5cf6'; // fallback purple\n }\n\n function ensureFront(hex: string) {\n colors = [hex, ...colors.filter(c => c !== hex)].slice(0, max);\n save(colors);\n }\n\n function closePop() {\n if (!pop) return;\n pop.remove(); pop = null;\n document.removeEventListener('click', outsideClose, true);\n window.removeEventListener('resize', closePop);\n window.removeEventListener('scroll', closePop, true);\n }\n\n function outsideClose(e: MouseEvent) {\n if (!pop) return;\n if (e.target instanceof Node && (pop.contains(e.target) || btn.contains(e.target))) return;\n closePop();\n }\n\n function render() {\n if (!pop) return;\n const grid = pop.querySelector('.mz-accent-grid') as HTMLElement;\n grid.innerHTML = '';\n\n const cur = currentAccent();\n\n // Existing swatches\n colors.forEach((hex, i) => {\n const sw = document.createElement('button');\n sw.type = 'button';\n sw.className = 'mz-swatch';\n Object.assign(sw.style, {\n width: '28px', height: '28px', borderRadius: '50%',\n border: '1px solid #333', background: hex, cursor: 'pointer',\n boxShadow: 'inset 0 0 0 2px rgba(0,0,0,.2)',\n padding: '0', margin: '0', boxSizing: 'border-box',\n });\n if (hex === cur) sw.style.outline = '2px solid var(--mz-accent, #8b5cf6)';\n sw.title = hex;\n sw.onclick = () => {\n setAccent(editor, hex);\n ensureFront(hex);\n render();\n };\n sw.oncontextmenu = (e) => {\n e.preventDefault();\n colors.splice(i, 1);\n save(colors);\n render();\n };\n grid.appendChild(sw);\n });\n\n // “+” swatch to add new color\n const plus = document.createElement('button');\n plus.type = 'button';\n plus.className = 'mz-swatch mz-swatch-add';\n plus.textContent = '+';\n plus.title = 'Add color (click to pick, ⇧click to type, ⌥click eyedropper)';\n Object.assign(plus.style, {\n width: '28px', height: '28px', borderRadius: '50%',\n background: 'linear-gradient(135deg, #222, #2b2f36)', color: '#e7e7e7',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontWeight: '700', fontSize: '16px', cursor: 'pointer',\n border: '1px solid #333', padding: '0', margin: '0', boxSizing: 'border-box',\n });\n plus.onclick = async (e) => {\n let hex: string | null = null;\n\n if (e.shiftKey) {\n hex = normHex(prompt('Enter hex color (#RRGGBB or RRGGBB):') || '');\n } else if (e.altKey) {\n hex = await pickWithEyedropper();\n if (!hex) hex = normHex(prompt('Enter hex color:') || '');\n } else {\n // Native color input for broad support\n const input = document.createElement('input');\n input.type = 'color';\n input.value = currentAccent();\n input.onchange = () => {\n const v = normHex(input.value);\n if (!v) return;\n setAccent(editor, v);\n ensureFront(v);\n render();\n };\n input.click();\n return;\n }\n\n if (hex) {\n setAccent(editor, hex);\n ensureFront(hex);\n render();\n }\n };\n grid.appendChild(plus);\n\n // Controls: “Use current”, “Reset”\n const useCur = pop.querySelector('.mz-accent-usecur') as HTMLButtonElement;\n useCur.onclick = () => {\n const hex = currentAccent();\n ensureFront(hex);\n render();\n };\n\n const reset = pop.querySelector('.mz-accent-reset') as HTMLButtonElement;\n reset.onclick = () => {\n if (!opts?.defaults?.length) { colors = []; save(colors); render(); return; }\n colors = opts.defaults.map(normHex).filter(Boolean) as string[];\n save(colors);\n render();\n };\n }\n\n function openPop() {\n if (pop) { closePop(); return; }\n\n pop = document.createElement('div');\n pop.className = 'mz-pop mz-accent-pop';\n pop.innerHTML = `\n <div class=\"mz-accent-grid\"></div>\n <div class=\"mz-accent-row\">\n <button type=\"button\" class=\"mz-accent-usecur\">Add current</button>\n <button type=\"button\" class=\"mz-accent-reset\">Reset</button>\n </div>\n <div class=\"mz-accent-hint\">Tip: Right-click a swatch to remove. Alt-click “+” for eyedropper.</div>\n `;\n document.body.appendChild(pop);\n\n // Apply critical styles inline to avoid CSS framework resets (e.g. Tailwind)\n const r = btn.getBoundingClientRect();\n Object.assign(pop.style, {\n position: 'absolute',\n left: `${Math.round(window.scrollX + r.left)}px`,\n top: `${Math.round(window.scrollY + r.bottom + 6)}px`,\n width: '280px',\n maxWidth: 'calc(100vw - 24px)',\n background: '#1a1e24',\n border: '1px solid #333',\n borderRadius: '10px',\n boxShadow: '0 4px 16px rgba(0,0,0,.35)',\n zIndex: '10000',\n padding: '8px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '14px',\n color: '#e7e7e7',\n boxSizing: 'border-box',\n });\n\n // Style inner elements inline to survive CSS resets\n const grid = pop.querySelector('.mz-accent-grid') as HTMLElement;\n if (grid) Object.assign(grid.style, {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, 28px)',\n gap: '8px',\n padding: '6px',\n });\n const row = pop.querySelector('.mz-accent-row') as HTMLElement;\n if (row) Object.assign(row.style, { display: 'flex', gap: '8px', padding: '6px' });\n pop.querySelectorAll('.mz-accent-row button').forEach(b => {\n Object.assign((b as HTMLElement).style, {\n flex: '1',\n padding: '6px 8px',\n borderRadius: '8px',\n border: '1px solid #2b2f36',\n background: '#1a1e24',\n color: '#e7e7e7',\n cursor: 'pointer',\n fontSize: '13px',\n fontFamily: 'inherit',\n });\n });\n const hint = pop.querySelector('.mz-accent-hint') as HTMLElement;\n if (hint) Object.assign(hint.style, { fontSize: '12px', opacity: '0.7', padding: '0 6px 6px' });\n\n render();\n\n setTimeout(() => {\n document.addEventListener('click', outsideClose, true);\n window.addEventListener('resize', closePop);\n window.addEventListener('scroll', closePop, true);\n }, 0);\n }\n\n btn.onclick = openPop;\n bar.appendChild(btn);\n\n // Initialize CSS var if missing\n if (!getComputedStyle(editor.container).getPropertyValue('--mz-accent').trim()) {\n const seed = colors[0] || opts?.defaults?.[0] || '#8b5cf6';\n setAccent(editor, seed);\n }\n };\n}\n\n// Minimal CSS you can inject once in your app\nexport const accentSwatchStyles = `\n.mz-accent-pop {\n width: 280px; max-width: calc(100vw - 24px);\n background: var(--mz-pop-bg, #1a1e24);\n border: 1px solid var(--mz-pop-bd, #333);\n border-radius: 10px;\n box-shadow: 0 4px 16px rgba(0,0,0,.35);\n z-index: 10000;\n padding: 8px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n color: var(--mz-pop-fg, #e7e7e7);\n}\n.mz-accent-grid { display: grid; grid-template-columns: repeat(auto-fill, 28px); gap: 8px; padding: 6px; }\n.mz-swatch {\n width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--mz-pop-bd, #333);\n background: var(--sw, #777); cursor: pointer; box-shadow: inset 0 0 0 2px rgba(0,0,0,.2);\n transition: transform .1s;\n}\n.mz-swatch:hover { transform: scale(1.15); }\n.mz-swatch.sel { outline: 2px solid var(--mz-accent, #8b5cf6); outline-offset: 2px; }\n.mz-swatch-add { background: linear-gradient(135deg, #222, #2b2f36); color: #e7e7e7;\n display:flex; align-items:center; justify-content:center; font-weight:700; font-size:16px; }\n.mz-accent-row { display:flex; gap:8px; padding: 6px; }\n.mz-accent-row button {\n flex:1; padding:6px 8px; border-radius:8px; border:1px solid var(--mz-bd, #2b2f36);\n background: var(--mz-btn-bg, #1a1e24); color: var(--mz-btn-fg, #e7e7e7); cursor:pointer;\n font-size: 13px; transition: background .15s;\n}\n.mz-accent-row button:hover { background: var(--mz-btn-hover, #2b2f36); }\n.mz-accent-hint { font-size: 12px; opacity: .7; padding: 0 6px 6px; }\n`;"],"names":["LS_KEY","normHex","hex","h","c","load","save","arr","pickWithEyedropper","anyWin","res","setAccent","editor","accentSwatchPlugin","opts","max","title","label","bar","btn","pop","colors","x","currentAccent","v","ensureFront","closePop","outsideClose","e","render","grid","cur","i","sw","plus","input","useCur","reset","openPop","r","row","b","hint","seed","accentSwatchStyles"],"mappings":"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"}
|
|
@@ -36,11 +36,13 @@ export declare class BlockHandlesPlugin {
|
|
|
36
36
|
private config;
|
|
37
37
|
private blocks;
|
|
38
38
|
private selectedBlockId;
|
|
39
|
+
private activeBlockId;
|
|
39
40
|
private handleContainer;
|
|
40
41
|
private _boundMouseMove;
|
|
41
42
|
private _boundMouseLeave;
|
|
42
43
|
private _boundClick;
|
|
43
44
|
private _boundKeyDown;
|
|
45
|
+
private _boundCursorUpdate;
|
|
44
46
|
constructor(editor: HTMLTextAreaElement, preview: HTMLElement, config?: BlockHandlesConfig);
|
|
45
47
|
/**
|
|
46
48
|
* Initialize the plugin
|
|
@@ -91,7 +93,8 @@ export declare class BlockHandlesPlugin {
|
|
|
91
93
|
*/
|
|
92
94
|
private handleMouseMove;
|
|
93
95
|
/**
|
|
94
|
-
* Handle mouse leave event
|
|
96
|
+
* Handle mouse leave event.
|
|
97
|
+
* Checks relatedTarget so handles don't disappear when mouse moves to a handle.
|
|
95
98
|
*/
|
|
96
99
|
private handleMouseLeave;
|
|
97
100
|
/**
|
|
@@ -105,12 +108,17 @@ export declare class BlockHandlesPlugin {
|
|
|
105
108
|
* Handle keyboard shortcuts
|
|
106
109
|
*/
|
|
107
110
|
private handleKeyDown;
|
|
111
|
+
/**
|
|
112
|
+
* Update the active block handle based on the cursor position in the textarea.
|
|
113
|
+
* Shows the handle for the block containing the current editing line (Notion-like behavior).
|
|
114
|
+
*/
|
|
115
|
+
private updateActiveBlock;
|
|
108
116
|
/**
|
|
109
117
|
* Show a specific handle
|
|
110
118
|
*/
|
|
111
119
|
private showHandle;
|
|
112
120
|
/**
|
|
113
|
-
* Hide all handles except selected
|
|
121
|
+
* Hide all handles except selected and active cursor block
|
|
114
122
|
*/
|
|
115
123
|
private hideAllHandles;
|
|
116
124
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-handles.d.ts","sourceRoot":"","sources":["../../src/plugins/block-handles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"block-handles.d.ts","sourceRoot":"","sources":["../../src/plugins/block-handles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,kBAAkB,CAAa;gBAE3B,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAE,kBAAuB;IA6B9F;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACI,UAAU,IAAI,IAAI;IAsCzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwDpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;OAEG;IACI,wBAAwB,IAAI,IAAI;IAMvC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAwBvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;YACW,SAAS;IAevB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuEvB;;OAEG;IACH,OAAO,CAAC,SAAS;IA2BjB;;OAEG;IACI,MAAM,IAAI,IAAI;IAMrB;;OAEG;IACI,OAAO,IAAI,IAAI;IAqBtB;;OAEG;IACI,OAAO,IAAI,IAAI;IAItB;;OAEG;IACI,gBAAgB,IAAI,WAAW,GAAG,IAAI;IAI7C;;OAEG;IACI,YAAY,IAAI,WAAW,EAAE;IAIpC;;OAEG;IACI,OAAO,IAAI,IAAI;CAGvB"}
|