@pixerate/editor 0.266.2 → 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.
Files changed (111) hide show
  1. package/dist/agent/index.cjs +2 -2
  2. package/dist/agent/index.js +1 -1
  3. package/dist/animation-editor/controller.d.cts +8 -0
  4. package/dist/animation-editor/controller.d.ts +8 -0
  5. package/dist/animation-editor/effect-tools.d.cts +1 -1
  6. package/dist/animation-editor/effect-tools.d.ts +1 -1
  7. package/dist/animation-editor/index.cjs +172 -105
  8. package/dist/animation-editor/index.js +91 -24
  9. package/dist/brushes/index.cjs +59 -59
  10. package/dist/brushes/index.js +5 -5
  11. package/dist/brushes/profiles.d.cts +6 -1
  12. package/dist/brushes/profiles.d.ts +6 -1
  13. package/dist/{brushstrokeRender-FSUWXUZY.cjs → brushstrokeRender-L7JYRR2R.cjs} +16 -16
  14. package/dist/{brushstrokeRender-KD453OBX.js → brushstrokeRender-NLFPEBGI.js} +4 -4
  15. package/dist/canvas/brushTypes.d.cts +12 -0
  16. package/dist/canvas/brushTypes.d.ts +12 -0
  17. package/dist/canvas/brushstroke.d.cts +1 -1
  18. package/dist/canvas/brushstroke.d.ts +1 -1
  19. package/dist/canvas/drawController.d.cts +19 -4
  20. package/dist/canvas/drawController.d.ts +19 -4
  21. package/dist/canvas/index.cjs +144 -105
  22. package/dist/canvas/index.js +46 -7
  23. package/dist/{chunk-XORJ7UZO.cjs → chunk-3VHH6V67.cjs} +13 -12
  24. package/dist/{chunk-T2LDTEXK.js → chunk-4IDUYB45.js} +2217 -56
  25. package/dist/chunk-7UKFXXWL.js +802 -0
  26. package/dist/chunk-ADMRNWR7.js +340 -0
  27. package/dist/{chunk-CIJBSUM5.js → chunk-AGNUD5BI.js} +2 -2
  28. package/dist/{chunk-WLUVZKVD.cjs → chunk-DT4YQUGT.cjs} +32 -32
  29. package/dist/{chunk-DXYHQ2VN.js → chunk-EF7LZAXQ.js} +1 -1
  30. package/dist/chunk-EXB2EGBE.cjs +802 -0
  31. package/dist/{chunk-4ODRXQRW.js → chunk-EYSHTYLG.js} +1 -1
  32. package/dist/{chunk-R44Y3EFS.js → chunk-FGJHJIMN.js} +8 -336
  33. package/dist/{chunk-AQZQWXEU.cjs → chunk-G7NHE2VD.cjs} +35 -35
  34. package/dist/{chunk-XC6DPRYI.js → chunk-GSTSZPSR.js} +154 -949
  35. package/dist/{chunk-VRK322ZC.cjs → chunk-HIO6E7LC.cjs} +2 -2
  36. package/dist/{chunk-TOID45I2.cjs → chunk-J2TNIZ55.cjs} +1 -1
  37. package/dist/{chunk-YHDHFJUC.cjs → chunk-J5VQYK7T.cjs} +217 -1012
  38. package/dist/{chunk-3C33YTNN.js → chunk-JGWVZPT6.js} +2 -2
  39. package/dist/{chunk-ACFSFUQH.js → chunk-JL6YH5WD.js} +4 -0
  40. package/dist/{chunk-3SBLVGOM.cjs → chunk-LA5Y4ETA.cjs} +23 -23
  41. package/dist/{chunk-MVUQSK5J.cjs → chunk-LHPEG5AU.cjs} +107 -435
  42. package/dist/{chunk-DOZ6F2K2.js → chunk-NSETJI74.js} +3 -2
  43. package/dist/{chunk-XRXFVRGY.cjs → chunk-OKHKA43L.cjs} +2364 -203
  44. package/dist/{chunk-LK4SXL3V.js → chunk-OSEXT7JL.js} +1 -1
  45. package/dist/{chunk-PE6YJMQT.cjs → chunk-PFHJS4HE.cjs} +20 -19
  46. package/dist/{chunk-7KNW3WXZ.cjs → chunk-QEVLRLUN.cjs} +63 -0
  47. package/dist/{chunk-OTN6VB5S.cjs → chunk-RDFHWAHL.cjs} +5 -1
  48. package/dist/{chunk-6JL2D5SG.js → chunk-VE6UKYQ2.js} +3 -2
  49. package/dist/{chunk-RFJZGTHA.cjs → chunk-XVOP3CGQ.cjs} +9 -9
  50. package/dist/{chunk-EZOJBP4D.js → chunk-YIC6MAJ2.js} +1 -1
  51. package/dist/chunk-YZWM6ZIP.cjs +340 -0
  52. package/dist/{chunk-472INMWH.js → chunk-ZA7L5YJB.js} +63 -0
  53. package/dist/commands/builtins.d.cts +12 -1
  54. package/dist/commands/builtins.d.ts +12 -1
  55. package/dist/commands/index.cjs +2 -2
  56. package/dist/commands/index.js +1 -1
  57. package/dist/image-editor/controller.d.cts +1 -1
  58. package/dist/image-editor/controller.d.ts +1 -1
  59. package/dist/image-editor/index.cjs +837 -833
  60. package/dist/image-editor/index.js +105 -101
  61. package/dist/paint/index.cjs +5 -3
  62. package/dist/paint/index.js +46 -44
  63. package/dist/paint-editor/controller.d.cts +5 -3
  64. package/dist/paint-editor/controller.d.ts +5 -3
  65. package/dist/paint-editor/index.cjs +832 -2295
  66. package/dist/paint-editor/index.js +285 -1748
  67. package/dist/paint-editor/path-samples.d.cts +2 -0
  68. package/dist/paint-editor/path-samples.d.ts +2 -0
  69. package/dist/paint-editor/presence.d.cts +20 -1
  70. package/dist/paint-editor/presence.d.ts +20 -1
  71. package/dist/stickers/helpers.d.cts +2 -0
  72. package/dist/stickers/helpers.d.ts +2 -0
  73. package/dist/stickers/index.cjs +41 -35
  74. package/dist/stickers/index.js +22 -16
  75. package/dist/stickers/types.d.cts +4 -2
  76. package/dist/stickers/types.d.ts +4 -2
  77. package/dist/vector/backdrop.d.cts +13 -0
  78. package/dist/vector/backdrop.d.ts +13 -0
  79. package/dist/vector/brushstroke.d.cts +54 -7
  80. package/dist/vector/brushstroke.d.ts +54 -7
  81. package/dist/vector/brushstrokeMedia.d.cts +96 -0
  82. package/dist/vector/brushstrokeMedia.d.ts +96 -0
  83. package/dist/vector/controller.d.cts +17 -3
  84. package/dist/vector/controller.d.ts +17 -3
  85. package/dist/vector/index.cjs +1846 -1386
  86. package/dist/vector/index.d.cts +2 -0
  87. package/dist/vector/index.d.ts +2 -0
  88. package/dist/vector/index.js +517 -57
  89. package/dist/vector/render.d.cts +6 -0
  90. package/dist/vector/render.d.ts +6 -0
  91. package/dist/vector/types.d.cts +14 -0
  92. package/dist/vector/types.d.ts +14 -0
  93. package/package.json +1 -1
  94. package/skills/pixerate-animation-editor/SKILL.md +1 -0
  95. package/skills/pixerate-brushes/SKILL.md +2 -2
  96. package/skills/pixerate-brushes-design/SKILL.md +7 -4
  97. package/skills/pixerate-brushes-design/evals/port-to-vector.json +8 -8
  98. package/skills/pixerate-canvas/SKILL.md +11 -1
  99. package/skills/pixerate-image-editor/SKILL.md +19 -64
  100. package/skills/pixerate-image-editor/references/color-management.md +2 -1
  101. package/skills/pixerate-image-editor/references/free-transform.md +12 -0
  102. package/skills/pixerate-image-editor/references/layer-effects.md +10 -0
  103. package/skills/pixerate-image-editor/references/painting.md +17 -0
  104. package/skills/pixerate-image-editor/references/photoshop-files.md +1 -1
  105. package/skills/pixerate-image-editor/references/shapes-and-type.md +14 -0
  106. package/skills/pixerate-image-editor/references/smart-objects.md +10 -0
  107. package/skills/pixerate-paint-editor/SKILL.md +8 -4
  108. package/skills/pixerate-paint-editor/references/wet-media.md +9 -0
  109. package/skills/pixerate-vector/SKILL.md +16 -6
  110. package/skills/pixerate-vector/references/best-practices.md +1 -0
  111. 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 _chunkVRK322ZCcjs = require('./chunk-VRK322ZC.cjs');
