@stocksharp/diagram 1.2.0 → 1.2.1
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/esm/canvas-renderer.js +8 -3
- package/dist/esm/canvas-renderer.js.map +1 -1
- package/dist/esm/color.js +109 -0
- package/dist/esm/color.js.map +1 -0
- package/dist/esm/embed.js +1 -51
- package/dist/esm/embed.js.map +1 -1
- package/dist/ssdiagram-headless.js +64 -1
- package/dist/ssdiagram-headless.js.map +4 -4
- package/dist/ssdiagram.js +71 -39
- package/dist/ssdiagram.js.map +4 -4
- package/dist/types/canvas-renderer.d.ts.map +1 -1
- package/dist/types/color.d.ts +12 -0
- package/dist/types/color.d.ts.map +1 -0
- package/dist/types/embed.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/canvas-renderer.ts +8 -3
- package/src/color.ts +125 -0
- package/src/embed.ts +1 -56
package/dist/ssdiagram.js
CHANGED
|
@@ -796,6 +796,76 @@ var SSDiagram = (() => {
|
|
|
796
796
|
}
|
|
797
797
|
};
|
|
798
798
|
|
|
799
|
+
// src/color.ts
|
|
800
|
+
var CSS_COLOR_KEYWORDS = {
|
|
801
|
+
white: [255, 255, 255],
|
|
802
|
+
black: [0, 0, 0],
|
|
803
|
+
transparent: [255, 255, 255]
|
|
804
|
+
};
|
|
805
|
+
function parseRgb(color) {
|
|
806
|
+
const value = color.trim().toLowerCase();
|
|
807
|
+
if (value === "")
|
|
808
|
+
return null;
|
|
809
|
+
const keyword = CSS_COLOR_KEYWORDS[value];
|
|
810
|
+
if (keyword !== void 0)
|
|
811
|
+
return [...keyword];
|
|
812
|
+
const long = value.match(/^#?([0-9a-f]{6})$/);
|
|
813
|
+
if (long !== null) {
|
|
814
|
+
const n2 = parseInt(long[1], 16);
|
|
815
|
+
return [n2 >> 16 & 255, n2 >> 8 & 255, n2 & 255];
|
|
816
|
+
}
|
|
817
|
+
const short = value.match(/^#?([0-9a-f]{3})([0-9a-f])?$/);
|
|
818
|
+
if (short !== null) {
|
|
819
|
+
const [r, g, b] = [...short[1]].map((digit) => parseInt(digit + digit, 16));
|
|
820
|
+
return [r, g, b];
|
|
821
|
+
}
|
|
822
|
+
const long8 = value.match(/^#?([0-9a-f]{6})[0-9a-f]{2}$/);
|
|
823
|
+
if (long8 !== null) {
|
|
824
|
+
const n2 = parseInt(long8[1], 16);
|
|
825
|
+
return [n2 >> 16 & 255, n2 >> 8 & 255, n2 & 255];
|
|
826
|
+
}
|
|
827
|
+
const rgb = value.match(/^rgba?\(([^)]+)\)$/);
|
|
828
|
+
if (rgb !== null) {
|
|
829
|
+
const parts = rgb[1].split(/[\s,/]+/).filter((part) => part !== "");
|
|
830
|
+
if (parts.length >= 3) {
|
|
831
|
+
const [r, g, b] = parts.slice(0, 3).map((part) => part.endsWith("%") ? parseFloat(part) / 100 * 255 : parseFloat(part));
|
|
832
|
+
if ([r, g, b].every((channel) => Number.isFinite(channel)))
|
|
833
|
+
return [r, g, b];
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
return null;
|
|
837
|
+
}
|
|
838
|
+
function luminance(color) {
|
|
839
|
+
const rgb = parseRgb(color);
|
|
840
|
+
if (rgb === null)
|
|
841
|
+
return -1;
|
|
842
|
+
const [r, g, b] = rgb;
|
|
843
|
+
return 0.299 * r + 0.587 * g + 0.114 * b;
|
|
844
|
+
}
|
|
845
|
+
var DARK_TEXT = "#1b1b1b";
|
|
846
|
+
var LIGHT_TEXT = "#f5f5f5";
|
|
847
|
+
function toLinear(channel) {
|
|
848
|
+
const v = channel / 255;
|
|
849
|
+
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
|
|
850
|
+
}
|
|
851
|
+
function relativeLuminance(color) {
|
|
852
|
+
const rgb = parseRgb(color);
|
|
853
|
+
if (rgb === null)
|
|
854
|
+
return -1;
|
|
855
|
+
const [r, g, b] = rgb;
|
|
856
|
+
return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
|
|
857
|
+
}
|
|
858
|
+
function contrast(a, b) {
|
|
859
|
+
const [lighter, darker] = a > b ? [a, b] : [b, a];
|
|
860
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
861
|
+
}
|
|
862
|
+
function readableTextOn(fill) {
|
|
863
|
+
const background = relativeLuminance(fill);
|
|
864
|
+
if (background < 0)
|
|
865
|
+
return DARK_TEXT;
|
|
866
|
+
return contrast(background, relativeLuminance(LIGHT_TEXT)) > contrast(background, relativeLuminance(DARK_TEXT)) ? LIGHT_TEXT : DARK_TEXT;
|
|
867
|
+
}
|
|
868
|
+
|
|
799
869
|
// src/core/history.ts
|
|
800
870
|
var DiagramCommandHistory = class {
|
|
801
871
|
constructor(listener) {
|
|
@@ -3593,7 +3663,7 @@ ${runtime.error}`;
|
|
|
3593
3663
|
}
|
|
3594
3664
|
}
|
|
3595
3665
|
const titleShift = n2.icon ? iconW + 4 : 0;
|
|
3596
|
-
ctx.fillStyle = hasLoadError ? "#ffffff" : "#
|
|
3666
|
+
ctx.fillStyle = hasLoadError ? "#ffffff" : readableTextOn(active ? "#ffd1dc" : n2.color);
|
|
3597
3667
|
ctx.font = "600 12px Segoe UI, Tahoma, sans-serif";
|
|
3598
3668
|
ctx.textAlign = "center";
|
|
3599
3669
|
ctx.textBaseline = "middle";
|
|
@@ -6079,44 +6149,6 @@ ${runtime.error}`;
|
|
|
6079
6149
|
function iconUrl(name) {
|
|
6080
6150
|
return name ? `/diagram-icons/${name}.svg` : "";
|
|
6081
6151
|
}
|
|
6082
|
-
var CSS_COLOR_KEYWORDS = {
|
|
6083
|
-
white: [255, 255, 255],
|
|
6084
|
-
black: [0, 0, 0],
|
|
6085
|
-
transparent: [255, 255, 255]
|
|
6086
|
-
};
|
|
6087
|
-
function luminance(color) {
|
|
6088
|
-
const value = color.trim().toLowerCase();
|
|
6089
|
-
if (value === "")
|
|
6090
|
-
return -1;
|
|
6091
|
-
const keyword = CSS_COLOR_KEYWORDS[value];
|
|
6092
|
-
if (keyword !== void 0)
|
|
6093
|
-
return 0.299 * keyword[0] + 0.587 * keyword[1] + 0.114 * keyword[2];
|
|
6094
|
-
const long = value.match(/^#?([0-9a-f]{6})$/);
|
|
6095
|
-
if (long !== null) {
|
|
6096
|
-
const n2 = parseInt(long[1], 16);
|
|
6097
|
-
return 0.299 * (n2 >> 16 & 255) + 0.587 * (n2 >> 8 & 255) + 0.114 * (n2 & 255);
|
|
6098
|
-
}
|
|
6099
|
-
const short = value.match(/^#?([0-9a-f]{3})([0-9a-f])?$/);
|
|
6100
|
-
if (short !== null) {
|
|
6101
|
-
const [r, g, b] = [...short[1]].map((digit) => parseInt(digit + digit, 16));
|
|
6102
|
-
return 0.299 * r + 0.587 * g + 0.114 * b;
|
|
6103
|
-
}
|
|
6104
|
-
const long8 = value.match(/^#?([0-9a-f]{6})[0-9a-f]{2}$/);
|
|
6105
|
-
if (long8 !== null) {
|
|
6106
|
-
const n2 = parseInt(long8[1], 16);
|
|
6107
|
-
return 0.299 * (n2 >> 16 & 255) + 0.587 * (n2 >> 8 & 255) + 0.114 * (n2 & 255);
|
|
6108
|
-
}
|
|
6109
|
-
const rgb = value.match(/^rgba?\(([^)]+)\)$/);
|
|
6110
|
-
if (rgb !== null) {
|
|
6111
|
-
const parts = rgb[1].split(/[\s,/]+/).filter((part) => part !== "");
|
|
6112
|
-
if (parts.length >= 3) {
|
|
6113
|
-
const [r, g, b] = parts.slice(0, 3).map((part) => part.endsWith("%") ? parseFloat(part) / 100 * 255 : parseFloat(part));
|
|
6114
|
-
if ([r, g, b].every((channel) => Number.isFinite(channel)))
|
|
6115
|
-
return 0.299 * r + 0.587 * g + 0.114 * b;
|
|
6116
|
-
}
|
|
6117
|
-
}
|
|
6118
|
-
return -1;
|
|
6119
|
-
}
|
|
6120
6152
|
function makePort(p) {
|
|
6121
6153
|
return new Port({
|
|
6122
6154
|
id: p.key,
|