@pixerate/editor 0.80.0 → 0.81.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 (64) hide show
  1. package/README.md +13 -3
  2. package/dist/agent/index.cjs +102 -6
  3. package/dist/agent/index.cjs.map +1 -1
  4. package/dist/agent/index.d.cts +4 -2
  5. package/dist/agent/index.d.ts +4 -2
  6. package/dist/agent/index.js +101 -5
  7. package/dist/agent/index.js.map +1 -1
  8. package/dist/{builtins-BKYlHH1s.d.ts → builtins-CV1fDj64.d.ts} +5 -1
  9. package/dist/{builtins-1kqwLUnb.d.cts → builtins-c4w0eAYl.d.cts} +5 -1
  10. package/dist/{chunk-2CJ3LPYQ.js → chunk-424H3P4I.js} +13 -295
  11. package/dist/chunk-424H3P4I.js.map +1 -0
  12. package/dist/{chunk-UN33YOXW.cjs → chunk-PA5S7KPC.cjs} +293 -2
  13. package/dist/chunk-PA5S7KPC.cjs.map +1 -0
  14. package/dist/{chunk-IB3ZHQAX.js → chunk-PTYWCFFW.js} +29 -4
  15. package/dist/chunk-PTYWCFFW.js.map +1 -0
  16. package/dist/{chunk-JQ3BB3E6.js → chunk-PXDEFEG2.js} +293 -2
  17. package/dist/chunk-PXDEFEG2.js.map +1 -0
  18. package/dist/{chunk-YU4WQE5M.cjs → chunk-TAPXWP2B.cjs} +95 -377
  19. package/dist/chunk-TAPXWP2B.cjs.map +1 -0
  20. package/dist/{chunk-HXDMZQTD.cjs → chunk-TPOT575P.cjs} +29 -4
  21. package/dist/{chunk-IB3ZHQAX.js.map → chunk-TPOT575P.cjs.map} +1 -1
  22. package/dist/commands/index.cjs +2 -2
  23. package/dist/commands/index.d.cts +1 -1
  24. package/dist/commands/index.d.ts +1 -1
  25. package/dist/commands/index.js +1 -1
  26. package/dist/generation/index.cjs +932 -791
  27. package/dist/generation/index.cjs.map +1 -1
  28. package/dist/generation/index.d.cts +266 -240
  29. package/dist/generation/index.d.ts +266 -240
  30. package/dist/generation/index.js +926 -785
  31. package/dist/generation/index.js.map +1 -1
  32. package/dist/image-editor/index.cjs +266 -2
  33. package/dist/image-editor/index.cjs.map +1 -1
  34. package/dist/image-editor/index.d.cts +12 -1
  35. package/dist/image-editor/index.d.ts +12 -1
  36. package/dist/image-editor/index.js +265 -1
  37. package/dist/image-editor/index.js.map +1 -1
  38. package/dist/index.cjs +3 -3
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.js +16 -16
  41. package/dist/spreadsheet/index.cjs +3 -3
  42. package/dist/spreadsheet/index.cjs.map +1 -1
  43. package/dist/spreadsheet/index.js +16 -16
  44. package/package.json +2 -1
  45. package/skills/README.md +55 -0
  46. package/skills/pixerate-agent-tools/SKILL.md +75 -0
  47. package/skills/pixerate-animation-editor/SKILL.md +155 -0
  48. package/skills/pixerate-animation-editor/references/commands.md +123 -0
  49. package/skills/pixerate-canvas/SKILL.md +230 -0
  50. package/skills/pixerate-chart/SKILL.md +190 -0
  51. package/skills/pixerate-diagram/SKILL.md +134 -0
  52. package/skills/pixerate-generation/SKILL.md +109 -0
  53. package/skills/pixerate-image-editor/SKILL.md +139 -0
  54. package/skills/pixerate-parameters/SKILL.md +83 -0
  55. package/skills/pixerate-rich-text/SKILL.md +160 -0
  56. package/skills/pixerate-spreadsheet/SKILL.md +146 -0
  57. package/skills/pixerate-vector/SKILL.md +191 -0
  58. package/skills/pixerate-vector/references/commands.md +138 -0
  59. package/skills/pixerate-video-editor/SKILL.md +173 -0
  60. package/dist/chunk-2CJ3LPYQ.js.map +0 -1
  61. package/dist/chunk-HXDMZQTD.cjs.map +0 -1
  62. package/dist/chunk-JQ3BB3E6.js.map +0 -1
  63. package/dist/chunk-UN33YOXW.cjs.map +0 -1
  64. package/dist/chunk-YU4WQE5M.cjs.map +0 -1
