@pixerate/editor 0.266.1 → 0.267.0
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/agent/index.cjs +8 -4
- package/dist/agent/index.js +6 -2
- package/dist/animation-editor/controller.d.cts +8 -0
- package/dist/animation-editor/controller.d.ts +8 -0
- package/dist/animation-editor/effect-tools.d.cts +1 -1
- package/dist/animation-editor/effect-tools.d.ts +1 -1
- package/dist/animation-editor/index.cjs +172 -105
- package/dist/animation-editor/index.js +91 -24
- package/dist/brushes/index.cjs +59 -59
- package/dist/brushes/index.js +5 -5
- package/dist/brushes/profiles.d.cts +6 -1
- package/dist/brushes/profiles.d.ts +6 -1
- package/dist/{brushstrokeRender-FSUWXUZY.cjs → brushstrokeRender-L7JYRR2R.cjs} +16 -16
- package/dist/{brushstrokeRender-KD453OBX.js → brushstrokeRender-NLFPEBGI.js} +4 -4
- package/dist/canvas/brushTypes.d.cts +12 -0
- package/dist/canvas/brushTypes.d.ts +12 -0
- package/dist/canvas/brushstroke.d.cts +1 -1
- package/dist/canvas/brushstroke.d.ts +1 -1
- package/dist/canvas/drawController.d.cts +19 -4
- package/dist/canvas/drawController.d.ts +19 -4
- package/dist/canvas/index.cjs +144 -105
- package/dist/canvas/index.js +46 -7
- package/dist/{chunk-XORJ7UZO.cjs → chunk-3VHH6V67.cjs} +13 -12
- package/dist/{chunk-T2LDTEXK.js → chunk-4IDUYB45.js} +2217 -56
- package/dist/chunk-7UKFXXWL.js +802 -0
- package/dist/chunk-ADMRNWR7.js +340 -0
- package/dist/{chunk-CIJBSUM5.js → chunk-AGNUD5BI.js} +2 -2
- package/dist/{chunk-WLUVZKVD.cjs → chunk-DT4YQUGT.cjs} +32 -32
- package/dist/{chunk-DXYHQ2VN.js → chunk-EF7LZAXQ.js} +1 -1
- package/dist/chunk-EXB2EGBE.cjs +802 -0
- package/dist/{chunk-4ODRXQRW.js → chunk-EYSHTYLG.js} +1 -1
- package/dist/{chunk-R44Y3EFS.js → chunk-FGJHJIMN.js} +8 -336
- package/dist/{chunk-AQZQWXEU.cjs → chunk-G7NHE2VD.cjs} +35 -35
- package/dist/{chunk-XC6DPRYI.js → chunk-GSTSZPSR.js} +154 -949
- package/dist/{chunk-VRK322ZC.cjs → chunk-HIO6E7LC.cjs} +2 -2
- package/dist/{chunk-TOID45I2.cjs → chunk-J2TNIZ55.cjs} +1 -1
- package/dist/{chunk-YHDHFJUC.cjs → chunk-J5VQYK7T.cjs} +217 -1012
- package/dist/{chunk-3C33YTNN.js → chunk-JGWVZPT6.js} +2 -2
- package/dist/{chunk-ACFSFUQH.js → chunk-JL6YH5WD.js} +4 -0
- package/dist/{chunk-3SBLVGOM.cjs → chunk-LA5Y4ETA.cjs} +23 -23
- package/dist/{chunk-MVUQSK5J.cjs → chunk-LHPEG5AU.cjs} +107 -435
- package/dist/{chunk-DOZ6F2K2.js → chunk-NSETJI74.js} +3 -2
- package/dist/{chunk-XRXFVRGY.cjs → chunk-OKHKA43L.cjs} +2364 -203
- package/dist/{chunk-LK4SXL3V.js → chunk-OSEXT7JL.js} +1 -1
- package/dist/{chunk-PE6YJMQT.cjs → chunk-PFHJS4HE.cjs} +20 -19
- package/dist/{chunk-ZQI3WUPP.js → chunk-QCLY5SFS.js} +12 -0
- package/dist/{chunk-7KNW3WXZ.cjs → chunk-QEVLRLUN.cjs} +63 -0
- package/dist/{chunk-OTN6VB5S.cjs → chunk-RDFHWAHL.cjs} +5 -1
- package/dist/{chunk-6JL2D5SG.js → chunk-VE6UKYQ2.js} +3 -2
- package/dist/{chunk-RFJZGTHA.cjs → chunk-XVOP3CGQ.cjs} +9 -9
- package/dist/{chunk-EZOJBP4D.js → chunk-YIC6MAJ2.js} +1 -1
- package/dist/chunk-YZWM6ZIP.cjs +340 -0
- package/dist/{chunk-472INMWH.js → chunk-ZA7L5YJB.js} +63 -0
- package/dist/{chunk-YBC3RKT2.cjs → chunk-ZGXJ7BTR.cjs} +13 -1
- package/dist/commands/builtins.d.cts +12 -1
- package/dist/commands/builtins.d.ts +12 -1
- package/dist/commands/index.cjs +2 -2
- package/dist/commands/index.js +1 -1
- package/dist/image-editor/controller.d.cts +1 -1
- package/dist/image-editor/controller.d.ts +1 -1
- package/dist/image-editor/index.cjs +837 -833
- package/dist/image-editor/index.js +105 -101
- package/dist/paint/index.cjs +5 -3
- package/dist/paint/index.js +46 -44
- package/dist/paint-editor/controller.d.cts +5 -3
- package/dist/paint-editor/controller.d.ts +5 -3
- package/dist/paint-editor/index.cjs +832 -2295
- package/dist/paint-editor/index.js +285 -1748
- package/dist/paint-editor/path-samples.d.cts +2 -0
- package/dist/paint-editor/path-samples.d.ts +2 -0
- package/dist/paint-editor/presence.d.cts +20 -1
- package/dist/paint-editor/presence.d.ts +20 -1
- package/dist/stickers/helpers.d.cts +2 -0
- package/dist/stickers/helpers.d.ts +2 -0
- package/dist/stickers/index.cjs +41 -35
- package/dist/stickers/index.js +22 -16
- package/dist/stickers/types.d.cts +4 -2
- package/dist/stickers/types.d.ts +4 -2
- package/dist/tools/conformance.d.cts +8 -0
- package/dist/tools/conformance.d.ts +8 -0
- package/dist/tools/index.cjs +6 -2
- package/dist/tools/index.js +5 -1
- package/dist/vector/backdrop.d.cts +13 -0
- package/dist/vector/backdrop.d.ts +13 -0
- package/dist/vector/brushstroke.d.cts +54 -7
- package/dist/vector/brushstroke.d.ts +54 -7
- package/dist/vector/brushstrokeMedia.d.cts +96 -0
- package/dist/vector/brushstrokeMedia.d.ts +96 -0
- package/dist/vector/controller.d.cts +17 -3
- package/dist/vector/controller.d.ts +17 -3
- package/dist/vector/index.cjs +1846 -1386
- package/dist/vector/index.d.cts +2 -0
- package/dist/vector/index.d.ts +2 -0
- package/dist/vector/index.js +517 -57
- package/dist/vector/render.d.cts +6 -0
- package/dist/vector/render.d.ts +6 -0
- package/dist/vector/types.d.cts +14 -0
- package/dist/vector/types.d.ts +14 -0
- package/package.json +1 -1
- package/skills/pixerate-animation-editor/SKILL.md +1 -0
- package/skills/pixerate-brushes/SKILL.md +2 -2
- package/skills/pixerate-brushes-design/SKILL.md +7 -4
- package/skills/pixerate-brushes-design/evals/port-to-vector.json +8 -8
- package/skills/pixerate-canvas/SKILL.md +11 -1
- package/skills/pixerate-image-editor/SKILL.md +19 -64
- package/skills/pixerate-image-editor/references/color-management.md +2 -1
- package/skills/pixerate-image-editor/references/free-transform.md +12 -0
- package/skills/pixerate-image-editor/references/layer-effects.md +10 -0
- package/skills/pixerate-image-editor/references/painting.md +17 -0
- package/skills/pixerate-image-editor/references/photoshop-files.md +1 -1
- package/skills/pixerate-image-editor/references/shapes-and-type.md +14 -0
- package/skills/pixerate-image-editor/references/smart-objects.md +10 -0
- package/skills/pixerate-paint-editor/SKILL.md +8 -4
- package/skills/pixerate-paint-editor/references/wet-media.md +9 -0
- package/skills/pixerate-vector/SKILL.md +16 -6
- package/skills/pixerate-vector/references/best-practices.md +1 -0
- package/skills/pixerate-vector/references/commands.md +19 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkHIO6E7LCcjs = require('./chunk-HIO6E7LC.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkJ2TNIZ55cjs = require('./chunk-J2TNIZ55.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
@@ -14,8 +14,8 @@ var _chunkTOID45I2cjs = require('./chunk-TOID45I2.cjs');
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
var
|
|
18
|
-
require('./chunk-
|
|
17
|
+
var _chunkXVOP3CGQcjs = require('./chunk-XVOP3CGQ.cjs');
|
|
18
|
+
require('./chunk-RDFHWAHL.cjs');
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
@@ -48,17 +48,17 @@ require('./chunk-5UEFBM2M.cjs');
|
|
|
48
48
|
require('./chunk-IPJ3TEYR.cjs');
|
|
49
49
|
|
|
50
50
|
// src/canvas/brushstrokeRender.ts
|
|
51
|
-
var PRESETS =
|
|
51
|
+
var PRESETS = _chunkXVOP3CGQcjs.listPresets.call(void 0, _chunkXVOP3CGQcjs.CANVAS_PROFILE).map((spec) => _chunkXVOP3CGQcjs.BUILTIN_BRUSHES.find((b) => b.id === spec.id));
|
|
52
52
|
var presetIds = () => PRESETS.map((b) => b.id).join(", ");
|
|
53
|
-
var refusal = (brush) =>
|
|
53
|
+
var refusal = (brush) => _chunkXVOP3CGQcjs.checkBrush.call(void 0, brush, _chunkXVOP3CGQcjs.CANVAS_PROFILE).issues.filter((i) => i.severity === "error").map((i) => `${i.reason} ${i.fix}`).join(" ");
|
|
54
54
|
function readCanvasBrushSpec(spec) {
|
|
55
55
|
let brush;
|
|
56
56
|
try {
|
|
57
|
-
brush =
|
|
57
|
+
brush = _chunkXVOP3CGQcjs.normalizeBrushSpec.call(void 0, spec);
|
|
58
58
|
} catch (e) {
|
|
59
59
|
throw new Error(`Not a brush: ${e.message}`);
|
|
60
60
|
}
|
|
61
|
-
if (!
|
|
61
|
+
if (!_chunkXVOP3CGQcjs.checkBrush.call(void 0, brush, _chunkXVOP3CGQcjs.CANVAS_PROFILE).ok) throw new Error(`Brush '${brush.id}' (${brush.name}) can't brush a canvas stroke: ${refusal(brush)}`);
|
|
62
62
|
return brush;
|
|
63
63
|
}
|
|
64
64
|
function listCanvasBrushes(user = []) {
|
|
@@ -66,12 +66,12 @@ function listCanvasBrushes(user = []) {
|
|
|
66
66
|
const d = _optionalChain([spec, 'access', _2 => _2.colour, 'optionalAccess', _3 => _3.default]);
|
|
67
67
|
return typeof d === "string" || _chunkMLLTWAXHcjs.isDualColor.call(void 0, d) ? { defaultColor: d } : {};
|
|
68
68
|
};
|
|
69
|
-
const out = PRESETS.map((b) => ({ id: b.id, name: b.name, category: b.category, size: b.tip.size, builtin: true, ...colourOf(
|
|
69
|
+
const out = PRESETS.map((b) => ({ id: b.id, name: b.name, category: b.category, size: b.tip.size, builtin: true, ...colourOf(_chunkXVOP3CGQcjs.BRUSH_PRESETS.find((p) => p.id === b.id)) }));
|
|
70
70
|
for (const raw of user) {
|
|
71
71
|
try {
|
|
72
72
|
const brush = readCanvasBrushSpec(raw);
|
|
73
73
|
if (out.some((b) => b.id === brush.id)) continue;
|
|
74
|
-
out.push({ id: brush.id, name: brush.name, category:
|
|
74
|
+
out.push({ id: brush.id, name: brush.name, category: _chunkXVOP3CGQcjs.resolveCategory.call(void 0, brush), size: _chunkXVOP3CGQcjs.resolveBrush.call(void 0, brush).tip.size, builtin: false, spec: brush, ...colourOf(brush) });
|
|
75
75
|
} catch (e2) {
|
|
76
76
|
}
|
|
77
77
|
}
|
|
@@ -82,15 +82,15 @@ function resolveCanvasBrush(brush, width, spec) {
|
|
|
82
82
|
const sized = (b) => given === void 0 ? b : { ...b, tip: { ...b.tip, size: given } };
|
|
83
83
|
if (typeof brush === "string") {
|
|
84
84
|
if (spec !== void 0 && spec !== null) {
|
|
85
|
-
const saved =
|
|
85
|
+
const saved = _chunkXVOP3CGQcjs.resolveBrush.call(void 0, readCanvasBrushSpec(spec));
|
|
86
86
|
if (!_chunkPXDIAYB6cjs.isBrushstrokeBrush.call(void 0, saved)) throw new Error(`Brush '${saved.id}' (${saved.name}) can't brush a canvas stroke: it is not a dry dab brush.`);
|
|
87
87
|
return sized(saved);
|
|
88
88
|
}
|
|
89
89
|
const preset = PRESETS.find((b) => b.id === brush);
|
|
90
90
|
if (preset) return sized(preset);
|
|
91
|
-
const other =
|
|
91
|
+
const other = _chunkXVOP3CGQcjs.BRUSH_PRESETS.find((b) => b.id === brush);
|
|
92
92
|
if (other) throw new Error(`Brush '${brush}' (${other.name}) can't brush a canvas stroke: ${refusal(other)} Use one of: ${presetIds()}, or a saved brush the canvas can paint.`);
|
|
93
|
-
throw new Error(`Unknown brush '${brush}'. ${
|
|
93
|
+
throw new Error(`Unknown brush '${brush}'. ${_chunkXVOP3CGQcjs.closest.call(void 0, brush, PRESETS.map((b) => b.id))}Use one of the dry presets (${presetIds()}), a saved brush from the brush library, or tip settings ({ hardness, spacing, flow, \u2026 }).`);
|
|
94
94
|
}
|
|
95
95
|
if (!brush || typeof brush !== "object" || Array.isArray(brush)) {
|
|
96
96
|
throw new Error("A brush is a preset or saved brush id (see listCanvasBrushes / canvas.listBrushes) or an object of tip settings.");
|
|
@@ -126,7 +126,7 @@ function renderShapeBrushstrokeNow(shape, scale, place = {}) {
|
|
|
126
126
|
const textured = typeof seed === "number" && Number.isFinite(seed);
|
|
127
127
|
const size = _nullishCoalesce(shape.brush.size, () => ( (textured ? void 0 : _nullishCoalesce(shape.strokeWidth, () => ( 3)))));
|
|
128
128
|
const brush = resolveCanvasBrush(shape.brush.brush, size, shape.brush.spec);
|
|
129
|
-
const points =
|
|
129
|
+
const points = _chunkJ2TNIZ55cjs.pathDataToPolyline.call(void 0, shape.d);
|
|
130
130
|
if (!points.length) return null;
|
|
131
131
|
const { pressure, tiltX, tiltY } = shape.brush;
|
|
132
132
|
const input = {
|
|
@@ -164,8 +164,8 @@ function brushedShapeSvgNow(shape, size, scale, place = {}) {
|
|
|
164
164
|
return `<svg xmlns="http://www.w3.org/2000/svg" width="${f(size.width)}" height="${f(size.height)}" viewBox="0 0 ${f(size.width)} ${f(size.height)}">${content}</svg>`;
|
|
165
165
|
}
|
|
166
166
|
function swatchColour(brush, background, spec) {
|
|
167
|
-
const facets = typeof brush !== "string" ? null : spec ? readCanvasBrushSpec(spec) :
|
|
168
|
-
return background && facets ?
|
|
167
|
+
const facets = typeof brush !== "string" ? null : spec ? readCanvasBrushSpec(spec) : _chunkXVOP3CGQcjs.BRUSH_PRESETS.find((b) => b.id === brush);
|
|
168
|
+
return background && facets ? _chunkHIO6E7LCcjs.brushPreviewColours.call(void 0, facets, { paper: background, profile: _chunkXVOP3CGQcjs.CANVAS_PROFILE, keepPaper: true }).color : "#1f2937";
|
|
169
169
|
}
|
|
170
170
|
function brushSwatchNow(brush, options, spec) {
|
|
171
171
|
const w = options.width && options.width > 8 ? options.width : 96;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
brushPreviewColours
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EYSHTYLG.js";
|
|
4
4
|
import {
|
|
5
5
|
pathDataToPolyline
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-EF7LZAXQ.js";
|
|
7
7
|
import {
|
|
8
8
|
BRUSH_PRESETS,
|
|
9
9
|
BUILTIN_BRUSHES,
|
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
normalizeBrushSpec,
|
|
15
15
|
resolveBrush,
|
|
16
16
|
resolveCategory
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-AGNUD5BI.js";
|
|
18
|
+
import "./chunk-JL6YH5WD.js";
|
|
19
19
|
import {
|
|
20
20
|
formatNumber,
|
|
21
21
|
getShapeSvg,
|
|
@@ -153,3 +153,15 @@ export interface CanvasBrushPreset {
|
|
|
153
153
|
/** The preset's own tip diameter in canvas units: a new brushed stroke's default size. */
|
|
154
154
|
size: number;
|
|
155
155
|
}
|
|
156
|
+
/** What the canvas brush picker is set to (`brushSettings()` of the draw controller). */
|
|
157
|
+
export interface CanvasBrushChoice {
|
|
158
|
+
/** The preset or saved brush id the pen draws with by hand, or null for a plain vector stroke. */
|
|
159
|
+
brush: string | null;
|
|
160
|
+
/** The stroke colour, or null while strokes take a gradient. */
|
|
161
|
+
color: string | null;
|
|
162
|
+
colorScheme: 'light' | 'dark';
|
|
163
|
+
/** "Keep my colour": choosing a brush keeps the stroke colour. */
|
|
164
|
+
colorLocked: boolean;
|
|
165
|
+
/** The colour is a brush's light / dark default and changes with the scheme. */
|
|
166
|
+
colorFollowsScheme: boolean;
|
|
167
|
+
}
|
|
@@ -153,3 +153,15 @@ export interface CanvasBrushPreset {
|
|
|
153
153
|
/** The preset's own tip diameter in canvas units: a new brushed stroke's default size. */
|
|
154
154
|
size: number;
|
|
155
155
|
}
|
|
156
|
+
/** What the canvas brush picker is set to (`brushSettings()` of the draw controller). */
|
|
157
|
+
export interface CanvasBrushChoice {
|
|
158
|
+
/** The preset or saved brush id the pen draws with by hand, or null for a plain vector stroke. */
|
|
159
|
+
brush: string | null;
|
|
160
|
+
/** The stroke colour, or null while strokes take a gradient. */
|
|
161
|
+
color: string | null;
|
|
162
|
+
colorScheme: 'light' | 'dark';
|
|
163
|
+
/** "Keep my colour": choosing a brush keeps the stroke colour. */
|
|
164
|
+
colorLocked: boolean;
|
|
165
|
+
/** The colour is a brush's light / dark default and changes with the scheme. */
|
|
166
|
+
colorFollowsScheme: boolean;
|
|
167
|
+
}
|
|
@@ -11,7 +11,7 @@ import type { Point } from './types.cjs';
|
|
|
11
11
|
import type { CanvasBrush, CanvasBrushPaint, CanvasBrushPreset, CanvasBrushSpec, CanvasBrushstroke } from './brushTypes.cjs';
|
|
12
12
|
import type { BrushLibrary } from '../brushes/library.cjs';
|
|
13
13
|
import type { BrushPreviewRenderer } from '../brushes/tools.cjs';
|
|
14
|
-
export type { CanvasBrush, CanvasBrushPaint, CanvasBrushPaintMapping, CanvasBrushPaintStop, CanvasBrushPaper, CanvasBrushPreset, CanvasBrushSettings, CanvasBrushSpec, CanvasBrushstroke } from './brushTypes.cjs';
|
|
14
|
+
export type { CanvasBrush, CanvasBrushPaint, CanvasBrushPaintMapping, CanvasBrushPaintStop, CanvasBrushPaper, CanvasBrushChoice, CanvasBrushPreset, CanvasBrushSettings, CanvasBrushSpec, CanvasBrushstroke } from './brushTypes.cjs';
|
|
15
15
|
export { brushstrokeScaleBucket };
|
|
16
16
|
/** A brushed stroke's image, placed in the path's coordinates (the shape's view box). */
|
|
17
17
|
export interface CanvasBrushstrokeImage {
|
|
@@ -11,7 +11,7 @@ import type { Point } from './types.js';
|
|
|
11
11
|
import type { CanvasBrush, CanvasBrushPaint, CanvasBrushPreset, CanvasBrushSpec, CanvasBrushstroke } from './brushTypes.js';
|
|
12
12
|
import type { BrushLibrary } from '../brushes/library.js';
|
|
13
13
|
import type { BrushPreviewRenderer } from '../brushes/tools.js';
|
|
14
|
-
export type { CanvasBrush, CanvasBrushPaint, CanvasBrushPaintMapping, CanvasBrushPaintStop, CanvasBrushPaper, CanvasBrushPreset, CanvasBrushSettings, CanvasBrushSpec, CanvasBrushstroke } from './brushTypes.js';
|
|
14
|
+
export type { CanvasBrush, CanvasBrushPaint, CanvasBrushPaintMapping, CanvasBrushPaintStop, CanvasBrushPaper, CanvasBrushChoice, CanvasBrushPreset, CanvasBrushSettings, CanvasBrushSpec, CanvasBrushstroke } from './brushTypes.js';
|
|
15
15
|
export { brushstrokeScaleBucket };
|
|
16
16
|
/** A brushed stroke's image, placed in the path's coordinates (the shape's view box). */
|
|
17
17
|
export interface CanvasBrushstrokeImage {
|
|
@@ -7,7 +7,7 @@ import type { CanvasNode, Point } from './types.cjs';
|
|
|
7
7
|
import { type FreehandDrawOptions, type FreehandPenSample, type FreehandStroke, type FreehandStrokeStyle, type FreehandTool } from './freehand.cjs';
|
|
8
8
|
import { type CanvasBrush } from './brushstroke.cjs';
|
|
9
9
|
import type { BrushLibrary } from '../brushes/library.cjs';
|
|
10
|
-
import type { CanvasBrushPreset } from './brushTypes.cjs';
|
|
10
|
+
import type { CanvasBrushPreset, CanvasBrushChoice } from './brushTypes.cjs';
|
|
11
11
|
/** A stroke drawn by code or an agent (`drawStroke`). */
|
|
12
12
|
export interface DrawStrokeInput {
|
|
13
13
|
/** Points in canvas (flow) coordinates, at least one. */
|
|
@@ -45,6 +45,8 @@ export interface CanvasDrawControllerOptions<TNode extends CanvasNode = CanvasNo
|
|
|
45
45
|
brushLibrary?: Pick<BrushLibrary, 'list' | 'get' | 'isBuiltin'>;
|
|
46
46
|
/** The host's colour scheme (default light): a brush's light / dark default colour resolves to its side. */
|
|
47
47
|
colorScheme?: 'light' | 'dark';
|
|
48
|
+
/** Start with the colour locked: choosing a brush keeps the stroke colour (see `setColorLocked`). */
|
|
49
|
+
colorLocked?: boolean;
|
|
48
50
|
getNodes: () => TNode[];
|
|
49
51
|
setNodes: (nodes: TNode[]) => void;
|
|
50
52
|
history?: ArrangeHistoryTarget;
|
|
@@ -54,6 +56,8 @@ export interface CanvasDrawControllerOptions<TNode extends CanvasNode = CanvasNo
|
|
|
54
56
|
generateNodeId?: () => string;
|
|
55
57
|
onToolChange?: (tool: FreehandTool) => void;
|
|
56
58
|
onStyleChange?: (style: FreehandStrokeStyle) => void;
|
|
59
|
+
/** The colour lock changed (`setColorLocked`). */
|
|
60
|
+
onColorLockChange?: (locked: boolean) => void;
|
|
57
61
|
onActiveStrokeChange?: (stroke: FreehandStroke | null) => void;
|
|
58
62
|
onStrokeComplete?: (node: TNode) => void;
|
|
59
63
|
onNodesErase?: (erasedNodes: TNode[]) => void;
|
|
@@ -82,14 +86,25 @@ export declare function createCanvasDrawController<TNode extends CanvasNode = Ca
|
|
|
82
86
|
/**
|
|
83
87
|
* A brush picker's choice: brushes the pen and highlighter with `id` (`null`: a plain vector
|
|
84
88
|
* stroke) at the brush's own size, embedding a saved brush, and makes its default colour
|
|
85
|
-
* (resolved for the colour scheme) the stroke colour unless `keepColour
|
|
86
|
-
*
|
|
89
|
+
* (resolved for the colour scheme) the stroke colour unless `keepColour` or the colour is
|
|
90
|
+
* locked (`setColorLocked`). A light / dark default resolves again when the scheme changes,
|
|
91
|
+
* until another colour is set. Throws for a brush the canvas can't paint. Resolves with the
|
|
92
|
+
* brush chosen.
|
|
87
93
|
*/
|
|
88
94
|
selectBrush(id: string | null, choice?: {
|
|
89
95
|
keepColour?: boolean;
|
|
90
96
|
}): Promise<CanvasBrushPreset | null>;
|
|
91
|
-
|
|
97
|
+
readonly colorScheme: "light" | "dark";
|
|
98
|
+
/**
|
|
99
|
+
* The host's colour scheme, for brushes' light / dark default colours: a stroke colour that
|
|
100
|
+
* came from one (`selectBrush`) resolves to the new side. Strokes already drawn keep theirs.
|
|
101
|
+
*/
|
|
92
102
|
setColorScheme(scheme: "light" | "dark"): void;
|
|
103
|
+
readonly colorLocked: boolean;
|
|
104
|
+
/** Locks the stroke colour ("Keep my colour"): choosing a brush with a default colour keeps it. */
|
|
105
|
+
setColorLocked(locked: boolean): void;
|
|
106
|
+
/** What the brush picker is set to: the brush, colour, scheme and lock (a snapshot). */
|
|
107
|
+
brushSettings(): CanvasBrushChoice;
|
|
93
108
|
/** The saved brush to embed for a brush id (undefined for presets and tip settings); for a brush picker. */
|
|
94
109
|
brushSpec: (brush: CanvasBrush) => Promise<import("./brushTypes.cjs").CanvasBrushSpec | undefined>;
|
|
95
110
|
};
|
|
@@ -7,7 +7,7 @@ import type { CanvasNode, Point } from './types.js';
|
|
|
7
7
|
import { type FreehandDrawOptions, type FreehandPenSample, type FreehandStroke, type FreehandStrokeStyle, type FreehandTool } from './freehand.js';
|
|
8
8
|
import { type CanvasBrush } from './brushstroke.js';
|
|
9
9
|
import type { BrushLibrary } from '../brushes/library.js';
|
|
10
|
-
import type { CanvasBrushPreset } from './brushTypes.js';
|
|
10
|
+
import type { CanvasBrushPreset, CanvasBrushChoice } from './brushTypes.js';
|
|
11
11
|
/** A stroke drawn by code or an agent (`drawStroke`). */
|
|
12
12
|
export interface DrawStrokeInput {
|
|
13
13
|
/** Points in canvas (flow) coordinates, at least one. */
|
|
@@ -45,6 +45,8 @@ export interface CanvasDrawControllerOptions<TNode extends CanvasNode = CanvasNo
|
|
|
45
45
|
brushLibrary?: Pick<BrushLibrary, 'list' | 'get' | 'isBuiltin'>;
|
|
46
46
|
/** The host's colour scheme (default light): a brush's light / dark default colour resolves to its side. */
|
|
47
47
|
colorScheme?: 'light' | 'dark';
|
|
48
|
+
/** Start with the colour locked: choosing a brush keeps the stroke colour (see `setColorLocked`). */
|
|
49
|
+
colorLocked?: boolean;
|
|
48
50
|
getNodes: () => TNode[];
|
|
49
51
|
setNodes: (nodes: TNode[]) => void;
|
|
50
52
|
history?: ArrangeHistoryTarget;
|
|
@@ -54,6 +56,8 @@ export interface CanvasDrawControllerOptions<TNode extends CanvasNode = CanvasNo
|
|
|
54
56
|
generateNodeId?: () => string;
|
|
55
57
|
onToolChange?: (tool: FreehandTool) => void;
|
|
56
58
|
onStyleChange?: (style: FreehandStrokeStyle) => void;
|
|
59
|
+
/** The colour lock changed (`setColorLocked`). */
|
|
60
|
+
onColorLockChange?: (locked: boolean) => void;
|
|
57
61
|
onActiveStrokeChange?: (stroke: FreehandStroke | null) => void;
|
|
58
62
|
onStrokeComplete?: (node: TNode) => void;
|
|
59
63
|
onNodesErase?: (erasedNodes: TNode[]) => void;
|
|
@@ -82,14 +86,25 @@ export declare function createCanvasDrawController<TNode extends CanvasNode = Ca
|
|
|
82
86
|
/**
|
|
83
87
|
* A brush picker's choice: brushes the pen and highlighter with `id` (`null`: a plain vector
|
|
84
88
|
* stroke) at the brush's own size, embedding a saved brush, and makes its default colour
|
|
85
|
-
* (resolved for the colour scheme) the stroke colour unless `keepColour
|
|
86
|
-
*
|
|
89
|
+
* (resolved for the colour scheme) the stroke colour unless `keepColour` or the colour is
|
|
90
|
+
* locked (`setColorLocked`). A light / dark default resolves again when the scheme changes,
|
|
91
|
+
* until another colour is set. Throws for a brush the canvas can't paint. Resolves with the
|
|
92
|
+
* brush chosen.
|
|
87
93
|
*/
|
|
88
94
|
selectBrush(id: string | null, choice?: {
|
|
89
95
|
keepColour?: boolean;
|
|
90
96
|
}): Promise<CanvasBrushPreset | null>;
|
|
91
|
-
|
|
97
|
+
readonly colorScheme: "light" | "dark";
|
|
98
|
+
/**
|
|
99
|
+
* The host's colour scheme, for brushes' light / dark default colours: a stroke colour that
|
|
100
|
+
* came from one (`selectBrush`) resolves to the new side. Strokes already drawn keep theirs.
|
|
101
|
+
*/
|
|
92
102
|
setColorScheme(scheme: "light" | "dark"): void;
|
|
103
|
+
readonly colorLocked: boolean;
|
|
104
|
+
/** Locks the stroke colour ("Keep my colour"): choosing a brush with a default colour keeps it. */
|
|
105
|
+
setColorLocked(locked: boolean): void;
|
|
106
|
+
/** What the brush picker is set to: the brush, colour, scheme and lock (a snapshot). */
|
|
107
|
+
brushSettings(): CanvasBrushChoice;
|
|
93
108
|
/** The saved brush to embed for a brush id (undefined for presets and tip settings); for a brush picker. */
|
|
94
109
|
brushSpec: (brush: CanvasBrush) => Promise<import("./brushTypes.js").CanvasBrushSpec | undefined>;
|
|
95
110
|
};
|