@pixerate/editor 0.250.0 → 0.252.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 (137) hide show
  1. package/dist/agent/index.cjs +40 -41
  2. package/dist/agent/index.js +9 -10
  3. package/dist/animation/index.cjs +6 -7
  4. package/dist/animation/index.js +5 -6
  5. package/dist/animation-editor/index.cjs +70 -70
  6. package/dist/animation-editor/index.js +12 -12
  7. package/dist/brushes/index.cjs +2087 -0
  8. package/dist/brushes/index.d.cts +17 -0
  9. package/dist/brushes/index.d.ts +17 -0
  10. package/dist/brushes/index.js +2087 -0
  11. package/dist/brushes/library.d.cts +104 -0
  12. package/dist/brushes/library.d.ts +104 -0
  13. package/dist/brushes/migrate.d.cts +17 -0
  14. package/dist/brushes/migrate.d.ts +17 -0
  15. package/dist/brushes/normalize.d.cts +15 -0
  16. package/dist/brushes/normalize.d.ts +15 -0
  17. package/dist/brushes/presets.d.cts +12 -0
  18. package/dist/brushes/presets.d.ts +12 -0
  19. package/dist/brushes/profiles.d.cts +85 -0
  20. package/dist/brushes/profiles.d.ts +85 -0
  21. package/dist/brushes/resolve.d.cts +56 -0
  22. package/dist/brushes/resolve.d.ts +56 -0
  23. package/dist/brushes/schema.d.cts +29 -0
  24. package/dist/brushes/schema.d.ts +29 -0
  25. package/dist/brushes/tools.d.cts +37 -0
  26. package/dist/brushes/tools.d.ts +37 -0
  27. package/dist/brushes/types.d.cts +323 -0
  28. package/dist/brushes/types.d.ts +323 -0
  29. package/dist/{brushstrokeRender-2FHFLSEG.js → brushstrokeRender-5PYSKZIJ.js} +8 -8
  30. package/dist/{brushstrokeRender-QGRXOKDA.cjs → brushstrokeRender-7FLLSQEC.cjs} +14 -14
  31. package/dist/canvas/index.cjs +57 -58
  32. package/dist/canvas/index.js +31 -32
  33. package/dist/chart/index.cjs +159 -160
  34. package/dist/chart/index.js +9 -10
  35. package/dist/{chunk-NOHJP5TK.js → chunk-2ZJ4DT3M.js} +1 -1
  36. package/dist/{chunk-XZNU4DUX.cjs → chunk-3NS5C7FB.cjs} +76 -76
  37. package/dist/{chunk-UTI5IITZ.cjs → chunk-4ZC5QJE2.cjs} +3 -3
  38. package/dist/{chunk-SMSGP2HQ.js → chunk-5JNA6LLY.js} +1 -1
  39. package/dist/{chunk-RD7RX52G.cjs → chunk-5UEFBM2M.cjs} +207 -18
  40. package/dist/{chunk-WA44NKPF.js → chunk-62Z5WLRA.js} +1 -1
  41. package/dist/{chunk-BVRRIW7F.js → chunk-6GRUVGKU.js} +3 -3
  42. package/dist/{chunk-QARCM66V.js → chunk-6ZZKRH7R.js} +3 -3
  43. package/dist/{chunk-BP6KSGVD.js → chunk-7272D3K2.js} +4 -6
  44. package/dist/{chunk-NTRAVM2I.js → chunk-7P6VF3FG.js} +2 -2
  45. package/dist/chunk-APX63ILU.js +173 -0
  46. package/dist/{chunk-W7L4HUT2.cjs → chunk-CJ6TBL2N.cjs} +16 -16
  47. package/dist/{chunk-7PT4RJL5.cjs → chunk-EUIDTZNQ.cjs} +111 -113
  48. package/dist/{chunk-CXXXAZ7H.js → chunk-F6R67I3A.js} +1 -1
  49. package/dist/{chunk-I7NJPHWV.cjs → chunk-FQPUF2W2.cjs} +35 -606
  50. package/dist/{chunk-D5KGAO4Z.js → chunk-GCVFEPJG.js} +2 -573
  51. package/dist/{chunk-LEQKZGQI.js → chunk-GOBOCZZI.js} +1 -1
  52. package/dist/{chunk-KDLBJ6QR.js → chunk-GYMMNCFT.js} +3 -3
  53. package/dist/{chunk-NUTMINJZ.cjs → chunk-H7ET2ISK.cjs} +52 -52
  54. package/dist/chunk-HS6QDWDF.cjs +1029 -0
  55. package/dist/{chunk-T7KQEMAE.cjs → chunk-HUAISCUX.cjs} +18 -18
  56. package/dist/{chunk-YGQVCQTG.js → chunk-ILP77UD6.js} +1 -1
  57. package/dist/{chunk-S6OT6CTS.cjs → chunk-IWEVV63O.cjs} +31 -33
  58. package/dist/{chunk-M2VKFE5L.cjs → chunk-JFHBXNR2.cjs} +88 -88
  59. package/dist/{chunk-WPUXGDH4.cjs → chunk-JPEHXIB5.cjs} +10 -10
  60. package/dist/chunk-JSDND7DF.cjs +173 -0
  61. package/dist/{chunk-36ZTV7WO.js → chunk-L6Y7TSQ4.js} +1 -1
  62. package/dist/{chunk-YW43M56C.cjs → chunk-LFMKWGFL.cjs} +1 -1
  63. package/dist/{chunk-V6DT2CDH.js → chunk-M2TPMYJE.js} +1 -1
  64. package/dist/{chunk-LJZRHVZV.cjs → chunk-M5GLQQWG.cjs} +2 -2
  65. package/dist/{chunk-JEGJP4OW.js → chunk-MHLU6GRJ.js} +196 -7
  66. package/dist/{chunk-KMPM5JM5.js → chunk-MONXNVZK.js} +4 -6
  67. package/dist/chunk-MTKY6K3Q.js +1029 -0
  68. package/dist/{chunk-MOW3JMNG.cjs → chunk-N76AMOKE.cjs} +42 -42
  69. package/dist/{chunk-75K3W4D6.cjs → chunk-NKGB64CW.cjs} +16 -16
  70. package/dist/{chunk-SGPIVHJB.js → chunk-P3K2JCJA.js} +3 -3
  71. package/dist/chunk-PXDIAYB6.cjs +594 -0
  72. package/dist/{chunk-3TWOCSCY.js → chunk-QC3OXRE4.js} +9 -9
  73. package/dist/{chunk-YM6ZBTXG.cjs → chunk-QLSGTCYT.cjs} +23 -23
  74. package/dist/{chunk-7YW7T5TJ.js → chunk-RHPSE2YR.js} +2 -2
  75. package/dist/{chunk-44BMJJVA.cjs → chunk-RUONPPMC.cjs} +8 -8
  76. package/dist/{chunk-ATK6ABN3.cjs → chunk-SABJMH6M.cjs} +145 -12
  77. package/dist/{chunk-XWOLPNBW.cjs → chunk-SOSBOS5T.cjs} +22 -22
  78. package/dist/{chunk-PPFJHTW5.cjs → chunk-TFF2GTGN.cjs} +22 -24
  79. package/dist/{chunk-X7WRL5ZZ.cjs → chunk-TLOGFIIV.cjs} +37 -37
  80. package/dist/chunk-TXFWZ5ZJ.js +594 -0
  81. package/dist/{chunk-GXAK6Q5J.js → chunk-UFEDHACQ.js} +2 -2
  82. package/dist/{chunk-GA4EU4P3.cjs → chunk-UXETV2NC.cjs} +4 -4
  83. package/dist/{chunk-N4DFDI73.js → chunk-WKMUBATU.js} +1 -1
  84. package/dist/{chunk-3R5P3DVY.cjs → chunk-WRZ6C4TU.cjs} +6 -6
  85. package/dist/{chunk-U4NUOKBT.js → chunk-WZOGDKCQ.js} +134 -1
  86. package/dist/{chunk-6ADHGQ73.js → chunk-YBAPT7NL.js} +2 -4
  87. package/dist/color/index.cjs +4 -6
  88. package/dist/color/index.js +7 -9
  89. package/dist/export/index.cjs +7 -8
  90. package/dist/export/index.js +6 -7
  91. package/dist/extensions/index.cjs +10 -11
  92. package/dist/extensions/index.js +9 -10
  93. package/dist/gradient/index.cjs +33 -34
  94. package/dist/gradient/index.js +4 -5
  95. package/dist/image-editor/index.cjs +845 -844
  96. package/dist/image-editor/index.js +39 -38
  97. package/dist/index.cjs +16 -17
  98. package/dist/index.js +10 -11
  99. package/dist/paint/index.cjs +6 -4
  100. package/dist/paint/index.js +21 -19
  101. package/dist/paint-editor/brushes.d.cts +1 -2
  102. package/dist/paint-editor/brushes.d.ts +1 -2
  103. package/dist/paint-editor/index.cjs +2193 -694
  104. package/dist/paint-editor/index.js +1575 -76
  105. package/dist/paint-editor/mark-settings.d.cts +104 -0
  106. package/dist/paint-editor/mark-settings.d.ts +104 -0
  107. package/dist/paint-editor/procedural.d.cts +2 -75
  108. package/dist/paint-editor/procedural.d.ts +2 -75
  109. package/dist/paint-editor/stickers.d.cts +1 -22
  110. package/dist/paint-editor/stickers.d.ts +1 -22
  111. package/dist/raster/index.cjs +2 -2
  112. package/dist/raster/index.js +9 -9
  113. package/dist/stickers/index.cjs +10 -10
  114. package/dist/stickers/index.js +9 -9
  115. package/dist/tokens/index.cjs +3 -4
  116. package/dist/tokens/index.js +2 -3
  117. package/dist/tools/skill-evals.d.cts +8 -1
  118. package/dist/tools/skill-evals.d.ts +8 -1
  119. package/dist/typography/index.cjs +7 -8
  120. package/dist/typography/index.js +2 -3
  121. package/dist/vector/index.cjs +974 -974
  122. package/dist/vector/index.js +12 -12
  123. package/dist/video-editor/index.cjs +6 -7
  124. package/dist/video-editor/index.js +5 -6
  125. package/package.json +11 -1
  126. package/skills/README.md +2 -0
  127. package/skills/pixerate-brushes/SKILL.md +104 -0
  128. package/skills/pixerate-brushes-design/SKILL.md +88 -0
  129. package/skills/pixerate-brushes-design/evals/canvas-chalk.json +15 -0
  130. package/skills/pixerate-brushes-design/evals/pink-highlighter.json +15 -0
  131. package/skills/pixerate-brushes-design/evals/port-to-vector.json +17 -0
  132. package/dist/chunk-4JNWA3VT.cjs +0 -302
  133. package/dist/chunk-7AHBW2CQ.cjs +0 -200
  134. package/dist/chunk-F67XMVDI.js +0 -200
  135. package/dist/chunk-GT77U7QG.cjs +0 -2637
  136. package/dist/chunk-OTEPAQJX.js +0 -2637
  137. package/dist/chunk-WKH5ZAUA.js +0 -302
