${deadRibbon}
-
WANTED
+
${escapeHtml(characterPosterLabel(c))}
${characterPortraitSVG(c)}
${escapeHtml(c.name)}
${c.epithet ? '"' + escapeHtml(c.epithet) + '"' : ' '}
-
${c.bounty ? formatBounty(c.bounty) : 'Bounty Unknown'}
+
${escapeHtml(characterBountyOrRank(c))}
@@ -82,4 +82,6 @@
`;
+
+ hydrateProperImages(root);
})();
diff --git a/js/fruit.js b/js/fruit.js
index ea9b321..2de632c 100644
--- a/js/fruit.js
+++ b/js/fruit.js
@@ -79,4 +79,6 @@
`;
+
+ hydrateProperImages(root);
})();
diff --git a/js/fruits.js b/js/fruits.js
index bbeba43..4dce6a3 100644
--- a/js/fruits.js
+++ b/js/fruits.js
@@ -33,6 +33,7 @@
renderCardGrid(grid, results, fruitCardHTML, 'No Devil Fruits match your search.');
resultCount.textContent = `${results.length} of ${FRUITS.length} Devil Fruits`;
+ hydrateProperImages(grid);
}
chipRow.addEventListener('click', (e) => {
diff --git a/js/main.js b/js/main.js
index 9d41a5a..0f8637e 100644
--- a/js/main.js
+++ b/js/main.js
@@ -35,6 +35,7 @@
renderCardGrid(grid, results, characterCardHTML, 'No characters match your search. Try a different name or affiliation.');
resultCount.textContent = `${results.length} of ${CHARACTERS.length} characters`;
+ hydrateProperImages(grid);
}
searchInput.addEventListener('input', applyFilters);
diff --git a/js/portraits.js b/js/portraits.js
index e4ef12c..8b2586e 100644
--- a/js/portraits.js
+++ b/js/portraits.js
@@ -74,7 +74,26 @@ function iconKeyForCharacter(c) {
return 'star';
}
-function characterPortraitSVG(c) {
+function characterImageTitle(c) {
+ return c.imageTitle || c.name;
+}
+
+function fruitImageTitle(f) {
+ if (f.imageTitle) return f.imageTitle;
+ if (f.id === 'gomu-gomu-no-mi') return 'Hito Hito no Mi, Model: Nika';
+ return f.name;
+}
+
+function properImageHTML(kind, title, label, fallback) {
+ return `
+