koishi-plugin-dew-bot 1.0.264 → 1.0.266
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/README.md +1 -2
- package/lib/index.js +183 -40
- package/lib/plugin/companionCardAssets.d.ts +1 -0
- package/lib/plugin/companionCardStyles.d.ts +1 -1
- package/lib/plugin/companionCardTemplate.d.ts +1 -1
- package/lib/plugin/qualityCardStyles.d.ts +1 -1
- package/lib/plugin/serverHandel/qqCommandMessage.d.ts +0 -3
- package/lib/plugin/serverHandel/qqPageMessage.d.ts +1 -3
- package/lib/plugin/serverHandel/qqRewardMessage.d.ts +2 -2
- package/lib/plugin/serverHandel/qqStoryMessage.d.ts +0 -3
- package/lib/plugin/serverHandel/qqTransactionMessage.d.ts +0 -3
- package/lib/plugin/signinCardTemplate.d.ts +0 -1
- package/lib/shared/bot/PtlStatistics.d.ts +1 -1
- package/lib/shared/face/index.d.ts +21 -2
- package/package.json +1 -1
- package/src/plugin/companionCardAssets.ts +2 -0
- package/src/plugin/companionCardStyles.ts +6 -0
- package/src/plugin/companionCardTemplate.ts +17 -8
- package/src/plugin/equipmentCardTemplate.ts +5 -2
- package/src/plugin/qualityCardStyles.ts +6 -0
- package/src/plugin/serverHandel/qqCommandMessage.ts +1 -8
- package/src/plugin/serverHandel/qqMessagePreview.ts +1 -0
- package/src/plugin/serverHandel/qqPageMessage.ts +1 -8
- package/src/plugin/serverHandel/qqRewardMessage.ts +12 -7
- package/src/plugin/serverHandel/qqStoryMessage.ts +1 -8
- package/src/plugin/serverHandel/qqTransactionMessage.ts +1 -8
- package/src/plugin/signinCardTemplate.ts +0 -1
- package/src/plugin/skillCard.ts +2 -1
- package/src/plugin/skillCardTemplate.ts +21 -2
- package/src/shared/bot/PtlStatistics.ts +1 -1
- package/src/shared/bot/serviceProto.ts +101 -1
- package/src/shared/face/index.ts +11 -1
package/README.md
CHANGED
package/lib/index.js
CHANGED
|
@@ -67,7 +67,7 @@ var serviceProto;
|
|
|
67
67
|
var init_serviceProto = __esm({
|
|
68
68
|
"src/shared/bot/serviceProto.ts"() {
|
|
69
69
|
serviceProto = {
|
|
70
|
-
"version":
|
|
70
|
+
"version": 44,
|
|
71
71
|
"services": [
|
|
72
72
|
{
|
|
73
73
|
"id": 0,
|
|
@@ -931,6 +931,22 @@ var init_serviceProto = __esm({
|
|
|
931
931
|
"type": {
|
|
932
932
|
"type": "String"
|
|
933
933
|
}
|
|
934
|
+
},
|
|
935
|
+
{
|
|
936
|
+
"id": 15,
|
|
937
|
+
"name": "stars",
|
|
938
|
+
"type": {
|
|
939
|
+
"type": "Number"
|
|
940
|
+
},
|
|
941
|
+
"optional": true
|
|
942
|
+
},
|
|
943
|
+
{
|
|
944
|
+
"id": 16,
|
|
945
|
+
"name": "maxStars",
|
|
946
|
+
"type": {
|
|
947
|
+
"type": "Number"
|
|
948
|
+
},
|
|
949
|
+
"optional": true
|
|
934
950
|
}
|
|
935
951
|
]
|
|
936
952
|
},
|
|
@@ -1192,6 +1208,33 @@ var init_serviceProto = __esm({
|
|
|
1192
1208
|
"type": "String"
|
|
1193
1209
|
},
|
|
1194
1210
|
"optional": true
|
|
1211
|
+
},
|
|
1212
|
+
{
|
|
1213
|
+
"id": 13,
|
|
1214
|
+
"name": "randomAffixes",
|
|
1215
|
+
"type": {
|
|
1216
|
+
"type": "Array",
|
|
1217
|
+
"elementType": {
|
|
1218
|
+
"type": "Interface",
|
|
1219
|
+
"properties": [
|
|
1220
|
+
{
|
|
1221
|
+
"id": 0,
|
|
1222
|
+
"name": "name",
|
|
1223
|
+
"type": {
|
|
1224
|
+
"type": "String"
|
|
1225
|
+
}
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
"id": 1,
|
|
1229
|
+
"name": "value",
|
|
1230
|
+
"type": {
|
|
1231
|
+
"type": "String"
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
]
|
|
1235
|
+
}
|
|
1236
|
+
},
|
|
1237
|
+
"optional": true
|
|
1195
1238
|
}
|
|
1196
1239
|
]
|
|
1197
1240
|
},
|
|
@@ -1828,6 +1871,55 @@ var init_serviceProto = __esm({
|
|
|
1828
1871
|
]
|
|
1829
1872
|
}
|
|
1830
1873
|
}
|
|
1874
|
+
},
|
|
1875
|
+
{
|
|
1876
|
+
"id": 14,
|
|
1877
|
+
"name": "equipment",
|
|
1878
|
+
"type": {
|
|
1879
|
+
"type": "Array",
|
|
1880
|
+
"elementType": {
|
|
1881
|
+
"type": "Interface",
|
|
1882
|
+
"properties": [
|
|
1883
|
+
{
|
|
1884
|
+
"id": 0,
|
|
1885
|
+
"name": "id",
|
|
1886
|
+
"type": {
|
|
1887
|
+
"type": "String"
|
|
1888
|
+
}
|
|
1889
|
+
},
|
|
1890
|
+
{
|
|
1891
|
+
"id": 1,
|
|
1892
|
+
"name": "name",
|
|
1893
|
+
"type": {
|
|
1894
|
+
"type": "String"
|
|
1895
|
+
}
|
|
1896
|
+
},
|
|
1897
|
+
{
|
|
1898
|
+
"id": 2,
|
|
1899
|
+
"name": "quality",
|
|
1900
|
+
"type": {
|
|
1901
|
+
"type": "String"
|
|
1902
|
+
}
|
|
1903
|
+
},
|
|
1904
|
+
{
|
|
1905
|
+
"id": 3,
|
|
1906
|
+
"name": "slot",
|
|
1907
|
+
"type": {
|
|
1908
|
+
"type": "String"
|
|
1909
|
+
}
|
|
1910
|
+
},
|
|
1911
|
+
{
|
|
1912
|
+
"id": 4,
|
|
1913
|
+
"name": "enhancement",
|
|
1914
|
+
"type": {
|
|
1915
|
+
"type": "Number"
|
|
1916
|
+
},
|
|
1917
|
+
"optional": true
|
|
1918
|
+
}
|
|
1919
|
+
]
|
|
1920
|
+
}
|
|
1921
|
+
},
|
|
1922
|
+
"optional": true
|
|
1831
1923
|
}
|
|
1832
1924
|
]
|
|
1833
1925
|
},
|
|
@@ -1841,6 +1933,14 @@ var init_serviceProto = __esm({
|
|
|
1841
1933
|
{
|
|
1842
1934
|
"id": 1,
|
|
1843
1935
|
"value": "follower"
|
|
1936
|
+
},
|
|
1937
|
+
{
|
|
1938
|
+
"id": 2,
|
|
1939
|
+
"value": "monster"
|
|
1940
|
+
},
|
|
1941
|
+
{
|
|
1942
|
+
"id": 3,
|
|
1943
|
+
"value": "boss"
|
|
1844
1944
|
}
|
|
1845
1945
|
]
|
|
1846
1946
|
},
|
|
@@ -2711,6 +2811,12 @@ h1,h2,h3,p{margin:0}
|
|
|
2711
2811
|
.skill-type{font-size:24px;letter-spacing:3px;color:#cbcdbd}
|
|
2712
2812
|
.quality-badge{display:inline-flex;align-items:center;gap:9px;padding:6px 14px;color:#fff5de;font-size:18px;font-weight:600;border:1px solid color-mix(in srgb,var(--quality-accent) 70%,transparent);border-radius:6px;background:color-mix(in srgb,var(--quality-accent) 17%,transparent)}
|
|
2713
2813
|
.quality-badge b{color:var(--quality-end);font:700 24px Georgia,serif}
|
|
2814
|
+
.skill-stars{display:flex;align-items:center;flex-wrap:wrap;gap:3px;max-width:100%;margin-top:-8px}
|
|
2815
|
+
.skill-star{display:block;flex:0 0 40px;width:40px;height:40px;overflow:visible;filter:drop-shadow(0 1px 1px #10121780)}
|
|
2816
|
+
.star-shape{stroke:#24252b;stroke-width:2.4;stroke-linejoin:round}
|
|
2817
|
+
.star-gradient-light{stop-color:color-mix(in srgb,var(--quality-end) 55%,#fff)}.star-gradient-mid{stop-color:var(--quality-accent)}.star-gradient-shade{stop-color:var(--quality-start)}
|
|
2818
|
+
.star-facet-light{fill:#fff;opacity:.28}.star-facet-shade{fill:#151328;opacity:.18}.star-facet-glint{fill:none;stroke:#fff;stroke-width:.7;stroke-linejoin:round;opacity:.55}
|
|
2819
|
+
.skill-star.unlit .star-shape{fill:#303436;stroke:#171d22;stroke-width:2.6}
|
|
2714
2820
|
.tags{display:flex;gap:7px;flex-wrap:wrap}
|
|
2715
2821
|
.tag{font-size:20px;line-height:1.3;padding:6px 10px;border-radius:4px;overflow-wrap:anywhere;color:#bfcaed;background:#647bb434;border:1px solid #7d9cc62b}
|
|
2716
2822
|
.tag.damage{color:#f5ae94;background:#b961433d;border-color:#b4614340}.tag.shield{color:#a3d7b7;background:#5186683d;border-color:#73a48a40}.tag.heal{color:#b5deb0;background:#668e4a3b;border-color:#89a47140}.tag.passive{color:#cebbef;background:#8367a63d;border-color:#9682b540}.tag.growth{color:#ecd291;background:#b1944540;border-color:#ab944e40}
|
|
@@ -2986,6 +3092,12 @@ var companionCardStyles = `
|
|
|
2986
3092
|
.companion-attributes{margin-top:3px;flex:1;display:flex;flex-direction:column;justify-content:center;min-width:0}.companion-attributes .ornament-heading{margin-bottom:4px;font-size:22px;gap:6px;letter-spacing:2px}.companion-radar{width:100%;height:300px;display:block;overflow:visible}.radar-grid{fill:none;stroke:var(--radar-grid);stroke-width:1.2}.radar-axis{stroke:var(--radar-grid);stroke-width:1;opacity:.8}.radar-area{fill:var(--radar-fill);stroke:var(--radar);stroke-width:2.5;stroke-linejoin:round}.radar-dot{fill:var(--flower);stroke:var(--radar);stroke-width:2}.radar-label{font:18px "Microsoft YaHei",sans-serif;fill:var(--ink)}.radar-value{font:20px Georgia,"Microsoft YaHei",serif;fill:var(--ink)}.radar-scale{font:11px Georgia,serif;fill:var(--subtle)}.empty-attributes{padding:45px 10px;color:var(--subtle);font:18px/1.6 "Microsoft YaHei",sans-serif;text-align:center}.custom-attributes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 10px;margin:6px 0 0;font:15px/1.5 "Microsoft YaHei",sans-serif;color:var(--subtle)}.custom-attributes span{overflow-wrap:anywhere}.custom-attributes b{font-weight:500;color:var(--ink)}
|
|
2987
3093
|
.companion-skills{position:relative;z-index:1;padding:12px 18px 19px;margin-top:15px}.companion-skills .ornament-heading{margin-bottom:13px}.skill-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 13px}.companion-skill{position:relative;min-width:0;display:grid;grid-template-columns:47px minmax(0,1fr) auto;align-items:center;gap:10px;padding:9px 10px;border:1px solid var(--edge);border-radius:7px;box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--edge) 12%,transparent);background:color-mix(in srgb,var(--panel) 55%,transparent);min-height:65px}.skill-icon{width:47px;height:47px;border:1px solid var(--edge);border-radius:7px;display:grid;place-items:center;background:radial-gradient(ellipse at 40% 23%,color-mix(in srgb,var(--accent) 55%,var(--paper)),color-mix(in srgb,var(--paper) 72%,#282015));color:var(--flower);box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--light-edge) 20%,transparent)}.skill-icon svg{width:31px;height:31px;stroke:currentColor;stroke-width:1.7;fill:none;stroke-linecap:round;stroke-linejoin:round}.skill-name{font-size:20px;font-weight:700;overflow-wrap:anywhere;line-height:1.35}.skill-level{font:18px/1.2 Georgia,"Microsoft YaHei",serif;border:1px solid color-mix(in srgb,var(--edge) 55%,transparent);border-radius:13px;padding:5px 9px;white-space:nowrap;color:var(--ink);background:color-mix(in srgb,var(--accent) 9%,transparent)}.empty-list{margin:10px 0;color:var(--subtle);font:17px/1.6 "Microsoft YaHei",sans-serif;text-align:center}.follower-theme .companion-panel{box-shadow:inset 0 0 0 3px var(--panel),inset 0 0 0 4px color-mix(in srgb,var(--edge) 50%,transparent),0 2px 6px #00000040}.follower-theme .skill-icon{background:radial-gradient(ellipse at 40% 23%,#858585,#292929)}.follower-theme .resource-track{box-shadow:inset 0 1px 3px #00000030}.follower-theme .companion-power{color:var(--ink)}.follower-theme .resource-percent{color:#fffef7;text-shadow:0 1px 2px #242725}
|
|
2988
3094
|
.skill-icon,.bloodline-crest{position:relative;overflow:hidden}.bloodline-crest.has-entry-artwork{border-radius:7px}.skill-entry-artwork,.bloodline-entry-artwork{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:contain;border-radius:inherit;background:var(--paper);z-index:1}.follower-theme .skill-entry-artwork,.follower-theme .bloodline-entry-artwork{filter:grayscale(1)}
|
|
3095
|
+
.monster-theme{--ink:#e0eeea;--subtle:#a2b9b6;--accent:#9bd8c9;--edge:#668f90;--light-edge:#c3e5d7;--panel:#203f48;--panel-deep:#142d38;--paper:#183440;--flower:#d3efe6;--track:#213c46;--track-edge:#769b92;--health:#518f7f;--health-light:#96d6b5;--radar:#a2d8c9;--radar-fill:#7bb5ab55;--radar-grid:#507d80;background:radial-gradient(ellipse at 10% 9%,#81b8a840,transparent 43%),radial-gradient(ellipse at 94% 83%,#49808045,transparent 35%),repeating-linear-gradient(125deg,#d6eee608 0 1px,transparent 1px 5px),linear-gradient(155deg,#3c6269,#142a35 37%,#30515a)}
|
|
3096
|
+
.boss-theme{--ink:#f7e2c3;--subtle:#ceafac;--accent:#edc385;--edge:#b77c62;--light-edge:#f5dba4;--panel:#492937;--panel-deep:#281b2a;--paper:#342132;--flower:#ffe6b2;--track:#4b2837;--track-edge:#b88170;--health:#a24d59;--health-light:#eb9395;--radar:#edc385;--radar-fill:#daaa5b55;--radar-grid:#925c64;padding-top:55px;background:radial-gradient(ellipse at 48% 0%,#ecc07855,transparent 40%),radial-gradient(ellipse at 96% 83%,#c54a6245,transparent 35%),repeating-linear-gradient(125deg,#f2dfbd08 0 1px,transparent 1px 5px),linear-gradient(155deg,#773b46,#211b2c 37%,#5d2c42)}
|
|
3097
|
+
.boss-card-decoration{position:absolute;top:3px;left:50%;transform:translateX(-50%);width:160px;height:52px;color:var(--accent)}.boss-card-decoration svg{display:block;width:100%;height:100%}.boss-theme .companion-portrait,.boss-theme .companion-stats{box-shadow:inset 0 0 0 3px var(--panel),inset 0 0 0 4px color-mix(in srgb,var(--edge) 60%,transparent),0 0 13px #daa04e40}.boss-theme .state-badge{border-radius:5px;letter-spacing:3px;background:linear-gradient(135deg,#b6805130,#8c44502b);padding:7px 15px}.monster-theme .state-badge{letter-spacing:2px}
|
|
3098
|
+
.enemy-equipment{padding:13px 18px 18px;margin-top:15px}.enemy-equipment-list{display:grid;gap:8px}.enemy-equipment-row{display:grid;grid-template-columns:28px minmax(0,1fr) auto auto;align-items:center;gap:10px;padding:8px 11px;border:1px solid var(--edge);border-radius:7px;background:color-mix(in srgb,var(--panel) 55%,transparent);min-width:0}.equipment-symbol{color:var(--accent);font-size:26px}.enemy-equipment-name{font-size:20px;line-height:1.4;overflow-wrap:anywhere}.enemy-equipment-name small{color:var(--accent);font:17px Georgia,serif;white-space:nowrap}.equipment-slot{font:15px/1.4 "Microsoft YaHei",sans-serif;color:var(--subtle);max-width:120px;overflow-wrap:anywhere}
|
|
3099
|
+
.enemy-main{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.enemy-sheet .companion-stats{justify-content:center;padding:24px 24px 26px}.enemy-sheet .companion-name{font-size:43px;letter-spacing:2px}.enemy-sheet .companion-power-row{margin:24px 0}.enemy-sheet .companion-resource{margin-bottom:0}.enemy-attributes{padding:16px 12px 12px;display:flex;align-items:center}.enemy-attributes .companion-attributes{margin:0}.enemy-sheet>.bloodline-panel{margin-top:15px;padding:13px 18px 18px}.enemy-sheet .bloodline-list{grid-template-columns:repeat(2,minmax(0,1fr))}.enemy-sheet .bloodline-name{font-size:20px}
|
|
3100
|
+
|
|
2989
3101
|
`;
|
|
2990
3102
|
|
|
2991
3103
|
// src/plugin/companionCardAssets.ts
|
|
@@ -3018,6 +3130,7 @@ var followerPortraitPlaceholder = image(`<svg xmlns="http://www.w3.org/2000/svg"
|
|
|
3018
3130
|
<g fill="#1d1d1d" stroke="#a7a7a7" stroke-width="2"><path d="M158 485c7-79 20-135 42-166 15-44 29-83 70-88 46 7 58 45 73 89 19 29 37 87 42 166Z"/><path d="M218 297c-4-50 14-87 52-88 39 1 58 38 52 89l-19-9-13-30-20-12-22 12-11 30Z"/><path d="m216 316 54 66 54-66M197 358l-26 117m172-117 27 117" fill="none"/><path d="m247 287 23 20 24-20-11 48h-26Z" fill="#808080" stroke="none"/></g>
|
|
3019
3131
|
<text x="270" y="551" text-anchor="middle" font-family="Microsoft YaHei,sans-serif" font-size="26" letter-spacing="4" fill="#e1e0d6">暂无随从形象</text>
|
|
3020
3132
|
</svg>`);
|
|
3133
|
+
var bossCardDecoration = '<svg viewBox="0 0 160 64" aria-hidden="true"><path d="M31 49 23 17l32 20L80 5l25 32 32-20-8 32ZM31 55h98" fill="currentColor" opacity=".7"/><path d="M9 51 26 39M134 39l17 12M5 58l19-10m112 0 19 10" fill="none" stroke="currentColor" stroke-width="2"/><circle cx="80" cy="5" r="4" fill="currentColor"/><circle cx="23" cy="17" r="3" fill="currentColor"/><circle cx="137" cy="17" r="3" fill="currentColor"/></svg>';
|
|
3021
3134
|
|
|
3022
3135
|
// src/plugin/companionCardTemplate.ts
|
|
3023
3136
|
var finite2 = /* @__PURE__ */ __name((value) => Number.isFinite(value) ? value : 0, "finite");
|
|
@@ -3086,21 +3199,30 @@ function skills(card, icons) {
|
|
|
3086
3199
|
return `<section class="companion-panel companion-skills" aria-label="技能">${corners2()}${heading("技能")}${card.skills.length ? `<div class="skill-grid">${card.skills.map((skill, index) => `<div class="companion-skill" data-skill-id="${cardEscape(skill.id)}"><span class="skill-icon" aria-hidden="true"><svg viewBox="0 0 36 36">${skill.type === "passive" ? passive : active}</svg>${icons?.skills?.[index] ? `<img class="skill-entry-artwork" data-entry-index="${index}" src="${cardEscape(icons.skills[index])}" alt="">` : ""}</span><span class="skill-name">${cardEscape(skill.name)}</span><span class="skill-level">Lv.${number3(skill.rank)}</span></div>`).join("")}</div>` : '<p class="empty-list">暂无技能</p>'}</section>`;
|
|
3087
3200
|
}
|
|
3088
3201
|
__name(skills, "skills");
|
|
3202
|
+
function equipment(card) {
|
|
3203
|
+
if (!card.equipment) return "";
|
|
3204
|
+
return `<section class="companion-panel enemy-equipment" aria-label="装备">${heading("装备")}${card.equipment.length ? '<div class="enemy-equipment-list">' + card.equipment.map((item) => `<div class="enemy-equipment-row"><span class="equipment-symbol" aria-hidden="true">✧</span><span class="enemy-equipment-name">${cardEscape(item.name)}${item.enhancement ? " <small>+" + number3(item.enhancement) + "</small>" : ""}</span><span class="equipment-slot">${cardEscape(item.slot)}</span><span class="bloodline-quality">${cardEscape(item.quality)}</span></div>`).join("") + "</div>" : '<p class="empty-list">暂无装备</p>'}</section>`;
|
|
3205
|
+
}
|
|
3206
|
+
__name(equipment, "equipment");
|
|
3089
3207
|
function companionCardHtml(card, artwork, icons) {
|
|
3090
3208
|
const pet = card.kind === "pet";
|
|
3209
|
+
const enemy = card.kind === "monster" || card.kind === "boss";
|
|
3210
|
+
const boss = card.kind === "boss";
|
|
3211
|
+
const kind = enemy ? boss ? "boss" : "monster" : pet ? "pet" : "follower";
|
|
3212
|
+
const typeName = enemy ? boss ? "首领" : "普通怪物" : pet ? "宠物" : "随从";
|
|
3091
3213
|
const fallback = pet ? petPortraitPlaceholder : followerPortraitPlaceholder;
|
|
3092
3214
|
const healthPercent = ratio2(card.hp, card.maxHp) * 100;
|
|
3093
3215
|
const experience = Math.max(0, Math.min(100, finite2(card.experiencePercent ?? 0)));
|
|
3094
3216
|
const state = pet ? card.state === "fallen" ? "fallen" : card.state === "resting" ? "resting" : "active" : "active";
|
|
3095
|
-
const stateName = pet ? { active: "出战", resting: "休息", fallen: "倒下" }[state] : "自动参战";
|
|
3096
|
-
return `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><style>${companionCardStyles}</style></head><body><main id="capture" class="companion-sheet ${
|
|
3097
|
-
|
|
3098
|
-
<section class="companion-panel companion-stats" aria-label="${
|
|
3217
|
+
const stateName = enemy ? typeName : pet ? { active: "出战", resting: "休息", fallen: "倒下" }[state] : "自动参战";
|
|
3218
|
+
return `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><style>${companionCardStyles}</style></head><body><main id="capture" class="companion-sheet ${kind}-theme${enemy ? " enemy-sheet" : ""}" data-kind="${kind}">${boss ? `<div class="boss-card-decoration">${bossCardDecoration}</div>` : ""}<div class="companion-main${enemy ? " enemy-main" : ""}">
|
|
3219
|
+
${enemy ? "" : `<div class="portrait-column"><div class="companion-panel companion-portrait">${corners2()}<div class="portrait-window"><img id="companion-image" class="companion-artwork" src="${cardEscape(artwork || fallback)}" data-fallback="${cardEscape(fallback)}" alt="${cardEscape(card.name)}的形象图"></div></div>${card.description?.trim() ? `<p class="companion-description">${cardEscape(card.description.trim())}</p>` : ""}${bloodlines(card, icons)}</div>`}
|
|
3220
|
+
<section class="companion-panel companion-stats" aria-label="${typeName}属性">${corners2(["tr", "br"])}<div class="companion-identity"><h1 id="companion-name" class="companion-name">${cardEscape(card.name)}</h1><p class="companion-level">Lv. ${number3(card.level)}</p><div class="state-badge state-${state}">${pet ? paw : '<span aria-hidden="true">✦</span>'}<span>${stateName}</span>${pet ? paw : '<span aria-hidden="true">✦</span>'}</div>${kind === "follower" ? '<p class="permanent-note">战死后永久离队</p>' : ""}</div>
|
|
3099
3221
|
<div class="companion-power-row"><span class="power-icon" aria-hidden="true">${sword}</span><span class="companion-power-label">战力</span><strong id="companion-power" class="companion-power">${number3(card.power)}</strong></div>
|
|
3100
3222
|
<div class="companion-resource hp-resource"><div class="resource-heading"><span class="resource-label"><svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 28C6 21 2 17 2 10a7 7 0 0 1 14-2 7 7 0 0 1 14 2c0 7-4 11-14 18Z"/></svg>生命值</span><span id="companion-hp" class="resource-number">${number3(card.hp)} / ${number3(card.maxHp)}</span></div><div class="resource-track" role="progressbar" aria-label="生命值" aria-valuemin="0" aria-valuemax="100" aria-valuenow="${healthPercent}"><span class="resource-fill" style="width:${healthPercent}%"></span><span class="resource-percent">${number3(healthPercent)}%</span></div></div>
|
|
3101
3223
|
${pet ? `<div class="companion-resource exp-resource"><div class="resource-heading"><span class="resource-label"><svg viewBox="0 0 32 32" aria-hidden="true"><path d="m16 2 4.5 9.1 10 1.4-7.3 7.1 1.7 10-8.9-4.7-8.9 4.7 1.7-10-7.3-7.1 10-1.4Z"/></svg>经验进度</span><span class="resource-number">${number3(experience)}%</span></div><div class="resource-track" role="progressbar" aria-label="经验进度" aria-valuemin="0" aria-valuemax="100" aria-valuenow="${experience}"><span class="resource-fill" style="width:${experience}%"></span><span class="resource-percent">${number3(experience)}%</span></div></div>` : ""}
|
|
3102
|
-
<section class="companion-attributes" aria-label="一级属性">${heading("一级属性")}${radar2(card)}</section></section>
|
|
3103
|
-
</div>${skills(card, icons)}</main></body></html>`;
|
|
3224
|
+
${enemy ? '</section><section class="companion-panel enemy-attributes">' : ""}<section class="companion-attributes" aria-label="一级属性">${heading("一级属性")}${radar2(card)}</section></section>
|
|
3225
|
+
</div>${enemy ? bloodlines(card, icons) : ""}${skills(card, icons)}${equipment(card)}</main></body></html>`;
|
|
3104
3226
|
}
|
|
3105
3227
|
__name(companionCardHtml, "companionCardHtml");
|
|
3106
3228
|
|
|
@@ -3554,6 +3676,20 @@ function tagClass(tag) {
|
|
|
3554
3676
|
return "";
|
|
3555
3677
|
}
|
|
3556
3678
|
__name(tagClass, "tagClass");
|
|
3679
|
+
function skillStars(card) {
|
|
3680
|
+
if (card.stars === void 0 && card.maxStars === void 0) return "";
|
|
3681
|
+
const maxStars = Math.min(20, Math.max(0, Math.floor(Number.isFinite(card.maxStars) ? card.maxStars : Number.isFinite(card.stars) ? card.stars : 0)));
|
|
3682
|
+
if (!maxStars) return "";
|
|
3683
|
+
const stars = Math.min(maxStars, Math.max(0, Math.floor(Number.isFinite(card.stars) ? card.stars : 0)));
|
|
3684
|
+
const outline = "20,3 25.1,13.4 36.6,15.1 28.3,23.2 30.3,34.7 20,29.3 9.7,34.7 11.7,23.2 3.4,15.1 14.9,13.4";
|
|
3685
|
+
const icons = Array.from({ length: maxStars }, (_, index) => {
|
|
3686
|
+
const lit = index < stars;
|
|
3687
|
+
const gradient = "skill-star-fill-" + index;
|
|
3688
|
+
return '<svg class="skill-star ' + (lit ? "lit" : "unlit") + '" viewBox="0 0 40 40" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg">' + (lit ? '<defs><linearGradient id="' + gradient + '" x1="0" y1="0" x2="0.7" y2="1"><stop class="star-gradient-light"/><stop offset=".48" class="star-gradient-mid"/><stop offset="1" class="star-gradient-shade"/></linearGradient></defs>' : "") + '<polygon class="star-shape" points="' + outline + '"' + (lit ? ' fill="url(#' + gradient + ')"' : "") + "/>" + (lit ? '<path class="star-facet-light" d="M20 5.7 20 20.6 5.9 16.1 15.9 14.6Z"/><path class="star-facet-shade" d="M20 20.6 28.6 32.3 26.9 22.7 34.1 16.1Z"/><path class="star-facet-glint" d="M20 6.2 20 20.6 12 31.9 13.3 23 6.5 16.6 16 15.2Z"/>' : "") + "</svg>";
|
|
3689
|
+
}).join("");
|
|
3690
|
+
return '<div class="skill-stars" role="img" aria-label="' + stars + " / " + maxStars + ' 星">' + icons + "</div>";
|
|
3691
|
+
}
|
|
3692
|
+
__name(skillStars, "skillStars");
|
|
3557
3693
|
function skillCardHtml(card, _frame = "", artwork) {
|
|
3558
3694
|
const quality = normalizeCardQuality(card.quality);
|
|
3559
3695
|
const description = card.description?.trim() || "暂无技能效果说明";
|
|
@@ -3571,13 +3707,13 @@ function skillCardHtml(card, _frame = "", artwork) {
|
|
|
3571
3707
|
<div id="capture" class="skill-sheet"><article class="detail-card skill-card quality-${quality.toLowerCase()}" style="${qualityStyle(quality)}">
|
|
3572
3708
|
<i class="card-corner corner-tl" aria-hidden="true"></i><i class="card-corner corner-tr" aria-hidden="true"></i><i class="card-corner corner-bl" aria-hidden="true"></i><i class="card-corner corner-br" aria-hidden="true"></i>
|
|
3573
3709
|
<div class="card-inner"><header class="card-titlebar"><span class="title-glyph" aria-hidden="true">◇</span><h1>${escape2(card.name)}</h1><span class="title-star" aria-hidden="true">✦</span></header>
|
|
3574
|
-
<div class="card-hero"><div class="hero-copy"><div class="hero-meta"><span class="skill-type">${card.passive ? "被动技能" : "主动技能"}</span><span class="quality-badge"><b>${quality}</b> 级</span
|
|
3710
|
+
<div class="card-hero"><div class="hero-copy"><div class="hero-meta"><span class="skill-type">${card.passive ? "被动技能" : "主动技能"}</span><span class="quality-badge"><b>${quality}</b> 级</span>${skillStars(card)}</div><div class="tags">${tags.map((tag) => `<span class="tag ${tagClass(tag)}">${escape2(tag)}</span>`).join("")}</div></div><div class="hero-icon-wrap">${qualityMagicCircle(quality)}<div class="art-fallback" aria-hidden="true">${card.passive ? "静" : "势"}</div>${artwork ? `<img class="skill-artwork" alt="${escape2(card.name)}图标" src="${escape2(artwork)}">` : ""}${qualityIconFrame(quality)}</div></div>
|
|
3575
3711
|
<div class="card-body"><div class="effect-stats">
|
|
3576
3712
|
${row("消耗", escape2(card.cost || "无消耗"), true)}
|
|
3577
3713
|
${row("冷却", cooldownValue, true)}
|
|
3578
3714
|
${power ? row("战力", escape2(power.replace(/^(?:🔥\s*)?战力\s*[::]\s*/, "")), true) : ""}
|
|
3579
3715
|
${(card.stats || []).slice(0, 3).map((stat) => row(stat.label, statValue(stat.value))).join("")}
|
|
3580
|
-
</div><section class="effect"><h2 class="section-heading"
|
|
3716
|
+
</div><section class="effect"><h2 class="section-heading">${escape2(card.mechanism || "技能效果")}</h2><p class="description">${effectText(effect)}</p></section>
|
|
3581
3717
|
${growth ? `<section class="growth-section"><h2 class="section-heading">永久成长 · 仅玩家</h2><p class="description">${effectText(growth)}</p></section>` : ""}
|
|
3582
3718
|
${otherNotes ? `<section class="note-section"><h2 class="section-heading">附加信息</h2><p class="description">${escape2(otherNotes)}</p></section>` : ""}
|
|
3583
3719
|
</div></div></article></div></body></html>`;
|
|
@@ -3595,7 +3731,8 @@ function equipmentCardHtml(card, artwork, unknownFallback = false) {
|
|
|
3595
3731
|
cardStatRow("打造者", card.authorName?.trim() || "未知"),
|
|
3596
3732
|
...card.referencePrice ? [cardStatRow("参考价格", card.referencePrice)] : []
|
|
3597
3733
|
].join("");
|
|
3598
|
-
const affixes = card.affixes?.length ? '<div class="detail-list">' + card.affixes.map((affix) => cardStatRow(affix.name, affix.value)).join("") + "</div>" : '<p class="description"
|
|
3734
|
+
const affixes = card.affixes?.length ? '<div class="detail-list">' + card.affixes.map((affix) => cardStatRow(affix.name, affix.value)).join("") + "</div>" : '<p class="description">暂无基础属性</p>';
|
|
3735
|
+
const randomAffixes = card.randomAffixes?.length ? cardSection("随机词条", '<div class="detail-list">' + card.randomAffixes.map((affix) => cardStatRow(affix.name, affix.value)).join("") + "</div>") : "";
|
|
3599
3736
|
const skills2 = card.skills?.length ? cardSection("附带技能", '<div class="detail-list">' + card.skills.map((skill) => cardStatRow(skill.name, "")).join("") + "</div>") : "";
|
|
3600
3737
|
const description = card.description?.trim() ? cardSection("装备描述", '<p class="description">' + cardEscape(card.description.trim()) + "</p>") : "";
|
|
3601
3738
|
const notes = card.notes?.filter((note) => note?.trim()).length ? cardSection("附加信息", '<p class="description">' + card.notes.filter((note) => note?.trim()).map((note) => cardEscape(note)).join("\n") + "</p>") : "";
|
|
@@ -3608,7 +3745,7 @@ function equipmentCardHtml(card, artwork, unknownFallback = false) {
|
|
|
3608
3745
|
fallbackGlyph: "?",
|
|
3609
3746
|
sheetClass: "equipment-sheet",
|
|
3610
3747
|
tags: unknownFallback || !artwork ? ["外观暂未显现"] : [],
|
|
3611
|
-
body: '<div class="effect-stats">' + details + "</div>" + cardSection("
|
|
3748
|
+
body: '<div class="effect-stats">' + details + "</div>" + cardSection("基础属性", affixes) + randomAffixes + skills2 + description + notes
|
|
3612
3749
|
});
|
|
3613
3750
|
}
|
|
3614
3751
|
__name(equipmentCardHtml, "equipmentCardHtml");
|
|
@@ -3692,8 +3829,8 @@ function bloodlineCardHtml(card, artwork) {
|
|
|
3692
3829
|
const nextExperience = finite4(card.nextExperience ?? 0);
|
|
3693
3830
|
const experience = Math.max(0, finite4(card.experience ?? 0));
|
|
3694
3831
|
const experienceHtml = card.experience === void 0 ? "" : nextExperience > 0 ? `<div class="experience-block"><div class="experience-label"><span>血统经验</span><b>${number5(experience)}<small> / ${number5(nextExperience)}</small></b></div><div class="experience-track"><i style="width:${Math.max(0, Math.min(100, experience / nextExperience * 100))}%"></i></div>${card.nextQuality ? `<div class="experience-next">下一级品质 <b>${cardEscape(card.nextQuality.replace(/\s*级$/, ""))} 级</b></div>` : ""}</div>` : `<div class="experience-block"><div class="experience-label"><span>血统经验</span><b>${number5(experience)}</b></div><div class="experience-next"><b>已达最高品质</b></div></div>`;
|
|
3695
|
-
const
|
|
3696
|
-
const unlocks =
|
|
3832
|
+
const equipment2 = [...card.equipmentTypes].sort((a, b) => Number(/^[a-z]/i.test(a.type)) - Number(/^[a-z]/i.test(b.type)));
|
|
3833
|
+
const unlocks = equipment2.length ? `<div class="equipment-grid">${equipment2.map((rule) => `<div class="equipment-tile">${equipmentIcon(rule.type)}<span>${cardEscape(rule.type)}</span><b>× ${number5(rule.count)}</b></div>`).join("")}</div>` : '<p class="empty-line">当前品质暂无解锁装备</p>';
|
|
3697
3834
|
const perLevel = card.type === "血统道具" && card.level === 1;
|
|
3698
3835
|
const customAttributes = card.attributes.filter((attribute) => !classicIds.has(attribute.id));
|
|
3699
3836
|
const extraAttributes = customAttributes.length ? `<div class="bloodline-custom-attributes">${customAttributes.map((attribute) => cardStatRow(attribute.name?.trim() || attribute.id, signed(attribute.value), true)).join("")}</div>` : "";
|
|
@@ -4438,7 +4575,8 @@ async function renderUncached(ctx, card, leaderboard, itemCard, characterCard, e
|
|
|
4438
4575
|
}, "release");
|
|
4439
4576
|
try {
|
|
4440
4577
|
const work = /* @__PURE__ */ __name(async () => {
|
|
4441
|
-
const
|
|
4578
|
+
const encounterCard = companionCard?.kind === "monster" || companionCard?.kind === "boss";
|
|
4579
|
+
const remoteAddress = signinCard ? void 0 : titleCard ? titleCard.artworkUrl : bloodlineCard ? bloodlineCard.artworkUrl : equipmentCard ? equipmentCard.artworkUrl : companionCard ? encounterCard ? void 0 : companionCard.artworkUrl : characterCard ? characterCard.artworkUrl : itemCard ? itemCard.artworkUrl : leaderboard ? leaderboard.backgroundUrl : card?.artworkUrl;
|
|
4442
4580
|
const isEquipment = !signinCard && !titleCard && !bloodlineCard && Boolean(equipmentCard);
|
|
4443
4581
|
const isCharacter = !signinCard && !titleCard && !bloodlineCard && !equipmentCard && !companionCard && Boolean(characterCard);
|
|
4444
4582
|
const [remoteArt, fallbackArt, entryArtwork, characterAssets, header, signinAssets] = await Promise.all([
|
|
@@ -4719,28 +4857,6 @@ var AnalysisMsg = class {
|
|
|
4719
4857
|
}
|
|
4720
4858
|
};
|
|
4721
4859
|
|
|
4722
|
-
// src/plugin/serverHandel/qqMessageButtons.ts
|
|
4723
|
-
function renderQQKeyboard(data) {
|
|
4724
|
-
const rows = data.buttons;
|
|
4725
|
-
if (!rows?.length) return void 0;
|
|
4726
|
-
if (rows.length > 5 || rows.some((row) => !row.buttons.length || row.buttons.length > 5)) {
|
|
4727
|
-
throw new Error("QQ 按钮最多 5 行,每行必须有 1–5 个按钮");
|
|
4728
|
-
}
|
|
4729
|
-
return { content: { rows: rows.map((row, rowIndex) => ({
|
|
4730
|
-
buttons: row.buttons.map((button, buttonIndex) => {
|
|
4731
|
-
if (!button.label.trim() || !button.command.trim() || /[\r\n\0]/.test(button.label + button.command) || button.command.length > 4e3 || button.style !== void 0 && button.style !== "primary" && button.style !== "secondary") {
|
|
4732
|
-
throw new Error("QQ 按钮文案和指令必须是非空单行文本,样式必须为 primary 或 secondary");
|
|
4733
|
-
}
|
|
4734
|
-
return {
|
|
4735
|
-
id: "action-" + rowIndex + "-" + buttonIndex,
|
|
4736
|
-
render_data: { label: button.label, visited_label: button.label, style: button.style === "primary" ? 1 : 0 },
|
|
4737
|
-
action: { type: 2, permission: { type: 2 }, data: button.command, enter: true, reply: false, unsupport_tips: "请发送:" + button.command }
|
|
4738
|
-
};
|
|
4739
|
-
})
|
|
4740
|
-
})) } };
|
|
4741
|
-
}
|
|
4742
|
-
__name(renderQQKeyboard, "renderQQKeyboard");
|
|
4743
|
-
|
|
4744
4860
|
// src/plugin/serverHandel/qqMarkdownHelpers.ts
|
|
4745
4861
|
function escapeMarkdown(value) {
|
|
4746
4862
|
return value.replace(/[\\`*_{}\[\]()#+\-.!|>~<&]/g, "\\$&");
|
|
@@ -4816,16 +4932,20 @@ function renderRewardTitle(content) {
|
|
|
4816
4932
|
return `**${escapeMarkdown(compactDisplayText(content))}**`;
|
|
4817
4933
|
}
|
|
4818
4934
|
__name(renderRewardTitle, "renderRewardTitle");
|
|
4819
|
-
function renderRewardLine(content) {
|
|
4935
|
+
function renderRewardLine(content, command) {
|
|
4820
4936
|
return content.replace(/\r\n?/g, "\n").split("\n").filter((line) => line.trim()).map((line) => {
|
|
4821
4937
|
const text = line.trim();
|
|
4822
4938
|
const quantity = /([++\-−×xX]\s*\d+(?:\.\d+)?)$/.exec(text);
|
|
4823
|
-
const
|
|
4939
|
+
const label = quantity ? text.slice(0, quantity.index) : text;
|
|
4940
|
+
const name2 = label.trimEnd();
|
|
4941
|
+
const formattedName = command && name2 ? `[${escapeMarkdown(name2)}](${inlineCommandUrl(command)})${escapeMarkdown(label.slice(name2.length))}` : escapeMarkdown(label);
|
|
4942
|
+
const formatted = formattedName + (quantity ? `**${escapeMarkdown(quantity[1])}**` : "");
|
|
4824
4943
|
return "> " + formatted;
|
|
4825
4944
|
}).join(" \n");
|
|
4826
4945
|
}
|
|
4827
4946
|
__name(renderRewardLine, "renderRewardLine");
|
|
4828
4947
|
function renderQQMailMarkdown(data) {
|
|
4948
|
+
const commands = new Map(data.pageNav?.entries?.map((entry) => [entry.lineIndex, entry.viewCommand]) ?? []);
|
|
4829
4949
|
const sections = [];
|
|
4830
4950
|
const text = [];
|
|
4831
4951
|
const rewards = [];
|
|
@@ -4835,7 +4955,7 @@ function renderQQMailMarkdown(data) {
|
|
|
4835
4955
|
const flushRewards = /* @__PURE__ */ __name(() => {
|
|
4836
4956
|
if (rewards.length) sections.push(rewards.splice(0).join(" \n"));
|
|
4837
4957
|
}, "flushRewards");
|
|
4838
|
-
for (const item of data.line) {
|
|
4958
|
+
for (const [lineIndex, item] of data.line.entries()) {
|
|
4839
4959
|
if (item.type === 0 /* title */ || item.type === 1 /* line */ && item.mailPart === "title") {
|
|
4840
4960
|
flushText();
|
|
4841
4961
|
flushRewards();
|
|
@@ -4846,7 +4966,7 @@ function renderQQMailMarkdown(data) {
|
|
|
4846
4966
|
sections.push(item.content.replace(/\r\n?/g, "\n").split("\n").map((line) => "> " + escapeMarkdown(line)).join(" \n"));
|
|
4847
4967
|
} else if (item.type === 1 /* line */ && item.reward) {
|
|
4848
4968
|
flushText();
|
|
4849
|
-
const reward = renderRewardLine(item.content);
|
|
4969
|
+
const reward = renderRewardLine(item.content, commands.get(lineIndex));
|
|
4850
4970
|
if (reward) rewards.push(reward);
|
|
4851
4971
|
} else {
|
|
4852
4972
|
flushRewards();
|
|
@@ -5201,6 +5321,28 @@ async function sendQQMarkdown(session, markdown, keyboard) {
|
|
|
5201
5321
|
}
|
|
5202
5322
|
__name(sendQQMarkdown, "sendQQMarkdown");
|
|
5203
5323
|
|
|
5324
|
+
// src/plugin/serverHandel/qqMessageButtons.ts
|
|
5325
|
+
function renderQQKeyboard(data) {
|
|
5326
|
+
const rows = data.buttons;
|
|
5327
|
+
if (!rows?.length) return void 0;
|
|
5328
|
+
if (rows.length > 5 || rows.some((row) => !row.buttons.length || row.buttons.length > 5)) {
|
|
5329
|
+
throw new Error("QQ 按钮最多 5 行,每行必须有 1–5 个按钮");
|
|
5330
|
+
}
|
|
5331
|
+
return { content: { rows: rows.map((row, rowIndex) => ({
|
|
5332
|
+
buttons: row.buttons.map((button, buttonIndex) => {
|
|
5333
|
+
if (!button.label.trim() || !button.command.trim() || /[\r\n\0]/.test(button.label + button.command) || button.command.length > 4e3 || button.style !== void 0 && button.style !== "primary" && button.style !== "secondary") {
|
|
5334
|
+
throw new Error("QQ 按钮文案和指令必须是非空单行文本,样式必须为 primary 或 secondary");
|
|
5335
|
+
}
|
|
5336
|
+
return {
|
|
5337
|
+
id: "action-" + rowIndex + "-" + buttonIndex,
|
|
5338
|
+
render_data: { label: button.label, visited_label: button.label, style: button.style === "primary" ? 1 : 0 },
|
|
5339
|
+
action: { type: 2, permission: { type: 2 }, data: button.command, enter: true, reply: false, unsupport_tips: "请发送:" + button.command }
|
|
5340
|
+
};
|
|
5341
|
+
})
|
|
5342
|
+
})) } };
|
|
5343
|
+
}
|
|
5344
|
+
__name(renderQQKeyboard, "renderQQKeyboard");
|
|
5345
|
+
|
|
5204
5346
|
// src/plugin/serverHandel/qqCommandMessage.ts
|
|
5205
5347
|
function renderQQCommandMarkdown(data, showGreeting) {
|
|
5206
5348
|
data = withoutMessageButtonFallbacks(data);
|
|
@@ -5438,6 +5580,7 @@ function renderQQMessagePreview(data, showGreeting = false) {
|
|
|
5438
5580
|
if (hasStoryCodeBlock(data)) return native("story", renderQQStoryMarkdown(data, showGreeting));
|
|
5439
5581
|
if (data.commandHelp) return native("command", renderQQCommandMarkdown(data, showGreeting));
|
|
5440
5582
|
if (data.transaction) return native("transaction", renderQQTransactionMarkdown(data, showGreeting));
|
|
5583
|
+
if (data.mail) return native("reward", renderQQRewardMarkdown(data, showGreeting));
|
|
5441
5584
|
if (data.pageNav) return native("page", renderQQPageMarkdown(data, showGreeting));
|
|
5442
5585
|
if (isRewardMessage(data)) return native("reward", renderQQRewardMarkdown(data, showGreeting));
|
|
5443
5586
|
if (battleLogMessageLinks(data).length || data.line.some((item) => (item.type === 1 /* line */ || item.type === 2 /* error */) && hasInlineCommands(item.content))) {
|
|
@@ -2,3 +2,4 @@
|
|
|
2
2
|
export declare const companionCornerDecoration = "<svg viewBox=\"0 0 180 180\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M7 156C9 84 17 23 94 9M17 124C31 81 47 59 87 40M41 69C57 45 75 31 121 26M48 43C72 26 89 20 143 19\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <path d=\"M15 112C-1 86 2 67 11 57c17 20 22 34 4 55ZM26 79C15 47 21 28 37 23c10 25 10 45-11 56ZM47 53C53 29 66 19 87 18c-5 20-17 32-40 35ZM79 32c19-15 35-20 56-13-12 13-31 19-56 13Z\" fill=\"currentColor\" opacity=\".6\"/>\n <path d=\"M14 133c-3-27 15-47 34-49-1 23-13 41-34 49ZM32 94c6-28 26-42 45-42-8 24-22 39-45 42ZM66 49c18-20 36-24 56-15-17 17-33 21-56 15Z\" fill=\"currentColor\" opacity=\".35\"/>\n <g transform=\"translate(39 39)\">\n <g fill=\"var(--flower)\" stroke=\"currentColor\" stroke-width=\"1.2\">\n <ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\"/><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(72)\"/>\n <ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(144)\"/><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(216)\"/><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(288)\"/>\n </g><circle r=\"7\" fill=\"currentColor\"/><circle r=\"3\" fill=\"var(--flower)\"/>\n </g>\n <g transform=\"translate(12 109) scale(.48)\"><g fill=\"var(--flower)\" stroke=\"currentColor\" stroke-width=\"2\"><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\"/><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(72)\"/><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(144)\"/><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(216)\"/><ellipse cx=\"0\" cy=\"-18\" rx=\"10\" ry=\"18\" transform=\"rotate(288)\"/></g><circle r=\"7\" fill=\"currentColor\"/></g>\n</svg>";
|
|
3
3
|
export declare const petPortraitPlaceholder: string;
|
|
4
4
|
export declare const followerPortraitPlaceholder: string;
|
|
5
|
+
export declare const bossCardDecoration = "<svg viewBox=\"0 0 160 64\" aria-hidden=\"true\"><path d=\"M31 49 23 17l32 20L80 5l25 32 32-20-8 32ZM31 55h98\" fill=\"currentColor\" opacity=\".7\"/><path d=\"M9 51 26 39M134 39l17 12M5 58l19-10m112 0 19 10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"/><circle cx=\"80\" cy=\"5\" r=\"4\" fill=\"currentColor\"/><circle cx=\"23\" cy=\"17\" r=\"3\" fill=\"currentColor\"/><circle cx=\"137\" cy=\"17\" r=\"3\" fill=\"currentColor\"/></svg>";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Flow layout keeps every bloodline and skill row visible in bot/editor cards. */
|
|
2
|
-
export declare const companionCardStyles = "\n*{box-sizing:border-box}body{margin:0;width:760px}#capture{width:760px;position:relative;overflow:hidden;font-family:\"KaiTi\",\"STKaiti\",\"Microsoft YaHei\",sans-serif}\n.companion-sheet{--ink:#594322;--subtle:#79715a;--accent:#b78328;--edge:#c7a66a;--light-edge:#fff2c8;--panel:#fffaf0;--panel-deep:#f1e5cc;--paper:#e8ce9c;--flower:#fff9dc;--track:#e3e7d8;--track-edge:#9fad94;--health:#69985c;--health-light:#a4c68d;--radar:#c79539;--radar-fill:#dcb35369;--radar-grid:#c8ba94;color:var(--ink);padding:22px;background:radial-gradient(ellipse at 5% 12%,#fff8dfb0,transparent 42%),radial-gradient(ellipse at 98% 79%,#fff5d8a6,transparent 44%),repeating-linear-gradient(115deg,#f6e7c94d 0 1px,transparent 1px 5px),linear-gradient(155deg,#d5b777,#f2dfb9 37%,#c7ac76)}\n.follower-theme{--ink:#e6e5dc;--subtle:#b7b7b2;--accent:#d3d3cf;--edge:#858585;--light-edge:#e5e5de;--panel:#242424;--panel-deep:#181818;--paper:#232323;--flower:#d6d6d0;--track:#353535;--track-edge:#7c7c7c;--health:#a3a3a0;--health-light:#d5d5cf;--radar:#e3e3dc;--radar-fill:#bdbdbd51;--radar-grid:#686868;background:radial-gradient(ellipse at 10% 9%,#9f9f9f40,transparent 43%),radial-gradient(ellipse at 94% 83%,#91919145,transparent 35%),repeating-linear-gradient(125deg,#dddddd07 0 1px,transparent 1px 5px),linear-gradient(155deg,#575757,#1e1e1e 37%,#4e4e4e)}\n.companion-main{display:grid;grid-template-columns:334px minmax(0,1fr);gap:14px;align-items:stretch;position:relative;z-index:1}.portrait-column{min-width:0;display:flex;flex-direction:column;gap:14px}\n.companion-panel{position:relative;border:2px solid var(--edge);border-radius:27px;background:radial-gradient(ellipse at 22% 0%,color-mix(in srgb,var(--light-edge) 20%,transparent),transparent 51%),linear-gradient(160deg,var(--panel),var(--panel-deep));box-shadow:inset 0 0 0 3px var(--panel),inset 0 0 0 4px color-mix(in srgb,var(--edge) 50%,transparent),0 2px 6px #32290f30;min-width:0}.companion-panel:before{content:\"\";position:absolute;inset:8px;border:1px solid color-mix(in srgb,var(--edge) 55%,transparent);border-radius:20px;pointer-events:none}.panel-corner{position:absolute;width:112px;height:112px;color:var(--edge);pointer-events:none;z-index:3}.panel-corner svg{width:100%;height:100%;display:block}.corner-tl{top:-14px;left:-14px}.corner-tr{top:-14px;right:-14px;transform:rotate(90deg)}.corner-bl{bottom:-14px;left:-14px;transform:rotate(-90deg)}.corner-br{bottom:-14px;right:-14px;transform:rotate(180deg)}\n.companion-portrait{padding:10px;border-radius:18px;flex:0 0 auto;background:linear-gradient(135deg,var(--light-edge),var(--edge) 28%,var(--light-edge) 55%,var(--edge))}.companion-portrait:before{inset:5px;border-radius:12px;border-color:var(--light-edge)}.portrait-window{height:448px;border:2px solid var(--edge);border-radius:9px;overflow:hidden;background:var(--paper)}.companion-artwork{display:block;width:100%;height:100%;object-fit:contain}.follower-theme .companion-artwork{filter:grayscale(1)}.companion-portrait .panel-corner{width:97px;height:97px}.portrait-placeholder,.companion-placeholder{height:100%;display:grid;place-items:center;color:var(--subtle);font:21px \"Microsoft YaHei\",sans-serif}\n.companion-description{font:16px/1.65 \"Microsoft YaHei\",sans-serif;overflow-wrap:anywhere;color:var(--subtle);margin:0 10px}.bloodline-panel{padding:10px 16px 17px;flex:1}.ornament-heading{display:flex;align-items:center;justify-content:center;gap:10px;margin:0 0 12px;font-size:25px;font-weight:700;letter-spacing:3px;line-height:1.3;color:var(--ink)}.ornament-heading:before,.ornament-heading:after{content:\"\";height:1px;flex:1;background:linear-gradient(90deg,transparent,var(--edge))}.ornament-heading:after{transform:rotate(180deg)}.heading-star{font-size:16px;color:var(--accent);letter-spacing:0}.bloodline-list{display:grid;gap:10px}.bloodline-row{display:grid;grid-template-columns:41px minmax(0,1fr) auto;align-items:center;gap:9px;padding:8px 10px;border:1px solid var(--edge);border-radius:7px;box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--edge) 13%,transparent);background:color-mix(in srgb,var(--panel) 55%,transparent)}.bloodline-crest{width:41px;height:41px;display:grid;place-items:center;border:1px solid var(--edge);background:var(--paper);border-radius:50%;font-family:\"Microsoft YaHei\",sans-serif;font-size:27px;color:var(--ink)}.bloodline-crest svg{width:29px;height:29px}.follower-theme .bloodline-crest{filter:grayscale(1)}.bloodline-name{font-size:21px;font-weight:700;line-height:1.4;overflow-wrap:anywhere}.bloodline-quality{min-width:34px;padding:4px 6px;text-align:center;border:1px solid var(--edge);border-radius:7px;background:var(--paper);font:26px/1 Georgia,\"Microsoft YaHei\",serif;color:var(--ink)}\n.companion-stats{padding:22px 19px 14px;display:flex;flex-direction:column}.companion-identity{text-align:center;padding:6px 0 0;min-width:0}.companion-name{font-size:47px;font-weight:700;letter-spacing:4px;line-height:1.15;overflow-wrap:anywhere;margin:0 0 3px;text-shadow:0 1px 0 color-mix(in srgb,var(--panel) 70%,transparent)}.companion-level{font:30px/1.4 Georgia,\"Microsoft YaHei\",serif;margin:0;color:var(--subtle);overflow-wrap:anywhere}.state-badge{margin:6px auto 0;width:max-content;max-width:100%;display:flex;align-items:center;gap:11px;padding:5px 17px;border:1px solid var(--edge);border-radius:18px;background:color-mix(in srgb,var(--accent) 13%,transparent);color:var(--ink);font-size:19px;line-height:1}.state-badge svg{width:17px;height:17px;fill:currentColor}.state-resting{color:var(--subtle)}.state-fallen{background:color-mix(in srgb,var(--subtle) 15%,transparent);color:var(--subtle)}.permanent-note{margin:6px 0 0;color:var(--subtle);font-size:17px;line-height:1.4;letter-spacing:1px}.companion-power-row{display:flex;align-items:center;gap:10px;margin:18px 0 17px;min-width:0}.power-icon{flex:0 0 46px;height:46px;display:grid;place-items:center;border-radius:50%;border:1px solid var(--edge);box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--panel) 75%,transparent);color:var(--accent);background:color-mix(in srgb,var(--accent) 13%,transparent)}.power-icon svg{width:29px;height:29px;stroke:currentColor;fill:currentColor;stroke-width:2;stroke-linejoin:round}.companion-power-label{font-size:21px;white-space:nowrap}.companion-power{min-width:0;flex:1;text-align:right;overflow-wrap:anywhere;font:38px/1.2 Georgia,\"Microsoft YaHei\",serif;color:var(--accent);letter-spacing:-1px}\n.companion-resource{font-family:\"Microsoft YaHei\",sans-serif;margin-bottom:15px}.resource-heading{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:18px;color:var(--subtle);line-height:1.45}.resource-label{display:flex;align-items:center;gap:7px;font-weight:600;flex-shrink:0}.resource-label svg{width:20px;height:20px;fill:var(--health)}.resource-number{text-align:right;overflow-wrap:anywhere;min-width:0;font-size:17px}.resource-track{height:20px;position:relative;margin-top:7px;border:1px solid var(--track-edge);border-radius:11px;overflow:hidden;background:linear-gradient(var(--track),color-mix(in srgb,var(--track) 70%,var(--panel)));box-shadow:inset 0 1px 3px #30362030}.resource-fill{display:block;position:absolute;top:0;bottom:0;left:0;border-radius:10px;background:linear-gradient(var(--health-light),var(--health) 48%,color-mix(in srgb,var(--health) 75%,var(--health-light)));border-right:1px solid #fff8}.resource-percent{position:absolute;inset:0;display:grid;place-items:center;font:12px/1 \"Microsoft YaHei\",sans-serif;color:#fffef7;text-shadow:0 1px 2px #37422d}.exp-resource .resource-heading{color:#63809b}.exp-resource .resource-label svg{fill:#6f95b3}.exp-resource .resource-track{border-color:#91adc0;background:#e2e9ed}.exp-resource .resource-fill{background:linear-gradient(#b5d9e5,#74a4c0 50%,#9bc5d6)}\n.companion-attributes{margin-top:3px;flex:1;display:flex;flex-direction:column;justify-content:center;min-width:0}.companion-attributes .ornament-heading{margin-bottom:4px;font-size:22px;gap:6px;letter-spacing:2px}.companion-radar{width:100%;height:300px;display:block;overflow:visible}.radar-grid{fill:none;stroke:var(--radar-grid);stroke-width:1.2}.radar-axis{stroke:var(--radar-grid);stroke-width:1;opacity:.8}.radar-area{fill:var(--radar-fill);stroke:var(--radar);stroke-width:2.5;stroke-linejoin:round}.radar-dot{fill:var(--flower);stroke:var(--radar);stroke-width:2}.radar-label{font:18px \"Microsoft YaHei\",sans-serif;fill:var(--ink)}.radar-value{font:20px Georgia,\"Microsoft YaHei\",serif;fill:var(--ink)}.radar-scale{font:11px Georgia,serif;fill:var(--subtle)}.empty-attributes{padding:45px 10px;color:var(--subtle);font:18px/1.6 \"Microsoft YaHei\",sans-serif;text-align:center}.custom-attributes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 10px;margin:6px 0 0;font:15px/1.5 \"Microsoft YaHei\",sans-serif;color:var(--subtle)}.custom-attributes span{overflow-wrap:anywhere}.custom-attributes b{font-weight:500;color:var(--ink)}\n.companion-skills{position:relative;z-index:1;padding:12px 18px 19px;margin-top:15px}.companion-skills .ornament-heading{margin-bottom:13px}.skill-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 13px}.companion-skill{position:relative;min-width:0;display:grid;grid-template-columns:47px minmax(0,1fr) auto;align-items:center;gap:10px;padding:9px 10px;border:1px solid var(--edge);border-radius:7px;box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--edge) 12%,transparent);background:color-mix(in srgb,var(--panel) 55%,transparent);min-height:65px}.skill-icon{width:47px;height:47px;border:1px solid var(--edge);border-radius:7px;display:grid;place-items:center;background:radial-gradient(ellipse at 40% 23%,color-mix(in srgb,var(--accent) 55%,var(--paper)),color-mix(in srgb,var(--paper) 72%,#282015));color:var(--flower);box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--light-edge) 20%,transparent)}.skill-icon svg{width:31px;height:31px;stroke:currentColor;stroke-width:1.7;fill:none;stroke-linecap:round;stroke-linejoin:round}.skill-name{font-size:20px;font-weight:700;overflow-wrap:anywhere;line-height:1.35}.skill-level{font:18px/1.2 Georgia,\"Microsoft YaHei\",serif;border:1px solid color-mix(in srgb,var(--edge) 55%,transparent);border-radius:13px;padding:5px 9px;white-space:nowrap;color:var(--ink);background:color-mix(in srgb,var(--accent) 9%,transparent)}.empty-list{margin:10px 0;color:var(--subtle);font:17px/1.6 \"Microsoft YaHei\",sans-serif;text-align:center}.follower-theme .companion-panel{box-shadow:inset 0 0 0 3px var(--panel),inset 0 0 0 4px color-mix(in srgb,var(--edge) 50%,transparent),0 2px 6px #00000040}.follower-theme .skill-icon{background:radial-gradient(ellipse at 40% 23%,#858585,#292929)}.follower-theme .resource-track{box-shadow:inset 0 1px 3px #00000030}.follower-theme .companion-power{color:var(--ink)}.follower-theme .resource-percent{color:#fffef7;text-shadow:0 1px 2px #242725}\n.skill-icon,.bloodline-crest{position:relative;overflow:hidden}.bloodline-crest.has-entry-artwork{border-radius:7px}.skill-entry-artwork,.bloodline-entry-artwork{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:contain;border-radius:inherit;background:var(--paper);z-index:1}.follower-theme .skill-entry-artwork,.follower-theme .bloodline-entry-artwork{filter:grayscale(1)}\n";
|
|
2
|
+
export declare const companionCardStyles = "\n*{box-sizing:border-box}body{margin:0;width:760px}#capture{width:760px;position:relative;overflow:hidden;font-family:\"KaiTi\",\"STKaiti\",\"Microsoft YaHei\",sans-serif}\n.companion-sheet{--ink:#594322;--subtle:#79715a;--accent:#b78328;--edge:#c7a66a;--light-edge:#fff2c8;--panel:#fffaf0;--panel-deep:#f1e5cc;--paper:#e8ce9c;--flower:#fff9dc;--track:#e3e7d8;--track-edge:#9fad94;--health:#69985c;--health-light:#a4c68d;--radar:#c79539;--radar-fill:#dcb35369;--radar-grid:#c8ba94;color:var(--ink);padding:22px;background:radial-gradient(ellipse at 5% 12%,#fff8dfb0,transparent 42%),radial-gradient(ellipse at 98% 79%,#fff5d8a6,transparent 44%),repeating-linear-gradient(115deg,#f6e7c94d 0 1px,transparent 1px 5px),linear-gradient(155deg,#d5b777,#f2dfb9 37%,#c7ac76)}\n.follower-theme{--ink:#e6e5dc;--subtle:#b7b7b2;--accent:#d3d3cf;--edge:#858585;--light-edge:#e5e5de;--panel:#242424;--panel-deep:#181818;--paper:#232323;--flower:#d6d6d0;--track:#353535;--track-edge:#7c7c7c;--health:#a3a3a0;--health-light:#d5d5cf;--radar:#e3e3dc;--radar-fill:#bdbdbd51;--radar-grid:#686868;background:radial-gradient(ellipse at 10% 9%,#9f9f9f40,transparent 43%),radial-gradient(ellipse at 94% 83%,#91919145,transparent 35%),repeating-linear-gradient(125deg,#dddddd07 0 1px,transparent 1px 5px),linear-gradient(155deg,#575757,#1e1e1e 37%,#4e4e4e)}\n.companion-main{display:grid;grid-template-columns:334px minmax(0,1fr);gap:14px;align-items:stretch;position:relative;z-index:1}.portrait-column{min-width:0;display:flex;flex-direction:column;gap:14px}\n.companion-panel{position:relative;border:2px solid var(--edge);border-radius:27px;background:radial-gradient(ellipse at 22% 0%,color-mix(in srgb,var(--light-edge) 20%,transparent),transparent 51%),linear-gradient(160deg,var(--panel),var(--panel-deep));box-shadow:inset 0 0 0 3px var(--panel),inset 0 0 0 4px color-mix(in srgb,var(--edge) 50%,transparent),0 2px 6px #32290f30;min-width:0}.companion-panel:before{content:\"\";position:absolute;inset:8px;border:1px solid color-mix(in srgb,var(--edge) 55%,transparent);border-radius:20px;pointer-events:none}.panel-corner{position:absolute;width:112px;height:112px;color:var(--edge);pointer-events:none;z-index:3}.panel-corner svg{width:100%;height:100%;display:block}.corner-tl{top:-14px;left:-14px}.corner-tr{top:-14px;right:-14px;transform:rotate(90deg)}.corner-bl{bottom:-14px;left:-14px;transform:rotate(-90deg)}.corner-br{bottom:-14px;right:-14px;transform:rotate(180deg)}\n.companion-portrait{padding:10px;border-radius:18px;flex:0 0 auto;background:linear-gradient(135deg,var(--light-edge),var(--edge) 28%,var(--light-edge) 55%,var(--edge))}.companion-portrait:before{inset:5px;border-radius:12px;border-color:var(--light-edge)}.portrait-window{height:448px;border:2px solid var(--edge);border-radius:9px;overflow:hidden;background:var(--paper)}.companion-artwork{display:block;width:100%;height:100%;object-fit:contain}.follower-theme .companion-artwork{filter:grayscale(1)}.companion-portrait .panel-corner{width:97px;height:97px}.portrait-placeholder,.companion-placeholder{height:100%;display:grid;place-items:center;color:var(--subtle);font:21px \"Microsoft YaHei\",sans-serif}\n.companion-description{font:16px/1.65 \"Microsoft YaHei\",sans-serif;overflow-wrap:anywhere;color:var(--subtle);margin:0 10px}.bloodline-panel{padding:10px 16px 17px;flex:1}.ornament-heading{display:flex;align-items:center;justify-content:center;gap:10px;margin:0 0 12px;font-size:25px;font-weight:700;letter-spacing:3px;line-height:1.3;color:var(--ink)}.ornament-heading:before,.ornament-heading:after{content:\"\";height:1px;flex:1;background:linear-gradient(90deg,transparent,var(--edge))}.ornament-heading:after{transform:rotate(180deg)}.heading-star{font-size:16px;color:var(--accent);letter-spacing:0}.bloodline-list{display:grid;gap:10px}.bloodline-row{display:grid;grid-template-columns:41px minmax(0,1fr) auto;align-items:center;gap:9px;padding:8px 10px;border:1px solid var(--edge);border-radius:7px;box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--edge) 13%,transparent);background:color-mix(in srgb,var(--panel) 55%,transparent)}.bloodline-crest{width:41px;height:41px;display:grid;place-items:center;border:1px solid var(--edge);background:var(--paper);border-radius:50%;font-family:\"Microsoft YaHei\",sans-serif;font-size:27px;color:var(--ink)}.bloodline-crest svg{width:29px;height:29px}.follower-theme .bloodline-crest{filter:grayscale(1)}.bloodline-name{font-size:21px;font-weight:700;line-height:1.4;overflow-wrap:anywhere}.bloodline-quality{min-width:34px;padding:4px 6px;text-align:center;border:1px solid var(--edge);border-radius:7px;background:var(--paper);font:26px/1 Georgia,\"Microsoft YaHei\",serif;color:var(--ink)}\n.companion-stats{padding:22px 19px 14px;display:flex;flex-direction:column}.companion-identity{text-align:center;padding:6px 0 0;min-width:0}.companion-name{font-size:47px;font-weight:700;letter-spacing:4px;line-height:1.15;overflow-wrap:anywhere;margin:0 0 3px;text-shadow:0 1px 0 color-mix(in srgb,var(--panel) 70%,transparent)}.companion-level{font:30px/1.4 Georgia,\"Microsoft YaHei\",serif;margin:0;color:var(--subtle);overflow-wrap:anywhere}.state-badge{margin:6px auto 0;width:max-content;max-width:100%;display:flex;align-items:center;gap:11px;padding:5px 17px;border:1px solid var(--edge);border-radius:18px;background:color-mix(in srgb,var(--accent) 13%,transparent);color:var(--ink);font-size:19px;line-height:1}.state-badge svg{width:17px;height:17px;fill:currentColor}.state-resting{color:var(--subtle)}.state-fallen{background:color-mix(in srgb,var(--subtle) 15%,transparent);color:var(--subtle)}.permanent-note{margin:6px 0 0;color:var(--subtle);font-size:17px;line-height:1.4;letter-spacing:1px}.companion-power-row{display:flex;align-items:center;gap:10px;margin:18px 0 17px;min-width:0}.power-icon{flex:0 0 46px;height:46px;display:grid;place-items:center;border-radius:50%;border:1px solid var(--edge);box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--panel) 75%,transparent);color:var(--accent);background:color-mix(in srgb,var(--accent) 13%,transparent)}.power-icon svg{width:29px;height:29px;stroke:currentColor;fill:currentColor;stroke-width:2;stroke-linejoin:round}.companion-power-label{font-size:21px;white-space:nowrap}.companion-power{min-width:0;flex:1;text-align:right;overflow-wrap:anywhere;font:38px/1.2 Georgia,\"Microsoft YaHei\",serif;color:var(--accent);letter-spacing:-1px}\n.companion-resource{font-family:\"Microsoft YaHei\",sans-serif;margin-bottom:15px}.resource-heading{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:18px;color:var(--subtle);line-height:1.45}.resource-label{display:flex;align-items:center;gap:7px;font-weight:600;flex-shrink:0}.resource-label svg{width:20px;height:20px;fill:var(--health)}.resource-number{text-align:right;overflow-wrap:anywhere;min-width:0;font-size:17px}.resource-track{height:20px;position:relative;margin-top:7px;border:1px solid var(--track-edge);border-radius:11px;overflow:hidden;background:linear-gradient(var(--track),color-mix(in srgb,var(--track) 70%,var(--panel)));box-shadow:inset 0 1px 3px #30362030}.resource-fill{display:block;position:absolute;top:0;bottom:0;left:0;border-radius:10px;background:linear-gradient(var(--health-light),var(--health) 48%,color-mix(in srgb,var(--health) 75%,var(--health-light)));border-right:1px solid #fff8}.resource-percent{position:absolute;inset:0;display:grid;place-items:center;font:12px/1 \"Microsoft YaHei\",sans-serif;color:#fffef7;text-shadow:0 1px 2px #37422d}.exp-resource .resource-heading{color:#63809b}.exp-resource .resource-label svg{fill:#6f95b3}.exp-resource .resource-track{border-color:#91adc0;background:#e2e9ed}.exp-resource .resource-fill{background:linear-gradient(#b5d9e5,#74a4c0 50%,#9bc5d6)}\n.companion-attributes{margin-top:3px;flex:1;display:flex;flex-direction:column;justify-content:center;min-width:0}.companion-attributes .ornament-heading{margin-bottom:4px;font-size:22px;gap:6px;letter-spacing:2px}.companion-radar{width:100%;height:300px;display:block;overflow:visible}.radar-grid{fill:none;stroke:var(--radar-grid);stroke-width:1.2}.radar-axis{stroke:var(--radar-grid);stroke-width:1;opacity:.8}.radar-area{fill:var(--radar-fill);stroke:var(--radar);stroke-width:2.5;stroke-linejoin:round}.radar-dot{fill:var(--flower);stroke:var(--radar);stroke-width:2}.radar-label{font:18px \"Microsoft YaHei\",sans-serif;fill:var(--ink)}.radar-value{font:20px Georgia,\"Microsoft YaHei\",serif;fill:var(--ink)}.radar-scale{font:11px Georgia,serif;fill:var(--subtle)}.empty-attributes{padding:45px 10px;color:var(--subtle);font:18px/1.6 \"Microsoft YaHei\",sans-serif;text-align:center}.custom-attributes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 10px;margin:6px 0 0;font:15px/1.5 \"Microsoft YaHei\",sans-serif;color:var(--subtle)}.custom-attributes span{overflow-wrap:anywhere}.custom-attributes b{font-weight:500;color:var(--ink)}\n.companion-skills{position:relative;z-index:1;padding:12px 18px 19px;margin-top:15px}.companion-skills .ornament-heading{margin-bottom:13px}.skill-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 13px}.companion-skill{position:relative;min-width:0;display:grid;grid-template-columns:47px minmax(0,1fr) auto;align-items:center;gap:10px;padding:9px 10px;border:1px solid var(--edge);border-radius:7px;box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--edge) 12%,transparent);background:color-mix(in srgb,var(--panel) 55%,transparent);min-height:65px}.skill-icon{width:47px;height:47px;border:1px solid var(--edge);border-radius:7px;display:grid;place-items:center;background:radial-gradient(ellipse at 40% 23%,color-mix(in srgb,var(--accent) 55%,var(--paper)),color-mix(in srgb,var(--paper) 72%,#282015));color:var(--flower);box-shadow:inset 0 0 0 3px color-mix(in srgb,var(--light-edge) 20%,transparent)}.skill-icon svg{width:31px;height:31px;stroke:currentColor;stroke-width:1.7;fill:none;stroke-linecap:round;stroke-linejoin:round}.skill-name{font-size:20px;font-weight:700;overflow-wrap:anywhere;line-height:1.35}.skill-level{font:18px/1.2 Georgia,\"Microsoft YaHei\",serif;border:1px solid color-mix(in srgb,var(--edge) 55%,transparent);border-radius:13px;padding:5px 9px;white-space:nowrap;color:var(--ink);background:color-mix(in srgb,var(--accent) 9%,transparent)}.empty-list{margin:10px 0;color:var(--subtle);font:17px/1.6 \"Microsoft YaHei\",sans-serif;text-align:center}.follower-theme .companion-panel{box-shadow:inset 0 0 0 3px var(--panel),inset 0 0 0 4px color-mix(in srgb,var(--edge) 50%,transparent),0 2px 6px #00000040}.follower-theme .skill-icon{background:radial-gradient(ellipse at 40% 23%,#858585,#292929)}.follower-theme .resource-track{box-shadow:inset 0 1px 3px #00000030}.follower-theme .companion-power{color:var(--ink)}.follower-theme .resource-percent{color:#fffef7;text-shadow:0 1px 2px #242725}\n.skill-icon,.bloodline-crest{position:relative;overflow:hidden}.bloodline-crest.has-entry-artwork{border-radius:7px}.skill-entry-artwork,.bloodline-entry-artwork{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:contain;border-radius:inherit;background:var(--paper);z-index:1}.follower-theme .skill-entry-artwork,.follower-theme .bloodline-entry-artwork{filter:grayscale(1)}\n.monster-theme{--ink:#e0eeea;--subtle:#a2b9b6;--accent:#9bd8c9;--edge:#668f90;--light-edge:#c3e5d7;--panel:#203f48;--panel-deep:#142d38;--paper:#183440;--flower:#d3efe6;--track:#213c46;--track-edge:#769b92;--health:#518f7f;--health-light:#96d6b5;--radar:#a2d8c9;--radar-fill:#7bb5ab55;--radar-grid:#507d80;background:radial-gradient(ellipse at 10% 9%,#81b8a840,transparent 43%),radial-gradient(ellipse at 94% 83%,#49808045,transparent 35%),repeating-linear-gradient(125deg,#d6eee608 0 1px,transparent 1px 5px),linear-gradient(155deg,#3c6269,#142a35 37%,#30515a)}\n.boss-theme{--ink:#f7e2c3;--subtle:#ceafac;--accent:#edc385;--edge:#b77c62;--light-edge:#f5dba4;--panel:#492937;--panel-deep:#281b2a;--paper:#342132;--flower:#ffe6b2;--track:#4b2837;--track-edge:#b88170;--health:#a24d59;--health-light:#eb9395;--radar:#edc385;--radar-fill:#daaa5b55;--radar-grid:#925c64;padding-top:55px;background:radial-gradient(ellipse at 48% 0%,#ecc07855,transparent 40%),radial-gradient(ellipse at 96% 83%,#c54a6245,transparent 35%),repeating-linear-gradient(125deg,#f2dfbd08 0 1px,transparent 1px 5px),linear-gradient(155deg,#773b46,#211b2c 37%,#5d2c42)}\n.boss-card-decoration{position:absolute;top:3px;left:50%;transform:translateX(-50%);width:160px;height:52px;color:var(--accent)}.boss-card-decoration svg{display:block;width:100%;height:100%}.boss-theme .companion-portrait,.boss-theme .companion-stats{box-shadow:inset 0 0 0 3px var(--panel),inset 0 0 0 4px color-mix(in srgb,var(--edge) 60%,transparent),0 0 13px #daa04e40}.boss-theme .state-badge{border-radius:5px;letter-spacing:3px;background:linear-gradient(135deg,#b6805130,#8c44502b);padding:7px 15px}.monster-theme .state-badge{letter-spacing:2px}\n.enemy-equipment{padding:13px 18px 18px;margin-top:15px}.enemy-equipment-list{display:grid;gap:8px}.enemy-equipment-row{display:grid;grid-template-columns:28px minmax(0,1fr) auto auto;align-items:center;gap:10px;padding:8px 11px;border:1px solid var(--edge);border-radius:7px;background:color-mix(in srgb,var(--panel) 55%,transparent);min-width:0}.equipment-symbol{color:var(--accent);font-size:26px}.enemy-equipment-name{font-size:20px;line-height:1.4;overflow-wrap:anywhere}.enemy-equipment-name small{color:var(--accent);font:17px Georgia,serif;white-space:nowrap}.equipment-slot{font:15px/1.4 \"Microsoft YaHei\",sans-serif;color:var(--subtle);max-width:120px;overflow-wrap:anywhere}\n.enemy-main{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.enemy-sheet .companion-stats{justify-content:center;padding:24px 24px 26px}.enemy-sheet .companion-name{font-size:43px;letter-spacing:2px}.enemy-sheet .companion-power-row{margin:24px 0}.enemy-sheet .companion-resource{margin-bottom:0}.enemy-attributes{padding:16px 12px 12px;display:flex;align-items:center}.enemy-attributes .companion-attributes{margin:0}.enemy-sheet>.bloodline-panel{margin-top:15px;padding:13px 18px 18px}.enemy-sheet .bloodline-list{grid-template-columns:repeat(2,minmax(0,1fr))}.enemy-sheet .bloodline-name{font-size:20px}\n\n";
|
|
@@ -4,5 +4,5 @@ export interface CardEntryArtwork {
|
|
|
4
4
|
skills?: ReadonlyArray<string | undefined>;
|
|
5
5
|
bloodlines?: ReadonlyArray<string | undefined>;
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
7
|
+
/** Pets/followers keep portraits; encounters show fixed combat data without disposable artwork. */
|
|
8
8
|
export declare function companionCardHtml(card: CompanionCardData, artwork?: string, icons?: CardEntryArtwork): string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Shared detail-card styling; all ornaments render with JavaScript disabled. */
|
|
2
|
-
export declare const qualityCardStyles = "\n*{box-sizing:border-box}\nhtml,body{margin:0;width:760px;background:#e9e9e2;font-family:'Microsoft YaHei','Noto Sans CJK SC',sans-serif;color:#303735}\n#capture{width:760px;padding:18px;background:radial-gradient(ellipse at 70% 10%,#f9f7efb8,transparent 55%),#e9e9e2}\nh1,h2,h3,p{margin:0}\n.detail-card{position:relative;width:100%;isolation:isolate;border:3px solid color-mix(in srgb,var(--quality-accent) 50%,#454a45);border-radius:18px;box-shadow:0 8px 18px #3f47321c;background:#f5f4ed;overflow:visible;--corner-size:24px;--corner-metal:#dce1d6;--corner-cut:polygon(0 0,100% 13%,75% 50%,100% 100%,50% 75%,13% 100%)}\n.card-inner{overflow:hidden;border-radius:14px}\n.card-corner{position:absolute;width:var(--corner-size);height:var(--corner-size);z-index:5;background:linear-gradient(135deg,#faf9eb,var(--corner-metal));border:1px solid #7b8075;clip-path:var(--corner-cut);filter:drop-shadow(0 1px 2px #0009)}\n.card-corner:after{content:'';position:absolute;inset:6px;background:color-mix(in srgb,var(--quality-accent) 80%,#4e584b);clip-path:var(--corner-cut)}\n.corner-tl{top:-7px;left:-7px}.corner-tr{top:-7px;right:-7px;transform:rotate(90deg)}.corner-br{bottom:-7px;right:-7px;transform:rotate(180deg)}.corner-bl{bottom:-7px;left:-7px;transform:rotate(270deg)}\n.quality-f{--corner-size:13.5px;--corner-metal:#a6afa4;--corner-cut:polygon(0 0,100% 0,100% 30%,30% 30%,30% 100%,0 100%)}\n.quality-f .card-corner:after{display:none}\n.quality-e{--corner-size:18px;--corner-metal:#a6c1a7;--corner-cut:polygon(0 0,100% 0,85% 28%,37% 37%,28% 85%,0 100%)}\n.quality-d{--corner-size:21px;--corner-metal:#87c3b1;--corner-cut:polygon(0 0,70% 10%,100% 45%,45% 100%,10% 70%)}\n.quality-c{--corner-metal:#acd5ed}\n.quality-b{--corner-size:25.5px;--corner-metal:#c2a5dc;--corner-cut:polygon(0 0,58% 14%,100% 4%,86% 47%,100% 100%,47% 86%,4% 100%,14% 58%)}\n.quality-a{--corner-size:27px;--corner-metal:#e2ba7b}\n.quality-s{--corner-size:30px;--corner-metal:#e2ca7c;--corner-cut:polygon(0 0,70% 9%,100% 0,86% 30%,67% 45%,100% 100%,45% 67%,30% 86%,0 100%,9% 70%)}\n.quality-ss{--corner-size:30px;--corner-metal:#dea595;--corner-cut:polygon(0 0,78% 14%,100% 43%,70% 70%,43% 100%,14% 78%)}\n.quality-sss{--corner-size:34.5px;--corner-metal:#d6b575;--corner-cut:polygon(0 0,55% 14%,100% 3%,82% 30%,68% 50%,100% 100%,50% 68%,30% 82%,3% 100%,14% 55%)}\n.quality-sss .card-corner:after{background:#9d79ac}\n.card-titlebar{position:relative;isolation:isolate;display:flex;align-items:center;gap:18px;min-height:98px;padding:27px 35px;background:linear-gradient(112deg,var(--quality-start),var(--quality-end));border-bottom:4px solid var(--quality-accent);color:#fffbee}\n.card-titlebar:before{content:'';position:absolute;inset:0;z-index:-1;background-image:radial-gradient(circle,#fff7 1.5px,transparent 2.2px),linear-gradient(30deg,transparent 65%,#ffffff1a 65.2%,transparent 65.6%);background-size:118px 95px,100% 100%;opacity:.55}\n.card-titlebar h1{min-width:0;flex:1;font-size:35px;line-height:1.4;letter-spacing:1px;font-weight:600;text-shadow:0 1px 2px #2c292348;overflow-wrap:anywhere}\n.title-glyph{font-size:31px;line-height:1;color:#fff6cecc}.title-star{font:38px Georgia;opacity:.75}\n.card-hero{position:relative;isolation:isolate;display:flex;align-items:center;justify-content:space-between;gap:24px;min-height:228px;padding:30px 36px;color:#eeeedd;background:radial-gradient(ellipse at 0 0,color-mix(in srgb,var(--quality-accent) 33%,transparent),transparent 65%),#272f30}\n.card-hero:before{content:'';position:absolute;inset:0;z-index:-1;opacity:.16;background-image:radial-gradient(circle,#d3d4bd 1px,transparent 1.2px);background-size:7.5px 7.5px;mask-image:linear-gradient(to bottom,#000,transparent 74%)}\n.hero-copy{flex:1;min-width:0;align-self:stretch;display:flex;flex-direction:column;justify-content:space-between}\n.hero-meta{display:flex;flex-direction:column;align-items:flex-start;gap:15px;margin-bottom:25px}\n.skill-type{font-size:24px;letter-spacing:3px;color:#cbcdbd}\n.quality-badge{display:inline-flex;align-items:center;gap:9px;padding:6px 14px;color:#fff5de;font-size:18px;font-weight:600;border:1px solid color-mix(in srgb,var(--quality-accent) 70%,transparent);border-radius:6px;background:color-mix(in srgb,var(--quality-accent) 17%,transparent)}\n.quality-badge b{color:var(--quality-end);font:700 24px Georgia,serif}\n.tags{display:flex;gap:7px;flex-wrap:wrap}\n.tag{font-size:20px;line-height:1.3;padding:6px 10px;border-radius:4px;overflow-wrap:anywhere;color:#bfcaed;background:#647bb434;border:1px solid #7d9cc62b}\n.tag.damage{color:#f5ae94;background:#b961433d;border-color:#b4614340}.tag.shield{color:#a3d7b7;background:#5186683d;border-color:#73a48a40}.tag.heal{color:#b5deb0;background:#668e4a3b;border-color:#89a47140}.tag.passive{color:#cebbef;background:#8367a63d;border-color:#9682b540}.tag.growth{color:#ecd291;background:#b1944540;border-color:#ab944e40}\n.hero-icon-wrap{--icon-size:120px;--magic-size:calc(var(--magic-base) * 1.5px);position:relative;flex-shrink:0;width:var(--magic-size);height:var(--magic-size)}\n.magic-circle{position:absolute;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--quality-end);pointer-events:none;overflow:visible}\n.magic-rays{stroke:currentColor;stroke-width:.9;opacity:.28}.magic-orbits{stroke:currentColor;stroke-width:1.2;opacity:.42}.magic-detail{stroke:currentColor;stroke-width:.9;opacity:.45}.magic-marks{fill:currentColor;opacity:.68}\n.magic-sss .magic-rays{stroke:#ddbc80;opacity:.49}.magic-sss .magic-detail{stroke:#bb9ccc;opacity:.64}.magic-sss .magic-marks{fill:#eed093;opacity:.88}\n.quality-s .magic-circle,.quality-ss .magic-circle,.quality-sss .magic-circle{filter:drop-shadow(0 0 4px color-mix(in srgb,var(--quality-accent) 30%,transparent))}\n.skill-artwork,.art-fallback{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:var(--icon-size);height:var(--icon-size);border:1.5px solid #bfc6b7;border-radius:50%;box-shadow:0 4px 13px #0007;object-fit:cover;object-position:center}\n.art-fallback{display:grid;place-items:center;color:var(--quality-end);font:44px 'KaiTi','SimSun',serif;background:radial-gradient(circle,#53615b,#1f2928)}\n.skill-icon-frame{position:absolute;top:50%;left:50%;width:calc(var(--icon-size) + 45px);height:calc(var(--icon-size) + 45px);transform:translate(-50%,-50%);z-index:2;color:var(--quality-accent);pointer-events:none;filter:drop-shadow(0 1px 1px #10181480)}\n.quality-sss .hero-icon-wrap{background:radial-gradient(ellipse,#ad85d525,transparent 68%)}\n.card-body{padding:32px 36px 34px;background:linear-gradient(145deg,#faf9f3,#eeeee7)}\n.effect-stats{display:grid;gap:9px;margin-bottom:27px}\n.stat-row{display:flex;align-items:center;justify-content:space-between;gap:18px;min-height:54px;padding:13px 18px;background:#e5e7de;border-radius:6px;font-size:24px}\n.stat-row>span{color:#626d57;flex:0 0 auto;max-width:45%;overflow-wrap:anywhere}\n.stat-row b{min-width:0;text-align:right;overflow-wrap:anywhere;font-size:30px;color:var(--quality-ink);font-weight:600}\n.stat-row.detail-stat b{font-size:26px;font-weight:500;color:#4f594b;background:none;-webkit-text-fill-color:currentColor}\n.stat-row .param-unit{font-size:24px;font-weight:400;color:#75816d;-webkit-text-fill-color:currentColor}\n.stat-value{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:flex-end;gap:9px}\n.stat-value .stat-unit{font-size:24px;font-weight:400;color:#737c68;-webkit-text-fill-color:currentColor}\n.section-heading{display:flex;align-items:center;gap:10px;margin:0 0 16px;font-size:24px;font-weight:500;letter-spacing:2px;color:#6f7d60}\n.section-heading:before{content:'\u25C6';font-size:10px;color:var(--quality-accent)}\n.description{font-size:28px;line-height:1.85;color:#515b4c;overflow-wrap:anywhere;white-space:pre-wrap}\n.description .number{color:var(--quality-ink);font-weight:600}.description .keyword{color:#907843;font-weight:500}\n.growth-section,.note-section{border-top:1px solid #d6dacd;margin-top:27px;padding-top:24px}\n.growth-section .description{color:#5c684f}\n.note-section .description{font-size:26px;color:#626d57}\n.quality-sss .card-titlebar{background:linear-gradient(110deg,#7c679e,#a77c95 50%,#cba770)}\n.quality-sss .quality-badge{border-color:#d3c192}\n.quality-sss .stat-number{background:linear-gradient(90deg,#936891,#ab884d);background-clip:text;-webkit-text-fill-color:transparent}\n";
|
|
2
|
+
export declare const qualityCardStyles = "\n*{box-sizing:border-box}\nhtml,body{margin:0;width:760px;background:#e9e9e2;font-family:'Microsoft YaHei','Noto Sans CJK SC',sans-serif;color:#303735}\n#capture{width:760px;padding:18px;background:radial-gradient(ellipse at 70% 10%,#f9f7efb8,transparent 55%),#e9e9e2}\nh1,h2,h3,p{margin:0}\n.detail-card{position:relative;width:100%;isolation:isolate;border:3px solid color-mix(in srgb,var(--quality-accent) 50%,#454a45);border-radius:18px;box-shadow:0 8px 18px #3f47321c;background:#f5f4ed;overflow:visible;--corner-size:24px;--corner-metal:#dce1d6;--corner-cut:polygon(0 0,100% 13%,75% 50%,100% 100%,50% 75%,13% 100%)}\n.card-inner{overflow:hidden;border-radius:14px}\n.card-corner{position:absolute;width:var(--corner-size);height:var(--corner-size);z-index:5;background:linear-gradient(135deg,#faf9eb,var(--corner-metal));border:1px solid #7b8075;clip-path:var(--corner-cut);filter:drop-shadow(0 1px 2px #0009)}\n.card-corner:after{content:'';position:absolute;inset:6px;background:color-mix(in srgb,var(--quality-accent) 80%,#4e584b);clip-path:var(--corner-cut)}\n.corner-tl{top:-7px;left:-7px}.corner-tr{top:-7px;right:-7px;transform:rotate(90deg)}.corner-br{bottom:-7px;right:-7px;transform:rotate(180deg)}.corner-bl{bottom:-7px;left:-7px;transform:rotate(270deg)}\n.quality-f{--corner-size:13.5px;--corner-metal:#a6afa4;--corner-cut:polygon(0 0,100% 0,100% 30%,30% 30%,30% 100%,0 100%)}\n.quality-f .card-corner:after{display:none}\n.quality-e{--corner-size:18px;--corner-metal:#a6c1a7;--corner-cut:polygon(0 0,100% 0,85% 28%,37% 37%,28% 85%,0 100%)}\n.quality-d{--corner-size:21px;--corner-metal:#87c3b1;--corner-cut:polygon(0 0,70% 10%,100% 45%,45% 100%,10% 70%)}\n.quality-c{--corner-metal:#acd5ed}\n.quality-b{--corner-size:25.5px;--corner-metal:#c2a5dc;--corner-cut:polygon(0 0,58% 14%,100% 4%,86% 47%,100% 100%,47% 86%,4% 100%,14% 58%)}\n.quality-a{--corner-size:27px;--corner-metal:#e2ba7b}\n.quality-s{--corner-size:30px;--corner-metal:#e2ca7c;--corner-cut:polygon(0 0,70% 9%,100% 0,86% 30%,67% 45%,100% 100%,45% 67%,30% 86%,0 100%,9% 70%)}\n.quality-ss{--corner-size:30px;--corner-metal:#dea595;--corner-cut:polygon(0 0,78% 14%,100% 43%,70% 70%,43% 100%,14% 78%)}\n.quality-sss{--corner-size:34.5px;--corner-metal:#d6b575;--corner-cut:polygon(0 0,55% 14%,100% 3%,82% 30%,68% 50%,100% 100%,50% 68%,30% 82%,3% 100%,14% 55%)}\n.quality-sss .card-corner:after{background:#9d79ac}\n.card-titlebar{position:relative;isolation:isolate;display:flex;align-items:center;gap:18px;min-height:98px;padding:27px 35px;background:linear-gradient(112deg,var(--quality-start),var(--quality-end));border-bottom:4px solid var(--quality-accent);color:#fffbee}\n.card-titlebar:before{content:'';position:absolute;inset:0;z-index:-1;background-image:radial-gradient(circle,#fff7 1.5px,transparent 2.2px),linear-gradient(30deg,transparent 65%,#ffffff1a 65.2%,transparent 65.6%);background-size:118px 95px,100% 100%;opacity:.55}\n.card-titlebar h1{min-width:0;flex:1;font-size:35px;line-height:1.4;letter-spacing:1px;font-weight:600;text-shadow:0 1px 2px #2c292348;overflow-wrap:anywhere}\n.title-glyph{font-size:31px;line-height:1;color:#fff6cecc}.title-star{font:38px Georgia;opacity:.75}\n.card-hero{position:relative;isolation:isolate;display:flex;align-items:center;justify-content:space-between;gap:24px;min-height:228px;padding:30px 36px;color:#eeeedd;background:radial-gradient(ellipse at 0 0,color-mix(in srgb,var(--quality-accent) 33%,transparent),transparent 65%),#272f30}\n.card-hero:before{content:'';position:absolute;inset:0;z-index:-1;opacity:.16;background-image:radial-gradient(circle,#d3d4bd 1px,transparent 1.2px);background-size:7.5px 7.5px;mask-image:linear-gradient(to bottom,#000,transparent 74%)}\n.hero-copy{flex:1;min-width:0;align-self:stretch;display:flex;flex-direction:column;justify-content:space-between}\n.hero-meta{display:flex;flex-direction:column;align-items:flex-start;gap:15px;margin-bottom:25px}\n.skill-type{font-size:24px;letter-spacing:3px;color:#cbcdbd}\n.quality-badge{display:inline-flex;align-items:center;gap:9px;padding:6px 14px;color:#fff5de;font-size:18px;font-weight:600;border:1px solid color-mix(in srgb,var(--quality-accent) 70%,transparent);border-radius:6px;background:color-mix(in srgb,var(--quality-accent) 17%,transparent)}\n.quality-badge b{color:var(--quality-end);font:700 24px Georgia,serif}\n.skill-stars{display:flex;align-items:center;flex-wrap:wrap;gap:3px;max-width:100%;margin-top:-8px}\n.skill-star{display:block;flex:0 0 40px;width:40px;height:40px;overflow:visible;filter:drop-shadow(0 1px 1px #10121780)}\n.star-shape{stroke:#24252b;stroke-width:2.4;stroke-linejoin:round}\n.star-gradient-light{stop-color:color-mix(in srgb,var(--quality-end) 55%,#fff)}.star-gradient-mid{stop-color:var(--quality-accent)}.star-gradient-shade{stop-color:var(--quality-start)}\n.star-facet-light{fill:#fff;opacity:.28}.star-facet-shade{fill:#151328;opacity:.18}.star-facet-glint{fill:none;stroke:#fff;stroke-width:.7;stroke-linejoin:round;opacity:.55}\n.skill-star.unlit .star-shape{fill:#303436;stroke:#171d22;stroke-width:2.6}\n.tags{display:flex;gap:7px;flex-wrap:wrap}\n.tag{font-size:20px;line-height:1.3;padding:6px 10px;border-radius:4px;overflow-wrap:anywhere;color:#bfcaed;background:#647bb434;border:1px solid #7d9cc62b}\n.tag.damage{color:#f5ae94;background:#b961433d;border-color:#b4614340}.tag.shield{color:#a3d7b7;background:#5186683d;border-color:#73a48a40}.tag.heal{color:#b5deb0;background:#668e4a3b;border-color:#89a47140}.tag.passive{color:#cebbef;background:#8367a63d;border-color:#9682b540}.tag.growth{color:#ecd291;background:#b1944540;border-color:#ab944e40}\n.hero-icon-wrap{--icon-size:120px;--magic-size:calc(var(--magic-base) * 1.5px);position:relative;flex-shrink:0;width:var(--magic-size);height:var(--magic-size)}\n.magic-circle{position:absolute;width:100%;height:100%;top:50%;left:50%;transform:translate(-50%,-50%);color:var(--quality-end);pointer-events:none;overflow:visible}\n.magic-rays{stroke:currentColor;stroke-width:.9;opacity:.28}.magic-orbits{stroke:currentColor;stroke-width:1.2;opacity:.42}.magic-detail{stroke:currentColor;stroke-width:.9;opacity:.45}.magic-marks{fill:currentColor;opacity:.68}\n.magic-sss .magic-rays{stroke:#ddbc80;opacity:.49}.magic-sss .magic-detail{stroke:#bb9ccc;opacity:.64}.magic-sss .magic-marks{fill:#eed093;opacity:.88}\n.quality-s .magic-circle,.quality-ss .magic-circle,.quality-sss .magic-circle{filter:drop-shadow(0 0 4px color-mix(in srgb,var(--quality-accent) 30%,transparent))}\n.skill-artwork,.art-fallback{position:absolute;z-index:1;top:50%;left:50%;transform:translate(-50%,-50%);width:var(--icon-size);height:var(--icon-size);border:1.5px solid #bfc6b7;border-radius:50%;box-shadow:0 4px 13px #0007;object-fit:cover;object-position:center}\n.art-fallback{display:grid;place-items:center;color:var(--quality-end);font:44px 'KaiTi','SimSun',serif;background:radial-gradient(circle,#53615b,#1f2928)}\n.skill-icon-frame{position:absolute;top:50%;left:50%;width:calc(var(--icon-size) + 45px);height:calc(var(--icon-size) + 45px);transform:translate(-50%,-50%);z-index:2;color:var(--quality-accent);pointer-events:none;filter:drop-shadow(0 1px 1px #10181480)}\n.quality-sss .hero-icon-wrap{background:radial-gradient(ellipse,#ad85d525,transparent 68%)}\n.card-body{padding:32px 36px 34px;background:linear-gradient(145deg,#faf9f3,#eeeee7)}\n.effect-stats{display:grid;gap:9px;margin-bottom:27px}\n.stat-row{display:flex;align-items:center;justify-content:space-between;gap:18px;min-height:54px;padding:13px 18px;background:#e5e7de;border-radius:6px;font-size:24px}\n.stat-row>span{color:#626d57;flex:0 0 auto;max-width:45%;overflow-wrap:anywhere}\n.stat-row b{min-width:0;text-align:right;overflow-wrap:anywhere;font-size:30px;color:var(--quality-ink);font-weight:600}\n.stat-row.detail-stat b{font-size:26px;font-weight:500;color:#4f594b;background:none;-webkit-text-fill-color:currentColor}\n.stat-row .param-unit{font-size:24px;font-weight:400;color:#75816d;-webkit-text-fill-color:currentColor}\n.stat-value{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:flex-end;gap:9px}\n.stat-value .stat-unit{font-size:24px;font-weight:400;color:#737c68;-webkit-text-fill-color:currentColor}\n.section-heading{display:flex;align-items:center;gap:10px;margin:0 0 16px;font-size:24px;font-weight:500;letter-spacing:2px;color:#6f7d60}\n.section-heading:before{content:'\u25C6';font-size:10px;color:var(--quality-accent)}\n.description{font-size:28px;line-height:1.85;color:#515b4c;overflow-wrap:anywhere;white-space:pre-wrap}\n.description .number{color:var(--quality-ink);font-weight:600}.description .keyword{color:#907843;font-weight:500}\n.growth-section,.note-section{border-top:1px solid #d6dacd;margin-top:27px;padding-top:24px}\n.growth-section .description{color:#5c684f}\n.note-section .description{font-size:26px;color:#626d57}\n.quality-sss .card-titlebar{background:linear-gradient(110deg,#7c679e,#a77c95 50%,#cba770)}\n.quality-sss .quality-badge{border-color:#d3c192}\n.quality-sss .stat-number{background:linear-gradient(90deg,#936891,#ab884d);background-clip:text;-webkit-text-fill-color:transparent}\n";
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import type { Session } from 'koishi';
|
|
2
1
|
import { type IMessage } from '../../shared/face';
|
|
3
|
-
import type { MsgMessage } from '../../shared/bot/MsgMessage';
|
|
4
2
|
/** Render command help and ordinary prose with clickable bracketed commands. */
|
|
5
3
|
export declare function renderQQCommandMarkdown(data: IMessage, showGreeting: boolean): string;
|
|
6
|
-
export declare function sendQQCommand(session: Session, data: MsgMessage): Promise<void>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Session } from 'koishi';
|
|
2
2
|
import { type IMessage, type PageNavData } from '../../shared/face';
|
|
3
3
|
import type { MsgMessage } from '../../shared/bot/MsgMessage';
|
|
4
|
-
import {
|
|
4
|
+
import type { QQKeyboard } from './qqMessageButtons';
|
|
5
5
|
export { escapeMarkdown, renderQQTitle } from './qqMarkdownHelpers';
|
|
6
6
|
export declare function inlineCommandUrl(command: string): string;
|
|
7
7
|
export declare function hasInlineCommands(content: string): boolean;
|
|
@@ -11,7 +11,5 @@ export declare function pageCommandLines(nav: PageNavData): string[];
|
|
|
11
11
|
export declare function renderQQPageMarkdown(data: IMessage, showGreeting: boolean): string;
|
|
12
12
|
/** Returns false if this is not the matching QQ session or the adapter has no native API. */
|
|
13
13
|
export declare function canSendQQPage(session: Session | undefined, data: MsgMessage): session is Session;
|
|
14
|
-
/** Send a native QQ Markdown page with inline command links. */
|
|
15
|
-
export declare function sendQQPage(session: Session, data: MsgMessage): Promise<void>;
|
|
16
14
|
/** Reuse the adapter's native reply API for structured Markdown messages. */
|
|
17
15
|
export declare function sendQQMarkdown(session: Session, markdown: string, keyboard?: QQKeyboard): Promise<void>;
|
|
@@ -3,7 +3,7 @@ export declare function hasRewardLines(data: Pick<IMessage, 'line'>): boolean;
|
|
|
3
3
|
/** The message marker also covers empty rewards and attachments already claimed. */
|
|
4
4
|
export declare function isRewardMessage(data: Pick<IMessage, 'line' | 'reward'>): boolean;
|
|
5
5
|
export declare function renderRewardTitle(content: string): string;
|
|
6
|
-
/** Reward names
|
|
7
|
-
export declare function renderRewardLine(content: string): string;
|
|
6
|
+
/** Reward names stay literal; a supplied action links the name, keeping its signed quantity emphasized. */
|
|
7
|
+
export declare function renderRewardLine(content: string, command?: string): string;
|
|
8
8
|
/** Reward cards stay compact; mail keeps its content before the attachment quote. */
|
|
9
9
|
export declare function renderQQRewardMarkdown(data: IMessage, showGreeting: boolean): string;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type { Session } from 'koishi';
|
|
2
1
|
import { type IMessage } from '../../shared/face';
|
|
3
|
-
import type { MsgMessage } from '../../shared/bot/MsgMessage';
|
|
4
2
|
export declare function hasStoryCodeBlock(data: Pick<IMessage, 'line'>): boolean;
|
|
5
3
|
/** Marked stories keep their complete text; settled rewards use the shared reward card. */
|
|
6
4
|
export declare function renderQQStoryMarkdown(data: IMessage, showGreeting: boolean): string;
|
|
7
|
-
export declare function sendQQStory(session: Session, data: MsgMessage): Promise<void>;
|