@@ -74,7 +74,7 @@ function profileAlongPolyline(points, values, count = 32) {
74
74
  var round3 = (v) => Math.round(v * 1e3) / 1e3;
75
75
  var loading = null;
76
76
  function loadCanvasBrushstrokeRenderer() {
77
- loading ??= import("./brushstrokeRender-2FHFLSEG.js").catch((error) => {
77
+ loading ??= import("./brushstrokeRender-5PYSKZIJ.js").catch((error) => {
78
78
  loading = null;
79
79
  throw error;
80
80
  });
@@ -5,7 +5,184 @@
5
5
 
6
6
 
7
7
 
8
- var _chunk7AHBW2CQcjs = require('./chunk-7AHBW2CQ.cjs');
8
+ var _chunkIPJ3TEYRcjs = require('./chunk-IPJ3TEYR.cjs');
9
+
10
+ // src/color/convert.ts
11
+ function srgbToLinear(v) {
12
+ const sign = Math.sign(v);
13
+ const abs = Math.abs(v);
14
+ return sign * (abs <= 0.04045 ? abs / 12.92 : ((abs + 0.055) / 1.055) ** 2.4);
15
+ }
16
+ function linearToSrgb(v) {
17
+ const sign = Math.sign(v);
18
+ const abs = Math.abs(v);
19
+ return sign * (abs <= 31308e-7 ? 12.92 * abs : 1.055 * abs ** (1 / 2.4) - 0.055);
20
+ }
21
+ function rgbToHsl(rgba) {
22
+ const { r, g, b, a } = rgba;
23
+ const max = Math.max(r, g, b);
24
+ const min = Math.min(r, g, b);
25
+ const d = max - min;
26
+ const l = (max + min) / 2;
27
+ let h = 0;
28
+ if (d > 0) {
29
+ if (max === r) h = 60 * ((g - b) / d % 6);
30
+ else if (max === g) h = 60 * ((b - r) / d + 2);
31
+ else h = 60 * ((r - g) / d + 4);
32
+ }
33
+ if (h < 0) h += 360;
34
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
35
+ return { h, s, l, alpha: a };
36
+ }
37
+ function hslToRgb(hsla) {
38
+ const { h, s, l, alpha } = hsla;
39
+ const hh = (h % 360 + 360) % 360 / 60;
40
+ const c = (1 - Math.abs(2 * l - 1)) * s;
41
+ const x = c * (1 - Math.abs(hh % 2 - 1));
42
+ const m = l - c / 2;
43
+ let r = 0;
44
+ let g = 0;
45
+ let b = 0;
46
+ if (hh < 1) {
47
+ r = c;
48
+ g = x;
49
+ b = 0;
50
+ } else if (hh < 2) {
51
+ r = x;
52
+ g = c;
53
+ b = 0;
54
+ } else if (hh < 3) {
55
+ r = 0;
56
+ g = c;
57
+ b = x;
58
+ } else if (hh < 4) {
59
+ r = 0;
60
+ g = x;
61
+ b = c;
62
+ } else if (hh < 5) {
63
+ r = x;
64
+ g = 0;
65
+ b = c;
66
+ } else {
67
+ r = c;
68
+ g = 0;
69
+ b = x;
70
+ }
71
+ return { r: r + m, g: g + m, b: b + m, a: alpha };
72
+ }
73
+ function rgbToHsv(rgba) {
74
+ const { r, g, b, a } = rgba;
75
+ const max = Math.max(r, g, b);
76
+ const min = Math.min(r, g, b);
77
+ const d = max - min;
78
+ let h = 0;
79
+ if (d > 0) {
80
+ if (max === r) h = 60 * ((g - b) / d % 6);
81
+ else if (max === g) h = 60 * ((b - r) / d + 2);
82
+ else h = 60 * ((r - g) / d + 4);
83
+ }
84
+ if (h < 0) h += 360;
85
+ const s = max === 0 ? 0 : d / max;
86
+ return { h, s, v: max, alpha: a };
87
+ }
88
+ function hsvToRgb(hsva) {
89
+ const { h, s, v, alpha } = hsva;
90
+ const hh = (h % 360 + 360) % 360 / 60;
91
+ const c = v * s;
92
+ const x = c * (1 - Math.abs(hh % 2 - 1));
93
+ const m = v - c;
94
+ let r = 0;
95
+ let g = 0;
96
+ let b = 0;
97
+ if (hh < 1) {
98
+ r = c;
99
+ g = x;
100
+ b = 0;
101
+ } else if (hh < 2) {
102
+ r = x;
103
+ g = c;
104
+ b = 0;
105
+ } else if (hh < 3) {
106
+ r = 0;
107
+ g = c;
108
+ b = x;
109
+ } else if (hh < 4) {
110
+ r = 0;
111
+ g = x;
112
+ b = c;
113
+ } else if (hh < 5) {
114
+ r = x;
115
+ g = 0;
116
+ b = c;
117
+ } else {
118
+ r = c;
119
+ g = 0;
120
+ b = x;
121
+ }
122
+ return { r: r + m, g: g + m, b: b + m, a: alpha };
123
+ }
124
+ function rgbToOklab(rgba) {
125
+ const lr = srgbToLinear(rgba.r);
126
+ const lg = srgbToLinear(rgba.g);
127
+ const lb = srgbToLinear(rgba.b);
128
+ const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);
129
+ const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);
130
+ const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);
131
+ return {
132
+ l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,
133
+ a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,
134
+ b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,
135
+ alpha: rgba.a
136
+ };
137
+ }
138
+ function oklabToRgb(lab) {
139
+ const l_ = lab.l + 0.3963377774 * lab.a + 0.2158037573 * lab.b;
140
+ const m_ = lab.l - 0.1055613458 * lab.a - 0.0638541728 * lab.b;
141
+ const s_ = lab.l - 0.0894841775 * lab.a - 1.291485548 * lab.b;
142
+ const l = l_ ** 3;
143
+ const m = m_ ** 3;
144
+ const s = s_ ** 3;
145
+ return {
146
+ r: linearToSrgb(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),
147
+ g: linearToSrgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),
148
+ b: linearToSrgb(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),
149
+ a: lab.alpha
150
+ };
151
+ }
152
+ function oklabToOklch(lab) {
153
+ const c = Math.hypot(lab.a, lab.b);
154
+ let h = 0;
155
+ if (c >= 1e-6) {
156
+ h = Math.atan2(lab.b, lab.a) * 180 / Math.PI;
157
+ if (h < 0) h += 360;
158
+ if (h >= 360) h -= 360;
159
+ }
160
+ return { l: lab.l, c, h, alpha: lab.alpha };
161
+ }
162
+ function oklchToOklab(lch) {
163
+ const rad = lch.h * Math.PI / 180;
164
+ return {
165
+ l: lch.l,
166
+ a: lch.c * Math.cos(rad),
167
+ b: lch.c * Math.sin(rad),
168
+ alpha: lch.alpha
169
+ };
170
+ }
171
+ var D65_XYZ = _chunkIPJ3TEYRcjs.xyToXyz.call(void 0, _chunkIPJ3TEYRcjs.D65_XY);
172
+ var SRGB_TO_XYZ = _chunkIPJ3TEYRcjs.rgbToXyzMatrix.call(void 0, [0.64, 0.33], [0.3, 0.6], [0.15, 0.06], D65_XYZ);
173
+ var P3_TO_XYZ = _chunkIPJ3TEYRcjs.rgbToXyzMatrix.call(void 0, [0.68, 0.32], [0.265, 0.69], [0.15, 0.06], D65_XYZ);
174
+ var XYZ_TO_SRGB = _chunkIPJ3TEYRcjs.invert.call(void 0, SRGB_TO_XYZ);
175
+ var XYZ_TO_P3 = _chunkIPJ3TEYRcjs.invert.call(void 0, P3_TO_XYZ);
176
+ var P3_TO_SRGB_MAT = _chunkIPJ3TEYRcjs.mul.call(void 0, XYZ_TO_SRGB, P3_TO_XYZ);
177
+ var SRGB_TO_P3_MAT = _chunkIPJ3TEYRcjs.mul.call(void 0, XYZ_TO_P3, SRGB_TO_XYZ);
178
+ function linearSrgbToDisplayP3(rgb) {
179
+ const out = _chunkIPJ3TEYRcjs.apply.call(void 0, SRGB_TO_P3_MAT, [rgb.r, rgb.g, rgb.b]);
180
+ return { r: out[0], g: out[1], b: out[2], a: rgb.a };
181
+ }
182
+ function displayP3ToLinearSrgb(rgb) {
183
+ const out = _chunkIPJ3TEYRcjs.apply.call(void 0, P3_TO_SRGB_MAT, [rgb.r, rgb.g, rgb.b]);
184
+ return { r: out[0], g: out[1], b: out[2], a: rgb.a };
185
+ }
9
186
 