@@ -24,6 +24,7 @@
24
24
 
25
25
 
26
26
 
27
+
27
28
 
28
29
 
29
30
  var _chunkXP5IUZUOcjs = require('./chunk-XP5IUZUO.cjs');
@@ -3480,6 +3481,296 @@ var FormulaEvaluator = (_class2 = class {
3480
3481
  }
3481
3482
  }, _class2);
3482
3483
 
3484
+ // src/spreadsheet/table.ts
3485
+ function normalizeRange(range) {
3486
+ return {
3487
+ startRow: Math.min(range.startRow, range.endRow),
3488
+ startCol: Math.min(range.startCol, range.endCol),
3489
+ endRow: Math.max(range.startRow, range.endRow),
3490
+ endCol: Math.max(range.startCol, range.endCol)
3491
+ };
3492
+ }
3493
+ function rangeContains(range, row, col) {
3494
+ const r = normalizeRange(range);
3495
+ return row >= r.startRow && row <= r.endRow && col >= r.startCol && col <= r.endCol;
3496
+ }
3497
+ function rangesIntersect(a, b) {
3498
+ const x = normalizeRange(a);
3499
+ const y = normalizeRange(b);
3500
+ return x.startRow <= y.endRow && y.startRow <= x.endRow && x.startCol <= y.endCol && y.startCol <= x.endCol;
3501
+ }
3502
+ function rangeContainsRange(outer, inner) {
3503
+ const o = normalizeRange(outer);
3504
+ const i = normalizeRange(inner);
3505
+ return i.startRow >= o.startRow && i.endRow <= o.endRow && i.startCol >= o.startCol && i.endCol <= o.endCol;
3506
+ }
3507
+ function isSingleCellRange(range) {
3508
+ const r = normalizeRange(range);
3509
+ return r.startRow === r.endRow && r.startCol === r.endCol;
3510
+ }
3511
+ var NUMBER_PATTERN = /^[-+]?(\d+\.?\d*|\.\d+)(e[-+]?\d+)?$/i;
3512
+ var ISO_DATE_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
3513
+ function isBlankValue(value) {
3514
+ return value === null || value === void 0 || typeof value === "string" && value.trim() === "";
3515
+ }
3516
+ function toNumber2(value) {
3517
+ if (typeof value === "number") return Number.isFinite(value) ? value : null;
3518
+ if (typeof value === "string") {
3519
+ const trimmed = value.trim();
3520
+ if (NUMBER_PATTERN.test(trimmed)) return parseFloat(trimmed);
3521
+ }
3522
+ return null;
3523
+ }
3524
+ var collator = typeof Intl !== "undefined" ? new Intl.Collator(void 0, { numeric: true, sensitivity: "base" }) : null;
3525
+ function compareText(a, b) {
3526
+ return collator ? collator.compare(a, b) : a < b ? -1 : a > b ? 1 : 0;
3527
+ }
3528
+ function compareCellValues(a, b, direction = "asc") {
3529
+ const aBlank = isBlankValue(a);
3530
+ const bBlank = isBlankValue(b);
3531
+ if (aBlank || bBlank) return aBlank === bBlank ? 0 : aBlank ? 1 : -1;
3532
+ let result;
3533
+ if (isPlainText(a) && isPlainText(b) && !(_chunkXP5IUZUOcjs.parseIsoDate.call(void 0, a) && _chunkXP5IUZUOcjs.parseIsoDate.call(void 0, b))) {
3534
+ result = compareText(a, b);
3535
+ } else {
3536
+ result = _chunkXP5IUZUOcjs.sortCompareValues.call(void 0, a, b);
3537
+ }
3538
+ if (result === 0) return 0;
3539
+ return direction === "desc" ? -Math.sign(result) : Math.sign(result);
3540
+ }
3541
+ var isPlainText = (value) => typeof value === "string" && !_chunkXP5IUZUOcjs.isFormulaError.call(void 0, value);
3542
+ function filterValue(value) {
3543
+ if (isBlankValue(value) || _chunkXP5IUZUOcjs.isFormulaError.call(void 0, value)) return null;
3544
+ if (typeof value === "number") return Number.isFinite(value) ? { value, kind: "number" } : null;
3545
+ if (typeof value === "boolean") return { value, kind: "boolean" };
3546
+ const num = _chunkXP5IUZUOcjs.numericValue.call(void 0, value);
3547
+ if (num !== null) return { value: num, kind: "number" };
3548
+ const text = String(value);
3549
+ return { value: text, kind: _chunkXP5IUZUOcjs.parseIsoDate.call(void 0, text) ? "number" : "text" };
3550
+ }
3551
+ function filterOperand(operand) {
3552
+ if (typeof operand !== "string") return filterValue(operand);
3553
+ if (operand.trim() === "") return null;
3554
+ const parsed = _chunkXP5IUZUOcjs.parseCellInput.call(void 0, operand.trim());
3555
+ if (parsed.type === "number" || parsed.type === "date" || parsed.type === "boolean") return filterValue(parsed.value);
3556
+ return { value: operand, kind: "text" };
3557
+ }
3558
+ function compareForFilter(value, operand) {
3559
+ const a = filterValue(value);
3560
+ const b = filterOperand(operand);
3561
+ if (!a || !b || a.kind !== b.kind) return null;
3562
+ return _chunkXP5IUZUOcjs.compareValues.call(void 0, a.value, b.value);
3563
+ }
3564
+ function looselyEquals(value, operand) {
3565
+ const c = compareForFilter(value, operand);
3566
+ if (c !== null) return c === 0;
3567
+ return String(_nullishCoalesce(value, () => ( ""))).trim().toLowerCase() === String(_nullishCoalesce(operand, () => ( ""))).trim().toLowerCase();
3568
+ }
3569
+ function matchesFilterRule(value, rule) {
3570
+ const text = String(_nullishCoalesce(value, () => ( ""))).toLowerCase();
3571
+ switch (rule.operator) {
3572
+ case "equals":
3573
+ return looselyEquals(value, rule.value);
3574
+ case "notEquals":
3575
+ return !looselyEquals(value, rule.value);
3576
+ case "contains":
3577
+ return text.includes(String(_nullishCoalesce(rule.value, () => ( ""))).toLowerCase());
3578
+ case "notContains":
3579
+ return !text.includes(String(_nullishCoalesce(rule.value, () => ( ""))).toLowerCase());
3580
+ case "greaterThan": {
3581
+ const c = compareForFilter(value, rule.value);
3582
+ return c !== null && c > 0;
3583
+ }
3584
+ case "greaterThanOrEqual": {
3585
+ const c = compareForFilter(value, rule.value);
3586
+ return c !== null && c >= 0;
3587
+ }
3588
+ case "lessThan": {
3589
+ const c = compareForFilter(value, rule.value);
3590
+ return c !== null && c < 0;
3591
+ }
3592
+ case "lessThanOrEqual": {
3593
+ const c = compareForFilter(value, rule.value);
3594
+ return c !== null && c <= 0;
3595
+ }
3596
+ case "between": {
3597
+ const lo = compareForFilter(value, rule.value);
3598
+ const hi = compareForFilter(value, rule.value2);
3599
+ return lo !== null && hi !== null && lo >= 0 && hi <= 0;
3600
+ }
3601
+ case "isBlank":
3602
+ return isBlankValue(value);
3603
+ case "isNotBlank":
3604
+ return !isBlankValue(value);
3605
+ case "oneOf":
3606
+ return (_nullishCoalesce(rule.values, () => ( []))).some((candidate) => String(candidate) === String(_nullishCoalesce(value, () => ( ""))));
3607
+ default:
3608
+ return true;
3609
+ }
3610
+ }
3611
+ function aggregateValues(values, aggregate) {
3612
+ if (aggregate === "count") return values.filter((v) => !isBlankValue(v)).length;
3613
+ const numbers = [];
3614
+ for (const v of values) {
3615
+ const n = toNumber2(v);
3616
+ if (n !== null) numbers.push(n);
3617
+ }
3618
+ if (numbers.length === 0) return aggregate === "sum" ? 0 : null;
3619
+ switch (aggregate) {
3620
+ case "sum":
3621
+ return roundFloat(numbers.reduce((s, n) => s + n, 0));
3622
+ case "average":
3623
+ return roundFloat(numbers.reduce((s, n) => s + n, 0) / numbers.length);
3624
+ case "min":
3625
+ return numbers.reduce((m, n) => n < m ? n : m, numbers[0]);
3626
+ case "max":
3627
+ return numbers.reduce((m, n) => n > m ? n : m, numbers[0]);
3628
+ default:
3629
+ return null;
3630
+ }
3631
+ }
3632
+ function roundFloat(value) {
3633
+ return Number.isInteger(value) ? value : parseFloat(value.toPrecision(12));
3634
+ }
3635
+ var DAY_MS = 864e5;
3636
+ var TRAILING_NUMBER = /^(.*?)(\d+)(\D*)$/;
3637
+ function classifyFillValue(raw) {
3638
+ if (raw.trim() === "") return { kind: "blank" };
3639
+ const num = toNumber2(raw);
3640
+ if (num !== null) return { kind: "number", value: num };
3641
+ const typed = _chunkXP5IUZUOcjs.parseCellInput.call(void 0, raw);
3642
+ const date = ISO_DATE_PATTERN.exec(typed.type === "date" ? String(typed.value) : raw.trim());
3643
+ if (date) {
3644
+ const [year, month, day] = [Number(date[1]), Number(date[2]), Number(date[3])];
3645
+ const time = Date.UTC(year, month - 1, day);
3646
+ const check2 = new Date(time);
3647
+ if (check2.getUTCMonth() === month - 1 && check2.getUTCDate() === day) {
3648
+ return { kind: "date", time, year, month, day };
3649
+ }
3650
+ }
3651
+ const textNumber = TRAILING_NUMBER.exec(raw);
3652
+ if (textNumber && textNumber[1] !== "") {
3653
+ return {
3654
+ kind: "textNumber",
3655
+ prefix: textNumber[1],
3656
+ value: parseInt(textNumber[2], 10),
3657
+ width: textNumber[2].length,
3658
+ suffix: textNumber[3]
3659
+ };
3660
+ }
3661
+ return { kind: "text", text: raw };
3662
+ }
3663
+ var pad = (n, width) => String(Math.abs(n)).padStart(width, "0");
3664
+ function formatDate(time) {
3665
+ const d = new Date(time);
3666
+ return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1, 2)}-${pad(d.getUTCDate(), 2)}`;
3667
+ }
3668
+ function constantStep(values) {
3669
+ const step = values[1] - values[0];
3670
+ for (let i = 2; i < values.length; i++) {
3671
+ if (Math.abs(values[i] - values[i - 1] - step) > 1e-9) return null;
3672
+ }
3673
+ return step;
3674
+ }
3675
+ function linearTrend(values, x) {
3676
+ const n = values.length;
3677
+ const meanX = (n - 1) / 2;
3678
+ const meanY = values.reduce((s, v) => s + v, 0) / n;
3679
+ let num = 0;
3680
+ let den = 0;
3681
+ values.forEach((v, i) => {
3682
+ num += (i - meanX) * (v - meanY);
3683
+ den += (i - meanX) ** 2;
3684
+ });
3685
+ const slope = den === 0 ? 0 : num / den;
3686
+ return meanY + slope * (x - meanX);
3687
+ }
3688
+ function fillSeries(source, count) {
3689
+ if (count <= 0) return [];
3690
+ if (source.length === 0) return Array(count).fill("");
3691
+ const repeat = () => Array.from({ length: count }, (_, i) => source[i % source.length]);
3692
+ const parsed = source.map(classifyFillValue);
3693
+ const kind = parsed[0].kind;
3694
+ if (!parsed.every((p) => p.kind === kind)) return repeat();
3695
+ const n = source.length;
3696
+ if (kind === "number") {
3697
+ if (n === 1) return repeat();
3698
+ const values = parsed.map((p) => p.value);
3699
+ return Array.from({ length: count }, (_, i) => String(roundFloat(linearTrend(values, n + i))));
3700
+ }
3701
+ if (kind === "date") {
3702
+ const dates = parsed;
3703
+ if (n === 1) {
3704
+ return Array.from({ length: count }, (_, i) => formatDate(dates[0].time + (i + 1) * DAY_MS));
3705
+ }
3706
+ const monthIndex = dates.map((d) => d.year * 12 + (d.month - 1));
3707
+ const monthStep = constantStep(monthIndex);
3708
+ if (monthStep !== null && monthStep !== 0 && dates.every((d) => d.day === dates[0].day)) {
3709
+ const last = monthIndex[n - 1];
3710
+ return Array.from({ length: count }, (_, i) => {
3711
+ const m = last + monthStep * (i + 1);
3712
+ const year = Math.floor(m / 12);
3713
+ const month = m - year * 12;
3714
+ const daysInMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
3715
+ return formatDate(Date.UTC(year, month, Math.min(dates[0].day, daysInMonth)));
3716
+ });
3717
+ }
3718
+ const dayStep = constantStep(dates.map((d) => Math.round(d.time / DAY_MS)));
3719
+ if (dayStep === null) return repeat();
3720
+ const lastTime = dates[n - 1].time;
3721
+ return Array.from({ length: count }, (_, i) => formatDate(lastTime + dayStep * (i + 1) * DAY_MS));
3722
+ }
3723
+ if (kind === "textNumber") {
3724
+ const items = parsed;
3725
+ const { prefix, suffix } = items[0];
3726
+ if (!items.every((t) => t.prefix === prefix && t.suffix === suffix)) return repeat();
3727
+ const step = n === 1 ? 1 : constantStep(items.map((t) => t.value));
3728
+ if (step === null) return repeat();
3729
+ const last = items[n - 1];
3730
+ return Array.from({ length: count }, (_, i) => {
3731
+ const value = last.value + step * (i + 1);
3732
+ const digits = value < 0 ? `-${pad(value, last.width)}` : pad(value, last.width);
3733
+ return `${prefix}${digits}${suffix}`;
3734
+ });
3735
+ }
3736
+ return repeat();
3737
+ }
3738
+ function computeFillTarget(source, pointer) {
3739
+ const s = normalizeRange(source);
3740
+ const rowOverflow = pointer.row > s.endRow ? pointer.row - s.endRow : pointer.row < s.startRow ? s.startRow - pointer.row : 0;
3741
+ const colOverflow = pointer.col > s.endCol ? pointer.col - s.endCol : pointer.col < s.startCol ? s.startCol - pointer.col : 0;
3742
+ if (rowOverflow === 0 && colOverflow === 0) return null;
3743
+ if (rowOverflow >= colOverflow) {
3744
+ return pointer.row > s.endRow ? { ...s, endRow: pointer.row } : { ...s, startRow: pointer.row };
3745
+ }
3746
+ return pointer.col > s.endCol ? { ...s, endCol: pointer.col } : { ...s, startCol: pointer.col };
3747
+ }
3748
+ function getFillDirection(source, target) {
3749
+ const s = normalizeRange(source);
3750
+ const t = normalizeRange(target);
3751
+ const sameCols = s.startCol === t.startCol && s.endCol === t.endCol;
3752
+ const sameRows = s.startRow === t.startRow && s.endRow === t.endRow;
3753
+ if (sameCols && t.startRow === s.startRow && t.endRow > s.endRow) return "down";
3754
+ if (sameCols && t.endRow === s.endRow && t.startRow < s.startRow) return "up";
3755
+ if (sameRows && t.startCol === s.startCol && t.endCol > s.endCol) return "right";
3756
+ if (sameRows && t.endCol === s.endCol && t.startCol < s.startCol) return "left";
3757
+ return null;
3758
+ }
3759
+
3760
+
3761
+
3762
+
3763
+
3764
+
3765
+
3766
+
3767
+
3768
+
3769
+
3770
+
3771
+
3772
+
3773
+
3483
3774
 
3484
3775
 
3485
3776
 
@@ -3504,5 +3795,5 @@ var FormulaEvaluator = (_class2 = class {
3504
3795
 
3505
3796
 
3506
3797
 
3507
- exports.tokenizeFormula = tokenizeFormula; exports.WHOLE_COLUMN_END_ROW = WHOLE_COLUMN_END_ROW; exports.parseCellReference = parseCellReference; exports.parseRange = parseRange; exports.FormulaParser = FormulaParser; exports.parseFormula = parseFormula; exports.FormulaLambda = FormulaLambda; exports.isFormulaLambda = isFormulaLambda; exports.MAX_LAMBDA_DEPTH = MAX_LAMBDA_DEPTH; exports.wildcardToRegExp = wildcardToRegExp; exports.parseCriteria = parseCriteria; exports.registerFormulaFunction = registerFormulaFunction; exports.unregisterFormulaFunction = unregisterFormulaFunction; exports.getFormulaFunction = getFormulaFunction; exports.listFormulaFunctions = listFormulaFunctions; exports.searchFormulaFunctions = searchFormulaFunctions; exports.getFormulaArgumentSpecIndex = getFormulaArgumentSpecIndex; exports.checkFormulaArgumentCount = checkFormulaArgumentCount; exports.getFormulaSignatureParts = getFormulaSignatureParts; exports.getFormulaSignature = getFormulaSignature; exports.describeFormulaError = describeFormulaError; exports.MAX_FORMULA_ARRAY_SIZE = MAX_FORMULA_ARRAY_SIZE; exports.FormulaEvaluator = FormulaEvaluator;
3508
- //# sourceMappingURL=chunk-UN33YOXW.cjs.map
3798
+ exports.tokenizeFormula = tokenizeFormula; exports.WHOLE_COLUMN_END_ROW = WHOLE_COLUMN_END_ROW; exports.parseCellReference = parseCellReference; exports.parseRange = parseRange; exports.FormulaParser = FormulaParser; exports.parseFormula = parseFormula; exports.FormulaLambda = FormulaLambda; exports.isFormulaLambda = isFormulaLambda; exports.MAX_LAMBDA_DEPTH = MAX_LAMBDA_DEPTH; exports.wildcardToRegExp = wildcardToRegExp; exports.parseCriteria = parseCriteria; exports.registerFormulaFunction = registerFormulaFunction; exports.unregisterFormulaFunction = unregisterFormulaFunction; exports.getFormulaFunction = getFormulaFunction; exports.listFormulaFunctions = listFormulaFunctions; exports.searchFormulaFunctions = searchFormulaFunctions; exports.getFormulaArgumentSpecIndex = getFormulaArgumentSpecIndex; exports.checkFormulaArgumentCount = checkFormulaArgumentCount; exports.getFormulaSignatureParts = getFormulaSignatureParts; exports.getFormulaSignature = getFormulaSignature; exports.describeFormulaError = describeFormulaError; exports.MAX_FORMULA_ARRAY_SIZE = MAX_FORMULA_ARRAY_SIZE; exports.FormulaEvaluator = FormulaEvaluator; exports.normalizeRange = normalizeRange; exports.rangeContains = rangeContains; exports.rangesIntersect = rangesIntersect; exports.rangeContainsRange = rangeContainsRange; exports.isSingleCellRange = isSingleCellRange; exports.isBlankValue = isBlankValue; exports.toNumber = toNumber2; exports.compareCellValues = compareCellValues; exports.matchesFilterRule = matchesFilterRule; exports.aggregateValues = aggregateValues; exports.roundFloat = roundFloat; exports.fillSeries = fillSeries; exports.computeFillTarget = computeFillTarget; exports.getFillDirection = getFillDirection;
3799
+ //# sourceMappingURL=chunk-PA5S7KPC.cjs.map