modernuo/Distribution/Data/commands.html
2024-02-10 18:56:45 -08:00

591 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="description" content="In-game commands for the Ultima Online Server Emulator ModernUO">
<meta name="author" content="Kamron Batman">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="https://modernuo.com/branding/favicon.png">
<title>ModernUO Commands</title>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;500;700&display=swap" rel="stylesheet">
<script src="https://cdn.tailwindcss.com/3.4.1?plugins=typography@0.5.10"></script>
<script>
tailwind.config = {
theme: {
colors: {
inherit: "inherit",
current: "currentColor",
transparent: "transparent",
black: "#000",
white: "#fff",
counselor: "rgb(80, 80, 200)",
gamemaster: "rgb(200, 128, 112)",
seer: "rgb(128, 168, 128)",
administrator: "rgb(0, 152, 136)",
developer: "rgb(112, 88, 160)",
owner: "rgb(208, 144, 0)",
"modern-black": "#212121",
"modern-black-hover": "#2F2F2F",
"modern-dark-black": "#1A1A1A",
gold: {
50: "#fbf3ee",
100: "#f8e9dd",
200: "#f0d9bd",
300: "#e8cea1",
400: "#dfc688",
500: "#d5bf74",
600: "#cab664",
700: "#bdab58",
800: "#b09f4f",
900: "#a29147",
},
slate: {
50: "#f8fafc",
100: "#f1f5f9",
200: "#e2e8f0",
300: "#cbd5e1",
400: "#94a3b8",
500: "#64748b",
600: "#475569",
700: "#334155",
800: "#1e293b",
900: "#0f172a",
950: "#020617"
},
gray: {
50: "#f9fafb",
100: "#f3f4f6",
200: "#e5e7eb",
300: "#d1d5db",
400: "#9ca3af",
500: "#6b7280",
600: "#4b5563",
700: "#374151",
800: "#1f2937",
900: "#111827",
950: "#030712"
},
zinc: {
50: "#fafafa",
100: "#f4f4f5",
200: "#e4e4e7",
300: "#d4d4d8",
400: "#a1a1aa",
500: "#71717a",
600: "#52525b",
700: "#3f3f46",
800: "#27272a",
900: "#18181b",
950: "#09090b"
},
neutral: {
50: "#fafafa",
100: "#f5f5f5",
200: "#e5e5e5",
300: "#d4d4d4",
400: "#a3a3a3",
500: "#737373",
600: "#525252",
700: "#404040",
800: "#262626",
900: "#171717",
950: "#0a0a0a"
},
stone: {
50: "#fafaf9",
100: "#f5f5f4",
200: "#e7e5e4",
300: "#d6d3d1",
400: "#a8a29e",
500: "#78716c",
600: "#57534e",
700: "#44403c",
800: "#292524",
900: "#1c1917",
950: "#0c0a09"
},
red: {
50: "#fef2f2",
100: "#fee2e2",
200: "#fecaca",
300: "#fca5a5",
400: "#f87171",
500: "#ef4444",
600: "#dc2626",
700: "#b91c1c",
800: "#991b1b",
900: "#7f1d1d",
950: "#450a0a"
},
orange: {
50: "#fff7ed",
100: "#ffedd5",
200: "#fed7aa",
300: "#fdba74",
400: "#fb923c",
500: "#f97316",
600: "#ea580c",
700: "#c2410c",
800: "#9a3412",
900: "#7c2d12",
950: "#431407"
},
amber: {
50: "#fffbeb",
100: "#fef3c7",
200: "#fde68a",
300: "#fcd34d",
400: "#fbbf24",
500: "#f59e0b",
600: "#d97706",
700: "#b45309",
800: "#92400e",
900: "#78350f",
950: "#451a03"
},
yellow: {
50: "#fefce8",
100: "#fef9c3",
200: "#fef08a",
300: "#fde047",
400: "#facc15",
500: "#eab308",
600: "#ca8a04",
700: "#a16207",
800: "#854d0e",
900: "#713f12",
950: "#422006"
},
lime: {
50: "#f7fee7",
100: "#ecfccb",
200: "#d9f99d",
300: "#bef264",
400: "#a3e635",
500: "#84cc16",
600: "#65a30d",
700: "#4d7c0f",
800: "#3f6212",
900: "#365314",
950: "#1a2e05"
},
green: {
50: "#f0fdf4",
100: "#dcfce7",
200: "#bbf7d0",
300: "#86efac",
400: "#4ade80",
500: "#22c55e",
600: "#16a34a",
700: "#15803d",
800: "#166534",
900: "#14532d",
950: "#052e16"
},
emerald: {
50: "#ecfdf5",
100: "#d1fae5",
200: "#a7f3d0",
300: "#6ee7b7",
400: "#34d399",
500: "#10b981",
600: "#059669",
700: "#047857",
800: "#065f46",
900: "#064e3b",
950: "#022c22"
},
teal: {
50: "#f0fdfa",
100: "#ccfbf1",
200: "#99f6e4",
300: "#5eead4",
400: "#2dd4bf",
500: "#14b8a6",
600: "#0d9488",
700: "#0f766e",
800: "#115e59",
900: "#134e4a",
950: "#042f2e"
},
cyan: {
50: "#ecfeff",
100: "#cffafe",
200: "#a5f3fc",
300: "#67e8f9",
400: "#22d3ee",
500: "#06b6d4",
600: "#0891b2",
700: "#0e7490",
800: "#155e75",
900: "#164e63",
950: "#083344"
},
sky: {
50: "#f0f9ff",
100: "#e0f2fe",
200: "#bae6fd",
300: "#7dd3fc",
400: "#38bdf8",
500: "#0ea5e9",
600: "#0284c7",
700: "#0369a1",
800: "#075985",
900: "#0c4a6e",
950: "#082f49"
},
blue: {
50: "#eff6ff",
100: "#dbeafe",
200: "#bfdbfe",
300: "#93c5fd",
400: "#60a5fa",
500: "#3b82f6",
600: "#2563eb",
700: "#1d4ed8",
800: "#1e40af",
900: "#1e3a8a",
950: "#172554"
},
indigo: {
50: "#eef2ff",
100: "#e0e7ff",
200: "#c7d2fe",
300: "#a5b4fc",
400: "#818cf8",
500: "#6366f1",
600: "#4f46e5",
700: "#4338ca",
800: "#3730a3",
900: "#312e81",
950: "#1e1b4b"
},
violet: {
50: "#f5f3ff",
100: "#ede9fe",
200: "#ddd6fe",
300: "#c4b5fd",
400: "#a78bfa",
500: "#8b5cf6",
600: "#7c3aed",
700: "#6d28d9",
800: "#5b21b6",
900: "#4c1d95",
950: "#2e1065"
},
purple: {
50: "#faf5ff",
100: "#f3e8ff",
200: "#e9d5ff",
300: "#d8b4fe",
400: "#c084fc",
500: "#a855f7",
600: "#9333ea",
700: "#7e22ce",
800: "#6b21a8",
900: "#581c87",
950: "#3b0764"
},
fuchsia: {
50: "#fdf4ff",
100: "#fae8ff",
200: "#f5d0fe",
300: "#f0abfc",
400: "#e879f9",
500: "#d946ef",
600: "#c026d3",
700: "#a21caf",
800: "#86198f",
900: "#701a75",
950: "#4a044e"
},
pink: {
50: "#fdf2f8",
100: "#fce7f3",
200: "#fbcfe8",
300: "#f9a8d4",
400: "#f472b6",
500: "#ec4899",
600: "#db2777",
700: "#be185d",
800: "#9d174d",
900: "#831843",
950: "#500724"
},
rose: {
50: "#fff1f2",
100: "#ffe4e6",
200: "#fecdd3",
300: "#fda4af",
400: "#fb7185",
500: "#f43f5e",
600: "#e11d48",
700: "#be123c",
800: "#9f1239",
900: "#881337",
950: "#4c0519"
}
},
},
}
</script>
</head>
<body class="bg-modern-dark-black text-gold-300 max-w-4xl">
<div id="app" class="min-h-screen p-2">
<div class="max-w-4xl mx-auto">
<div class="bg-modern-black p-6 rounded-lg shadow-lg">
<!-- Logo -->
<div class="flex justify-center">
<img src="https://modernuo.com/branding/logo.svg" class="h-24 w-24">
</div>
<!-- Title -->
<h1 class="text-center text-white text-3xl opacity-70 p-2 pb-12 font-light">ModernUO Commands</h1>
<!-- Tabs -->
<ul id="tabs" class="flex mb-0 list-none flex-wrap pt-3 pb-4 flex-row place-content-center">
<!-- JavaScript will populate tabs here -->
</ul>
<!-- Tab Content -->
<div id="tabContent" class="border-t border-gold-500">
<!-- JavaScript will populate tab content here -->
</div>
</div>
</div>
</div>
<!-- Toolip -->
<div id="tooltip" class="absolute p-2 bg-modern-black text-white rounded-md shadow-lg max-w-xs md:max-w-sm lg:max-w-md xl:max-w-lg hidden"></div>
<span id="commands" style="display:none; visibility: hidden">
<!-- COMMANDS -->
</span>
<span id="modifiers" style="display:none; visibility: hidden">
<!-- MODIFIERS -->
</span>
<script>
/*
Modifiers Structure:
{
"modifier": {
name: "Modifier",
usage: "[modifier <command> [condition]",
description: "long description. Optional condition arguments can further restrict the set of objects."
}
}
*/
let allModifiers = {};
try {
allModifiers = JSON.parse(document.querySelectorAll('#modifiers')[0].innerText.trim() || {});
} catch {}
/*
Commands Structure:
{
"AccessLevel": [
{
command: "CommandName",
aliases: ["cn"],
usage: "CommandName <options>",
modifiers: ["Global", "Online", "Region", "Multi", "Area", "Self"],
description: "Long Description"
}
]
}
*/
let commands = {};
try {
commands = JSON.parse(document.querySelectorAll('#commands')[0].innerText.trim() || {});
} catch {}
function createTab(name, selected) {
const tab = document.createElement("li");
tab.className = "mr-2 last:mr-0 flex-auto text-center";
const tabLink = document.createElement("a");
tabLink.href = "#";
tabLink.className = "text-xs font-bold uppercase px-5 py-3 rounded block leading-normal text-white bg-modern-black hover:bg-modern-black-hover hover:bg-opacity-70 transition-background-color ease-in-out duration-700";
tabLink.innerText = name;
tabLink.onclick = function (e) {
e.preventDefault();
document.querySelectorAll("#tabs a").forEach(tab => {
tab.classList.remove("bg-gold-500", "text-modern-black");
tab.classList.add("bg-modern-black", "text-white", "hover:bg-modern-black-hover", "hover:bg-opacity-70");
});
tabLink.classList.remove("bg-gold-900", "text-white", "hover:bg-modern-black-hover", "hover:bg-opacity-70");
tabLink.classList.add("bg-gold-500", "text-modern-black");
loadTabContent(name);
};
if (selected) {
tabLink.classList.remove("bg-gold-900", "text-white", "hover:bg-modern-black-hover", "hover:bg-opacity-70");
tabLink.classList.add("bg-gold-500", "text-modern-black");
}
tab.appendChild(tabLink);
return tab;
}
function createTable(tabData) {
let table = `<table class="min-w-full border-collapse table-fixed"><tbody>`;
tabData.forEach(item => {
table += `
<tr class="border-b border-gold-500">
<td class="xs:px-2 py-4 text-sm font-medium text-gold-500 w-1/3 m-w-1/2"><p class="break-all">${item.name}</p></td>
<td class="text-sm text-gold-900 pl-4 py-4">
`;
const usageParts = (item.usage || item.name).split(" ");
const usage = `${usageParts[0]} <span class='text-gold-700 font-light'>${usageParts.slice(1).join(" ")}</span>`;
table += `<div class="text-white">Usage: <span class="font-bold text-gold-500">${usage}</span></div>`;
if (item.aliases && item.aliases.length > 0) {
table += `<div class="text-white">Aliases: <span class="text-gold-500">${item.aliases.join(", ")}</span></div>`;
}
if (item.modifiers && item.modifiers.length > 0) {
table += "<div>";
item.modifiers.forEach((mod, index) => {
table += `<span class="modifier cursor-pointer italic text-gold-300"
data-modifier="${mod}"
data-command="${item.name}">${mod}</span>${index !== item.modifiers.length - 1 ? ", " : ""}`;
});
table += "</div>";
}
if (item.description) {
table += `<div class="text-white pt-2">${item.description}</div>`;
}
table += "</td></tr>";
});
table += "</tbody></table>";
return table;
}
function loadTabContent(tabName) {
const tabContent = document.getElementById("tabContent");
tabContent.innerHTML = createTable(commands[tabName]);
// Add event listeners to modifiers
const modifiers = document.querySelectorAll(".modifier");
modifiers.forEach(el => {
el.addEventListener("mouseenter", (event) => {
showTooltip(el, event);
});
el.addEventListener("touchstart", (event) => {
showTooltip(el, event, true);
});
el.addEventListener("mouseleave", hideTooltip);
// el.addEventListener('touchend', hideTooltip);
});
}
function initTabs() {
const tabsContainer = document.getElementById("tabs");
Object.keys(commands).forEach((tabName, index) => {
const tab = createTab(tabName, index === 0);
tabsContainer.appendChild(tab);
if (index === 0) { // Load first tab content by default
loadTabContent(tabName);
}
});
}
let currentShownEl = null;
// Function to show the tooltip
function showTooltip(el, event, isTouchEvent) {
const tooltip = document.getElementById('tooltip');
if (el === currentShownEl && (tooltip.classList.contains('invisible') || !tooltip.classList.contains('hidden'))) {
event.preventDefault();
return;
}
currentShownEl = el;
const mod = allModifiers[el.dataset.modifier];
const command = el.dataset.command.toLowerCase()
let aliases = "";
if (mod.accessors.length > 1) {
aliases = `<p class="text-white">Aliases: <span class="text-gold-500">${mod.accessors.slice(1).join(", ")}</span></p>`;
}
const usageParts = (mod.usage || mod.accessors[0]).split(" ");
const usage = `${usageParts[0]} <span class='text-gold-700 font-light'>${usageParts.slice(1).join(" ")}</span>`
.replace("<command>", command);
tooltip.innerHTML = `
<p class="font-bold text-gold-500">${mod.accessors[0]}</p>
<p class="text-white">Access Level: <span class="text-${mod.accessLevel.toLowerCase()}">${mod.accessLevel}</span></p>
${aliases}
<p class="text-white">Usage: <span class="font-bold text-gold-500">${usage}</span></p>
<p class="italic text-white pt-2">${mod.description}</p>
`;
// Make it visible to the DOM so we can get size calculations
tooltip.classList.add('invisible');
tooltip.classList.remove('hidden');
const srcRect = event.target.getBoundingClientRect();
// Calculate the size of the tooltip for positioning
const tooltipRect = tooltip.getBoundingClientRect();
const offset = 20; // Offset from the cursor for the tooltip
const startX = window.scrollX + srcRect.x;
const startY = window.scrollY + srcRect.y;
// Initial horizontal position (with viewport width check for side overflow)
let leftPosition = startX + offset;
if (leftPosition + tooltipRect.width > document.documentElement.clientWidth) {
leftPosition = document.documentElement.clientWidth - tooltipRect.width - offset;
}
// Determine vertical position based on available space
let topPosition;
const spaceAbove = startY - window.scrollY;
const spaceBelow = window.innerHeight - spaceAbove;
// Check if there's enough space below the cursor; otherwise, flip above
if (spaceBelow > tooltipRect.height + offset) {
topPosition = startY + offset;
} else if (spaceAbove > tooltipRect.height + offset) {
topPosition = startY - tooltipRect.height - offset;
} else {
// If neither above nor below has enough space, default to below and adjust to within viewport
topPosition = Math.max(window.scrollY + offset, startY - (tooltipRect.height / 2));
}
// Apply the calculated positions
tooltip.style.left = `${leftPosition}px`;
tooltip.style.top = `${topPosition}px`;
tooltip.classList.remove('invisible');
if (isTouchEvent) {
// Delay hiding tooltip to allow it to be seen
setTimeout(() => {
document.addEventListener('touchstart', hideTooltipOnNextTouch, { passive: false });
}, 10);
}
}
// Function to hide the tooltip
function hideTooltip() {
document.removeEventListener('touchstart', hideTooltipOnNextTouch);
const tooltip = document.getElementById("tooltip");
tooltip.classList.add("hidden");
}
function hideTooltipOnNextTouch(event) {
// Check if the touch is outside the tooltip, if so, hide the tooltip
if (event.target !== currentShownEl && !event.target.matches('#tooltip, #tooltip *')) {
hideTooltip();
} else { event.preventDefault(); }
}
initTabs();
</script>
</body>
</html>