10
187
  // src/color/named.ts
11
188
  var NAMED_COLORS = {
@@ -253,7 +430,7 @@ function parseColor(input) {
253
430
  const s = parsePercentOrNumber(parts[1], 100);
254
431
  const l = parsePercentOrNumber(parts[2], 100);
255
432
  if (h === null || s === null || l === null) return null;
256
- return _chunk7AHBW2CQcjs.hslToRgb.call(void 0, { h, s, l, alpha: alphaVal });
433
+ return hslToRgb({ h, s, l, alpha: alphaVal });
257
434
  }
258
435
  const oklabMatch = OKLAB_RE.exec(text);
259
436
  if (oklabMatch) {
@@ -269,7 +446,7 @@ function parseColor(input) {
269
446
  const a = parsePercentOrNumber(parts[1], 1);
270
447
  const b = parsePercentOrNumber(parts[2], 1);
271
448
  if (l === null || a === null || b === null) return null;
272
- return _chunk7AHBW2CQcjs.oklabToRgb.call(void 0, { l, a, b, alpha: alphaVal });
449
+ return oklabToRgb({ l, a, b, alpha: alphaVal });
273
450
  }
274
451
  const oklchMatch = OKLCH_RE.exec(text);
275
452
  if (oklchMatch) {
@@ -285,7 +462,7 @@ function parseColor(input) {
285
462
  const c = parsePercentOrNumber(parts[1], 1);
286
463
  const h = parseAngle(parts[2]);
287
464
  if (l === null || c === null || h === null) return null;
288
- return _chunk7AHBW2CQcjs.oklabToRgb.call(void 0, _chunk7AHBW2CQcjs.oklchToOklab.call(void 0, { l, c, h, alpha: alphaVal }));
465
+ return oklabToRgb(oklchToOklab({ l, c, h, alpha: alphaVal }));
289
466
  }
290
467
  const colorMatch = COLOR_FN_RE.exec(text);
291
468
  if (colorMatch) {
@@ -308,21 +485,21 @@ function parseColor(input) {
308
485
  }
309
486
  if (space === "srgb-linear") {
310
487
  return {
311
- r: _chunk7AHBW2CQcjs.linearToSrgb.call(void 0, c1),
312
- g: _chunk7AHBW2CQcjs.linearToSrgb.call(void 0, c2),
313
- b: _chunk7AHBW2CQcjs.linearToSrgb.call(void 0, c3),
488
+ r: linearToSrgb(c1),
489
+ g: linearToSrgb(c2),
490
+ b: linearToSrgb(c3),
314
491
  a: alphaVal
315
492
  };
316
493
  }
317
494
  if (space === "display-p3") {
318
- const linP3R = _chunk7AHBW2CQcjs.srgbToLinear.call(void 0, c1);
319
- const linP3G = _chunk7AHBW2CQcjs.srgbToLinear.call(void 0, c2);
320
- const linP3B = _chunk7AHBW2CQcjs.srgbToLinear.call(void 0, c3);
321
- const linSrgb = _chunk7AHBW2CQcjs.displayP3ToLinearSrgb.call(void 0, { r: linP3R, g: linP3G, b: linP3B, a: alphaVal });
495
+ const linP3R = srgbToLinear(c1);
496
+ const linP3G = srgbToLinear(c2);
497
+ const linP3B = srgbToLinear(c3);
498
+ const linSrgb = displayP3ToLinearSrgb({ r: linP3R, g: linP3G, b: linP3B, a: alphaVal });
322
499
  return {
323
- r: _chunk7AHBW2CQcjs.linearToSrgb.call(void 0, linSrgb.r),
324
- g: _chunk7AHBW2CQcjs.linearToSrgb.call(void 0, linSrgb.g),
325
- b: _chunk7AHBW2CQcjs.linearToSrgb.call(void 0, linSrgb.b),
500
+ r: linearToSrgb(linSrgb.r),
501
+ g: linearToSrgb(linSrgb.g),
502
+ b: linearToSrgb(linSrgb.b),
326
503
  a: alphaVal
327
504
  };
328
505
  }
@@ -388,9 +565,9 @@ function composite(fg, bg) {
388
565
  };
389
566
  }
390
567
  function relativeLuminance(c) {
391
- const r = _chunk7AHBW2CQcjs.srgbToLinear.call(void 0, c.r);
392
- const g = _chunk7AHBW2CQcjs.srgbToLinear.call(void 0, c.g);
393
- const b = _chunk7AHBW2CQcjs.srgbToLinear.call(void 0, c.b);
568
+ const r = srgbToLinear(c.r);
569
+ const g = srgbToLinear(c.g);
570
+ const b = srgbToLinear(c.b);
394
571
  return 0.2126 * r + 0.7152 * g + 0.0722 * b;
395
572
  }
396
573
  function contrastRatio(foreground, background) {
@@ -440,4 +617,16 @@ function readableTextColor(background, candidates = [BLACK, WHITE]) {
440
617
 
441
618
 
442
619
 
443
- exports.NAMED_COLORS = NAMED_COLORS; exports.parseColor = parseColor; exports.isColor = isColor; exports.relativeLuminance = relativeLuminance; exports.contrastRatio = contrastRatio; exports.contrastLevel = contrastLevel; exports.readableTextColor = readableTextColor;
620
+
621
+
622
+
623
+
624
+
625
+
626
+
627
+
628
+
629
+
630
+
631
+
632
+ exports.srgbToLinear = srgbToLinear; exports.linearToSrgb = linearToSrgb; exports.rgbToHsl = rgbToHsl; exports.hslToRgb = hslToRgb; exports.rgbToHsv = rgbToHsv; exports.hsvToRgb = hsvToRgb; exports.rgbToOklab = rgbToOklab; exports.oklabToRgb = oklabToRgb; exports.oklabToOklch = oklabToOklch; exports.oklchToOklab = oklchToOklab; exports.linearSrgbToDisplayP3 = linearSrgbToDisplayP3; exports.displayP3ToLinearSrgb = displayP3ToLinearSrgb; exports.NAMED_COLORS = NAMED_COLORS; exports.parseColor = parseColor; exports.isColor = isColor; exports.relativeLuminance = relativeLuminance; exports.contrastRatio = contrastRatio; exports.contrastLevel = contrastLevel; exports.readableTextColor = readableTextColor;
@@ -13,7 +13,7 @@ import {
13
13
  dabRect,
14
14
  put255,
15
15
  rasterizeDab
16
- } from "./chunk-D5KGAO4Z.js";
16
+ } from "./chunk-GCVFEPJG.js";
17
17
  import {
18
18
  blendPixel,
19
19
  srgbDecode,
@@ -5,14 +5,14 @@ import {
5
5
  chartToMermaid,
6
6
  describeChart,
7
7
  layoutSparkline
8
- } from "./chunk-7YW7T5TJ.js";
8
+ } from "./chunk-RHPSE2YR.js";
9
9
  import {
10
10
  layoutChart
11
- } from "./chunk-N4DFDI73.js";
11
+ } from "./chunk-WKMUBATU.js";
12
12
  import {
13
13
  DEFAULT_CHART_THEME,
14
14
  normalizeChartSpec
15
- } from "./chunk-QARCM66V.js";
15
+ } from "./chunk-6ZZKRH7R.js";
16
16
  import {
17
17
  plainTextToSlice
18
18
  } from "./chunk-2INPJDNY.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  simulateColorVision
3
- } from "./chunk-BP6KSGVD.js";
3
+ } from "./chunk-7272D3K2.js";
4
4
  import {
5
5
  deltaEOK
6
- } from "./chunk-6ADHGQ73.js";
6
+ } from "./chunk-YBAPT7NL.js";
7
7
  import {
8
8
  rgbToOklab
9
- } from "./chunk-F67XMVDI.js";
9
+ } from "./chunk-MHLU6GRJ.js";
10
10
 
