Compare commits

..

8 Commits

Author SHA1 Message Date
Thomas
1b60f459cb redo removal after restructuring 2026-01-30 10:59:29 -05:00
Thomas
1a7c0d4796 remove attunement functionality 2026-01-28 05:53:41 -05:00
Thomas
4e37f2b0ee add filtering to magic item market 2026-01-24 23:56:35 -05:00
Thomas
49754b1394 fix faction details that get cutoff 2026-01-24 23:51:20 -05:00
Thomas
68232403d3 add alternating row coloration 2026-01-24 23:48:36 -05:00
Thomas
b32b317be2 add attunement requirements tooltip that shows when hovering over 'Special' attunement badge 2026-01-24 23:45:38 -05:00
Thomas
791f8aff8b link item names to dndbeyond item page 2026-01-24 23:42:38 -05:00
Thomas
52524231aa add attunement column 2026-01-24 23:37:35 -05:00
5 changed files with 1032 additions and 377 deletions

155
app.js
View File

@ -26,6 +26,11 @@ const FACTIONS = {
"Thuranni": { xp: 1.0, gold: 1.25, "rep+": 0.5, "rep-": -2 } "Thuranni": { xp: 1.0, gold: 1.25, "rep+": 0.5, "rep-": -2 }
}; };
const DNDBEYOND_MAGIC_ITEM_BASE_URL = "https://dndbeyond.com/magic-items/";
const MAGIC_ITEM_PAGE_MAP = typeof MAGIC_ITEMS_DATA !== 'undefined'
? new Map(MAGIC_ITEMS_DATA.map(item => [item.name, item.dndbeyondPage]).filter(([, page]) => page))
: new Map();
const OPPOSITIONS = { const OPPOSITIONS = {
"Kundarak": ["Deneith", "Tharashk"], "Kundarak": ["Deneith", "Tharashk"],
"Medani": ["Tharashk", "Thuranni"], "Medani": ["Tharashk", "Thuranni"],
@ -307,6 +312,8 @@ function getStockTransitions(rarity) {
// Global market data and sort state // Global market data and sort state
let marketData = null; let marketData = null;
let currentSort = { column: 'name', direction: 'asc' }; let currentSort = { column: 'name', direction: 'asc' };
// Calculate price multiplier based on reputation and rarity // Calculate price multiplier based on reputation and rarity
function getPriceMultiplier(reputation, rarity) { function getPriceMultiplier(reputation, rarity) {
@ -395,7 +402,7 @@ function toggleSection(contentId, iconId) {
const icon = document.getElementById(iconId); const icon = document.getElementById(iconId);
if (content.style.display === 'none') { if (content.style.display === 'none') {
content.style.display = 'block'; content.style.display = '';
icon.textContent = '▼'; icon.textContent = '▼';
} else { } else {
content.style.display = 'none'; content.style.display = 'none';
@ -423,6 +430,7 @@ document.addEventListener('click', (event) => {
function renderMarket(marketData, reputationData) { function renderMarket(marketData, reputationData) {
const marketContainer = document.getElementById('market-display'); const marketContainer = document.getElementById('market-display');
if (!marketContainer || !marketData || !marketData.items) return; if (!marketContainer || !marketData || !marketData.items) return;
captureMarketTableScroll();
// Filter to only available items (stock > unavailable AND reputation high enough) // Filter to only available items (stock > unavailable AND reputation high enough)
const availableItems = []; const availableItems = [];
@ -430,12 +438,19 @@ function renderMarket(marketData, reputationData) {
marketData.items.forEach(item => { marketData.items.forEach(item => {
const reputation = reputationData[item.faction] || 0; const reputation = reputationData[item.faction] || 0;
if (item.stock !== "unavailable" && isItemAvailable(item, reputation)) { if (item.stock !== "unavailable" && isItemAvailable(item, reputation)) {
const dndbeyondPage = item.dndbeyondPage
|| MAGIC_ITEM_PAGE_MAP.get(item.name)
|| null;
const dndbeyondUrl = dndbeyondPage
? `${DNDBEYOND_MAGIC_ITEM_BASE_URL}${dndbeyondPage}`
: null;
// Add adjusted price to item for sorting // Add adjusted price to item for sorting
const adjustedPrice = getAdjustedPrice(item, reputation); const adjustedPrice = getAdjustedPrice(item, reputation);
availableItems.push({ availableItems.push({
...item, ...item,
adjustedPrice, adjustedPrice,
reputation reputation,
dndbeyondUrl
}); });
} }
}); });
@ -445,42 +460,47 @@ function renderMarket(marketData, reputationData) {
return; return;
} }
const filterValues = getMarketFilterValues(availableItems);
const filteredItems = applyMarketFilters(availableItems);
if (filteredItems.length === 0) {
const emptyColspan = 5;
marketContainer.innerHTML = `
<div class="market-table-wrapper">
<table class="market-table">
<thead>
${renderMarketHeader()}
${renderMarketFilters(filterValues)}
</thead>
<tbody>
<tr>
<td class="no-items" colspan="${emptyColspan}">No items match the current filters.</td>
</tr>
</tbody>
</table>
</div>
`;
restoreMarketFilterFocus();
return;
}
// Sort items // Sort items
sortItems(availableItems, currentSort.column, currentSort.direction); sortItems(filteredItems, currentSort.column, currentSort.direction);
// Build table HTML with scrollable wrapper // Build table HTML with scrollable wrapper
let html = ` let html = `
<div class="market-table-wrapper"> <div class="market-table-wrapper">
<table class="market-table"> <table class="market-table">
<thead> <thead>
<tr> ${renderMarketHeader()}
<th class="sortable ${currentSort.column === 'name' ? 'sorted-' + currentSort.direction : ''}" ${renderMarketFilters(filterValues)}
onclick="sortMarket('name')">
Name ${getSortIndicator('name')}
</th>
<th class="sortable ${currentSort.column === 'faction' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('faction')">
Faction ${getSortIndicator('faction')}
</th>
<th class="sortable ${currentSort.column === 'rarity' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('rarity')">
Rarity ${getSortIndicator('rarity')}
</th>
<th class="sortable ${currentSort.column === 'stock' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('stock')">
Stock ${getSortIndicator('stock')}
</th>
<th class="sortable ${currentSort.column === 'cost' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('cost')">
Cost ${getSortIndicator('cost')}
</th>
</tr>
</thead> </thead>
<tbody> <tbody>
`; `;
// Render each item as table row // Render each item as table row
availableItems.forEach(item => { filteredItems.forEach(item => {
const stockClass = item.stock.replace(' ', '-'); const stockClass = item.stock.replace(' ', '-');
const factionClass = item.faction.toLowerCase(); const factionClass = item.faction.toLowerCase();
const rarityClass = item.rarity.toLowerCase().replace(' ', '-'); const rarityClass = item.rarity.toLowerCase().replace(' ', '-');
@ -493,10 +513,13 @@ function renderMarket(marketData, reputationData) {
: isAdminPage : isAdminPage
? `${item.adjustedPrice} gp <span class="base-price">(${item.baseCost} gp)</span>` ? `${item.adjustedPrice} gp <span class="base-price">(${item.baseCost} gp)</span>`
: `${item.adjustedPrice} gp`; : `${item.adjustedPrice} gp`;
const nameDisplay = item.dndbeyondUrl
? `<a class="item-link" href="${item.dndbeyondUrl}" target="_blank" rel="noopener">${item.name}</a>`
: item.name;
html += ` html += `
<tr class="market-row"> <tr class="market-row">
<td class="item-name-cell">${item.name}</td> <td class="item-name-cell">${nameDisplay}</td>
<td class="item-faction-cell ${factionClass}">${item.faction}</td> <td class="item-faction-cell ${factionClass}">${item.faction}</td>
<td class="item-rarity-cell"> <td class="item-rarity-cell">
<span class="rarity-badge rarity-${rarityClass}">${item.rarity}</span> <span class="rarity-badge rarity-${rarityClass}">${item.rarity}</span>
@ -517,9 +540,37 @@ function renderMarket(marketData, reputationData) {
`; `;
marketContainer.innerHTML = html; marketContainer.innerHTML = html;
restoreMarketFilterFocus();
restoreMarketTableScroll();
}
function renderMarketHeader() {
return `
<tr>
<th class="sortable ${currentSort.column === 'name' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('name')">
Name ${getSortIndicator('name')}
</th>
<th class="sortable ${currentSort.column === 'faction' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('faction')">
Faction ${getSortIndicator('faction')}
</th>
<th class="sortable ${currentSort.column === 'rarity' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('rarity')">
Rarity ${getSortIndicator('rarity')}
</th>
<th class="sortable ${currentSort.column === 'stock' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('stock')">
Stock ${getSortIndicator('stock')}
</th>
<th class="sortable cost-col ${currentSort.column === 'cost' ? 'sorted-' + currentSort.direction : ''}"
onclick="sortMarket('cost')">
Cost ${getSortIndicator('cost')}
</th>
</tr>
`;
} }
// Sort items by column
function sortItems(items, column, direction) { function sortItems(items, column, direction) {
const multiplier = direction === 'asc' ? 1 : -1; const multiplier = direction === 'asc' ? 1 : -1;
@ -583,6 +634,14 @@ function getSortIndicator(column) {
return currentSort.direction === 'asc' ? '↑' : '↓'; return currentSort.direction === 'asc' ? '↑' : '↓';
} }
function escapeAttribute(value) {
return String(value)
.replace(/&/g, '&amp;')
.replace(/\"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
}
// ===== END MAGIC ITEM MARKET SYSTEM ===== // ===== END MAGIC ITEM MARKET SYSTEM =====
function getNextQuestForFaction(faction, currentIndex) { function getNextQuestForFaction(faction, currentIndex) {
@ -730,6 +789,41 @@ function toggleBenefitsTooltip(event) {
// Toggle this tooltip // Toggle this tooltip
tooltip.classList.toggle('show'); tooltip.classList.toggle('show');
if (tooltip.classList.contains('show')) {
positionBenefitsTooltip(tooltip, icon);
}
}
function positionBenefitsTooltip(tooltip, icon) {
const margin = 12;
const maxWidth = Math.min(400, window.innerWidth - margin * 2);
tooltip.style.width = `${maxWidth}px`;
tooltip.style.left = '50%';
tooltip.style.right = 'auto';
tooltip.style.transform = 'translateX(-50%)';
let tooltipRect = tooltip.getBoundingClientRect();
const iconRect = icon.getBoundingClientRect();
const viewportWidth = window.innerWidth;
if (tooltipRect.right > viewportWidth - margin) {
const shiftLeft = tooltipRect.right - (viewportWidth - margin);
tooltip.style.transform = `translateX(calc(-50% - ${shiftLeft}px))`;
} else if (tooltipRect.left < margin) {
const shiftRight = margin - tooltipRect.left;
tooltip.style.transform = `translateX(calc(-50% + ${shiftRight}px))`;
}
// Re-measure after shifting and align arrow to icon center
tooltipRect = tooltip.getBoundingClientRect();
const iconCenter = iconRect.left + iconRect.width / 2;
const arrowLeft = Math.min(
Math.max(iconCenter - tooltipRect.left, 16),
tooltipRect.width - 16
);
tooltip.style.setProperty('--tooltip-arrow-left', `${arrowLeft}px`);
} }
// Close tooltips when clicking outside // Close tooltips when clicking outside
@ -739,6 +833,9 @@ document.addEventListener('click', (event) => {
tooltip.classList.remove('show'); tooltip.classList.remove('show');
}); });
} }
if (!event.target.closest('.market-filter-dropdown')) {
closeMarketFilterDropdown();
}
}); });
function renderQuestBoard(quests, currentTime) { function renderQuestBoard(quests, currentTime) {

377
filtering.js Normal file
View File

@ -0,0 +1,377 @@
// Magic Item Market filtering state and helpers
let marketFilters = {
name: '',
faction: [],
rarity: [],
stock: [],
costMin: '',
costMax: ''
};
let marketFilterFocus = null;
let marketFilterOpenKey = null;
let marketFilterSearch = {
faction: '',
rarity: '',
stock: '',
};
let marketTableScrollLeft = null;
let marketFilterAllValues = {
faction: [],
rarity: [],
stock: [],
};
let marketFiltersInitialized = false;
let marketFilterDebounce = null;
function renderMarketFilters(values) {
// Build the filter row markup for the market table.
const { factions, rarities, stocks, } = values;
return `
<tr class="market-filter-row">
<th>
<div class="market-filter-search">
<input class="market-filter-input market-filter-search-input" type="text" placeholder="Search"
value="${escapeAttribute(marketFilters.name)}"
data-filter-key="name"
oninput="updateMarketFilter('name', this.value)" />
<button class="market-filter-clear${marketFilters.name ? ' active' : ''}"
type="button"
aria-label="Clear name filter"
onclick="clearMarketFilter('name')">×</button>
</div>
</th>
<th>
${renderFilterDropdown('faction', 'Faction', factions, marketFilters.faction)}
</th>
<th>
${renderFilterDropdown('rarity', 'Rarity', rarities, marketFilters.rarity)}
</th>
<th>
${renderFilterDropdown('stock', 'Stock', stocks, marketFilters.stock, toTitleCase)}
</th>
<th class="cost-col">
<div class="market-filter-range">
<div class="market-filter-search">
<input class="market-filter-input cost-filter" type="text" inputmode="numeric" pattern="[0-9]*" placeholder="Min"
value="${escapeAttribute(marketFilters.costMin)}"
data-filter-key="costMin"
oninput="updateMarketFilter('costMin', this.value)" />
<button class="market-filter-clear${marketFilters.costMin ? ' active' : ''}"
type="button"
aria-label="Clear minimum cost"
onclick="clearMarketFilter('costMin')">×</button>
</div>
<div class="market-filter-search">
<input class="market-filter-input cost-filter" type="text" inputmode="numeric" pattern="[0-9]*" placeholder="Max"
value="${escapeAttribute(marketFilters.costMax)}"
data-filter-key="costMax"
oninput="updateMarketFilter('costMax', this.value)" />
<button class="market-filter-clear${marketFilters.costMax ? ' active' : ''}"
type="button"
aria-label="Clear maximum cost"
onclick="clearMarketFilter('costMax')">×</button>
</div>
</div>
</th>
</tr>
`;
}
function getMarketFilterValues(items) {
// Derive filter options once per render, seeding defaults on first load.
const factions = getUniqueValues(items, item => item.faction);
const rarities = getRarityValues();
const stocks = getUniqueValues(items, item => item.stock, stockSort);
marketFilterAllValues = {
faction: factions,
rarity: rarities,
stock: stocks,
};
if (!marketFiltersInitialized) {
marketFilters.faction = [...factions];
marketFilters.rarity = [...rarities];
marketFilters.stock = [...stocks];
marketFiltersInitialized = true;
}
return { factions, rarities, stocks };
}
function getUniqueValues(items, getter, sorter) {
// Collect unique values and apply optional custom sort.
const values = new Set();
items.forEach(item => {
const value = getter(item);
if (value) values.add(value);
});
const list = Array.from(values);
if (sorter) {
return list.sort(sorter);
}
return list.sort((a, b) => a.localeCompare(b));
}
function renderFilterDropdown(key, label, values, selected, labelFormatter) {
// Compact filter UI with search and multi-select checkboxes.
const formatted = labelFormatter || (value => value);
const search = marketFilterSearch[key] || '';
const filteredValues = values.filter(value =>
value.toLowerCase().includes(search.toLowerCase())
);
// "All" is shown only when every value is selected; "NONE" means zero selected.
const isAllSelected = selected.length === values.length && values.length > 0;
const isNoneSelected = selected.length === 0;
const summary = isAllSelected
? 'All'
: isNoneSelected
? 'NONE'
: selected.length === 1
? formatted(selected[0])
: `${selected.length} selected`;
const options = filteredValues.map(value => {
const isChecked = selected.includes(value) ? ' checked' : '';
const display = escapeAttribute(formatted(value));
return `
<label class="market-filter-option">
<input type="checkbox" value="${escapeAttribute(value)}"${isChecked}
onchange="toggleMarketFilterValue('${key}', this.value, this.checked)" />
<span>${display}</span>
</label>
`;
}).join('');
const openClass = marketFilterOpenKey === key ? ' show' : '';
return `
<div class="market-filter-dropdown" data-filter-key="${key}">
<button type="button" class="market-filter-trigger${isNoneSelected ? ' is-empty' : ''}" onclick="toggleMarketFilterDropdown('${key}')">
${label}: <span class="market-filter-summary">${escapeAttribute(summary)}</span>
</button>
<div class="market-filter-popover${openClass}" onclick="event.stopPropagation()">
<div class="market-filter-popover-header">
<input class="market-filter-input market-filter-popover-search" type="text" placeholder="Search"
value="${escapeAttribute(search)}"
data-filter-search-key="${key}"
oninput="updateMarketFilterSearch('${key}', this.value)" />
<div class="market-filter-popover-actions">
<button type="button" onclick="selectAllMarketFilter('${key}')">All</button>
<button type="button" onclick="clearMarketFilter('${key}')">Clear</button>
</div>
</div>
<div class="market-filter-options">
${options || '<div class="market-filter-empty">No matches</div>'}
</div>
</div>
</div>
`;
}
function toTitleCase(value) {
// Title-case display helper for stock labels.
return value.replace(/\b\w/g, (char) => char.toUpperCase());
}
function stockSort(a, b) {
// Enforce stock order from most scarce to most available.
const order = ["Very Limited", "Limited", "Modest", "Abundant", "Very Abundant"];
return order.indexOf(toTitleCase(a)) - order.indexOf(toTitleCase(b));
}
function raritySort(a, b) {
// Enforce rarity order from rarest to most common.
const order = ["Unique", "Artifact", "Legendary", "Very Rare", "Rare", "Uncommon", "Common"];
const indexA = order.indexOf(a);
const indexB = order.indexOf(b);
if (indexA === -1 && indexB === -1) return a.localeCompare(b);
if (indexA === -1) return 1;
if (indexB === -1) return -1;
return indexA - indexB;
}
function getRarityValues() {
// Use full dataset so rarities aren't limited by current visibility.
if (typeof MAGIC_ITEMS_DATA === 'undefined') return [];
const values = new Set();
MAGIC_ITEMS_DATA.forEach(item => {
if (item.rarity) values.add(item.rarity);
});
const list = Array.from(values);
return list.sort(raritySort);
}
function applyMarketFilters(items) {
// Empty selections mean "show none" for that filter (intentional for clear state).
const name = marketFilters.name.trim().toLowerCase();
const faction = marketFilters.faction;
const rarity = marketFilters.rarity;
const stock = marketFilters.stock;
const costMin = marketFilters.costMin === '' ? null : Number(marketFilters.costMin);
const costMax = marketFilters.costMax === '' ? null : Number(marketFilters.costMax);
return items.filter(item => {
if (name && !item.name.toLowerCase().includes(name)) return false;
if (faction.length === 0 || !faction.includes(item.faction)) return false;
if (rarity.length === 0 || !rarity.includes(item.rarity)) return false;
if (stock.length === 0 || !stock.includes(item.stock)) return false;
if (costMin !== null && item.adjustedPrice < costMin) return false;
if (costMax !== null && item.adjustedPrice > costMax) return false;
return true;
});
}
function updateMarketFilter(key, value) {
// Preserve focus while re-rendering.
captureMarketFilterFocus();
marketFilters[key] = value;
scheduleMarketFilterRender();
}
function toggleMarketFilterValue(key, value, isChecked) {
// Toggle a checkbox value within the active selection array.
const values = marketFilters[key];
if (!Array.isArray(values)) return;
const index = values.indexOf(value);
if (isChecked && index === -1) {
values.push(value);
} else if (!isChecked && index >= 0) {
values.splice(index, 1);
}
scheduleMarketFilterRender();
}
function clearMarketFilter(key) {
// Clear selection or input for the given filter key.
captureMarketFilterFocus();
if (Array.isArray(marketFilters[key])) {
marketFilters[key] = [];
} else {
marketFilters[key] = '';
}
if (key === 'costMin' || key === 'costMax' || key === 'name') {
marketFilterFocus = {
key,
selectionStart: 0,
selectionEnd: 0
};
}
scheduleMarketFilterRender();
}
function selectAllMarketFilter(key) {
// Select all values for the given filter.
const values = marketFilters[key];
if (!Array.isArray(values)) return;
marketFilters[key] = [...(marketFilterAllValues[key] || [])];
scheduleMarketFilterRender();
}
function toggleMarketFilterDropdown(key) {
// Open/close the filter popover for the given column.
marketFilterOpenKey = marketFilterOpenKey === key ? null : key;
scheduleMarketFilterRender();
if (marketFilterOpenKey) {
requestAnimationFrame(() => positionMarketFilterPopover(marketFilterOpenKey));
}
}
function updateMarketFilterSearch(key, value) {
// Update popover search text and refresh the list.
captureMarketFilterFocus();
marketFilterSearch[key] = value;
scheduleMarketFilterRender();
}
function closeMarketFilterDropdown() {
// Close any open popover when clicking outside.
if (marketFilterOpenKey !== null) {
captureMarketFilterFocus();
marketFilterOpenKey = null;
scheduleMarketFilterRender();
}
}
function positionMarketFilterPopover(key) {
// Keep the popover within the viewport on narrow screens.
const dropdown = document.querySelector(`.market-filter-dropdown[data-filter-key="${key}"]`);
if (!dropdown) return;
const trigger = dropdown.querySelector('.market-filter-trigger');
const popover = dropdown.querySelector('.market-filter-popover');
if (!popover || !trigger) return;
const margin = 12;
const viewportWidth = window.innerWidth;
const triggerRect = trigger.getBoundingClientRect();
popover.style.position = 'absolute';
popover.style.left = '0';
popover.style.right = 'auto';
popover.style.transform = 'none';
const popoverRect = popover.getBoundingClientRect();
const popoverWidth = popoverRect.width;
const maxLeft = Math.max(margin, viewportWidth - popoverWidth - margin);
const left = Math.min(Math.max(triggerRect.left, margin), maxLeft);
const shiftLeft = triggerRect.left - left;
if (shiftLeft !== 0) {
popover.style.transform = `translateX(-${shiftLeft}px)`;
}
}
function captureMarketFilterFocus() {
// Track cursor placement to avoid input blur on re-render.
const el = document.activeElement;
if (!el || !el.dataset) return;
if (el.dataset.filterKey) {
marketFilterFocus = {
type: 'filter',
key: el.dataset.filterKey,
selectionStart: el.selectionStart,
selectionEnd: el.selectionEnd
};
} else if (el.dataset.filterSearchKey) {
marketFilterFocus = {
type: 'search',
key: el.dataset.filterSearchKey,
selectionStart: el.selectionStart,
selectionEnd: el.selectionEnd
};
}
}
function restoreMarketFilterFocus() {
// Restore focus and caret to the active filter input.
if (!marketFilterFocus) return;
const selector = marketFilterFocus.type === 'search'
? `[data-filter-search-key="${marketFilterFocus.key}"]`
: `[data-filter-key="${marketFilterFocus.key}"]`;
const el = document.querySelector(selector);
if (!el) return;
el.focus();
if (typeof el.selectionStart === 'number') {
el.setSelectionRange(marketFilterFocus.selectionStart, marketFilterFocus.selectionEnd);
}
marketFilterFocus = null;
}
function captureMarketTableScroll() {
// Preserve horizontal scroll when re-rendering on mobile.
const wrapper = document.querySelector('.market-table-wrapper');
if (!wrapper) return;
marketTableScrollLeft = wrapper.scrollLeft;
}
function restoreMarketTableScroll() {
// Restore horizontal scroll position after re-render.
if (marketTableScrollLeft === null) return;
const wrapper = document.querySelector('.market-table-wrapper');
if (!wrapper) return;
wrapper.scrollLeft = marketTableScrollLeft;
marketTableScrollLeft = null;
}
function scheduleMarketFilterRender() {
clearTimeout(marketFilterDebounce);
marketFilterDebounce = setTimeout(() => {
if (marketData && campaignData) {
renderMarket(marketData, campaignData.reputation);
}
}, 250);
}

View File

@ -75,6 +75,9 @@
<!-- Magic Items Data --> <!-- Magic Items Data -->
<script src="magic-items-data.js"></script> <script src="magic-items-data.js"></script>
<!-- Market Filtering -->
<script src="filtering.js"></script>
<!-- App Logic --> <!-- App Logic -->
<script src="app.js"></script> <script src="app.js"></script>
</body> </body>

View File

@ -1,332 +1,332 @@
// Magic Items Database // Magic Items Database
// Converted from MagicItems.csv // Converted from MagicItems.csv
const MAGIC_ITEMS_DATA = [ const MAGIC_ITEMS_DATA = [
{ id: "item_001", name: "Adamantine Armor", rarity: "Uncommon", faction: "Deneith", baseCost: 500 }, { id: "item_001", name: "Adamantine Armor", rarity: "Uncommon", faction: "Deneith", baseCost: 500, dndbeyondPage: "5370-adamantine-armor" },
{ id: "item_002", name: "Adamantine Weapon", rarity: "Uncommon", faction: "Deneith", baseCost: 500 }, { id: "item_002", name: "Adamantine Weapon", rarity: "Uncommon", faction: "Deneith", baseCost: 500, dndbeyondPage: "9228341-adamantine-weapon" },
{ id: "item_003", name: "Alchemy Jug", rarity: "Uncommon", faction: "Morgrave", baseCost: 100 }, { id: "item_003", name: "Alchemy Jug", rarity: "Uncommon", faction: "Morgrave", baseCost: 100, dndbeyondPage: "9228343-alchemy-jug" },
{ id: "item_004", name: "Ammunition of Slaying", rarity: "Very Rare", faction: "Thuranni", baseCost: 1000 }, { id: "item_004", name: "Ammunition of Slaying", rarity: "Very Rare", faction: "Thuranni", baseCost: 1000, dndbeyondPage: "9228344-ammunition-of-slaying" },
{ id: "item_005", name: "Ammunition, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 50 }, { id: "item_005", name: "Ammunition, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 50, dndbeyondPage: "5407-ammunition-1" },
{ id: "item_006", name: "Ammunition, +2", rarity: "Rare", faction: "Deneith", baseCost: 250 }, { id: "item_006", name: "Ammunition, +2", rarity: "Rare", faction: "Deneith", baseCost: 250, dndbeyondPage: "5410-ammunition-2" },
{ id: "item_007", name: "Ammunition, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 1250 }, { id: "item_007", name: "Ammunition, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 1250, dndbeyondPage: "5411-ammunition-3" },
{ id: "item_008", name: "Amulet of Health", rarity: "Rare", faction: "Morgrave", baseCost: 4000 }, { id: "item_008", name: "Amulet of Health", rarity: "Rare", faction: "Morgrave", baseCost: 4000, dndbeyondPage: "4568-amulet-of-health" },
{ id: "item_009", name: "Amulet of Proof against Detection and Location", rarity: "Uncommon", faction: "Kundarak", baseCost: 400 }, { id: "item_009", name: "Amulet of Proof against Detection and Location", rarity: "Uncommon", faction: "Kundarak", baseCost: 400, dndbeyondPage: "4569-amulet-of-proof-against-detection-and-location" },
{ id: "item_010", name: "Amulet of the Planes", rarity: "Very Rare", faction: "Morgrave", baseCost: 43000 }, { id: "item_010", name: "Amulet of the Planes", rarity: "Very Rare", faction: "Morgrave", baseCost: 43000, dndbeyondPage: "9228345-amulet-of-the-planes" },
{ id: "item_011", name: "Animated Shield", rarity: "Very Rare", faction: "Deneith", baseCost: 6000 }, { id: "item_011", name: "Animated Shield", rarity: "Very Rare", faction: "Deneith", baseCost: 6000, dndbeyondPage: "4571-animated-shield" },
{ id: "item_012", name: "Arcane Propulsion Arm", rarity: "Very Rare", faction: "Deneith", baseCost: 5100 }, { id: "item_012", name: "Arcane Propulsion Arm", rarity: "Very Rare", faction: "Deneith", baseCost: 5100, dndbeyondPage: "976932-arcane-propulsion-arm" },
{ id: "item_013", name: "Armor of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3000 }, { id: "item_013", name: "Armor of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "5371-armor-of-resistance" },
{ id: "item_014", name: "Armor of Safeguarding", rarity: "Very Rare", faction: "Deneith", baseCost: 10000 }, { id: "item_014", name: "Armor of Safeguarding", rarity: "Very Rare", faction: "Deneith", baseCost: 10000, dndbeyondPage: "7102410-armor-of-safeguarding" },
{ id: "item_015", name: "Armor of the White Rose", rarity: "Very Rare", faction: "Ashbound", baseCost: 7000 }, { id: "item_015", name: "Armor of the White Rose", rarity: "Very Rare", faction: "Ashbound", baseCost: 7000, dndbeyondPage: "8806813-armor-of-the-white-rose" },
{ id: "item_016", name: "Armor, +1", rarity: "Rare", faction: "Deneith", baseCost: 3500 }, { id: "item_016", name: "Armor, +1", rarity: "Rare", faction: "Deneith", baseCost: 3500, dndbeyondPage: "5377-armor-1" },
{ id: "item_017", name: "Armor, +2", rarity: "Very Rare", faction: "Deneith", baseCost: 20000 }, { id: "item_017", name: "Armor, +2", rarity: "Very Rare", faction: "Deneith", baseCost: 20000, dndbeyondPage: "5378-armor-2" },
{ id: "item_018", name: "Arrow-Catching Shield", rarity: "Rare", faction: "Medani", baseCost: 4500 }, { id: "item_018", name: "Arrow-Catching Shield", rarity: "Rare", faction: "Medani", baseCost: 4500, dndbeyondPage: "4577-arrow-catching-shield" },
{ id: "item_019", name: "Bag of Beans", rarity: "Rare", faction: "Ashbound", baseCost: 4200 }, { id: "item_019", name: "Bag of Beans", rarity: "Rare", faction: "Ashbound", baseCost: 4200, dndbeyondPage: "9228355-bag-of-beans" },
{ id: "item_020", name: "Bag of Devouring", rarity: "Very Rare", faction: "Tarkanan", baseCost: 12000 }, { id: "item_020", name: "Bag of Devouring", rarity: "Very Rare", faction: "Tarkanan", baseCost: 12000, dndbeyondPage: "4580-bag-of-devouring" },
{ id: "item_021", name: "Bag of Holding", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 }, { id: "item_021", name: "Bag of Holding", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "9228356-bag-of-holding" },
{ id: "item_022", name: "Bag of Tricks", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 }, { id: "item_022", name: "Bag of Tricks", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9228357-bag-of-tricks" },
{ id: "item_023", name: "Bead of Force", rarity: "Rare", faction: "Kundarak", baseCost: 3000 }, { id: "item_023", name: "Bead of Force", rarity: "Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "9180132-bead-of-force" },
{ id: "item_024", name: "Belt of Dwarvenkind", rarity: "Rare", faction: "Kundarak", baseCost: 5000 }, { id: "item_024", name: "Belt of Dwarvenkind", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "4584-belt-of-dwarvenkind" },
{ id: "item_025", name: "Belt of Giant Strength (fire)", rarity: "Very Rare", faction: "Deneith", baseCost: 36000 }, { id: "item_025", name: "Belt of Giant Strength (fire)", rarity: "Very Rare", faction: "Deneith", baseCost: 36000, dndbeyondPage: "5372-belt-of-giant-strength" },
{ id: "item_026", name: "Belt of Giant Strength (frost or stone)", rarity: "Very Rare", faction: "Deneith", baseCost: 12000 }, { id: "item_026", name: "Belt of Giant Strength (frost or stone)", rarity: "Very Rare", faction: "Deneith", baseCost: 12000, dndbeyondPage: "5372-belt-of-giant-strength" },
{ id: "item_027", name: "Belt of Giant Strength (hill)", rarity: "Rare", faction: "Deneith", baseCost: 4000 }, { id: "item_027", name: "Belt of Giant Strength (hill)", rarity: "Rare", faction: "Deneith", baseCost: 4000, dndbeyondPage: "5372-belt-of-giant-strength" },
{ id: "item_028", name: "Berserker Axe", rarity: "Rare", faction: "Deneith", baseCost: 2000 }, { id: "item_028", name: "Berserker Axe", rarity: "Rare", faction: "Deneith", baseCost: 2000, dndbeyondPage: "5382-berserker-axe" },
{ id: "item_029", name: "Bloodshed Blade", rarity: "Very Rare", faction: "Tarkanan", baseCost: 8000 }, { id: "item_029", name: "Bloodshed Blade", rarity: "Very Rare", faction: "Tarkanan", baseCost: 8000, dndbeyondPage: "7102412-bloodshed-blade" },
{ id: "item_030", name: "Boots of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 400 }, { id: "item_030", name: "Boots of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 400, dndbeyondPage: "4587-boots-of-elvenkind" },
{ id: "item_031", name: "Boots of Levitation", rarity: "Rare", faction: "Tarkanan", baseCost: 4500 }, { id: "item_031", name: "Boots of Levitation", rarity: "Rare", faction: "Tarkanan", baseCost: 4500, dndbeyondPage: "4588-boots-of-levitation" },
{ id: "item_032", name: "Boots of Speed", rarity: "Rare", faction: "Tarkanan", baseCost: 3000 }, { id: "item_032", name: "Boots of Speed", rarity: "Rare", faction: "Tarkanan", baseCost: 3000, dndbeyondPage: "4589-boots-of-speed" },
{ id: "item_033", name: "Boots of Striding and Springing", rarity: "Uncommon", faction: "Tharashk", baseCost: 200 }, { id: "item_033", name: "Boots of Striding and Springing", rarity: "Uncommon", faction: "Tharashk", baseCost: 200, dndbeyondPage: "9228365-boots-of-striding-and-springing" },
{ id: "item_034", name: "Boots of the Winding Path", rarity: "Uncommon", faction: "Tharashk", baseCost: 400 }, { id: "item_034", name: "Boots of the Winding Path", rarity: "Uncommon", faction: "Tharashk", baseCost: 400, dndbeyondPage: "10886002-boots-of-the-winding-path" },
{ id: "item_035", name: "Boots of the Winterlands", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 }, { id: "item_035", name: "Boots of the Winterlands", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "4591-boots-of-the-winterlands" },
{ id: "item_036", name: "Bowl of Commanding Water Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 }, { id: "item_036", name: "Bowl of Commanding Water Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9228366-bowl-of-commanding-water-elementals" },
{ id: "item_037", name: "Bracers of Archery", rarity: "Uncommon", faction: "Deneith", baseCost: 350 }, { id: "item_037", name: "Bracers of Archery", rarity: "Uncommon", faction: "Deneith", baseCost: 350, dndbeyondPage: "4593-bracers-of-archery" },
{ id: "item_038", name: "Bracers of Defense", rarity: "Rare", faction: "Kundarak", baseCost: 4000 }, { id: "item_038", name: "Bracers of Defense", rarity: "Rare", faction: "Kundarak", baseCost: 4000, dndbeyondPage: "4594-bracers-of-defense" },
{ id: "item_039", name: "Brazier of Commanding Fire Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 }, { id: "item_039", name: "Brazier of Commanding Fire Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9228367-brazier-of-commanding-fire-elementals" },
{ id: "item_040", name: "Brooch of Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 375 }, { id: "item_040", name: "Brooch of Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 375, dndbeyondPage: "4596-brooch-of-shielding" },
{ id: "item_041", name: "Broom of Flying", rarity: "Uncommon", faction: "Ashbound", baseCost: 4500 }, { id: "item_041", name: "Broom of Flying", rarity: "Uncommon", faction: "Ashbound", baseCost: 4500, dndbeyondPage: "9228372-broom-of-flying" },
{ id: "item_042", name: "Candle of Invocation", rarity: "Very Rare", faction: "Morgrave", baseCost: 8400 }, { id: "item_042", name: "Candle of Invocation", rarity: "Very Rare", faction: "Morgrave", baseCost: 8400, dndbeyondPage: "9228374-candle-of-invocation" },
{ id: "item_043", name: "Cap of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 450 }, { id: "item_043", name: "Cap of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 450, dndbeyondPage: "9228375-cap-of-water-breathing" },
{ id: "item_044", name: "Cape of the Mountebank", rarity: "Rare", faction: "Thuranni", baseCost: 3900 }, { id: "item_044", name: "Cape of the Mountebank", rarity: "Rare", faction: "Thuranni", baseCost: 3900, dndbeyondPage: "9228376-cape-of-the-mountebank" },
{ id: "item_045", name: "Carpet of Flying", rarity: "Very Rare", faction: "Morgrave", baseCost: 44000 }, { id: "item_045", name: "Carpet of Flying", rarity: "Very Rare", faction: "Morgrave", baseCost: 44000, dndbeyondPage: "9228381-carpet-of-flying" },
{ id: "item_046", name: "Cauldron of Rebirth", rarity: "Very Rare", faction: "Ashbound", baseCost: 10000 }, { id: "item_046", name: "Cauldron of Rebirth", rarity: "Very Rare", faction: "Ashbound", baseCost: 10000, dndbeyondPage: "9228395-cauldron-of-rebirth" },
{ id: "item_047", name: "Censer of Controlling Air Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 }, { id: "item_047", name: "Censer of Controlling Air Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9228396-censer-of-controlling-air-elementals" },
{ id: "item_048", name: "Chime of Opening", rarity: "Rare", faction: "Tarkanan", baseCost: 3000 }, { id: "item_048", name: "Chime of Opening", rarity: "Rare", faction: "Tarkanan", baseCost: 3000, dndbeyondPage: "9228405-chime-of-opening" },
{ id: "item_049", name: "Circlet of Blasting", rarity: "Uncommon", faction: "Morgrave", baseCost: 350 }, { id: "item_049", name: "Circlet of Blasting", rarity: "Uncommon", faction: "Morgrave", baseCost: 350, dndbeyondPage: "4603-circlet-of-blasting" },
{ id: "item_050", name: "Cloak of Arachnida", rarity: "Very Rare", faction: "Tarkanan", baseCost: 14000 }, { id: "item_050", name: "Cloak of Arachnida", rarity: "Very Rare", faction: "Tarkanan", baseCost: 14000, dndbeyondPage: "4604-cloak-of-arachnida" },
{ id: "item_051", name: "Cloak of Displacement", rarity: "Rare", faction: "Tarkanan", baseCost: 3600 }, { id: "item_051", name: "Cloak of Displacement", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9228407-cloak-of-displacement" },
{ id: "item_052", name: "Cloak of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250 }, { id: "item_052", name: "Cloak of Elvenkind", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250, dndbeyondPage: "9228408-cloak-of-elvenkind" },
{ id: "item_053", name: "Cloak of Protection", rarity: "Uncommon", faction: "Kundarak", baseCost: 400 }, { id: "item_053", name: "Cloak of Protection", rarity: "Uncommon", faction: "Kundarak", baseCost: 400, dndbeyondPage: "4607-cloak-of-protection" },
{ id: "item_054", name: "Cloak of the Bat", rarity: "Rare", faction: "Thuranni", baseCost: 4600 }, { id: "item_054", name: "Cloak of the Bat", rarity: "Rare", faction: "Thuranni", baseCost: 4600, dndbeyondPage: "4608-cloak-of-the-bat" },
{ id: "item_055", name: "Cloak of the Manta Ray", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 }, { id: "item_055", name: "Cloak of the Manta Ray", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9228409-cloak-of-the-manta-ray" },
{ id: "item_056", name: "Coat of the Crest", rarity: "Rare", faction: "Medani", baseCost: 4000 }, { id: "item_056", name: "Coat of the Crest", rarity: "Rare", faction: "Medani", baseCost: 4000, dndbeyondPage: "7170921-coat-of-the-crest" },
{ id: "item_057", name: "Crown of the Wrath Bringer", rarity: "Rare", faction: "Thuranni", baseCost: 3750 }, { id: "item_057", name: "Crown of the Wrath Bringer", rarity: "Rare", faction: "Thuranni", baseCost: 3750, dndbeyondPage: "7102418-crown-of-the-wrath-bringer" },
{ id: "item_058", name: "Crystal Ball", rarity: "Very Rare", faction: "Medani", baseCost: 42000 }, { id: "item_058", name: "Crystal Ball", rarity: "Very Rare", faction: "Medani", baseCost: 42000, dndbeyondPage: "4610-crystal-ball" },
{ id: "item_059", name: "Cube of Force", rarity: "Rare", faction: "Kundarak", baseCost: 5000 }, { id: "item_059", name: "Cube of Force", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "9228411-cube-of-force" },
{ id: "item_060", name: "Daern's Instant Fortress", rarity: "Rare", faction: "Kundarak", baseCost: 5000 }, { id: "item_060", name: "Daern's Instant Fortress", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "9228414-daerns-instant-fortress" },
{ id: "item_061", name: "Dagger of Denial", rarity: "Rare", faction: "Kundarak", baseCost: 2750 }, { id: "item_061", name: "Dagger of Denial", rarity: "Rare", faction: "Kundarak", baseCost: 2750, dndbeyondPage: "7170927-dagger-of-denial" },
{ id: "item_062", name: "Dagger of Venom", rarity: "Rare", faction: "Thuranni", baseCost: 1500 }, { id: "item_062", name: "Dagger of Venom", rarity: "Rare", faction: "Thuranni", baseCost: 1500, dndbeyondPage: "9228415-dagger-of-venom" },
{ id: "item_063", name: "Dancing Sword", rarity: "Very Rare", faction: "Deneith", baseCost: 10000 }, { id: "item_063", name: "Dancing Sword", rarity: "Very Rare", faction: "Deneith", baseCost: 10000, dndbeyondPage: "5383-dancing-sword" },
{ id: "item_064", name: "Dazzling Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 3500 }, { id: "item_064", name: "Dazzling Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 3500, dndbeyondPage: "10886041-dazzling-weapon" },
{ id: "item_065", name: "Decanter of Endless Water", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 }, { id: "item_065", name: "Decanter of Endless Water", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "9228419-decanter-of-endless-water" },
{ id: "item_066", name: "Deck of Illusions", rarity: "Uncommon", faction: "Thuranni", baseCost: 450 }, { id: "item_066", name: "Deck of Illusions", rarity: "Uncommon", faction: "Thuranni", baseCost: 450, dndbeyondPage: "9228420-deck-of-illusions" },
{ id: "item_067", name: "Demon Armor", rarity: "Very Rare", faction: "Thuranni", baseCost: 7500 }, { id: "item_067", name: "Demon Armor", rarity: "Very Rare", faction: "Thuranni", baseCost: 7500, dndbeyondPage: "9228451-demon-armor" },
{ id: "item_068", name: "Demon Skin", rarity: "Rare", faction: "Tarkanan", baseCost: 1300 }, { id: "item_068", name: "Demon Skin", rarity: "Rare", faction: "Tarkanan", baseCost: 1300, dndbeyondPage: "8225886-demon-skin" },
{ id: "item_069", name: "Dimensional Shackles", rarity: "Rare", faction: "Kundarak", baseCost: 2800 }, { id: "item_069", name: "Dimensional Shackles", rarity: "Rare", faction: "Kundarak", baseCost: 2800, dndbeyondPage: "9228465-dimensional-shackles" },
{ id: "item_070", name: "Dispelling Stone", rarity: "Very Rare", faction: "Tarkanan", baseCost: 7000 }, { id: "item_070", name: "Dispelling Stone", rarity: "Very Rare", faction: "Tarkanan", baseCost: 7000, dndbeyondPage: "1434307-dispelling-stone" },
{ id: "item_071", name: "Dragon Scale Mail", rarity: "Very Rare", faction: "Deneith", baseCost: 15000 }, { id: "item_071", name: "Dragon Scale Mail", rarity: "Very Rare", faction: "Deneith", baseCost: 15000, dndbeyondPage: "9228477-dragon-scale-mail" },
{ id: "item_072", name: "Dragon Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4800 }, { id: "item_072", name: "Dragon Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4800, dndbeyondPage: "9228520-dragon-slayer" },
{ id: "item_073", name: "Driftglobe", rarity: "Uncommon", faction: "Tharashk", baseCost: 100 }, { id: "item_073", name: "Driftglobe", rarity: "Uncommon", faction: "Tharashk", baseCost: 100, dndbeyondPage: "9228521-driftglobe" },
{ id: "item_074", name: "Dust of Disappearance", rarity: "Uncommon", faction: "Tarkanan", baseCost: 200 }, { id: "item_074", name: "Dust of Disappearance", rarity: "Uncommon", faction: "Tarkanan", baseCost: 200, dndbeyondPage: "9228522-dust-of-disappearance" },
{ id: "item_075", name: "Dust of Dryness", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 }, { id: "item_075", name: "Dust of Dryness", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9228523-dust-of-dryness" },
{ id: "item_076", name: "Dust of Sneezing and Choking", rarity: "Uncommon", faction: "Thuranni", baseCost: 150 }, { id: "item_076", name: "Dust of Sneezing and Choking", rarity: "Uncommon", faction: "Thuranni", baseCost: 150, dndbeyondPage: "9228524-dust-of-sneezing-and-choking" },
{ id: "item_077", name: "Dwarven Plate", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000 }, { id: "item_077", name: "Dwarven Plate", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000, dndbeyondPage: "9228527-dwarven-plate" },
{ id: "item_078", name: "Dwarven Thrower", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000 }, { id: "item_078", name: "Dwarven Thrower", rarity: "Very Rare", faction: "Kundarak", baseCost: 25000, dndbeyondPage: "4627-dwarven-thrower" },
{ id: "item_079", name: "Dyrrn's Tentacle Whip", rarity: "Very Rare", faction: "Kundarak", baseCost: 17000 }, { id: "item_079", name: "Dyrrn's Tentacle Whip", rarity: "Very Rare", faction: "Kundarak", baseCost: 17000, dndbeyondPage: "1000370-dyrrns-tentacle-whip" },
{ id: "item_080", name: "Earworm", rarity: "Uncommon", faction: "Kundarak", baseCost: 225 }, { id: "item_080", name: "Earworm", rarity: "Uncommon", faction: "Kundarak", baseCost: 225, dndbeyondPage: "1000466-earworm" },
{ id: "item_081", name: "Efreeti Bottle", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000 }, { id: "item_081", name: "Efreeti Bottle", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000, dndbeyondPage: "9228528-efreeti-bottle" },
{ id: "item_082", name: "Elemental Gem", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 }, { id: "item_082", name: "Elemental Gem", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "9228536-elemental-gem" },
{ id: "item_083", name: "Elixir of Health", rarity: "Rare", faction: "Morgrave", baseCost: 2000 }, { id: "item_083", name: "Elixir of Health", rarity: "Rare", faction: "Morgrave", baseCost: 2000, dndbeyondPage: "5351-elixir-of-health" },
{ id: "item_084", name: "Elven Chain", rarity: "Rare", faction: "Kundarak", baseCost: 4500 }, { id: "item_084", name: "Elven Chain", rarity: "Rare", faction: "Kundarak", baseCost: 4500, dndbeyondPage: "9228539-elven-chain" },
{ id: "item_085", name: "Eversmoking Bottle", rarity: "Uncommon", faction: "Thuranni", baseCost: 270 }, { id: "item_085", name: "Eversmoking Bottle", rarity: "Uncommon", faction: "Thuranni", baseCost: 270, dndbeyondPage: "9228602-eversmoking-bottle" },
{ id: "item_086", name: "Eyes of Charming", rarity: "Uncommon", faction: "Medani", baseCost: 300 }, { id: "item_086", name: "Eyes of Charming", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "9228610-eyes-of-charming" },
{ id: "item_087", name: "Eyes of Minute Seeing", rarity: "Uncommon", faction: "Medani", baseCost: 150 }, { id: "item_087", name: "Eyes of Minute Seeing", rarity: "Uncommon", faction: "Medani", baseCost: 150, dndbeyondPage: "9228611-eyes-of-minute-seeing" },
{ id: "item_088", name: "Eyes of the Eagle", rarity: "Uncommon", faction: "Medani", baseCost: 400 }, { id: "item_088", name: "Eyes of the Eagle", rarity: "Uncommon", faction: "Medani", baseCost: 400, dndbeyondPage: "9276755-eyes-of-the-eagle" },
{ id: "item_089", name: "Fate Cutter Shears", rarity: "Very Rare", faction: "Thuranni", baseCost: 9000 }, { id: "item_089", name: "Fate Cutter Shears", rarity: "Very Rare", faction: "Thuranni", baseCost: 9000, dndbeyondPage: "7526657-fate-cutter-shears" },
{ id: "item_090", name: "Figurine of Wondrous Power (bronze griffon)", rarity: "Rare", faction: "Ashbound", baseCost: 3600 }, { id: "item_090", name: "Figurine of Wondrous Power (bronze griffon)", rarity: "Rare", faction: "Ashbound", baseCost: 3600, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_091", name: "Figurine of Wondrous Power (ebony fly)", rarity: "Rare", faction: "Ashbound", baseCost: 3600 }, { id: "item_091", name: "Figurine of Wondrous Power (ebony fly)", rarity: "Rare", faction: "Ashbound", baseCost: 3600, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_092", name: "Figurine of Wondrous Power (golden lions)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 }, { id: "item_092", name: "Figurine of Wondrous Power (golden lions)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_093", name: "Figurine of Wondrous Power (ivory goats)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 }, { id: "item_093", name: "Figurine of Wondrous Power (ivory goats)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_094", name: "Figurine of Wondrous Power (marble elephant)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 }, { id: "item_094", name: "Figurine of Wondrous Power (marble elephant)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_095", name: "Figurine of Wondrous Power (obsidian steed)", rarity: "Very Rare", faction: "Thuranni", baseCost: 28500 }, { id: "item_095", name: "Figurine of Wondrous Power (obsidian steed)", rarity: "Very Rare", faction: "Thuranni", baseCost: 28500, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_096", name: "Figurine of Wondrous Power (onyx dog)", rarity: "Rare", faction: "Ashbound", baseCost: 3200 }, { id: "item_096", name: "Figurine of Wondrous Power (onyx dog)", rarity: "Rare", faction: "Ashbound", baseCost: 3200, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_097", name: "Figurine of Wondrous Power (serpentine owl)", rarity: "Rare", faction: "Ashbound", baseCost: 3000 }, { id: "item_097", name: "Figurine of Wondrous Power (serpentine owl)", rarity: "Rare", faction: "Ashbound", baseCost: 3000, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_098", name: "Figurine of Wondrous Power (silver raven)", rarity: "Uncommon", faction: "Medani", baseCost: 380 }, { id: "item_098", name: "Figurine of Wondrous Power (silver raven)", rarity: "Uncommon", faction: "Medani", baseCost: 380, dndbeyondPage: "9228621-figurine-of-wondrous-power" },
{ id: "item_099", name: "Finder's Goggles", rarity: "Uncommon", faction: "Tharashk", baseCost: 500 }, { id: "item_099", name: "Finder's Goggles", rarity: "Uncommon", faction: "Tharashk", baseCost: 500, dndbeyondPage: "977633-finders-goggles" },
{ id: "item_100", name: "Flame Tongue", rarity: "Rare", faction: "Deneith", baseCost: 5000 }, { id: "item_100", name: "Flame Tongue", rarity: "Rare", faction: "Deneith", baseCost: 5000, dndbeyondPage: "9228647-flame-tongue" },
{ id: "item_101", name: "Folding Boat", rarity: "Rare", faction: "Tharashk", baseCost: 4750 }, { id: "item_101", name: "Folding Boat", rarity: "Rare", faction: "Tharashk", baseCost: 4750, dndbeyondPage: "9228649-folding-boat" },
{ id: "item_102", name: "Frost Brand", rarity: "Very Rare", faction: "Deneith", baseCost: 11000 }, { id: "item_102", name: "Frost Brand", rarity: "Very Rare", faction: "Deneith", baseCost: 11000, dndbeyondPage: "9228651-frost-brand" },
{ id: "item_103", name: "Gauntlets of Ogre Power", rarity: "Uncommon", faction: "Deneith", baseCost: 450 }, { id: "item_103", name: "Gauntlets of Ogre Power", rarity: "Uncommon", faction: "Deneith", baseCost: 450, dndbeyondPage: "4641-gauntlets-of-ogre-power" },
{ id: "item_104", name: "Gavel of the Venn Rune", rarity: "Rare", faction: "Medani", baseCost: 2800 }, { id: "item_104", name: "Gavel of the Venn Rune", rarity: "Rare", faction: "Medani", baseCost: 2800, dndbeyondPage: "5514-gavel-of-the-venn-rune" },
{ id: "item_105", name: "Gem of Brightness", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 }, { id: "item_105", name: "Gem of Brightness", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "9228652-gem-of-brightness" },
{ id: "item_106", name: "Gem of Seeing", rarity: "Rare", faction: "Medani", baseCost: 5000 }, { id: "item_106", name: "Gem of Seeing", rarity: "Rare", faction: "Medani", baseCost: 5000, dndbeyondPage: "9228653-gem-of-seeing" },
{ id: "item_107", name: "Giant Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4600 }, { id: "item_107", name: "Giant Slayer", rarity: "Rare", faction: "Deneith", baseCost: 4600, dndbeyondPage: "5388-giant-slayer" },
{ id: "item_108", name: "Glamerweave", rarity: "Uncommon", faction: "Thuranni", baseCost: 150 }, { id: "item_108", name: "Glamerweave", rarity: "Uncommon", faction: "Thuranni", baseCost: 150, dndbeyondPage: "215556-glamerweave" },
{ id: "item_109", name: "Glamoured Studded Leather", rarity: "Rare", faction: "Tarkanan", baseCost: 4800 }, { id: "item_109", name: "Glamoured Studded Leather", rarity: "Rare", faction: "Tarkanan", baseCost: 4800, dndbeyondPage: "4645-glamoured-studded-leather" },
{ id: "item_110", name: "Gloves of Missile Snaring", rarity: "Uncommon", faction: "Tarkanan", baseCost: 325 }, { id: "item_110", name: "Gloves of Missile Snaring", rarity: "Uncommon", faction: "Tarkanan", baseCost: 325, dndbeyondPage: "9228697-gloves-of-missile-snaring" },
{ id: "item_111", name: "Gloves of Swimming and Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 }, { id: "item_111", name: "Gloves of Swimming and Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "4647-gloves-of-swimming-and-climbing" },
{ id: "item_112", name: "Gloves of Thievery", rarity: "Uncommon", faction: "Tarkanan", baseCost: 300 }, { id: "item_112", name: "Gloves of Thievery", rarity: "Uncommon", faction: "Tarkanan", baseCost: 300, dndbeyondPage: "5352-gloves-of-thievery" },
{ id: "item_113", name: "Goggles of Night", rarity: "Uncommon", faction: "Medani", baseCost: 300 }, { id: "item_113", name: "Goggles of Night", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "4648-goggles-of-night" },
{ id: "item_114", name: "Grasping Whip", rarity: "Rare", faction: "Morgrave", baseCost: 750 }, { id: "item_114", name: "Grasping Whip", rarity: "Rare", faction: "Morgrave", baseCost: 750, dndbeyondPage: "7526717-grasping-whip" },
{ id: "item_115", name: "Gulthias Staff", rarity: "Rare", faction: "Ashbound", baseCost: 2200 }, { id: "item_115", name: "Gulthias Staff", rarity: "Rare", faction: "Ashbound", baseCost: 2200, dndbeyondPage: "5528-gulthias-staff" },
{ id: "item_116", name: "Hat of Disguise", rarity: "Uncommon", faction: "Tarkanan", baseCost: 475 }, { id: "item_116", name: "Hat of Disguise", rarity: "Uncommon", faction: "Tarkanan", baseCost: 475, dndbeyondPage: "4651-hat-of-disguise" },
{ id: "item_117", name: "Headband of Intellect", rarity: "Uncommon", faction: "Morgrave", baseCost: 450 }, { id: "item_117", name: "Headband of Intellect", rarity: "Uncommon", faction: "Morgrave", baseCost: 450, dndbeyondPage: "4652-headband-of-intellect" },
{ id: "item_118", name: "Helm of Awareness", rarity: "Uncommon", faction: "Medani", baseCost: 500 }, { id: "item_118", name: "Helm of Awareness", rarity: "Uncommon", faction: "Medani", baseCost: 500, dndbeyondPage: "10886043-helm-of-awareness" },
{ id: "item_119", name: "Helm of Brilliance", rarity: "Very Rare", faction: "Tharashk", baseCost: 32000 }, { id: "item_119", name: "Helm of Brilliance", rarity: "Very Rare", faction: "Tharashk", baseCost: 32000, dndbeyondPage: "9228720-helm-of-brilliance" },
{ id: "item_120", name: "Helm of Comprehending Languages", rarity: "Uncommon", faction: "Medani", baseCost: 200 }, { id: "item_120", name: "Helm of Comprehending Languages", rarity: "Uncommon", faction: "Medani", baseCost: 200, dndbeyondPage: "4654-helm-of-comprehending-languages" },
{ id: "item_121", name: "Helm of Telepathy", rarity: "Uncommon", faction: "Medani", baseCost: 300 }, { id: "item_121", name: "Helm of Telepathy", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "9228721-helm-of-telepathy" },
{ id: "item_122", name: "Helm of Teleportation", rarity: "Rare", faction: "Morgrave", baseCost: 4250 }, { id: "item_122", name: "Helm of Teleportation", rarity: "Rare", faction: "Morgrave", baseCost: 4250, dndbeyondPage: "4656-helm-of-teleportation" },
{ id: "item_123", name: "Heward's Handy Haversack", rarity: "Rare", faction: "Morgrave", baseCost: 2000 }, { id: "item_123", name: "Heward's Handy Haversack", rarity: "Rare", faction: "Morgrave", baseCost: 2000, dndbeyondPage: "9228722-hewards-handy-haversack" },
{ id: "item_124", name: "Horn of Blasting", rarity: "Rare", faction: "Ashbound", baseCost: 2500 }, { id: "item_124", name: "Horn of Blasting", rarity: "Rare", faction: "Ashbound", baseCost: 2500, dndbeyondPage: "9228775-horn-of-blasting" },
{ id: "item_125", name: "Horn of Valhalla (brass or silver)", rarity: "Rare", faction: "Ashbound", baseCost: 5000 }, { id: "item_125", name: "Horn of Valhalla (brass or silver)", rarity: "Rare", faction: "Ashbound", baseCost: 5000, dndbeyondPage: "9228781-horn-of-valhalla" },
{ id: "item_126", name: "Horn of Valhalla (bronze)", rarity: "Very Rare", faction: "Ashbound", baseCost: 20000 }, { id: "item_126", name: "Horn of Valhalla (bronze)", rarity: "Very Rare", faction: "Ashbound", baseCost: 20000, dndbeyondPage: "9228781-horn-of-valhalla" },
{ id: "item_127", name: "Horseshoes of a Zephyr", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000 }, { id: "item_127", name: "Horseshoes of a Zephyr", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000, dndbeyondPage: "9228782-horseshoes-of-a-zephyr" },
{ id: "item_128", name: "Horseshoes of Speed", rarity: "Rare", faction: "Tharashk", baseCost: 3000 }, { id: "item_128", name: "Horseshoes of Speed", rarity: "Rare", faction: "Tharashk", baseCost: 3000, dndbeyondPage: "9228783-horseshoes-of-speed" },
{ id: "item_129", name: "Immovable Rod", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 }, { id: "item_129", name: "Immovable Rod", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "9228785-immovable-rod" },
{ id: "item_130", name: "Instrument of the Bards (Anstruth harp)", rarity: "Very Rare", faction: "Morgrave", baseCost: 17500 }, { id: "item_130", name: "Instrument of the Bards (Anstruth harp)", rarity: "Very Rare", faction: "Morgrave", baseCost: 17500, dndbeyondPage: "9228788-instrument-of-the-bards" },
{ id: "item_131", name: "Instrument of the Bards (Canaith mandolin)", rarity: "Rare", faction: "Morgrave", baseCost: 3750 }, { id: "item_131", name: "Instrument of the Bards (Canaith mandolin)", rarity: "Rare", faction: "Morgrave", baseCost: 3750, dndbeyondPage: "9228788-instrument-of-the-bards" },
{ id: "item_132", name: "Instrument of the Bards (Cli lyre)", rarity: "Rare", faction: "Morgrave", baseCost: 4250 }, { id: "item_132", name: "Instrument of the Bards (Cli lyre)", rarity: "Rare", faction: "Morgrave", baseCost: 4250, dndbeyondPage: "9228788-instrument-of-the-bards" },
{ id: "item_133", name: "Instrument of the Bards (Doss lute)", rarity: "Uncommon", faction: "Morgrave", baseCost: 250 }, { id: "item_133", name: "Instrument of the Bards (Doss lute)", rarity: "Uncommon", faction: "Morgrave", baseCost: 250, dndbeyondPage: "9228788-instrument-of-the-bards" },
{ id: "item_134", name: "Instrument of the Bards (Fochlucan bandore)", rarity: "Uncommon", faction: "Morgrave", baseCost: 350 }, { id: "item_134", name: "Instrument of the Bards (Fochlucan bandore)", rarity: "Uncommon", faction: "Morgrave", baseCost: 350, dndbeyondPage: "9228788-instrument-of-the-bards" },
{ id: "item_135", name: "Instrument of the Bards (Mac-Fuirmidh cittern)", rarity: "Uncommon", faction: "Morgrave", baseCost: 450 }, { id: "item_135", name: "Instrument of the Bards (Mac-Fuirmidh cittern)", rarity: "Uncommon", faction: "Morgrave", baseCost: 450, dndbeyondPage: "9228788-instrument-of-the-bards" },
{ id: "item_136", name: "Ioun Stone (absorption)", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000 }, { id: "item_136", name: "Ioun Stone (absorption)", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_137", name: "Ioun Stone (agility)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000 }, { id: "item_137", name: "Ioun Stone (agility)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_138", name: "Ioun Stone (awareness)", rarity: "Rare", faction: "Medani", baseCost: 4000 }, { id: "item_138", name: "Ioun Stone (awareness)", rarity: "Rare", faction: "Medani", baseCost: 4000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_139", name: "Ioun Stone (fortitude)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000 }, { id: "item_139", name: "Ioun Stone (fortitude)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_140", name: "Ioun Stone (insight)", rarity: "Very Rare", faction: "Medani", baseCost: 8000 }, { id: "item_140", name: "Ioun Stone (insight)", rarity: "Very Rare", faction: "Medani", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_141", name: "Ioun Stone (intellect)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000 }, { id: "item_141", name: "Ioun Stone (intellect)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_142", name: "Ioun Stone (leadership)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000 }, { id: "item_142", name: "Ioun Stone (leadership)", rarity: "Very Rare", faction: "Morgrave", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_143", name: "Ioun Stone (protection)", rarity: "Rare", faction: "Kundarak", baseCost: 3600 }, { id: "item_143", name: "Ioun Stone (protection)", rarity: "Rare", faction: "Kundarak", baseCost: 3600, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_144", name: "Ioun Stone (reserve)", rarity: "Rare", faction: "Morgrave", baseCost: 4500 }, { id: "item_144", name: "Ioun Stone (reserve)", rarity: "Rare", faction: "Morgrave", baseCost: 4500, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_145", name: "Ioun Stone (strength)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000 }, { id: "item_145", name: "Ioun Stone (strength)", rarity: "Very Rare", faction: "Tharashk", baseCost: 8000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_146", name: "Ioun Stone (sustenance)", rarity: "Rare", faction: "Morgrave", baseCost: 3000 }, { id: "item_146", name: "Ioun Stone (sustenance)", rarity: "Rare", faction: "Morgrave", baseCost: 3000, dndbeyondPage: "9228804-ioun-stone" },
{ id: "item_147", name: "Iron Bands of Bilarro", rarity: "Rare", faction: "Tharashk", baseCost: 2600 }, { id: "item_147", name: "Iron Bands of Bilarro", rarity: "Rare", faction: "Tharashk", baseCost: 2600, dndbeyondPage: "9228805-iron-bands-of-bilarro" },
{ id: "item_148", name: "Javelin of Lightning", rarity: "Uncommon", faction: "Deneith", baseCost: 350 }, { id: "item_148", name: "Javelin of Lightning", rarity: "Uncommon", faction: "Deneith", baseCost: 350, dndbeyondPage: "9228807-javelin-of-lightning" },
{ id: "item_149", name: "Keoghtom's Ointment", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 }, { id: "item_149", name: "Keoghtom's Ointment", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228809-keoghtoms-ointment" },
{ id: "item_150", name: "Kyrzin's Ooze", rarity: "Very Rare", faction: "Kundarak", baseCost: 21000 }, { id: "item_150", name: "Kyrzin's Ooze", rarity: "Very Rare", faction: "Kundarak", baseCost: 21000, dndbeyondPage: "977672-kyrzins-ooze" },
{ id: "item_151", name: "Lantern of Revealing", rarity: "Uncommon", faction: "Medani", baseCost: 500 }, { id: "item_151", name: "Lantern of Revealing", rarity: "Uncommon", faction: "Medani", baseCost: 500, dndbeyondPage: "9228811-lantern-of-revealing" },
{ id: "item_152", name: "Living Armor", rarity: "Very Rare", faction: "Kundarak", baseCost: 9500 }, { id: "item_152", name: "Living Armor", rarity: "Very Rare", faction: "Kundarak", baseCost: 9500, dndbeyondPage: "982693-living-armor" },
{ id: "item_153", name: "Living Gloves", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 }, { id: "item_153", name: "Living Gloves", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "1085653-living-gloves" },
{ id: "item_154", name: "Mace of Disruption", rarity: "Rare", faction: "Deneith", baseCost: 1750 }, { id: "item_154", name: "Mace of Disruption", rarity: "Rare", faction: "Deneith", baseCost: 1750, dndbeyondPage: "4670-mace-of-disruption" },
{ id: "item_155", name: "Mace of Smiting", rarity: "Rare", faction: "Deneith", baseCost: 2000 }, { id: "item_155", name: "Mace of Smiting", rarity: "Rare", faction: "Deneith", baseCost: 2000, dndbeyondPage: "4671-mace-of-smiting" },
{ id: "item_156", name: "Mace of Terror", rarity: "Rare", faction: "Deneith", baseCost: 3500 }, { id: "item_156", name: "Mace of Terror", rarity: "Rare", faction: "Deneith", baseCost: 3500, dndbeyondPage: "9228835-mace-of-terror" },
{ id: "item_157", name: "Magician's Judge", rarity: "Rare", faction: "Deneith", baseCost: 1125 }, { id: "item_157", name: "Magician's Judge", rarity: "Rare", faction: "Deneith", baseCost: 1125, dndbeyondPage: "7170951-magicians-judge" },
{ id: "item_158", name: "Mantle of Spell Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 4200 }, { id: "item_158", name: "Mantle of Spell Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 4200, dndbeyondPage: "4673-mantle-of-spell-resistance" },
{ id: "item_159", name: "Manual of Bodily Health", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 }, { id: "item_159", name: "Manual of Bodily Health", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4674-manual-of-bodily-health" },
{ id: "item_160", name: "Manual of Gainful Exercise", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 }, { id: "item_160", name: "Manual of Gainful Exercise", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4675-manual-of-gainful-exercise" },
{ id: "item_161", name: "Manual of Golems (clay, flesh, iron, or stone)", rarity: "Very Rare", faction: "Morgrave", baseCost: 22000 }, { id: "item_161", name: "Manual of Golems (clay, flesh, iron, or stone)", rarity: "Very Rare", faction: "Morgrave", baseCost: 22000, dndbeyondPage: "5416-manual-of-golems" },
{ id: "item_162", name: "Manual of Quickness of Action", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 }, { id: "item_162", name: "Manual of Quickness of Action", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4677-manual-of-quickness-of-action" },
{ id: "item_163", name: "Mariner's Armor", rarity: "Uncommon", faction: "Tharashk", baseCost: 400 }, { id: "item_163", name: "Mariner's Armor", rarity: "Uncommon", faction: "Tharashk", baseCost: 400, dndbeyondPage: "9228837-mariners-armor" },
{ id: "item_164", name: "Medallion of Thoughts", rarity: "Uncommon", faction: "Medani", baseCost: 300 }, { id: "item_164", name: "Medallion of Thoughts", rarity: "Uncommon", faction: "Medani", baseCost: 300, dndbeyondPage: "9781866-medallion-of-thoughts" },
{ id: "item_165", name: "Mind Sharpener", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 }, { id: "item_165", name: "Mind Sharpener", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "10886045-mind-sharpener" },
{ id: "item_166", name: "Mindguard Crown", rarity: "Very Rare", faction: "Deneith", baseCost: 11000 }, { id: "item_166", name: "Mindguard Crown", rarity: "Very Rare", faction: "Deneith", baseCost: 11000, dndbeyondPage: "7247083-mindguard-crown" },
{ id: "item_167", name: "Mirror of Life Trapping", rarity: "Very Rare", faction: "Tharashk", baseCost: 50000 }, { id: "item_167", name: "Mirror of Life Trapping", rarity: "Very Rare", faction: "Tharashk", baseCost: 50000, dndbeyondPage: "9228851-mirror-of-life-trapping" },
{ id: "item_168", name: "Mithral Armor", rarity: "Uncommon", faction: "Kundarak", baseCost: 450 }, { id: "item_168", name: "Mithral Armor", rarity: "Uncommon", faction: "Kundarak", baseCost: 450, dndbeyondPage: "5381-mithral-armor" },
{ id: "item_169", name: "Nature's Mantle", rarity: "Uncommon", faction: "Ashbound", baseCost: 325 }, { id: "item_169", name: "Nature's Mantle", rarity: "Uncommon", faction: "Ashbound", baseCost: 325, dndbeyondPage: "2405507-natures-mantle" },
{ id: "item_170", name: "Necklace of Adaptation", rarity: "Uncommon", faction: "Ashbound", baseCost: 450 }, { id: "item_170", name: "Necklace of Adaptation", rarity: "Uncommon", faction: "Ashbound", baseCost: 450, dndbeyondPage: "4682-necklace-of-adaptation" },
{ id: "item_171", name: "Necklace of Fireballs", rarity: "Rare", faction: "Deneith", baseCost: 4350 }, { id: "item_171", name: "Necklace of Fireballs", rarity: "Rare", faction: "Deneith", baseCost: 4350, dndbeyondPage: "9228861-necklace-of-fireballs" },
{ id: "item_172", name: "Necklace of Prayer Beads", rarity: "Rare", faction: "Morgrave", baseCost: 5000 }, { id: "item_172", name: "Necklace of Prayer Beads", rarity: "Rare", faction: "Morgrave", baseCost: 5000, dndbeyondPage: "9228862-necklace-of-prayer-beads" },
{ id: "item_173", name: "Nimbus Coronet", rarity: "Very Rare", faction: "Tharashk", baseCost: 10500 }, { id: "item_173", name: "Nimbus Coronet", rarity: "Very Rare", faction: "Tharashk", baseCost: 10500, dndbeyondPage: "7102429-nimbus-coronet" },
{ id: "item_174", name: "Nine Lives Stealer", rarity: "Very Rare", faction: "Thuranni", baseCost: 36000 }, { id: "item_174", name: "Nine Lives Stealer", rarity: "Very Rare", faction: "Thuranni", baseCost: 36000, dndbeyondPage: "5394-nine-lives-stealer" },
{ id: "item_175", name: "Nolzur's Marvelous Pigments", rarity: "Very Rare", faction: "Morgrave", baseCost: 16000 }, { id: "item_175", name: "Nolzur's Marvelous Pigments", rarity: "Very Rare", faction: "Morgrave", baseCost: 16000, dndbeyondPage: "9228905-nolzurs-marvelous-pigments" },
{ id: "item_176", name: "Oathbow", rarity: "Very Rare", faction: "Deneith", baseCost: 13000 }, { id: "item_176", name: "Oathbow", rarity: "Very Rare", faction: "Deneith", baseCost: 13000, dndbeyondPage: "9228907-oathbow" },
{ id: "item_177", name: "Oil of Etherealness", rarity: "Rare", faction: "Thuranni", baseCost: 2000 }, { id: "item_177", name: "Oil of Etherealness", rarity: "Rare", faction: "Thuranni", baseCost: 2000, dndbeyondPage: "4687-oil-of-etherealness" },
{ id: "item_178", name: "Oil of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 2200 }, { id: "item_178", name: "Oil of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 2200, dndbeyondPage: "9228908-oil-of-sharpness" },
{ id: "item_179", name: "Oil of Slipperiness", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250 }, { id: "item_179", name: "Oil of Slipperiness", rarity: "Uncommon", faction: "Tarkanan", baseCost: 250, dndbeyondPage: "9228909-oil-of-slipperiness" },
{ id: "item_180", name: "Pariah's Shield", rarity: "Rare", faction: "Deneith", baseCost: 1500 }, { id: "item_180", name: "Pariah's Shield", rarity: "Rare", faction: "Deneith", baseCost: 1500, dndbeyondPage: "316763-pariahs-shield" },
{ id: "item_181", name: "Pearl of Power", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 }, { id: "item_181", name: "Pearl of Power", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228918-pearl-of-power" },
{ id: "item_182", name: "Periapt of Health", rarity: "Uncommon", faction: "Morgrave", baseCost: 250 }, { id: "item_182", name: "Periapt of Health", rarity: "Uncommon", faction: "Morgrave", baseCost: 250, dndbeyondPage: "9228920-periapt-of-health" },
{ id: "item_183", name: "Periapt of Proof against Poison", rarity: "Rare", faction: "Kundarak", baseCost: 4700 }, { id: "item_183", name: "Periapt of Proof against Poison", rarity: "Rare", faction: "Kundarak", baseCost: 4700, dndbeyondPage: "9276658-periapt-of-proof-against-poison" },
{ id: "item_184", name: "Periapt of Wound Closure", rarity: "Uncommon", faction: "Morgrave", baseCost: 375 }, { id: "item_184", name: "Periapt of Wound Closure", rarity: "Uncommon", faction: "Morgrave", baseCost: 375, dndbeyondPage: "9228921-periapt-of-wound-closure" },
{ id: "item_185", name: "Philter of Love", rarity: "Uncommon", faction: "Tarkanan", baseCost: 150 }, { id: "item_185", name: "Philter of Love", rarity: "Uncommon", faction: "Tarkanan", baseCost: 150, dndbeyondPage: "9228922-philter-of-love" },
{ id: "item_186", name: "Pipes of Haunting", rarity: "Uncommon", faction: "Thuranni", baseCost: 300 }, { id: "item_186", name: "Pipes of Haunting", rarity: "Uncommon", faction: "Thuranni", baseCost: 300, dndbeyondPage: "9228925-pipes-of-haunting" },
{ id: "item_187", name: "Pipes of the Sewers", rarity: "Uncommon", faction: "Ashbound", baseCost: 150 }, { id: "item_187", name: "Pipes of the Sewers", rarity: "Uncommon", faction: "Ashbound", baseCost: 150, dndbeyondPage: "9228926-pipes-of-the-sewers" },
{ id: "item_188", name: "Portable Hole", rarity: "Rare", faction: "Kundarak", baseCost: 5000 }, { id: "item_188", name: "Portable Hole", rarity: "Rare", faction: "Kundarak", baseCost: 5000, dndbeyondPage: "9228932-portable-hole" },
{ id: "item_189", name: "Potion of Animal Friendship", rarity: "Uncommon", faction: "Ashbound", baseCost: 200 }, { id: "item_189", name: "Potion of Animal Friendship", rarity: "Uncommon", faction: "Ashbound", baseCost: 200, dndbeyondPage: "9228933-potion-of-animal-friendship" },
{ id: "item_190", name: "Potion of Clairvoyance", rarity: "Rare", faction: "Medani", baseCost: 900 }, { id: "item_190", name: "Potion of Clairvoyance", rarity: "Rare", faction: "Medani", baseCost: 900, dndbeyondPage: "4701-potion-of-clairvoyance" },
{ id: "item_191", name: "Potion of Diminution", rarity: "Rare", faction: "Tarkanan", baseCost: 500 }, { id: "item_191", name: "Potion of Diminution", rarity: "Rare", faction: "Tarkanan", baseCost: 500, dndbeyondPage: "4703-potion-of-diminution" },
{ id: "item_192", name: "Potion of Fire Breath", rarity: "Uncommon", faction: "Deneith", baseCost: 350 }, { id: "item_192", name: "Potion of Fire Breath", rarity: "Uncommon", faction: "Deneith", baseCost: 350, dndbeyondPage: "5357-potion-of-fire-breath" },
{ id: "item_193", name: "Potion of Flying", rarity: "Very Rare", faction: "Tharashk", baseCost: 2500 }, { id: "item_193", name: "Potion of Flying", rarity: "Very Rare", faction: "Tharashk", baseCost: 2500, dndbeyondPage: "4704-potion-of-flying" },
{ id: "item_194", name: "Potion of Gaseous Form", rarity: "Rare", faction: "Thuranni", baseCost: 1500 }, { id: "item_194", name: "Potion of Gaseous Form", rarity: "Rare", faction: "Thuranni", baseCost: 1500, dndbeyondPage: "4705-potion-of-gaseous-form" },
{ id: "item_195", name: "Potion of Giant Strength (cloud)", rarity: "Very Rare", faction: "Deneith", baseCost: 1800 }, { id: "item_195", name: "Potion of Giant Strength (cloud)", rarity: "Very Rare", faction: "Deneith", baseCost: 1800, dndbeyondPage: "5417-potion-of-giant-strength" },
{ id: "item_196", name: "Potion of Giant Strength (fire)", rarity: "Rare", faction: "Deneith", baseCost: 1200 }, { id: "item_196", name: "Potion of Giant Strength (fire)", rarity: "Rare", faction: "Deneith", baseCost: 1200, dndbeyondPage: "5417-potion-of-giant-strength" },
{ id: "item_197", name: "Potion of Giant Strength (frost or stone)", rarity: "Rare", faction: "Deneith", baseCost: 650 }, { id: "item_197", name: "Potion of Giant Strength (frost or stone)", rarity: "Rare", faction: "Deneith", baseCost: 650, dndbeyondPage: "5417-potion-of-giant-strength" },
{ id: "item_198", name: "Potion of Giant Strength (hill)", rarity: "Uncommon", faction: "Deneith", baseCost: 125 }, { id: "item_198", name: "Potion of Giant Strength (hill)", rarity: "Uncommon", faction: "Deneith", baseCost: 125, dndbeyondPage: "5417-potion-of-giant-strength" },
{ id: "item_199", name: "Potion of Greater Invisibility", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000 }, { id: "item_199", name: "Potion of Greater Invisibility", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000, dndbeyondPage: "9228934-potion-of-greater-invisibility" },
{ id: "item_200", name: "Potion of Growth", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 }, { id: "item_200", name: "Potion of Growth", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "9805016-potion-of-growth" },
{ id: "item_201", name: "Potion of Healing (greater)", rarity: "Uncommon", faction: "Morgrave", baseCost: 300 }, { id: "item_201", name: "Potion of Healing (greater)", rarity: "Uncommon", faction: "Morgrave", baseCost: 300, dndbeyondPage: "4708-potions-of-healing" },
{ id: "item_202", name: "Potion of Healing (superior)", rarity: "Rare", faction: "Morgrave", baseCost: 750 }, { id: "item_202", name: "Potion of Healing (superior)", rarity: "Rare", faction: "Morgrave", baseCost: 750, dndbeyondPage: "4708-potions-of-healing" },
{ id: "item_203", name: "Potion of Healing (supreme)", rarity: "Very Rare", faction: "Morgrave", baseCost: 1500 }, { id: "item_203", name: "Potion of Healing (supreme)", rarity: "Very Rare", faction: "Morgrave", baseCost: 1500, dndbeyondPage: "4708-potions-of-healing" },
{ id: "item_204", name: "Potion of Heroism", rarity: "Rare", faction: "Deneith", baseCost: 800 }, { id: "item_204", name: "Potion of Heroism", rarity: "Rare", faction: "Deneith", baseCost: 800, dndbeyondPage: "4709-potion-of-heroism" },
{ id: "item_205", name: "Potion of Invisibility", rarity: "Rare", faction: "Tarkanan", baseCost: 2000 }, { id: "item_205", name: "Potion of Invisibility", rarity: "Rare", faction: "Tarkanan", baseCost: 2000, dndbeyondPage: "9228935-potion-of-invisibility" },
{ id: "item_206", name: "Potion of Invulnerability", rarity: "Rare", faction: "Deneith", baseCost: 1500 }, { id: "item_206", name: "Potion of Invulnerability", rarity: "Rare", faction: "Deneith", baseCost: 1500, dndbeyondPage: "5358-potion-of-invulnerability" },
{ id: "item_207", name: "Potion of Longevity", rarity: "Very Rare", faction: "Kundarak", baseCost: 3000 }, { id: "item_207", name: "Potion of Longevity", rarity: "Very Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "5359-potion-of-longevity" },
{ id: "item_208", name: "Potion of Mind Reading", rarity: "Rare", faction: "Medani", baseCost: 1100 }, { id: "item_208", name: "Potion of Mind Reading", rarity: "Rare", faction: "Medani", baseCost: 1100, dndbeyondPage: "9228936-potion-of-mind-reading" },
{ id: "item_209", name: "Potion of Poison", rarity: "Uncommon", faction: "Thuranni", baseCost: 500 }, { id: "item_209", name: "Potion of Poison", rarity: "Uncommon", faction: "Thuranni", baseCost: 500, dndbeyondPage: "9228937-potion-of-poison" },
{ id: "item_210", name: "Potion of Resistance", rarity: "Uncommon", faction: "Kundarak", baseCost: 500 }, { id: "item_210", name: "Potion of Resistance", rarity: "Uncommon", faction: "Kundarak", baseCost: 500, dndbeyondPage: "5419-potion-of-resistance" },
{ id: "item_211", name: "Potion of Speed", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000 }, { id: "item_211", name: "Potion of Speed", rarity: "Very Rare", faction: "Tarkanan", baseCost: 2000, dndbeyondPage: "9228939-potion-of-speed" },
{ id: "item_212", name: "Potion of Vitality", rarity: "Very Rare", faction: "Morgrave", baseCost: 1800 }, { id: "item_212", name: "Potion of Vitality", rarity: "Very Rare", faction: "Morgrave", baseCost: 1800, dndbeyondPage: "5360-potion-of-vitality" },
{ id: "item_213", name: "Potion of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 400 }, { id: "item_213", name: "Potion of Water Breathing", rarity: "Uncommon", faction: "Ashbound", baseCost: 400, dndbeyondPage: "9228940-potion-of-water-breathing" },
{ id: "item_214", name: "Quaal's Feather Token (anchor, fan, or tree)", rarity: "Uncommon", faction: "Tharashk", baseCost: 25 }, { id: "item_214", name: "Quaal's Feather Token (anchor, fan, or tree)", rarity: "Uncommon", faction: "Tharashk", baseCost: 25, dndbeyondPage: "9228948-quaals-feather-token" },
{ id: "item_215", name: "Quiver of Ehlonna", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 }, { id: "item_215", name: "Quiver of Ehlonna", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "5367-quiver-of-ehlonna" },
{ id: "item_216", name: "Raven's Slumber", rarity: "Very Rare", faction: "Tarkanan", baseCost: 15000 }, { id: "item_216", name: "Raven's Slumber", rarity: "Very Rare", faction: "Tarkanan", baseCost: 15000, dndbeyondPage: "7171001-ravens-slumber" },
{ id: "item_217", name: "Repeating Shot", rarity: "Uncommon", faction: "Tarkanan", baseCost: 550 }, { id: "item_217", name: "Repeating Shot", rarity: "Uncommon", faction: "Tarkanan", baseCost: 550, dndbeyondPage: "10886055-repeating-shot" },
{ id: "item_218", name: "Repulsion Shield", rarity: "Uncommon", faction: "Deneith", baseCost: 600 }, { id: "item_218", name: "Repulsion Shield", rarity: "Uncommon", faction: "Deneith", baseCost: 600, dndbeyondPage: "10886056-repulsion-shield" },
{ id: "item_219", name: "Returning Weapon", rarity: "Uncommon", faction: "Medani", baseCost: 550 }, { id: "item_219", name: "Returning Weapon", rarity: "Uncommon", faction: "Medani", baseCost: 550, dndbeyondPage: "10886064-returning-weapon" },
{ id: "item_220", name: "Reveler's Concertina", rarity: "Rare", faction: "Thuranni", baseCost: 4250 }, { id: "item_220", name: "Reveler's Concertina", rarity: "Rare", faction: "Thuranni", baseCost: 4250, dndbeyondPage: "2405691-revelers-concertina" },
{ id: "item_221", name: "Ring of Animal Influence", rarity: "Rare", faction: "Ashbound", baseCost: 1000 }, { id: "item_221", name: "Ring of Animal Influence", rarity: "Rare", faction: "Ashbound", baseCost: 1000, dndbeyondPage: "9228958-ring-of-animal-influence" },
{ id: "item_222", name: "Ring of Evasion", rarity: "Rare", faction: "Thuranni", baseCost: 4900 }, { id: "item_222", name: "Ring of Evasion", rarity: "Rare", faction: "Thuranni", baseCost: 4900, dndbeyondPage: "4720-ring-of-evasion" },
{ id: "item_223", name: "Ring of Feather Falling", rarity: "Rare", faction: "Tarkanan", baseCost: 2200 }, { id: "item_223", name: "Ring of Feather Falling", rarity: "Rare", faction: "Tarkanan", baseCost: 2200, dndbeyondPage: "4721-ring-of-feather-falling" },
{ id: "item_224", name: "Ring of Free Action", rarity: "Rare", faction: "Tarkanan", baseCost: 4500 }, { id: "item_224", name: "Ring of Free Action", rarity: "Rare", faction: "Tarkanan", baseCost: 4500, dndbeyondPage: "4722-ring-of-free-action" },
{ id: "item_225", name: "Ring of Jumping", rarity: "Uncommon", faction: "Tharashk", baseCost: 250 }, { id: "item_225", name: "Ring of Jumping", rarity: "Uncommon", faction: "Tharashk", baseCost: 250, dndbeyondPage: "9228966-ring-of-jumping" },
{ id: "item_226", name: "Ring of Mind Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 450 }, { id: "item_226", name: "Ring of Mind Shielding", rarity: "Uncommon", faction: "Kundarak", baseCost: 450, dndbeyondPage: "9228967-ring-of-mind-shielding" },
{ id: "item_227", name: "Ring of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3000 }, { id: "item_227", name: "Ring of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3000, dndbeyondPage: "4726-ring-of-protection" },
{ id: "item_228", name: "Ring of Regeneration", rarity: "Very Rare", faction: "Ashbound", baseCost: 40000 }, { id: "item_228", name: "Ring of Regeneration", rarity: "Very Rare", faction: "Ashbound", baseCost: 40000, dndbeyondPage: "4727-ring-of-regeneration" },
{ id: "item_229", name: "Ring of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3500 }, { id: "item_229", name: "Ring of Resistance", rarity: "Rare", faction: "Kundarak", baseCost: 3500, dndbeyondPage: "9341408-ring-of-resistance" },
{ id: "item_230", name: "Ring of Shooting Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000 }, { id: "item_230", name: "Ring of Shooting Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 20000, dndbeyondPage: "9228968-ring-of-shooting-stars" },
{ id: "item_231", name: "Ring of Spell Storing", rarity: "Rare", faction: "Morgrave", baseCost: 3600 }, { id: "item_231", name: "Ring of Spell Storing", rarity: "Rare", faction: "Morgrave", baseCost: 3600, dndbeyondPage: "4730-ring-of-spell-storing" },
{ id: "item_232", name: "Ring of Swimming", rarity: "Uncommon", faction: "Tharashk", baseCost: 300 }, { id: "item_232", name: "Ring of Swimming", rarity: "Uncommon", faction: "Tharashk", baseCost: 300, dndbeyondPage: "4732-ring-of-swimming" },
{ id: "item_233", name: "Ring of Telekinesis", rarity: "Very Rare", faction: "Tarkanan", baseCost: 25000 }, { id: "item_233", name: "Ring of Telekinesis", rarity: "Very Rare", faction: "Tarkanan", baseCost: 25000, dndbeyondPage: "9228970-ring-of-telekinesis" },
{ id: "item_234", name: "Ring of Temporal Salvation", rarity: "Rare", faction: "Deneith", baseCost: 2250 }, { id: "item_234", name: "Ring of Temporal Salvation", rarity: "Rare", faction: "Deneith", baseCost: 2250, dndbeyondPage: "1434358-ring-of-temporal-salvation" },
{ id: "item_235", name: "Ring of the Ram", rarity: "Rare", faction: "Ashbound", baseCost: 4000 }, { id: "item_235", name: "Ring of the Ram", rarity: "Rare", faction: "Ashbound", baseCost: 4000, dndbeyondPage: "9228971-ring-of-the-ram" },
{ id: "item_236", name: "Ring of Warmth", rarity: "Uncommon", faction: "Tharashk", baseCost: 480 }, { id: "item_236", name: "Ring of Warmth", rarity: "Uncommon", faction: "Tharashk", baseCost: 480, dndbeyondPage: "9228972-ring-of-warmth" },
{ id: "item_237", name: "Ring of Water Walking", rarity: "Uncommon", faction: "Tharashk", baseCost: 500 }, { id: "item_237", name: "Ring of Water Walking", rarity: "Uncommon", faction: "Tharashk", baseCost: 500, dndbeyondPage: "9228973-ring-of-water-walking" },
{ id: "item_238", name: "Ring of X-ray Vision", rarity: "Rare", faction: "Medani", baseCost: 3500 }, { id: "item_238", name: "Ring of X-ray Vision", rarity: "Rare", faction: "Medani", baseCost: 3500, dndbeyondPage: "9228974-ring-of-x-ray-vision" },
{ id: "item_239", name: "Robe of Eyes", rarity: "Rare", faction: "Medani", baseCost: 5000 }, { id: "item_239", name: "Robe of Eyes", rarity: "Rare", faction: "Medani", baseCost: 5000, dndbeyondPage: "9228976-robe-of-eyes" },
{ id: "item_240", name: "Robe of Scintillating Colors", rarity: "Very Rare", faction: "Thuranni", baseCost: 27000 }, { id: "item_240", name: "Robe of Scintillating Colors", rarity: "Very Rare", faction: "Thuranni", baseCost: 27000, dndbeyondPage: "9228977-robe-of-scintillating-colors" },
{ id: "item_241", name: "Robe of Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000 }, { id: "item_241", name: "Robe of Stars", rarity: "Very Rare", faction: "Morgrave", baseCost: 45000, dndbeyondPage: "9228978-robe-of-stars" },
{ id: "item_242", name: "Robe of Useful Items", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 }, { id: "item_242", name: "Robe of Useful Items", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228979-robe-of-useful-items" },
{ id: "item_243", name: "Rod of Absorption", rarity: "Very Rare", faction: "Morgrave", baseCost: 48000 }, { id: "item_243", name: "Rod of Absorption", rarity: "Very Rare", faction: "Morgrave", baseCost: 48000, dndbeyondPage: "4744-rod-of-absorption" },
{ id: "item_244", name: "Rod of Alertness", rarity: "Very Rare", faction: "Kundarak", baseCost: 11000 }, { id: "item_244", name: "Rod of Alertness", rarity: "Very Rare", faction: "Kundarak", baseCost: 11000, dndbeyondPage: "9228980-rod-of-alertness" },
{ id: "item_245", name: "Rod of Hellish Flames", rarity: "Very Rare", faction: "Ashbound", baseCost: 10250 }, { id: "item_245", name: "Rod of Hellish Flames", rarity: "Very Rare", faction: "Ashbound", baseCost: 10250, dndbeyondPage: "7526749-rod-of-hellish-flames" },
{ id: "item_246", name: "Rod of Rulership", rarity: "Rare", faction: "Tarkanan", baseCost: 3600 }, { id: "item_246", name: "Rod of Rulership", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9228982-rod-of-rulership" },
{ id: "item_247", name: "Rod of Security", rarity: "Very Rare", faction: "Kundarak", baseCost: 45000 }, { id: "item_247", name: "Rod of Security", rarity: "Very Rare", faction: "Kundarak", baseCost: 45000, dndbeyondPage: "9228983-rod-of-security" },
{ id: "item_248", name: "Rod of the Pact Keeper (+1)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 }, { id: "item_248", name: "Rod of the Pact Keeper (+1)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9228987-rod-of-the-pact-keeper" },
{ id: "item_249", name: "Rod of the Pact Keeper, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000 }, { id: "item_249", name: "Rod of the Pact Keeper, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000, dndbeyondPage: "9228987-rod-of-the-pact-keeper" },
{ id: "item_250", name: "Rod of the Pact Keeper, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000 }, { id: "item_250", name: "Rod of the Pact Keeper, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000, dndbeyondPage: "9228987-rod-of-the-pact-keeper" },
{ id: "item_251", name: "Rogue's Mantle", rarity: "Rare", faction: "Tarkanan", baseCost: 5000 }, { id: "item_251", name: "Rogue's Mantle", rarity: "Rare", faction: "Tarkanan", baseCost: 5000, dndbeyondPage: "7526750-rogues-mantle" },
{ id: "item_252", name: "Rope of Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 350 }, { id: "item_252", name: "Rope of Climbing", rarity: "Uncommon", faction: "Tharashk", baseCost: 350, dndbeyondPage: "9228988-rope-of-climbing" },
{ id: "item_253", name: "Rope of Entanglement", rarity: "Rare", faction: "Kundarak", baseCost: 1000 }, { id: "item_253", name: "Rope of Entanglement", rarity: "Rare", faction: "Kundarak", baseCost: 1000, dndbeyondPage: "9228989-rope-of-entanglement" },
{ id: "item_254", name: "Saddle of the Cavalier", rarity: "Uncommon", faction: "Deneith", baseCost: 250 }, { id: "item_254", name: "Saddle of the Cavalier", rarity: "Uncommon", faction: "Deneith", baseCost: 250, dndbeyondPage: "5396-saddle-of-the-cavalier" },
{ id: "item_255", name: "Sanctum Amulet", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000 }, { id: "item_255", name: "Sanctum Amulet", rarity: "Very Rare", faction: "Tharashk", baseCost: 6000, dndbeyondPage: "7102438-sanctum-amulet" },
{ id: "item_256", name: "Scimitar of Speed", rarity: "Very Rare", faction: "Deneith", baseCost: 7500 }, { id: "item_256", name: "Scimitar of Speed", rarity: "Very Rare", faction: "Deneith", baseCost: 7500, dndbeyondPage: "4752-scimitar-of-speed" },
{ id: "item_257", name: "Scroll of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3500 }, { id: "item_257", name: "Scroll of Protection", rarity: "Rare", faction: "Kundarak", baseCost: 3500, dndbeyondPage: "9229016-scroll-of-protection" },
{ id: "item_258", name: "Sending Stones", rarity: "Uncommon", faction: "Morgrave", baseCost: 500 }, { id: "item_258", name: "Sending Stones", rarity: "Uncommon", faction: "Morgrave", baseCost: 500, dndbeyondPage: "9180147-sending-stones" },
{ id: "item_259", name: "Sentinel Shield", rarity: "Uncommon", faction: "Kundarak", baseCost: 300 }, { id: "item_259", name: "Sentinel Shield", rarity: "Uncommon", faction: "Kundarak", baseCost: 300, dndbeyondPage: "5403-sentinel-shield" },
{ id: "item_260", name: "Shield of Missile Attraction", rarity: "Rare", faction: "Tarkanan", baseCost: 1000 }, { id: "item_260", name: "Shield of Missile Attraction", rarity: "Rare", faction: "Tarkanan", baseCost: 1000, dndbeyondPage: "4754-shield-of-missile-attraction" },
{ id: "item_261", name: "Shield of the Cavalier", rarity: "Very Rare", faction: "Kundarak", baseCost: 12500 }, { id: "item_261", name: "Shield of the Cavalier", rarity: "Very Rare", faction: "Kundarak", baseCost: 12500, dndbeyondPage: "9058943-shield-of-the-cavalier" },
{ id: "item_262", name: "Shield, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 450 }, { id: "item_262", name: "Shield, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 450, dndbeyondPage: "4753-shield-1" },
{ id: "item_263", name: "Shield, +2", rarity: "Rare", faction: "Deneith", baseCost: 4000 }, { id: "item_263", name: "Shield, +2", rarity: "Rare", faction: "Deneith", baseCost: 4000, dndbeyondPage: "5157-shield-2" },
{ id: "item_264", name: "Shield, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 22000 }, { id: "item_264", name: "Shield, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 22000, dndbeyondPage: "5158-shield-3" },
{ id: "item_265", name: "Slippers of Spider Climbing", rarity: "Uncommon", faction: "Tarkanan", baseCost: 500 }, { id: "item_265", name: "Slippers of Spider Climbing", rarity: "Uncommon", faction: "Tarkanan", baseCost: 500, dndbeyondPage: "4755-slippers-of-spider-climbing" },
{ id: "item_266", name: "Speaking Stone", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000 }, { id: "item_266", name: "Speaking Stone", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000, dndbeyondPage: "221458-speaking-stone" },
{ id: "item_267", name: "Spell Scroll (level 2 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 150 }, { id: "item_267", name: "Spell Scroll (level 2 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 150, dndbeyondPage: "9229085-spell-scroll" },
{ id: "item_268", name: "Spell Scroll (level 3 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 }, { id: "item_268", name: "Spell Scroll (level 3 spell)", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "9229085-spell-scroll" },
{ id: "item_269", name: "Spell Scroll (level 4 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 800 }, { id: "item_269", name: "Spell Scroll (level 4 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 800, dndbeyondPage: "9229085-spell-scroll" },
{ id: "item_270", name: "Spell Scroll (level 5 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 1500 }, { id: "item_270", name: "Spell Scroll (level 5 spell)", rarity: "Rare", faction: "Morgrave", baseCost: 1500, dndbeyondPage: "9229085-spell-scroll" },
{ id: "item_271", name: "Spell Scroll (level 6 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 2000 }, { id: "item_271", name: "Spell Scroll (level 6 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 2000, dndbeyondPage: "9229085-spell-scroll" },
{ id: "item_272", name: "Spell Scroll (level 7 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 3500 }, { id: "item_272", name: "Spell Scroll (level 7 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 3500, dndbeyondPage: "9229085-spell-scroll" },
{ id: "item_273", name: "Spell Scroll (level 8 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000 }, { id: "item_273", name: "Spell Scroll (level 8 spell)", rarity: "Very Rare", faction: "Morgrave", baseCost: 5000, dndbeyondPage: "9229085-spell-scroll" },
{ id: "item_274", name: "Spellguard Shield", rarity: "Very Rare", faction: "Kundarak", baseCost: 36000 }, { id: "item_274", name: "Spellguard Shield", rarity: "Very Rare", faction: "Kundarak", baseCost: 36000, dndbeyondPage: "4757-spellguard-shield" },
{ id: "item_275", name: "Spell-refueling Ring", rarity: "Uncommon", faction: "Morgrave", baseCost: 600 }, { id: "item_275", name: "Spell-refueling Ring", rarity: "Uncommon", faction: "Morgrave", baseCost: 600, dndbeyondPage: "10886065-spell-refueling-ring" },
{ id: "item_276", name: "Staff of Charming", rarity: "Rare", faction: "Tarkanan", baseCost: 3750 }, { id: "item_276", name: "Staff of Charming", rarity: "Rare", faction: "Tarkanan", baseCost: 3750, dndbeyondPage: "9229093-staff-of-charming" },
{ id: "item_277", name: "Staff of Fire", rarity: "Very Rare", faction: "Ashbound", baseCost: 18000 }, { id: "item_277", name: "Staff of Fire", rarity: "Very Rare", faction: "Ashbound", baseCost: 18000, dndbeyondPage: "9229094-staff-of-fire" },
{ id: "item_278", name: "Staff of Frost", rarity: "Very Rare", faction: "Morgrave", baseCost: 18000 }, { id: "item_278", name: "Staff of Frost", rarity: "Very Rare", faction: "Morgrave", baseCost: 18000, dndbeyondPage: "9229096-staff-of-frost" },
{ id: "item_279", name: "Staff of Healing", rarity: "Rare", faction: "Morgrave", baseCost: 4800 }, { id: "item_279", name: "Staff of Healing", rarity: "Rare", faction: "Morgrave", baseCost: 4800, dndbeyondPage: "9229097-staff-of-healing" },
{ id: "item_280", name: "Staff of Power", rarity: "Very Rare", faction: "Morgrave", baseCost: 46000 }, { id: "item_280", name: "Staff of Power", rarity: "Very Rare", faction: "Morgrave", baseCost: 46000, dndbeyondPage: "9229098-staff-of-power" },
{ id: "item_281", name: "Staff of Striking", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 }, { id: "item_281", name: "Staff of Striking", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4765-staff-of-striking" },
{ id: "item_282", name: "Staff of Swarming Insects", rarity: "Rare", faction: "Ashbound", baseCost: 4500 }, { id: "item_282", name: "Staff of Swarming Insects", rarity: "Rare", faction: "Ashbound", baseCost: 4500, dndbeyondPage: "9229099-staff-of-swarming-insects" },
{ id: "item_283", name: "Staff of the Adder", rarity: "Uncommon", faction: "Ashbound", baseCost: 350 }, { id: "item_283", name: "Staff of the Adder", rarity: "Uncommon", faction: "Ashbound", baseCost: 350, dndbeyondPage: "9229100-staff-of-the-adder" },
{ id: "item_284", name: "Staff of the Python", rarity: "Uncommon", faction: "Ashbound", baseCost: 250 }, { id: "item_284", name: "Staff of the Python", rarity: "Uncommon", faction: "Ashbound", baseCost: 250, dndbeyondPage: "9229102-staff-of-the-python" },
{ id: "item_285", name: "Staff of the Woodlands", rarity: "Rare", faction: "Ashbound", baseCost: 4500 }, { id: "item_285", name: "Staff of the Woodlands", rarity: "Rare", faction: "Ashbound", baseCost: 4500, dndbeyondPage: "9229103-staff-of-the-woodlands" },
{ id: "item_286", name: "Staff of Thunder and Lightning", rarity: "Very Rare", faction: "Morgrave", baseCost: 30000 }, { id: "item_286", name: "Staff of Thunder and Lightning", rarity: "Very Rare", faction: "Morgrave", baseCost: 30000, dndbeyondPage: "9229104-staff-of-thunder-and-lightning" },
{ id: "item_287", name: "Staff of Withering", rarity: "Rare", faction: "Ashbound", baseCost: 2100 }, { id: "item_287", name: "Staff of Withering", rarity: "Rare", faction: "Ashbound", baseCost: 2100, dndbeyondPage: "4771-staff-of-withering" },
{ id: "item_288", name: "Stone of Controlling Earth Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700 }, { id: "item_288", name: "Stone of Controlling Earth Elementals", rarity: "Rare", faction: "Ashbound", baseCost: 4700, dndbeyondPage: "9229105-stone-of-controlling-earth-elementals" },
{ id: "item_289", name: "Stone of Good Luck", rarity: "Uncommon", faction: "Tharashk", baseCost: 400 }, { id: "item_289", name: "Stone of Good Luck", rarity: "Uncommon", faction: "Tharashk", baseCost: 400, dndbeyondPage: "4773-stone-of-good-luck-luckstone" },
{ id: "item_290", name: "Sun Blade", rarity: "Rare", faction: "Deneith", baseCost: 2000 }, { id: "item_290", name: "Sun Blade", rarity: "Rare", faction: "Deneith", baseCost: 2000, dndbeyondPage: "9229110-sun-blade" },
{ id: "item_291", name: "Sword of Life Stealing", rarity: "Rare", faction: "Thuranni", baseCost: 2200 }, { id: "item_291", name: "Sword of Life Stealing", rarity: "Rare", faction: "Thuranni", baseCost: 2200, dndbeyondPage: "9229113-sword-of-life-stealing" },
{ id: "item_292", name: "Sword of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 42000 }, { id: "item_292", name: "Sword of Sharpness", rarity: "Very Rare", faction: "Thuranni", baseCost: 42000, dndbeyondPage: "9229114-sword-of-sharpness" },
{ id: "item_293", name: "Sword of Vengeance", rarity: "Uncommon", faction: "Thuranni", baseCost: 400 }, { id: "item_293", name: "Sword of Vengeance", rarity: "Uncommon", faction: "Thuranni", baseCost: 400, dndbeyondPage: "5505-sword-of-vengeance" },
{ id: "item_294", name: "Sword of Wounding", rarity: "Rare", faction: "Thuranni", baseCost: 1200 }, { id: "item_294", name: "Sword of Wounding", rarity: "Rare", faction: "Thuranni", baseCost: 1200, dndbeyondPage: "9229115-sword-of-wounding" },
{ id: "item_295", name: "Tentacle Rod", rarity: "Rare", faction: "Kundarak", baseCost: 2000 }, { id: "item_295", name: "Tentacle Rod", rarity: "Rare", faction: "Kundarak", baseCost: 2000, dndbeyondPage: "9229127-tentacle-rod" },
{ id: "item_296", name: "Tome of Clear Thought", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 }, { id: "item_296", name: "Tome of Clear Thought", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4781-tome-of-clear-thought" },
{ id: "item_297", name: "Tome of Leadership and Influence", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 }, { id: "item_297", name: "Tome of Leadership and Influence", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4782-tome-of-leadership-and-influence" },
{ id: "item_298", name: "Tome of Understanding", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000 }, { id: "item_298", name: "Tome of Understanding", rarity: "Very Rare", faction: "Morgrave", baseCost: 36000, dndbeyondPage: "4783-tome-of-understanding" },
{ id: "item_299", name: "Trident of Fish Command", rarity: "Uncommon", faction: "Ashbound", baseCost: 300 }, { id: "item_299", name: "Trident of Fish Command", rarity: "Uncommon", faction: "Ashbound", baseCost: 300, dndbeyondPage: "4784-trident-of-fish-command" },
{ id: "item_300", name: "Ventilating Lungs", rarity: "Rare", faction: "Morgrave", baseCost: 1000 }, { id: "item_300", name: "Ventilating Lungs", rarity: "Rare", faction: "Morgrave", baseCost: 1000, dndbeyondPage: "1091623-ventilating-lungs" },
{ id: "item_301", name: "Vicious Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 4000 }, { id: "item_301", name: "Vicious Weapon", rarity: "Rare", faction: "Tarkanan", baseCost: 4000, dndbeyondPage: "9229175-vicious-weapon" },
{ id: "item_302", name: "Wand of Binding", rarity: "Rare", faction: "Thuranni", baseCost: 2500 }, { id: "item_302", name: "Wand of Binding", rarity: "Rare", faction: "Thuranni", baseCost: 2500, dndbeyondPage: "9229182-wand-of-binding" },
{ id: "item_303", name: "Wand of Enemy Detection", rarity: "Rare", faction: "Medani", baseCost: 3750 }, { id: "item_303", name: "Wand of Enemy Detection", rarity: "Rare", faction: "Medani", baseCost: 3750, dndbeyondPage: "9229184-wand-of-enemy-detection" },
{ id: "item_304", name: "Wand of Fear", rarity: "Rare", faction: "Thuranni", baseCost: 3250 }, { id: "item_304", name: "Wand of Fear", rarity: "Rare", faction: "Thuranni", baseCost: 3250, dndbeyondPage: "9229185-wand-of-fear" },
{ id: "item_305", name: "Wand of Fireballs", rarity: "Rare", faction: "Ashbound", baseCost: 4800 }, { id: "item_305", name: "Wand of Fireballs", rarity: "Rare", faction: "Ashbound", baseCost: 4800, dndbeyondPage: "9229186-wand-of-fireballs" },
{ id: "item_306", name: "Wand of Lightning Bolts", rarity: "Rare", faction: "Tarkanan", baseCost: 4800 }, { id: "item_306", name: "Wand of Lightning Bolts", rarity: "Rare", faction: "Tarkanan", baseCost: 4800, dndbeyondPage: "9229187-wand-of-lightning-bolts" },
{ id: "item_307", name: "Wand of Magic Detection", rarity: "Uncommon", faction: "Medani", baseCost: 150 }, { id: "item_307", name: "Wand of Magic Detection", rarity: "Uncommon", faction: "Medani", baseCost: 150, dndbeyondPage: "9229188-wand-of-magic-detection" },
{ id: "item_308", name: "Wand of Magic Missiles", rarity: "Uncommon", faction: "Tharashk", baseCost: 300 }, { id: "item_308", name: "Wand of Magic Missiles", rarity: "Uncommon", faction: "Tharashk", baseCost: 300, dndbeyondPage: "9237129-wand-of-magic-missiles" },
{ id: "item_309", name: "Wand of Paralysis", rarity: "Rare", faction: "Thuranni", baseCost: 4250 }, { id: "item_309", name: "Wand of Paralysis", rarity: "Rare", faction: "Thuranni", baseCost: 4250, dndbeyondPage: "9229190-wand-of-paralysis" },
{ id: "item_310", name: "Wand of Polymorph", rarity: "Very Rare", faction: "Tharashk", baseCost: 21000 }, { id: "item_310", name: "Wand of Polymorph", rarity: "Very Rare", faction: "Tharashk", baseCost: 21000, dndbeyondPage: "9229191-wand-of-polymorph" },
{ id: "item_311", name: "Wand of Secrets", rarity: "Uncommon", faction: "Medani", baseCost: 125 }, { id: "item_311", name: "Wand of Secrets", rarity: "Uncommon", faction: "Medani", baseCost: 125, dndbeyondPage: "9229193-wand-of-secrets" },
{ id: "item_312", name: "Wand of the War Mage, +1", rarity: "Uncommon", faction: "Morgrave", baseCost: 400 }, { id: "item_312", name: "Wand of the War Mage, +1", rarity: "Uncommon", faction: "Morgrave", baseCost: 400, dndbeyondPage: "34712-wand-of-the-war-mage" },
{ id: "item_313", name: "Wand of the War Mage, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000 }, { id: "item_313", name: "Wand of the War Mage, +2", rarity: "Rare", faction: "Morgrave", baseCost: 4000, dndbeyondPage: "34712-wand-of-the-war-mage" },
{ id: "item_314", name: "Wand of the War Mage, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000 }, { id: "item_314", name: "Wand of the War Mage, +3", rarity: "Very Rare", faction: "Morgrave", baseCost: 14000, dndbeyondPage: "34712-wand-of-the-war-mage" },
{ id: "item_315", name: "Wand of Web", rarity: "Uncommon", faction: "Thuranni", baseCost: 250 }, { id: "item_315", name: "Wand of Web", rarity: "Uncommon", faction: "Thuranni", baseCost: 250, dndbeyondPage: "9229194-wand-of-web" },
{ id: "item_316", name: "Wand of Wonder", rarity: "Rare", faction: "Morgrave", baseCost: 2250 }, { id: "item_316", name: "Wand of Wonder", rarity: "Rare", faction: "Morgrave", baseCost: 2250, dndbeyondPage: "9229195-wand-of-wonder" },
{ id: "item_317", name: "Warrior's Passkey", rarity: "Rare", faction: "Tharashk", baseCost: 5000 }, { id: "item_317", name: "Warrior's Passkey", rarity: "Rare", faction: "Tharashk", baseCost: 5000, dndbeyondPage: "7526784-warriors-passkey" },
{ id: "item_318", name: "Watchful Helm", rarity: "Very Rare", faction: "Medani", baseCost: 8500 }, { id: "item_318", name: "Watchful Helm", rarity: "Very Rare", faction: "Medani", baseCost: 8500, dndbeyondPage: "3001264-watchful-helm" },
{ id: "item_319", name: "Wayfarer's Boots", rarity: "Rare", faction: "Morgrave", baseCost: 4750 }, { id: "item_319", name: "Wayfarer's Boots", rarity: "Rare", faction: "Morgrave", baseCost: 4750, dndbeyondPage: "7102444-wayfarers-boots" },
{ id: "item_320", name: "Weapon of Throne's Command", rarity: "Very Rare", faction: "Medani", baseCost: 16000 }, { id: "item_320", name: "Weapon of Throne's Command", rarity: "Very Rare", faction: "Medani", baseCost: 16000, dndbeyondPage: "7526785-weapon-of-thrones-command" },
{ id: "item_321", name: "Weapon of Warning", rarity: "Uncommon", faction: "Kundarak", baseCost: 400 }, { id: "item_321", name: "Weapon of Warning", rarity: "Uncommon", faction: "Kundarak", baseCost: 400, dndbeyondPage: "9229199-weapon-of-warning" },
{ id: "item_322", name: "Weapon, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 500 }, { id: "item_322", name: "Weapon, +1", rarity: "Uncommon", faction: "Deneith", baseCost: 500, dndbeyondPage: "5400-weapon-1" },
{ id: "item_323", name: "Weapon, +2", rarity: "Rare", faction: "Deneith", baseCost: 2500 }, { id: "item_323", name: "Weapon, +2", rarity: "Rare", faction: "Deneith", baseCost: 2500, dndbeyondPage: "5401-weapon-2" },
{ id: "item_324", name: "Weapon, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 15000 }, { id: "item_324", name: "Weapon, +3", rarity: "Very Rare", faction: "Deneith", baseCost: 15000, dndbeyondPage: "5404-weapon-3" },
{ id: "item_325", name: "Whispering Cloak", rarity: "Rare", faction: "Tharashk", baseCost: 4500 }, { id: "item_325", name: "Whispering Cloak", rarity: "Rare", faction: "Tharashk", baseCost: 4500, dndbeyondPage: "8806956-whispering-cloak" },
{ id: "item_326", name: "Wind Fan", rarity: "Uncommon", faction: "Ashbound", baseCost: 150 }, { id: "item_326", name: "Wind Fan", rarity: "Uncommon", faction: "Ashbound", baseCost: 150, dndbeyondPage: "4803-wind-fan" },
{ id: "item_327", name: "Winged Boots", rarity: "Uncommon", faction: "Tarkanan", baseCost: 5000 }, { id: "item_327", name: "Winged Boots", rarity: "Uncommon", faction: "Tarkanan", baseCost: 5000, dndbeyondPage: "9229203-winged-boots" },
{ id: "item_328", name: "Wings of Flying", rarity: "Rare", faction: "Tarkanan", baseCost: 3600 } { id: "item_328", name: "Wings of Flying", rarity: "Rare", faction: "Tarkanan", baseCost: 3600, dndbeyondPage: "9229204-wings-of-flying" }
]; ];

View File

@ -440,7 +440,7 @@ body {
content: ''; content: '';
position: absolute; position: absolute;
bottom: 100%; bottom: 100%;
left: 50%; left: var(--tooltip-arrow-left, 50%);
transform: translateX(-50%); transform: translateX(-50%);
border: 8px solid transparent; border: 8px solid transparent;
border-bottom-color: #8b4513; border-bottom-color: #8b4513;
@ -450,7 +450,7 @@ body {
content: ''; content: '';
position: absolute; position: absolute;
bottom: 100%; bottom: 100%;
left: 50%; left: var(--tooltip-arrow-left, 50%);
transform: translateX(-50%); transform: translateX(-50%);
border: 6px solid transparent; border: 6px solid transparent;
border-bottom-color: #fff; border-bottom-color: #fff;
@ -576,14 +576,14 @@ body {
.ashbound { border-left-color: #228b22; } .ashbound { border-left-color: #228b22; }
.morgrave { border-left-color: #ff8c00; } .morgrave { border-left-color: #ff8c00; }
.kundarak .faction-name, .faction-name.kundarak { color: #8b7355; } .kundarak div[class*="header"] .faction-name, .faction-name.kundarak { color: #8b7355; }
.medani .faction-name, .faction-name.medani { color: #4682b4; } .medani div[class*="header"] .faction-name, .faction-name.medani { color: #4682b4; }
.deneith .faction-name, .faction-name.deneith { color: #b22222; } .deneith div[class*="header"] .faction-name, .faction-name.deneith { color: #b22222; }
.tharashk .faction-name, .faction-name.tharashk { color: #8b6914; } .tharashk div[class*="header"] .faction-name, .faction-name.tharashk { color: #8b6914; }
.thuranni .faction-name, .faction-name.thuranni { color: #4b0082; } .thuranni div[class*="header"] .faction-name, .faction-name.thuranni { color: #4b0082; }
.tarkanan .faction-name, .faction-name.tarkanan { color: #dc143c; } .tarkanan div[class*="header"] .faction-name, .faction-name.tarkanan { color: #dc143c; }
.ashbound .faction-name, .faction-name.ashbound { color: #228b22; } .ashbound div[class*="header"] .faction-name, .faction-name.ashbound { color: #228b22; }
.morgrave .faction-name, .faction-name.morgrave { color: #ff8c00; } .morgrave div[class*="header"] .faction-name, .faction-name.morgrave { color: #ff8c00; }
/* Loading & Empty States */ /* Loading & Empty States */
.loading, .no-quests { .loading, .no-quests {
@ -979,6 +979,7 @@ button {
.no-items { .no-items {
text-align: center; text-align: center;
vertical-align: top;
padding: 2rem; padding: 2rem;
color: #b8a992; color: #b8a992;
font-style: italic; font-style: italic;
@ -1017,13 +1018,185 @@ button {
background: rgba(139, 115, 85, 0.5); background: rgba(139, 115, 85, 0.5);
} }
.market-table thead tr:first-child th {
white-space: nowrap;
}
.market-filter-row th {
background: rgba(245, 222, 179, 0.5);
padding: 0.5rem 0.75rem;
vertical-align: top;
white-space: normal;
}
.market-filter-input,
.market-filter-select {
width: 100%;
padding: 0.35rem 0.5rem;
border: 1px solid rgba(139, 115, 85, 0.5);
border-radius: 4px;
font-size: 0.85rem;
background: #fff;
color: #2c1810;
}
.market-filter-input::placeholder {
color: #8b7355;
}
.market-filter-search {
position: relative;
}
.market-filter-search-input {
padding-right: 1.6rem;
}
.market-filter-clear {
position: absolute;
top: 50%;
right: 6px;
transform: translateY(-50%);
border: none;
padding: 0 0.5vw;
background: transparent;
color: #8b7355;
cursor: pointer;
font-size: 1.5rem;
line-height: 1;
opacity: 0;
pointer-events: none;
transition: opacity 0.15s ease;
}
.market-filter-clear.active {
opacity: 0.9;
pointer-events: auto;
}
.market-filter-range {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.cost-col {
width: 150px;
min-width: 150px;
}
.market-filter-input.cost-filter {
flex: 1 1 70px;
min-width: 0;
}
.market-filter-dropdown {
position: relative;
}
.market-filter-trigger {
width: 100%;
text-align: left;
border: 1px solid rgba(139, 115, 85, 0.5);
border-radius: 4px;
background: #fff;
color: #2c1810;
padding: 0.35rem 0.5rem;
font-size: 0.85rem;
cursor: pointer;
}
.market-filter-trigger.is-empty {
border-color: #b22222;
color: #b22222;
}
.market-filter-summary {
font-weight: 600;
}
.market-filter-popover {
position: absolute;
top: calc(100% + 6px);
left: 0;
z-index: 20;
width: 125px;
max-width: 80vw;
background: #fff;
border: 1px solid rgba(139, 115, 85, 0.5);
border-radius: 6px;
box-shadow: 0 8px 18px rgba(0,0,0,0.2);
padding: 0.5rem;
display: none;
}
.market-filter-popover.show {
display: block;
}
.market-filter-popover-header {
display: grid;
gap: 0.35rem;
}
.market-filter-popover-search {
font-size: 0.8rem;
}
.market-filter-popover-actions {
display: flex;
justify-content: space-between;
gap: 0.35rem;
}
.market-filter-popover-actions button {
border: 1px solid rgba(139, 115, 85, 0.4);
background: rgba(245, 222, 179, 0.6);
color: #2c1810;
border-radius: 4px;
padding: 0.2rem 0.4rem;
font-size: 0.75rem;
cursor: pointer;
}
.market-filter-options {
margin-top: 0.5rem;
max-height: 180px;
overflow-y: auto;
display: grid;
gap: 0.25rem;
}
.market-filter-option {
display: flex;
align-items: center;
gap: 0.35rem;
font-size: 0.8rem;
color: #2c1810;
cursor: pointer;
}
.market-filter-option input {
accent-color: #8b4513;
}
.market-filter-empty {
font-size: 0.75rem;
color: #8b7355;
}
.market-table tbody tr { .market-table tbody tr {
border-bottom: 1px solid rgba(139, 115, 85, 0.2); border-bottom: 1px solid rgba(139, 115, 85, 0.2);
transition: background 0.2s ease; transition: background 0.2s ease;
} }
.market-table tbody tr:hover { .market-table tbody tr:nth-child(even) {
background: rgba(139, 115, 85, 0.1); background-color: rgba(245, 222, 179, 0.3);
}
.market-table tbody tr:hover td {
background-color: rgba(139, 115, 85, 0.3);
} }
.market-table td { .market-table td {
@ -1053,32 +1226,34 @@ button {
.item-faction-cell.ashbound { color: #228b22; } .item-faction-cell.ashbound { color: #228b22; }
.item-faction-cell.morgrave { color: #ff8c00; } .item-faction-cell.morgrave { color: #ff8c00; }
.item-rarity-cell { /* Restrict scope of badge formatting to .market-table in case other badges exist */
text-align: center; .market-table span[class*='badge'] {
}
.rarity-badge {
display: inline-block; display: inline-block;
padding: 0.25rem 0.6rem; padding: 0.25rem 0.6rem;
border-radius: 4px; border-radius: 4px;
font-size: 0.75rem; font-size: 0.75rem;
font-weight: 600; font-weight: 600;
color: white;
}
.item-rarity-cell {
text-align: center;
}
.rarity-badge {
text-transform: uppercase; text-transform: uppercase;
} }
.rarity-uncommon { .rarity-uncommon {
background: #1e7b1e; background: #1e7b1e;
color: white;
} }
.rarity-rare { .rarity-rare {
background: #4169e1; background: #4169e1;
color: white;
} }
.rarity-very-rare { .rarity-very-rare {
background: #9370db; background: #9370db;
color: white;
} }
.item-stock-cell { .item-stock-cell {
@ -1143,10 +1318,13 @@ button {
/* Market table wrapper for horizontal scroll */ /* Market table wrapper for horizontal scroll */
.market-table-wrapper { .market-table-wrapper {
overflow-x: auto; overflow-x: auto;
overflow-y: visible;
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
margin: 0 -10px; margin: 0 -10px;
padding: 0 10px; padding: 0 10px;
position: relative; position: relative;
min-height: 320px;
min-height: 60vh;
} }
/* Scroll hint shadow on mobile */ /* Scroll hint shadow on mobile */