diff --git a/miniapp/data/theme-presets.js b/miniapp/data/theme-presets.js
new file mode 100644
index 0000000..7f786cb
--- /dev/null
+++ b/miniapp/data/theme-presets.js
@@ -0,0 +1,777 @@
+module.exports = [
+ {
+ "id": "figma-aegean",
+ "name": "Figma-Aegean",
+ "colors": [
+ "#264653",
+ "#287271",
+ "#2A9D8F",
+ "#8AB17D",
+ "#E9C46A",
+ "#EFB366",
+ "#F4A261",
+ "#F1965D",
+ "#EE8959",
+ "#E76F51"
+ ]
+ },
+ {
+ "id": "figma-violet",
+ "name": "Figma-Violet",
+ "colors": [
+ "#F72585",
+ "#B5179E",
+ "#7209B7",
+ "#560BAD",
+ "#480CA8",
+ "#3A0CA3",
+ "#3F37C9",
+ "#4361EE",
+ "#4895EF",
+ "#4CC9F0"
+ ]
+ },
+ {
+ "id": "figma-1",
+ "name": "Figma-01",
+ "colors": [
+ "#322F4F",
+ "#433E71",
+ "#554C93",
+ "#98958C",
+ "#DBDD85",
+ "#D8DD7D",
+ "#D5DB74",
+ "#CED56E",
+ "#C8CF67",
+ "#BAC35A"
+ ]
+ },
+ {
+ "id": "figma-2",
+ "name": "Figma-02",
+ "colors": [
+ "#2B3B51",
+ "#355971",
+ "#3F7690",
+ "#91A483",
+ "#E2D075",
+ "#E4C66F",
+ "#E4BD69",
+ "#E0B464",
+ "#DBAA5F",
+ "#D19654"
+ ]
+ },
+ {
+ "id": "figma-3",
+ "name": "Figma-03",
+ "colors": [
+ "#274D4C",
+ "#2B7171",
+ "#2F9595",
+ "#8B9395",
+ "#E79094",
+ "#EC878A",
+ "#EF7D7F",
+ "#EC7578",
+ "#E86D6F",
+ "#E15D5F"
+ ]
+ },
+ {
+ "id": "figma-4",
+ "name": "Figma-04",
+ "colors": [
+ "#3D3D3D",
+ "#5B5B5B",
+ "#797979",
+ "#9F9F9F",
+ "#C4C4C4",
+ "#BCBCBC",
+ "#B3B3B3",
+ "#AAAAAA",
+ "#A1A1A1",
+ "#8F8F8F"
+ ]
+ },
+ {
+ "id": "figma-5",
+ "name": "Figma-05",
+ "colors": [
+ "#F4F1DE",
+ "#EAB69F",
+ "#E07A5F",
+ "#8F5D5D",
+ "#3D405B",
+ "#5F797B",
+ "#81B29A",
+ "#9EB998",
+ "#BABF95",
+ "#F2CC8F"
+ ]
+ },
+ {
+ "id": "figma-6",
+ "name": "Figma-06",
+ "colors": [
+ "#F2F3E3",
+ "#D6DAA5",
+ "#B9C167",
+ "#7C805D",
+ "#3E3D52",
+ "#68667A",
+ "#938FA1",
+ "#A8A6A1",
+ "#BBBBA1",
+ "#E3E6A1"
+ ]
+ },
+ {
+ "id": "figma-7",
+ "name": "Figma-07",
+ "colors": [
+ "#F3F1E0",
+ "#E0C7A1",
+ "#CD9B62",
+ "#856D5D",
+ "#3D3F57",
+ "#63707A",
+ "#89A19D",
+ "#A2B09C",
+ "#BABD9A",
+ "#EBD896"
+ ]
+ },
+ {
+ "id": "figma-8",
+ "name": "Figma-08",
+ "colors": [
+ "#F3E6E7",
+ "#E7A8A9",
+ "#DA6A6B",
+ "#8C5D5D",
+ "#3D4F4E",
+ "#607A7A",
+ "#83A4A5",
+ "#9FA6A7",
+ "#BAA7A8",
+ "#F0A9AB"
+ ]
+ },
+ {
+ "id": "figma-9",
+ "name": "Figma-09",
+ "colors": [
+ "#EFEFEF",
+ "#C2C2C2",
+ "#959595",
+ "#6B6B6B",
+ "#424242",
+ "#717171",
+ "#A0A0A0",
+ "#ADADAD",
+ "#B8B8B8",
+ "#D0D0D0"
+ ]
+ },
+ {
+ "id": "figma-10",
+ "name": "Figma-10",
+ "colors": [
+ "#A8B868",
+ "#798575",
+ "#4A5282",
+ "#393F7C",
+ "#313679",
+ "#282C75",
+ "#3C3C9D",
+ "#4E4CC3",
+ "#645FD4",
+ "#7A71E4"
+ ]
+ },
+ {
+ "id": "figma-11",
+ "name": "Figma-11",
+ "colors": [
+ "#EF476F",
+ "#F78C6B",
+ "#FFD166",
+ "#83D483",
+ "#06D6A0",
+ "#001914",
+ "#118AB2",
+ "#0F7799",
+ "#0C637F",
+ "#073B4C"
+ ]
+ },
+ {
+ "id": "figma-12",
+ "name": "Figma-12",
+ "colors": [
+ "#D06A79",
+ "#984B8D",
+ "#5E2BA1",
+ "#482398",
+ "#3D1F94",
+ "#311B90",
+ "#3D39B6",
+ "#4857DC",
+ "#567BE3",
+ "#629FEB"
+ ]
+ },
+ {
+ "id": "figma-13",
+ "name": "Figma-13",
+ "colors": [
+ "#B0BC63",
+ "#CED674",
+ "#EDF186",
+ "#A19B9B",
+ "#5444B0",
+ "#493DAB",
+ "#3E35A6",
+ "#362E8E",
+ "#2C2676",
+ "#1A1646"
+ ]
+ },
+ {
+ "id": "figma-14",
+ "name": "Figma-14",
+ "colors": [
+ "#D07E6A",
+ "#E3AF6F",
+ "#F6E073",
+ "#91B98D",
+ "#2C90A6",
+ "#2A79A9",
+ "#2761AD",
+ "#225494",
+ "#1B467B",
+ "#102949"
+ ]
+ },
+ {
+ "id": "figma-15",
+ "name": "Figma-15",
+ "colors": [
+ "#E65D5C",
+ "#F1797A",
+ "#FC9498",
+ "#87A6A9",
+ "#10B7B9",
+ "#14ACAC",
+ "#17A09F",
+ "#148A88",
+ "#107271",
+ "#094443"
+ ]
+ },
+ {
+ "id": "figma-16",
+ "name": "Figma-16",
+ "colors": [
+ "#7D7D7D",
+ "#A8A8A8",
+ "#D2D2D2",
+ "#B2B2B2",
+ "#919191",
+ "#7E7E7E",
+ "#6A6A6A",
+ "#5B5B5B",
+ "#4C4C4C",
+ "#2D2D2D"
+ ]
+ },
+ {
+ "id": "figma-17",
+ "name": "Figma-17",
+ "colors": [
+ "#5F0F40",
+ "#7D092F",
+ "#9A031E",
+ "#CB4721",
+ "#FB8B24",
+ "#EF781C",
+ "#E36414",
+ "#AE5E26",
+ "#795838",
+ "#0F4C5C"
+ ]
+ },
+ {
+ "id": "figma-18",
+ "name": "Figma-18",
+ "colors": [
+ "#414731",
+ "#515A23",
+ "#616C15",
+ "#99A32C",
+ "#D1D942",
+ "#C2CB37",
+ "#B3BC2C",
+ "#909636",
+ "#6C6F41",
+ "#252157"
+ ]
+ },
+ {
+ "id": "figma-19",
+ "name": "Figma-19",
+ "colors": [
+ "#502939",
+ "#672F2A",
+ "#7E351A",
+ "#B27225",
+ "#E6B030",
+ "#D99F27",
+ "#CB8E1E",
+ "#9F782D",
+ "#72623C",
+ "#1A375A"
+ ]
+ },
+ {
+ "id": "figma-20",
+ "name": "Figma-20",
+ "colors": [
+ "#5B2A28",
+ "#771E1C",
+ "#921211",
+ "#C43133",
+ "#F55054",
+ "#E94347",
+ "#DC363A",
+ "#AA3E40",
+ "#774547",
+ "#125554"
+ ]
+ },
+ {
+ "id": "figma-21",
+ "name": "Figma-21",
+ "colors": [
+ "#2C2C2C",
+ "#303030",
+ "#333333",
+ "#6A6A6A",
+ "#A0A0A0",
+ "#919191",
+ "#808080",
+ "#6F6F6F",
+ "#5E5E5E",
+ "#3B3B3B"
+ ]
+ },
+ {
+ "id": "figma-22",
+ "name": "Figma-22",
+ "colors": [
+ "#366260",
+ "#516765",
+ "#6C6B6A",
+ "#8E6D6C",
+ "#B16E6D",
+ "#C76E6D",
+ "#DE6D6D",
+ "#E38384",
+ "#E6999A"
+ ]
+ },
+ {
+ "id": "figma-23",
+ "name": "Figma-23",
+ "colors": [
+ "#39476C",
+ "#515371",
+ "#695F75",
+ "#876F74",
+ "#A67F73",
+ "#BA8971",
+ "#CE936E",
+ "#D7AA7E",
+ "#DEC08F"
+ ]
+ },
+ {
+ "id": "figma-24",
+ "name": "Figma-24",
+ "colors": [
+ "#3F3D66",
+ "#52526B",
+ "#656770",
+ "#7E8270",
+ "#979D70",
+ "#A7AE6F",
+ "#B7C06D",
+ "#C5CC81",
+ "#D2D794"
+ ]
+ },
+ {
+ "id": "figma-25",
+ "name": "Figma-25",
+ "colors": [
+ "#4B4B4B",
+ "#575757",
+ "#626262",
+ "#707070",
+ "#7E7E7E",
+ "#878787",
+ "#8F8F8F",
+ "#A5A5A5",
+ "#BABABA"
+ ]
+ },
+ {
+ "id": "figma-26",
+ "name": "Figma-26",
+ "colors": [
+ "#363636",
+ "#474747",
+ "#585858",
+ "#9C9C9C",
+ "#E0E0E0",
+ "#A5A5A5",
+ "#696969",
+ "#565656",
+ "#424242"
+ ]
+ },
+ {
+ "id": "figma-27",
+ "name": "Figma-27",
+ "colors": [
+ "#293B3B",
+ "#235959",
+ "#1D7575",
+ "#84A6A6",
+ "#ECD7D8",
+ "#D58A8A",
+ "#BD3C3D",
+ "#993333",
+ "#732829"
+ ]
+ },
+ {
+ "id": "figma-28",
+ "name": "Figma-28",
+ "colors": [
+ "#2B363B",
+ "#2B4559",
+ "#295477",
+ "#899BA6",
+ "#EAE2D5",
+ "#CBA886",
+ "#AC6F37",
+ "#8B5B2F",
+ "#694626"
+ ]
+ },
+ {
+ "id": "figma-29",
+ "name": "Figma-29",
+ "colors": [
+ "#2F2E3B",
+ "#353159",
+ "#3A3376",
+ "#908EA6",
+ "#E7E8D6",
+ "#BEC388",
+ "#949D3A",
+ "#788031",
+ "#5B6127"
+ ]
+ },
+ {
+ "id": "figma-30",
+ "name": "Figma-30",
+ "colors": [
+ "#283D3B",
+ "#21585A",
+ "#197278",
+ "#83A8A6",
+ "#EDDDD4",
+ "#D99185",
+ "#E9B5AF",
+ "#9E3A2E",
+ "#772E25"
+ ]
+ },
+ {
+ "id": "figma-31",
+ "name": "Figma-31",
+ "colors": [
+ "#BDBDBD",
+ "#9D9D9D",
+ "#7E7E7E",
+ "#6B6B6B",
+ "#585858",
+ "#5D5D5D",
+ "#606060",
+ "#626262",
+ "#707070",
+ "#7D7D7D"
+ ]
+ },
+ {
+ "id": "figma-32",
+ "name": "Figma-32",
+ "colors": [
+ "#FB5860",
+ "#F74046",
+ "#F2292C",
+ "#F23433",
+ "#F23E39",
+ "#B86E68",
+ "#9C867F",
+ "#7F9E96",
+ "#5FB4AE",
+ "#3DCAC5"
+ ]
+ },
+ {
+ "id": "figma-33",
+ "name": "Figma-33",
+ "colors": [
+ "#F3D321",
+ "#E7B019",
+ "#DC8C10",
+ "#D67039",
+ "#D05460",
+ "#A2529A",
+ "#8C51B8",
+ "#7550D5",
+ "#5F5FE3",
+ "#476CEF"
+ ]
+ },
+ {
+ "id": "figma-34",
+ "name": "Figma-34",
+ "colors": [
+ "#E6EB40",
+ "#D1DA2F",
+ "#BDC91E",
+ "#AEBE36",
+ "#9FB24D",
+ "#838F81",
+ "#757E9C",
+ "#666CB6",
+ "#5F5FC8",
+ "#5650DA"
+ ]
+ },
+ {
+ "id": "figma-35",
+ "name": "Figma-35",
+ "colors": [
+ "#FFBE0B",
+ "#FD8A09",
+ "#FB5607",
+ "#FD2B3B",
+ "#FF006E",
+ "#C11CAD",
+ "#A22ACD",
+ "#8338EC",
+ "#5F5FF6",
+ "#3A86FF"
+ ]
+ },
+ {
+ "id": "figma-36",
+ "name": "Figma-36",
+ "colors": [
+ "#6E6E6E",
+ "#555555",
+ "#3C3C3C",
+ "#333333",
+ "#2F2F2F",
+ "#2A2A2A",
+ "#4A4A4A",
+ "#686868",
+ "#888888",
+ "#A8A8A8"
+ ]
+ },
+ {
+ "id": "figma-37",
+ "name": "Figma-37",
+ "colors": [
+ "#EC5B57",
+ "#AD635D",
+ "#6C6B64",
+ "#526660",
+ "#45645D",
+ "#37615B",
+ "#3E8983",
+ "#44B0AB",
+ "#4BC8C4",
+ "#52DFDD"
+ ]
+ },
+ {
+ "id": "figma-38",
+ "name": "Figma-38",
+ "colors": [
+ "#05668D",
+ "#04738F",
+ "#028090",
+ "#019493",
+ "#00A896",
+ "#01B698",
+ "#02C39A",
+ "#79DBAC",
+ "#B5E7B5",
+ "#F0F3BD"
+ ]
+ },
+ {
+ "id": "figma-39",
+ "name": "Figma-39",
+ "colors": [
+ "#292281",
+ "#2D2586",
+ "#31278B",
+ "#382D93",
+ "#3F329B",
+ "#4437A1",
+ "#4A3BA6",
+ "#9D96BA",
+ "#C7C4C4",
+ "#F1F0CD"
+ ]
+ },
+ {
+ "id": "figma-40",
+ "name": "Figma-40",
+ "colors": [
+ "#164588",
+ "#184E8B",
+ "#19568E",
+ "#1B6393",
+ "#1E7098",
+ "#22799B",
+ "#25829F",
+ "#8ABAB1",
+ "#BED6BB",
+ "#F0F2C3"
+ ]
+ },
+ {
+ "id": "figma-41",
+ "name": "Figma-41",
+ "colors": [
+ "#097C7A",
+ "#098281",
+ "#088988",
+ "#089393",
+ "#089D9E",
+ "#0AA4A6",
+ "#0BABAD",
+ "#7DC0C2",
+ "#B7CACC",
+ "#F0D4D6"
+ ]
+ },
+ {
+ "id": "figma-42",
+ "name": "Figma-42",
+ "colors": [
+ "#4D4D4D",
+ "#555555",
+ "#5C5C5C",
+ "#676767",
+ "#737373",
+ "#7C7C7C",
+ "#848484",
+ "#B8B8B8",
+ "#D2D2D2",
+ "#EBEBEB"
+ ]
+ },
+ {
+ "id": "figma-43",
+ "name": "Figma-43",
+ "colors": [
+ "#16697A",
+ "#2F8498",
+ "#489FB5",
+ "#65B0C1",
+ "#9DCAD2",
+ "#B8D4D8",
+ "#EDE7E3",
+ "#F2D7B5",
+ "#F6C787",
+ "#FFA62B"
+ ]
+ },
+ {
+ "id": "figma-44",
+ "name": "Figma-44",
+ "colors": [
+ "#352E74",
+ "#4E4892",
+ "#6862AE",
+ "#817BBB",
+ "#ADAACF",
+ "#C2C0D6",
+ "#EAEBE4",
+ "#E7E9BF",
+ "#E4E79A",
+ "#DDE44F"
+ ]
+ },
+ {
+ "id": "figma-45",
+ "name": "Figma-45",
+ "colors": [
+ "#254D77",
+ "#3E6795",
+ "#5782B2",
+ "#7297BE",
+ "#A5BBD1",
+ "#BDCAD7",
+ "#EBE8E3",
+ "#EDDFB9",
+ "#EDD68F",
+ "#EEC33A"
+ ]
+ },
+ {
+ "id": "figma-46",
+ "name": "Figma-46",
+ "colors": [
+ "#1A7271",
+ "#338F8E",
+ "#4CABAA",
+ "#68B9B8",
+ "#9FCECE",
+ "#B9D6D6",
+ "#ECE4E4",
+ "#F0C3C5",
+ "#F3A2A5",
+ "#FA6065"
+ ]
+ },
+ {
+ "id": "figma-47",
+ "name": "Figma-47",
+ "colors": [
+ "#525252",
+ "#6C6C6C",
+ "#878787",
+ "#9B9B9B",
+ "#BDBDBD",
+ "#CCCCCC",
+ "#E8E8E8",
+ "#DBDBDB",
+ "#CDCDCD",
+ "#B2B2B2"
+ ]
+ }
+];
diff --git a/miniapp/pages/index/index.js b/miniapp/pages/index/index.js
index 4bfc039..015daaf 100644
--- a/miniapp/pages/index/index.js
+++ b/miniapp/pages/index/index.js
@@ -1,5 +1,6 @@
const { parseTableByFileName, buildSankeyData } = require('../../utils/sankey');
const defaultSankeyTable = require('../../data/sankey.default.js');
+const themePresets = require('../../data/theme-presets.js');
/**
* 将表头标准化,便于做中英文别名匹配。
@@ -65,11 +66,39 @@ function getFileExtension(fileName) {
return lowerName.slice(lastDotIndex + 1);
}
+const FALLBACK_THEME_COLORS = ['#9b6bc2', '#7e95f7', '#4cc9f0', '#f4a261'];
+
/**
- * 节点配色:与当前画布渲染保持一致,双色交替。
+ * 节点配色:使用当前主题色带循环取色。
*/
-function getNodeColor(index) {
- return index % 2 === 0 ? '#9b6bc2' : '#7e95f7';
+function getNodeColor(index, palette) {
+ const colors = Array.isArray(palette) && palette.length > 0 ? palette : FALLBACK_THEME_COLORS;
+ return colors[index % colors.length];
+}
+
+/**
+ * 将 16 进制颜色转换为 rgba,便于控制连线透明度。
+ */
+function toRgbaColor(color, alpha) {
+ const text = String(color || '').trim();
+ const safeAlpha = Number.isFinite(Number(alpha)) ? Math.max(0, Math.min(1, Number(alpha))) : 1;
+ const shortHex = /^#([0-9a-fA-F]{3})$/;
+ const longHex = /^#([0-9a-fA-F]{6})$/;
+
+ let hex = '';
+ if (shortHex.test(text)) {
+ const raw = text.slice(1);
+ hex = `${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;
+ } else if (longHex.test(text)) {
+ hex = text.slice(1);
+ } else {
+ return text || `rgba(155,107,194,${safeAlpha})`;
+ }
+
+ const r = parseInt(hex.slice(0, 2), 16);
+ const g = parseInt(hex.slice(2, 4), 16);
+ const b = parseInt(hex.slice(4, 6), 16);
+ return `rgba(${r},${g},${b},${safeAlpha})`;
}
/**
@@ -137,6 +166,14 @@ const DEFAULT_SANKEY_FILE_PATHS = [
'data/sankey.xlsx',
'miniapp/data/sankey.xlsx'
];
+const DEFAULT_THEME_ID = 'figma-violet';
+const DEFAULT_THEME_INDEX = (() => {
+ if (!Array.isArray(themePresets) || themePresets.length === 0) {
+ return 0;
+ }
+ const index = themePresets.findIndex((item) => item && item.id === DEFAULT_THEME_ID);
+ return index >= 0 ? index : 0;
+})();
/**
* 数值限制,避免 UI 参数导致布局异常。
@@ -256,6 +293,10 @@ function buildSankeyLayout(links, width, height, renderOptions) {
const sourceNames = Object.keys(sourceValueMap);
const targetNames = Object.keys(targetValueMap);
+ const sourceIndexMap = {};
+ sourceNames.forEach((name, index) => {
+ sourceIndexMap[name] = index;
+ });
const totalValue = sourceNames.reduce((sum, name) => sum + sourceValueMap[name], 0);
if (totalValue <= 0) {
return null;
@@ -329,7 +370,8 @@ function buildSankeyLayout(links, width, height, renderOptions) {
controlX,
sy,
ty,
- linkHeight
+ linkHeight,
+ sourceIndex: Number.isFinite(sourceIndexMap[link.source]) ? sourceIndexMap[link.source] : 0
});
});
@@ -354,6 +396,12 @@ function buildSankeySvgText(links, width, height, renderOptions) {
return '';
}
const labelPositionMode = (renderOptions && renderOptions.labelPositionMode) || 'inner';
+ const themeColors =
+ renderOptions &&
+ Array.isArray(renderOptions.themeColors) &&
+ renderOptions.themeColors.length > 0
+ ? renderOptions.themeColors
+ : FALLBACK_THEME_COLORS;
const segments = [];
segments.push(
@@ -372,7 +420,10 @@ function buildSankeySvgText(links, width, height, renderOptions) {
segment.endX
)} ${formatSvgNumber(segment.ty)}`;
segments.push(
- ``
);
@@ -385,7 +436,7 @@ function buildSankeySvgText(links, width, height, renderOptions) {
segments.push(
``
+ )}" height="${formatSvgNumber(node.h)}" fill="${getNodeColor(index, themeColors)}" />`
);
segments.push(
``
+ )}" height="${formatSvgNumber(node.h)}" fill="${getNodeColor(index, themeColors)}" />`
);
segments.push(
`
选择配色主题
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/miniapp/pages/index/index.wxss b/miniapp/pages/index/index.wxss
index c2cf72d..0027adc 100644
--- a/miniapp/pages/index/index.wxss
+++ b/miniapp/pages/index/index.wxss
@@ -385,8 +385,9 @@
bottom: 0;
background: #fff;
border-radius: 16px 16px 0 0;
- padding: 12px;
+ padding: 12px 12px 16px;
z-index: 11;
+ box-sizing: border-box;
}
.theme-title {
@@ -395,11 +396,21 @@
text-align: center;
}
-.theme-row {
+.theme-list {
margin-top: 8px;
+ height: 216px;
+ min-height: 216px;
+}
+
+.theme-row {
display: flex;
align-items: center;
gap: 8px;
+ height: 36px;
+}
+
+.theme-row + .theme-row {
+ margin-top: 0;
}
.theme-row image {
@@ -411,5 +422,11 @@
flex: 1;
height: 20px;
border-radius: 2px;
- background: linear-gradient(90deg, #f72585, #3f37c9, #4cc9f0);
+ overflow: hidden;
+ display: flex;
+}
+
+.theme-color {
+ flex: 1;
+ height: 100%;
}