11
11
  // src/chart/color.ts
12
12
  var NAMED = {
@@ -6,25 +6,23 @@ import {
6
6
  normalizeColor,
7
7
  suggestAccessibleForeground,
8
8
  toSrgbGamut
9
- } from "./chunk-6ADHGQ73.js";
9
+ } from "./chunk-YBAPT7NL.js";
10
10
  import {
11
11
  contrastLevel,
12
12
  contrastRatio,
13
- parseColor,
14
- relativeLuminance
15
- } from "./chunk-JEGJP4OW.js";
16
- import {
17
13
  hslToRgb,
18
14
  hsvToRgb,
19
15
  linearToSrgb,
20
16
  oklabToOklch,
21
17
  oklabToRgb,
22
18
  oklchToOklab,
19
+ parseColor,
20
+ relativeLuminance,
23
21
  rgbToHsl,
24
22
  rgbToHsv,
25
23
  rgbToOklab,
26
24
  srgbToLinear
27
- } from "./chunk-F67XMVDI.js";
25
+ } from "./chunk-MHLU6GRJ.js";
28
26
 
29
27
  // src/color/vision.ts
30
28
  var CVD = {
@@ -18,7 +18,7 @@ import {
18
18
  unionBounds,
19
19
  vectorGradientPoints,
20
20
  widthProfileAt
21
- } from "./chunk-KDLBJ6QR.js";
21
+ } from "./chunk-GYMMNCFT.js";
22
22
  import {
23
23
  segmentLength,
24
24
  segmentParamAtLength,
@@ -29,7 +29,7 @@ import {
29
29
  } from "./chunk-5UJHB3BW.js";
30
30
  import {
31
31
  mixColorsOklab
32
- } from "./chunk-V6DT2CDH.js";
32
+ } from "./chunk-M2TPMYJE.js";
33
33
 