3
+ var _chunkHIO6E7LCcjs = require('./chunk-HIO6E7LC.cjs');
4
4
 
5
5
 
6
- var _chunkTOID45I2cjs = require('./chunk-TOID45I2.cjs');
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 _chunkRFJZGTHAcjs = require('./chunk-RFJZGTHA.cjs');
18
- require('./chunk-OTN6VB5S.cjs');
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 = _chunkRFJZGTHAcjs.listPresets.call(void 0, _chunkRFJZGTHAcjs.CANVAS_PROFILE).map((spec) => _chunkRFJZGTHAcjs.BUILTIN_BRUSHES.find((b) => b.id === spec.id));
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) => _chunkRFJZGTHAcjs.checkBrush.call(void 0, brush, _chunkRFJZGTHAcjs.CANVAS_PROFILE).issues.filter((i) => i.severity === "error").map((i) => `${i.reason} ${i.fix}`).join(" ");
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 = _chunkRFJZGTHAcjs.normalizeBrushSpec.call(void 0, spec);
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 (!_chunkRFJZGTHAcjs.checkBrush.call(void 0, brush, _chunkRFJZGTHAcjs.CANVAS_PROFILE).ok) throw new Error(`Brush '${brush.id}' (${brush.name}) can't brush a canvas stroke: ${refusal(brush)}`);
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(_chunkRFJZGTHAcjs.BRUSH_PRESETS.find((p) => p.id === b.id)) }));
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: _chunkRFJZGTHAcjs.resolveCategory.call(void 0, brush), size: _chunkRFJZGTHAcjs.resolveBrush.call(void 0, brush).tip.size, builtin: false, spec: brush, ...colourOf(brush) });
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 = _chunkRFJZGTHAcjs.resolveBrush.call(void 0, readCanvasBrushSpec(spec));
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 = _chunkRFJZGTHAcjs.BRUSH_PRESETS.find((b) => b.id === brush);
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}'. ${_chunkRFJZGTHAcjs.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 }).`);
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 = _chunkTOID45I2cjs.pathDataToPolyline.call(void 0, shape.d);
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) : _chunkRFJZGTHAcjs.BRUSH_PRESETS.find((b) => b.id === brush);
168
- return background && facets ? _chunkVRK322ZCcjs.brushPreviewColours.call(void 0, facets, { paper: background, profile: _chunkRFJZGTHAcjs.CANVAS_PROFILE, keepPaper: true }).color : "#1f2937";
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-4ODRXQRW.js";
3
+ } from "./chunk-EYSHTYLG.js";
4
4
  import {
5
5
  pathDataToPolyline
6
- } from "./chunk-DXYHQ2VN.js";
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-CIJBSUM5.js";
18
- import "./chunk-ACFSFUQH.js";
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`. Throws for a brush
86
- * the canvas can't paint. Resolves with the brush chosen.
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
- /** The host's colour scheme, for brushes' light / dark default colours. */
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`. Throws for a brush
86
- * the canvas can't paint. Resolves with the brush chosen.
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
- /** The host's colour scheme, for brushes' light / dark default colours. */
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
  };