Constant ITEMS_JS
Source const ITEMS_JS: &str = "\"use strict\";\n\nconst itemsState = {\n ilvl: \"all\",\n limit: \"20\",\n mode: \"pct\",\n scenario: \"patchwerk\",\n spec: null,\n tab: \"spec\",\n};\n\nconst itemsUrlKeys = {\n ilvl: (v) => itemsSelectIlvl(v),\n limit: (v) => itemsSelectLimit(v),\n mode: (v) => itemsSelectMode(v),\n scenario: (v) => itemsSelectScenario(v),\n spec: (v) => {\n const sel = document.getElementById(\"spec-select\");\n if (sel) {\n sel.value = v;\n }\n itemsSelectSpec(v);\n },\n tab: (v) => switchSection(v),\n};\n\nlet itemsLoading = false;\nlet itemsNameToIdCache = null;\n\nfunction itemsBarClick(params) {\n const id = itemsNameToId()[params?.name];\n if (!id) {\n return;\n }\n window.open(\n `https://wowlab.gg/inspect/item/${id}`,\n \"_blank\",\n \"noopener noreferrer\",\n );\n}\n\nfunction itemsLoadUrl() {\n const params = new URLSearchParams(window.location.search);\n itemsLoading = true;\n try {\n for (const [key, setter] of Object.entries(itemsUrlKeys)) {\n const value = params.get(key);\n if (value !== null) {\n setter(value);\n }\n }\n } finally {\n itemsLoading = false;\n }\n itemsSyncUrl();\n}\n\nfunction itemsNameToId() {\n if (itemsNameToIdCache) {\n return itemsNameToIdCache;\n }\n const script = document.getElementById(\"items-name-to-id\");\n itemsNameToIdCache = script ? (parseJSON(script) ?? {}) : {};\n return itemsNameToIdCache;\n}\n\nfunction itemsRenderChart() {\n const { limit, mode, scenario, spec } = itemsState;\n if (!spec) {\n return;\n }\n\n const script = document.getElementById(\n `items-bars-${mode}-${spec}-${scenario}`,\n );\n if (!script) {\n return;\n }\n\n const opts = parseJSON(script);\n if (!opts) {\n return;\n }\n\n const n = Number.parseInt(limit, 10);\n if (Number.isFinite(n) && n > 0) {\n const yAxis = Array.isArray(opts.yAxis) ? opts.yAxis[0] : opts.yAxis;\n if (Array.isArray(yAxis?.data)) {\n yAxis.data = yAxis.data.slice(0, n);\n }\n if (Array.isArray(opts.series)) {\n for (const s of opts.series) {\n if (Array.isArray(s.data)) {\n s.data = s.data.slice(0, n);\n }\n }\n }\n }\n\n const chartKey = `items-bars-${spec}`;\n const containers = document.querySelectorAll(\n `.spec-view[data-spec=\"${spec}\"] [data-chart=\"${chartKey}\"]`,\n );\n for (const el of containers) {\n initChart(el, opts);\n charts[el.dataset.chart]?.on(\"click\", itemsBarClick);\n }\n}\n\nfunction itemsSelectIlvl(value) {\n itemsState.ilvl = value;\n itemsSetActive(\"ilvl-group\", \"ilvl\", value);\n for (const row of document.querySelectorAll(\".ilvl-row\")) {\n row.hidden = !(value === \"all\" || row.dataset.ilvl === value);\n }\n itemsSyncUrl();\n}\n\nfunction itemsSelectLimit(value) {\n itemsState.limit = value;\n itemsSetActive(\"limit-group\", \"limit\", value);\n itemsRenderChart();\n itemsSyncUrl();\n}\n\nfunction itemsSelectMode(value) {\n itemsState.mode = value;\n itemsSetActive(\"mode-group\", \"mode\", value);\n itemsRenderChart();\n itemsSyncUrl();\n}\n\nfunction itemsSelectScenario(value) {\n itemsState.scenario = value;\n itemsSetActive(\"scenario-group\", \"scenario\", value);\n itemsRenderChart();\n itemsSyncUrl();\n}\n\nfunction itemsSelectSpec(slug) {\n itemsState.spec = slug;\n for (const el of document.querySelectorAll(\".spec-view\")) {\n el.hidden = el.dataset.spec !== slug;\n }\n itemsRenderChart();\n itemsSyncUrl();\n}\n\nfunction itemsSetActive(groupId, datasetKey, value) {\n const group = document.getElementById(groupId);\n if (!group) {\n return;\n }\n for (const btn of group.querySelectorAll(`button[data-${datasetKey}]`)) {\n const match = btn.dataset[datasetKey] === value;\n btn.classList.toggle(\"is-active\", match);\n btn.setAttribute(\"aria-pressed\", match ? \"true\" : \"false\");\n }\n}\n\nfunction itemsSyncUrl() {\n if (itemsLoading) {\n return;\n }\n const params = new URLSearchParams();\n for (const key of Object.keys(itemsUrlKeys)) {\n const value = itemsState[key];\n if (value != null && value !== \"\") {\n params.set(key, value);\n }\n }\n const qs = params.toString();\n const url = `${window.location.pathname}${qs ? `?${qs}` : \"\"}${window.location.hash}`;\n window.history.replaceState(null, \"\", url);\n}\n\n{\n const original = window.switchSection;\n if (typeof original === \"function\") {\n window.switchSection = (id) => {\n original(id);\n itemsState.tab = id;\n itemsSyncUrl();\n };\n }\n}\n\nitemsLoading = true;\ntry {\n itemsSelectMode(\"pct\");\n itemsSelectScenario(\"patchwerk\");\n itemsSelectLimit(\"20\");\n itemsSelectIlvl(\"all\");\n const specSelect = document.getElementById(\"spec-select\");\n if (specSelect) {\n itemsSelectSpec(specSelect.value);\n }\n} finally {\n itemsLoading = false;\n}\nitemsLoadUrl();\n";