34
34
  // src/vector/blend.ts
35
35
  var lerpN = (a, b, t) => a + (b - a) * t;
@@ -0,0 +1,173 @@
1
+ import {
2
+ StickerError
3
+ } from "./chunk-SZTI6EER.js";
4
+ import {
5
+ hash2
6
+ } from "./chunk-4D6KP5BV.js";
7
+
8
+ // src/stickers/stamps.ts
9
+ var STAMP_KINDS = ["dot", "star", "heart", "leaf", "flower", "confetti", "splat", "sparkle", "ring"];
10
+ function stampCoverage(kind, u, v, t) {
11
+ const r = Math.hypot(u, v);
12
+ const a = Math.atan2(v, u);
13
+ const edge = (d) => Math.min(1, Math.max(0, d * 24 + 0.5));
14
+ switch (kind) {
15
+ case "dot":
16
+ return edge(0.95 - r);
17
+ case "ring":
18
+ return edge(Math.min(0.95 - r, r - 0.6));
19
+ case "star": {
20
+ const f = (a + Math.PI / 2) * 5 / (2 * Math.PI) % 1;
21
+ const notch = Math.min(f < 0 ? f + 1 : f, 1 - (f < 0 ? f + 1 : f)) * 2;
22
+ return edge(0.95 - 0.55 * notch - r);
23
+ }
24
+ case "sparkle": {
25
+ const q = Math.pow(Math.abs(u) / 0.95, 0.6) + Math.pow(Math.abs(v) / 0.95, 0.6);
26
+ return edge((1 - q) * 0.4);
27
+ }
28
+ case "heart": {
29
+ const x = u * 1.1;
30
+ const y = -v * 1.1 + 0.15;
31
+ const q = x * x + y * y - 0.55;
32
+ return edge(-(q * q * q - x * x * y * y * y) * 3);
33
+ }
34
+ case "leaf": {
35
+ const w = 0.42 * Math.sqrt(Math.max(0, 1 - u * u));
36
+ const inside = edge(w - Math.abs(v + 0.15 * u * u));
37
+ const rib = Math.abs(v + 0.15 * u * u) < 0.03 && Math.abs(u) < 0.85 ? 0.65 : 1;
38
+ return inside * rib;
39
+ }
40
+ case "flower": {
41
+ const petals = 0.6 + 0.35 * Math.abs(Math.cos(2.5 * a));
42
+ const body = edge(petals - r);
43
+ return r < 0.22 ? Math.max(body, 1) * 0.85 : body;
44
+ }
45
+ case "confetti": {
46
+ return edge(Math.min(0.9 - Math.abs(u), 0.35 - Math.abs(v)));
47
+ }
48
+ case "splat": {
49
+ let rr = 0.55;
50
+ for (let k = 1; k <= 3; k++) rr += 0.08 * Math.sin(a * (k + 2) + hash2(k, 1, t) * 6.28) / k;
51
+ let c = edge(rr - r);
52
+ for (let k = 0; k < 4; k++) {
53
+ const ang = hash2(k, 7, t) * Math.PI * 2;
54
+ const dist = 0.72 + 0.2 * hash2(k, 9, t);
55
+ const dx = u - Math.cos(ang) * dist;
56
+ const dy = v - Math.sin(ang) * dist;
57
+ c = Math.max(c, edge(0.08 + 0.06 * hash2(k, 11, t) - Math.hypot(dx, dy)));
58
+ }
59
+ return c;
60
+ }
61
+ }
62
+ }
63
+
64
+ // src/stickers/helpers.ts
65
+ var DEFAULT_STICKER_PAGE = 24;
66
+ var MAX_STICKER_PAGE = 100;
67
+ var EDITOR_STICKERS_ID = "editor";
68
+ function checkStickerSearchOptions(options = {}) {
69
+ if (options.limit !== void 0 && !(Number.isInteger(options.limit) && options.limit >= 1 && options.limit <= MAX_STICKER_PAGE)) {
70
+ throw new StickerError("invalid_argument", `limit must be a whole number from 1 to ${MAX_STICKER_PAGE}, got ${options.limit}.`);
71
+ }
72
+ if (options.after !== void 0 && !/^\d+$/.test(options.after)) throw new StickerError("invalid_argument", `after "${options.after}" is not a cursor from this provider; pass the next value of the previous page.`);
73
+ }
74
+ var words = (s) => s.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
75
+ function stickerPage(items, options = {}, query = "") {
76
+ checkStickerSearchOptions(options);
77
+ const q = words(query);
78
+ const tags = (options.tags ?? []).map((t) => t.toLowerCase());
79
+ const matches = items.filter((s) => {
80
+ if (options.category && s.category !== options.category) return false;
81
+ if (tags.length && !tags.every((t) => (s.tags ?? []).some((x) => x.toLowerCase() === t))) return false;
82
+ if (options.licence?.commercial === true && !s.licence.commercial) return false;
83
+ if (!q.length) return true;
84
+ const text = new Set(words([s.name, s.category, s.description ?? "", ...s.tags ?? []].join(" ")));
85
+ return q.every((w) => [...text].some((t) => t.startsWith(w)));
86
+ });
87
+ const start = options.after ? Number(options.after) : 0;
88
+ const limit = options.limit ?? DEFAULT_STICKER_PAGE;
89
+ const page = matches.slice(start, start + limit);
90
+ return { items: page, total: matches.length, ...start + limit < matches.length ? { next: String(start + limit) } : {} };
91
+ }
92
+ function parseStickerRef(ref) {
93
+ if (typeof ref !== "string" || !ref) throw new StickerError("invalid_argument", 'A sticker ref is a "provider:id" string, e.g. "editor:star" (find_stickers lists them).');
94
+ const i = ref.indexOf(":");
95
+ if (i === -1) {
96
+ if (STAMP_KINDS.includes(ref)) return { provider: EDITOR_STICKERS_ID, id: ref };
97
+ throw new StickerError("invalid_argument", `"${ref}" is not a sticker ref; refs are "provider:id" (e.g. "editor:${STAMP_KINDS[1]}"); find_stickers lists them.`);
98
+ }
99
+ if (i === 0 || i === ref.length - 1) throw new StickerError("invalid_argument", `"${ref}" is not a sticker ref; refs are "provider:id".`);
100
+ return { provider: ref.slice(0, i), id: ref.slice(i + 1) };
101
+ }
102
+ function normalizeStickerRef(ref) {
103
+ const { provider, id } = parseStickerRef(ref);
104
+ return `${provider}:${id}`;
105
+ }
106
+ function editorStampOf(ref) {
107
+ const { provider, id } = parseStickerRef(ref);
108
+ return provider === EDITOR_STICKERS_ID && STAMP_KINDS.includes(id) ? id : null;
109
+ }
110
+ function stickerRefOf(provider, id) {
111
+ return provider.namespaced ? id : `${provider.id}:${id}`;
112
+ }
113
+ function stickerIdFor(provider, ref) {
114
+ const { provider: owner, id } = parseStickerRef(ref);
115
+ if (provider.namespaced) return `${owner}:${id}`;
116
+ return owner === provider.id ? id : null;
117
+ }
118
+ function closestStickerRefs(wanted, candidates, n = 3) {
119
+ const w = wanted.toLowerCase();
120
+ const dist = (a, b) => {
121
+ const d = Array.from({ length: b.length + 1 }, (_, j) => j);
122
+ for (let i = 1; i <= a.length; i++) {
123
+ let prev = d[0];
124
+ d[0] = i;
125
+ for (let j = 1; j <= b.length; j++) {
126
+ const tmp = d[j];
127
+ d[j] = Math.min(d[j] + 1, d[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
128
+ prev = tmp;
129
+ }
130
+ }
131
+ return d[b.length];
132
+ };
133
+ return [...candidates].sort((a, b) => dist(w, a.toLowerCase()) - dist(w, b.toLowerCase()) || a.localeCompare(b)).slice(0, n);
134
+ }
135
+ var StickersSlot = class {
136
+ constructor(fallback) {
137
+ this.fallback = fallback;
138
+ this.current = fallback;
139
+ }
140
+ fallback;
141
+ current;
142
+ listeners = /* @__PURE__ */ new Set();
143
+ get provider() {
144
+ return this.current;
145
+ }
146
+ set(provider) {
147
+ const next = provider ?? this.fallback;
148
+ if (next === this.current) return;
149
+ this.current = next;
150
+ for (const l of [...this.listeners]) l(next);
151
+ }
152
+ subscribe(listener) {
153
+ this.listeners.add(listener);
154
+ return () => this.listeners.delete(listener);
155
+ }
156
+ };
157
+
158
+ export {
159
+ STAMP_KINDS,
160
+ stampCoverage,
161
+ DEFAULT_STICKER_PAGE,
162
+ MAX_STICKER_PAGE,
163
+ EDITOR_STICKERS_ID,
164
+ checkStickerSearchOptions,
165
+ stickerPage,
166
+ parseStickerRef,
167
+ normalizeStickerRef,
168
+ editorStampOf,
169
+ stickerRefOf,
170
+ stickerIdFor,
171
+ closestStickerRefs,
172
+ StickersSlot
173
+ };
@@ -5,14 +5,14 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkXZNU4DUXcjs = require('./chunk-XZNU4DUX.cjs');
8
+ var _chunk3NS5C7FBcjs = require('./chunk-3NS5C7FB.cjs');
9
9
 
10
10
 
11
- var _chunkMOW3JMNGcjs = require('./chunk-MOW3JMNG.cjs');
11
+ var _chunkN76AMOKEcjs = require('./chunk-N76AMOKE.cjs');
12
12
 
13
13
 
14
14
 
15
- var _chunk3R5P3DVYcjs = require('./chunk-3R5P3DVY.cjs');
15
+ var _chunkWRZ6C4TUcjs = require('./chunk-WRZ6C4TU.cjs');
16
16
 
17
17
 
18
18
  var _chunkG43MNQ4Ccjs = require('./chunk-G43MNQ4C.cjs');
@@ -1457,7 +1457,7 @@ var ChartNodeView = (_class = class {
1457
1457
  this.dom.contentEditable = "false";
1458
1458
  this.syncAttributes();
1459
1459
  this.key = specKey(this.node.attrs.spec);
1460
- this.controller = new (0, _chunkXZNU4DUXcjs.ChartController)({ spec: this.node.attrs.spec });
1460
+ this.controller = new (0, _chunk3NS5C7FBcjs.ChartController)({ spec: this.node.attrs.spec });
1461
1461
  this.unsubscribe = this.controller.subscribe((state) => {
1462
1462
  if (!state.gesture) this.writeBack();
1463
1463
  });
@@ -1690,7 +1690,7 @@ function readSpec(value) {
1690
1690
  }
1691
1691
  }
1692
1692
  if (!input || typeof input !== "object" || Array.isArray(input)) return null;
1693
- return _chunk3R5P3DVYcjs.normalizeChartSpec.call(void 0, input).spec;
1693
+ return _chunkWRZ6C4TUcjs.normalizeChartSpec.call(void 0, input).spec;
1694
1694
  }
1695
1695
  var readSize = (value) => {
1696
1696
  const n = value === null ? NaN : Number(value);
@@ -1716,10 +1716,10 @@ function staticChartSvg(node, options) {
1716
1716
  const spec = node.attrs.spec;
1717
1717
  const width = _nullishCoalesce(node.attrs.width, () => ( options.defaultWidth));
1718
1718
  const height = _nullishCoalesce(node.attrs.height, () => ( options.defaultHeight));
1719
- const scene = _chunkMOW3JMNGcjs.layoutChart.call(void 0, spec, { width, height, theme: options.theme, selection: null });
1720
- return _chunkXZNU4DUXcjs.chartSceneToDomSpec.call(void 0, scene, {
1719
+ const scene = _chunkN76AMOKEcjs.layoutChart.call(void 0, spec, { width, height, theme: options.theme, selection: null });
1720
+ return _chunk3NS5C7FBcjs.chartSceneToDomSpec.call(void 0, scene, {
1721
1721
  ariaLabel: spec.title || "Chart",
1722
- description: _chunkXZNU4DUXcjs.describeChart.call(void 0, spec),
1722
+ description: _chunk3NS5C7FBcjs.describeChart.call(void 0, spec),
1723
1723
  attrs: { style: "max-width: 100%; height: auto; display: block" }
1724
1724
  });
1725
1725
  }
@@ -1735,7 +1735,7 @@ var Chart = _core.Node.create({
1735
1735
  return {
1736
1736
  HTMLAttributes: {},
1737
1737
  nodeView: null,
1738
- theme: _chunk3R5P3DVYcjs.DEFAULT_CHART_THEME,
1738
+ theme: _chunkWRZ6C4TUcjs.DEFAULT_CHART_THEME,
1739
1739
  defaultWidth: 640,
1740
1740
  defaultHeight: 320,
1741
1741
  generateId: () => generateStructureId("chart")
@@ -1749,7 +1749,7 @@ var Chart = _core.Node.create({
1749
1749
  renderHTML: (attributes) => attributes.id ? { "data-chart-id": attributes.id } : {}
1750
1750
  },
1751
1751
  spec: {
1752
- default: _chunk3R5P3DVYcjs.normalizeChartSpec.call(void 0, {}).spec,
1752
+ default: _chunkWRZ6C4TUcjs.normalizeChartSpec.call(void 0, {}).spec,
1753
1753
  // null (no `data-chart`) keeps what the parse rule found, e.g. a mermaid block's spec.
1754
1754
  parseHTML: (element) => readSpec(element.getAttribute("data-chart")),
1755
1755
  renderHTML: (attributes) => ({
@@ -1787,7 +1787,7 @@ var Chart = _core.Node.create({
1787
1787
  const code = element.querySelector("code");
1788
1788
  const language = _nullishCoalesce(_nullishCoalesce(_optionalChain([code, 'optionalAccess', _47 => _47.getAttribute, 'call', _48 => _48("class")]), () => ( element.getAttribute("data-language"))), () => ( ""));
1789
1789
  if (!/(?:^|\s)language-mermaid(?:\s|$)/.test(language) && language !== "mermaid") return false;
1790
- const result = _chunkXZNU4DUXcjs.chartFromMermaid.call(void 0, _nullishCoalesce((_nullishCoalesce(code, () => ( element))).textContent, () => ( "")));
1790
+ const result = _chunk3NS5C7FBcjs.chartFromMermaid.call(void 0, _nullishCoalesce((_nullishCoalesce(code, () => ( element))).textContent, () => ( "")));
1791
1791
  return result.family ? { spec: result.spec } : false;
1792
1792
  }
1793
1793
  }
@@ -1811,7 +1811,7 @@ var Chart = _core.Node.create({
1811
1811
  return {
1812
1812
  markdown: {
1813
1813
  serialize(state, node) {
1814
- const text = _chunkXZNU4DUXcjs.chartToMermaid.call(void 0, node.attrs.spec);
1814
+ const text = _chunk3NS5C7FBcjs.chartToMermaid.call(void 0, node.attrs.spec);
1815
1815
  const fence = "`".repeat(Math.max(3, longestBacktickRun(text) + 1));
1816
1816
  state.write(`${fence}mermaid
1817
1817
  `);
@@ -1833,7 +1833,7 @@ var Chart = _core.Node.create({
1833
1833
  type: this.name,
1834
1834
  attrs: {
1835
1835
  id: _nullishCoalesce(options.id, () => ( this.options.generateId())),
1836
- spec: _chunk3R5P3DVYcjs.normalizeChartSpec.call(void 0, _nullishCoalesce(options.spec, () => ( {}))).spec,
1836
+ spec: _chunkWRZ6C4TUcjs.normalizeChartSpec.call(void 0, _nullishCoalesce(options.spec, () => ( {}))).spec,
1837
1837
  width: _nullishCoalesce(options.width, () => ( null)),
1838
1838
  height: _nullishCoalesce(options.height, () => ( this.options.defaultHeight))
1839
1839
  }
@@ -1844,7 +1844,7 @@ var Chart = _core.Node.create({
1844
1844
  if (dispatch) {
1845
1845
  tr.setNodeMarkup(chart.pos, void 0, {
1846
1846
  ...chart.node.attrs,
1847
- ...changes.spec !== void 0 ? { spec: _chunk3R5P3DVYcjs.normalizeChartSpec.call(void 0, changes.spec).spec } : {},
1847
+ ...changes.spec !== void 0 ? { spec: _chunkWRZ6C4TUcjs.normalizeChartSpec.call(void 0, changes.spec).spec } : {},
1848
1848
  ...changes.width !== void 0 ? { width: changes.width } : {},
1849
1849
  ...changes.height !== void 0 ? { height: changes.height } : {}
1850
1850
  });
@@ -1951,14 +1951,14 @@ var Sparkline = _core.Node.create({
1951
1951
  return [{ tag: 'span[data-type="sparkline"]', priority: 60 }];
1952
1952
  },
1953
1953
  renderHTML({ node, HTMLAttributes }) {
1954
- const scene = _chunkXZNU4DUXcjs.layoutSparkline.call(void 0, node.attrs.values, {
1954
+ const scene = _chunk3NS5C7FBcjs.layoutSparkline.call(void 0, node.attrs.values, {
1955
1955
  kind: node.attrs.kind,
1956
1956
  width: node.attrs.width,
1957
1957
  height: node.attrs.height,
1958
1958
  color: _nullishCoalesce(node.attrs.color, () => ( this.options.color)),
1959
1959
  negativeColor: this.options.negativeColor
1960
1960
  });
1961
- const svg = _chunkXZNU4DUXcjs.chartSceneToDomSpec.call(void 0, scene, {
1961
+ const svg = _chunk3NS5C7FBcjs.chartSceneToDomSpec.call(void 0, scene, {
1962
1962
  ariaLabel: sparklineLabel(node),
1963
1963
  attrs: { style: "display: inline-block; vertical-align: middle" }
1964
1964
  });