匿名
未登录
中文(中国大陆)
创建账号
登录
Limbo Wiki
搜索
这是测试站点!!!!
不要保存重要内容!不要保存重要内容!不要保存重要内容!不要保存重要内容!不要保存重要内容!
查看“︁微件:PD卡牌”︁的源代码
来自Limbo Wiki
命名空间
微件
讨论
更多
更多
页面操作
中文(中国大陆)
阅读
查看源代码
历史
←
微件:PD卡牌
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于这些用户组的用户执行:
管理员
、
邮箱已验证用户
、FullUser
您没有权限编辑
微件
命名空间内的页面。
您可以查看和复制此页面的源代码。
<script> /* Project Divide unified card interface. Loaded only by its widget; no dependencies. */ (function () { 'use strict'; if (window.pdCards) { window.pdCards.init(); return; } var packs = [], reduce = window.matchMedia('(prefers-reduced-motion: reduce)'); var collator = new Intl.Collator('zh-Hans-CN-u-co-pinyin', { numeric: true, sensitivity: 'base' }); function button(text, action) { var b = document.createElement('button'); b.type = 'button'; b.textContent = text; b.addEventListener('click', action); return b; } function cancelEffects(s) { (s.effects || []).forEach(function (a) { a.cancel(); }); s.effects = []; if (s.move) { s.move.cancel(); s.move = null; } } function clearHeight(s) { s.detail.hidden = !s.open; s.detail.inert = !s.open; s.detail.style.height = ''; s.detail.style.overflow = ''; s.detail.style.opacity = ''; } function settle(s) { if (s.animation) { s.animation.cancel(); s.animation = null; } cancelEffects(s); clearHeight(s); } function near(rect) { return rect.bottom > -100 && rect.top < window.innerHeight + 100; } function layers(s) { var items = [], rules = s.detail.querySelector('.pd-card-ui-rules'); s.detail.querySelectorAll('.pd-card-ui-label').forEach(function (el) { items.push({ el: el, delay: 0 }); }); var skills = Array.from(rules ? rules.children : []).filter(function (el) { return el.classList.contains('pd-skill'); }); if (skills.length) skills.forEach(function (el, i) { items.push({ el: el, delay: 100 + Math.min(i * 25, 100) }); }); else if (rules) items.push({ el: rules, delay: 100 }); s.detail.querySelectorAll('.pd-card-ui-field').forEach(function (field, i) { Array.from(field.children).filter(function (el) { return !el.classList.contains('pd-card-ui-label'); }).forEach(function (el) { items.push({ el: el, delay: 100 + Math.min(i * 25, 100) }); }); }); var credit = s.detail.querySelector('.pd-card-ui-credit'); if (credit) items.push({ el: credit, delay: 150 }); return items; } function toggle(s, open, immediate) { if (s.open === open && !immediate) return; var wasHidden = s.detail.hidden; var cs = getComputedStyle(s.detail); var height = wasHidden ? 0 : s.detail.getBoundingClientRect().height - parseFloat(cs.borderTopWidth) - parseFloat(cs.borderBottomWidth); var parts = layers(s).map(function (item) { var style = getComputedStyle(item.el); item.opacity = wasHidden ? 0 : Number(style.opacity); item.transform = wasHidden ? 'translateY(6px)' : style.transform; return item; }); if (s.animation) { s.animation.cancel(); s.animation = null; } cancelEffects(s); if (!open && s.detail.contains(document.activeElement)) s.button.focus({ preventScroll: true }); s.open = open; s.button.setAttribute('aria-expanded', String(open)); s.summary.setAttribute('data-expanded', String(open)); s.detail.inert = !open; s.detail.hidden = false; if (immediate || reduce.matches || !s.detail.animate) { settle(s); return; } s.detail.style.overflow = 'hidden'; parts.forEach(function (item) { var effect = item.el.animate([ { opacity: item.opacity, transform: item.transform }, { opacity: open ? 1 : 0, transform: open ? 'translateY(0)' : item.transform } ], { duration: open ? 250 : 100, delay: open && wasHidden ? item.delay : 0, easing: 'cubic-bezier(.2,.7,.2,1)', fill: 'both' }); s.effects.push(effect); effect.onfinish = function () { if (open) { effect.cancel(); s.effects = s.effects.filter(function (a) { return a !== effect; }); } }; }); var a = s.detail.animate([{ height: Math.max(0, height) + 'px' }, { height: (open ? s.detail.scrollHeight : 0) + 'px' }], { duration: open ? 300 : 200, easing: 'cubic-bezier(.2,.7,.2,1)', fill: 'both' }); s.animation = a; a.onfinish = function () { if (s.animation !== a) return; a.cancel(); s.animation = null; if (open) clearHeight(s); else settle(s); }; } function batch(p, open) { var visible = p.states.map(function (s) { var r = s.card.getBoundingClientRect(); return r.bottom > 0 && r.top < window.innerHeight; }); p.states.forEach(function (s, i) { toggle(s, open, !visible[i]); }); } function numeric(raw) { var v = raw.trim().replace(/−/g, '-'); return /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$/.test(v) ? Number(v) : null; } function placeIcons(s) { var group = s.indicators || s.summary.querySelector('.pd-card-ui-indicators'); if (!group) return; s.indicators = group; var container = window.innerWidth < 700 ? s.summary.querySelector('.pd-card-ui-type') : s.summary.querySelector('.pd-card-ui-name'); if (group.parentNode !== container) { if (window.innerWidth < 700) container.insertBefore(group, container.firstChild); else container.appendChild(group); } } function glyph(type) { var ns = 'http://www.w3.org/2000/svg'; var svg = document.createElementNS(ns, 'svg'); svg.setAttribute('viewBox', '0 0 14 14'); svg.setAttribute('width', '14'); svg.setAttribute('height', '14'); svg.setAttribute('aria-hidden', 'true'); svg.setAttribute('focusable', 'false'); var shape; if (type === '被动') { shape = document.createElementNS(ns, 'circle'); shape.setAttribute('cx', '7'); shape.setAttribute('cy', '7'); shape.setAttribute('r', '5.5'); } else if (type === '主动') { shape = document.createElementNS(ns, 'rect'); shape.setAttribute('x', '1.5'); shape.setAttribute('y', '1.5'); shape.setAttribute('width', '11'); shape.setAttribute('height', '11'); } else { shape = document.createElementNS(ns, 'polygon'); shape.setAttribute('points', type === '特殊' ? '7,0.7 8.9,4.7 13.3,5.3 10.1,8.4 10.9,12.8 7,10.7 3.1,12.8 3.9,8.4 0.7,5.3 5.1,4.7' : '7,1.6 12.3,11.9 1.7,11.9'); } shape.setAttribute('fill', type === '离场' ? 'none' : 'currentColor'); if (type === '离场') { shape.setAttribute('stroke', 'currentColor'); shape.setAttribute('stroke-width', '1.6'); shape.setAttribute('stroke-linejoin', 'round'); } svg.appendChild(shape); return svg; } function enhanceDetails(detail) { detail.querySelectorAll('.pd-card-ui-tags').forEach(function (source) { if (source.dataset.pdTagsReady) return; var result = document.createDocumentFragment(), tag = document.createElement('span'); tag.className = 'pd-card-ui-tag'; function finish() { var walker = document.createTreeWalker(tag, NodeFilter.SHOW_TEXT), first; while ((first = walker.nextNode())) { if (first.textContent.trim()) { first.textContent = first.textContent.replace(/^\s*·\s*/, ''); break; } } if (tag.textContent.trim()) result.appendChild(tag); tag = document.createElement('span'); tag.className = 'pd-card-ui-tag'; } function visit(node) { if (node.nodeType === 1 && node.tagName === 'BR') { finish(); return; } if (node.nodeType === 1 && /^(P|UL|OL|LI|DIV)$/.test(node.tagName)) { finish(); Array.from(node.childNodes).forEach(visit); finish(); return; } // Split inline markup at explicit line breaks without flattening its links or formatting. if (node.nodeType === 1 && node.querySelector('br')) { while (node.querySelector('br')) { var br = node.querySelector('br'), range = document.createRange(); range.setStart(node, 0); range.setEndBefore(br); var shell = node.cloneNode(false); shell.appendChild(range.extractContents()); tag.appendChild(shell); br.remove(); finish(); } } tag.appendChild(node); } Array.from(source.childNodes).forEach(visit); finish(); source.replaceChildren(result); source.dataset.pdTagsReady = 'true'; }); } var activeSkill = null; function selectSkill(skill) { if (activeSkill) activeSkill.classList.remove('pd-card-ui-skill-active'); activeSkill = skill; if (activeSkill) activeSkill.classList.add('pd-card-ui-skill-active'); } function ownSkill(target) { var skill = target.closest('.pd-skill'); while (skill && skill.parentElement.closest('.pd-skill')) skill = skill.parentElement.closest('.pd-skill'); return skill && skill.id && skill.closest('.pd-card-ui-rules') ? skill : null; } function enhanceSkills(s) { var kind = s.card.dataset.kind; if (kind !== '角色' && kind !== '置物') return; var rules = s.detail.querySelector('.pd-card-ui-rules'); if (!rules) return; var skills = Array.from(rules.querySelectorAll('.pd-skill')).filter(function (el) { return !el.parentElement.closest('.pd-skill') && el.closest('.pd-card-ui-rules') === rules; }); var icons = document.createElement('span'); icons.className = 'pd-card-ui-skill-icons'; skills.forEach(function (skill, i) { skill.id = s.card.id + '-skill-' + (i + 1); skill.setAttribute('tabindex', '-1'); var heading = skill.querySelector('.pd-skill-title'); var type = heading.querySelector('.pd-skill-type').textContent.trim().replace(/^【|】$/g, ''); var iconType = /主动$/.test(type) ? '主动' : type === '退场' ? '离场' : type; if (['登场','被动','主动','离场','特殊'].indexOf(iconType) < 0) return; var label = type + ':' + heading.querySelector('.pd-skill-name').textContent.trim(); var link = document.createElement('a'); link.className = 'pd-card-ui-skill-link'; link.href = '#' + skill.id; link.title = label; link.setAttribute('aria-label', label); link.appendChild(glyph(iconType)); link.addEventListener('click', function (event) { if (event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return; event.preventDefault(); toggle(s, true, true); selectSkill(skill); if (location.hash !== '#' + skill.id) location.hash = skill.id; skill.focus({ preventScroll: true }); skill.scrollIntoView({ block: 'start', behavior: 'instant' }); }); icons.appendChild(link); }); if (icons.childElementCount) { s.icons = icons; s.indicators = s.summary.querySelector('.pd-card-ui-indicators'); if (!s.indicators) { s.indicators = document.createElement('span'); s.indicators.className = 'pd-card-ui-indicators'; } s.indicators.insertBefore(icons, s.indicators.firstChild); s.summary.classList.add('pd-card-ui-has-skills'); placeIcons(s); } } function key(s, field) { if (field === 'number') return s.number === '未编号' ? null : s.number; if (field === 'name') return s.name; if (field === 'rarity') { var r = ['C', 'B', 'A', 'S'].indexOf(s.card.dataset.rarity.trim()); return r < 0 ? null : r; } return numeric(s.card.dataset[field] || ''); } function sort(p) { var field = p.select.value; p.states.forEach(settle); var before = p.states.map(function (s) { return s.card.getBoundingClientRect(); }); var ordered = p.states.slice().sort(function (a, b) { if (field === 'original') return a.index - b.index; var x = key(a, field), y = key(b, field); if (x === null || y === null) return x === y ? a.index - b.index : x === null ? 1 : -1; var diff = typeof x === 'number' ? x - y : collator.compare(x, y); return diff ? diff * p.direction : a.index - b.index; }); ordered.forEach(function (s) { p.list.appendChild(s.card); }); if (!reduce.matches) p.states.forEach(function (s, i) { if (!s.card.animate) return; var old = before[i], rect = s.card.getBoundingClientRect(), dy = old.top - rect.top; if (Math.abs(dy) < 1 || !near(rect)) return; var shortMove = near(old) && Math.abs(dy) <= 160; var a = s.card.animate(shortMove ? [{ transform: 'translateY(' + dy + 'px)' }, { transform: 'translateY(0)' }] : [{ opacity: .65 }, { opacity: 1 }], { duration: shortMove ? 250 : 160, easing: 'cubic-bezier(.2,.7,.2,1)', fill: 'both' }); s.move = a; a.onfinish = function () { if (s.move === a) { a.cancel(); s.move = null; } }; }); p.directionButton.disabled = field === 'original'; p.directionButton.textContent = p.direction === 1 ? '升序 ↑' : '降序 ↓'; } function assignAnchor(root, card, doc) { if (card.id) return card.id; var original = card.querySelector('.pd-card-ui-summary'); var packId = root.dataset.anchorPrefix || root.dataset.pack || root.dataset.packName || 'cards'; var seed = card.dataset.number.trim() || original.querySelector('.pd-card-ui-name-text').textContent.trim(); var base = 'pd-card-' + (packId + '-' + seed).trim().replace(/\s+/g, '_').replace(/[\u0000-\u001f\u007f]/g, ''), candidate = base, serial = 2; while (doc.getElementById(candidate)) { candidate = base + '-' + serial; serial++; } card.id = candidate; return candidate; } function resolveAnchors(doc) { var ids = []; doc.querySelectorAll('.pd-card-ui-pack-root').forEach(function(root) { Array.from(root.querySelector('.pd-card-ui-list').children).filter(function(c) { return c.classList.contains('pd-card-ui-card'); }).forEach(function(card) { ids.push(assignAnchor(root, card, doc)); }); }); return ids; } function initPack(root) { if (root.dataset.pdCardsReady) return; var p = { root: root, list: root.querySelector('.pd-card-ui-list'), states: [], direction: 1 }; var controls = root.querySelector('.pd-card-ui-controls'); try { Array.from(p.list.children).filter(function (c) { return c.classList.contains('pd-card-ui-card'); }).forEach(function (card, i) { var original = card.querySelector('.pd-card-ui-summary'); assignAnchor(root, card, document); var b = document.createElement('button'); b.type = 'button'; b.className = 'pd-card-ui-toggle'; b.setAttribute('aria-label', original.textContent.trim().replace(/\s+/g, ' ')); var detail = card.querySelector('.pd-card-ui-detail'); detail.id = card.id + '-detail'; b.setAttribute('aria-controls', detail.id); var s = { card: card, button: b, detail: detail, summary: original, index: i, open: false, animation: null, number: original.querySelector('.pd-card-ui-number').textContent.trim(), name: original.querySelector('.pd-card-ui-name-text').textContent.trim() }; p.states.push(s); detail.addEventListener('click', function (event) { var skill = ownSkill(event.target); if (skill) selectSkill(skill); }); detail.addEventListener('focusin', function (event) { var skill = ownSkill(event.target); if (skill) selectSkill(skill); }); original.appendChild(b); b.addEventListener('click', function () { toggle(s, !s.open, false); }); try { enhanceDetails(detail); enhanceSkills(s); placeIcons(s); } catch (error) { if (s.icons) s.icons.remove(); s.icons = null; original.classList.remove('pd-card-ui-has-skills'); console.error('PD skill icons unavailable; skill text retained.', error); } }); var count = document.createElement('span'); count.className = 'pd-card-ui-count'; count.textContent = p.states.length + ' 张卡牌'; var label = document.createElement('label'); label.textContent = '排序方式'; p.select = document.createElement('select'); p.select.style.colorScheme = 'dark'; p.list.style.overflowAnchor = 'none'; [['original','原顺序'],['number','编号'],['name','名字'],['ep','EP'],['bp','BP'],['kb','KB'],['rarity','稀有度']].forEach(function (item) { var option = document.createElement('option'); option.value = item[0]; option.textContent = item[1]; p.select.appendChild(option); }); label.appendChild(p.select); p.directionButton = button('升序 ↑', function () { p.direction *= -1; sort(p); }); p.directionButton.disabled = true; p.select.addEventListener('change', function () { p.direction = 1; sort(p); }); var expand = button('全部展开', function () { batch(p, true); }); var collapse = button('全部收起', function () { batch(p, false); }); p.select.title = 'KB 按正负数值排序;缺失与复合数值排在末尾。'; var sorting = document.createElement('div'); sorting.className = 'pd-card-ui-sort-controls'; var bulk = document.createElement('div'); bulk.className = 'pd-card-ui-bulk-controls'; sorting.append(label, p.directionButton); bulk.append(expand, collapse); controls.append(sorting, bulk); p.states.forEach(function (s) { toggle(s, false, true); }); root.classList.add('pd-card-ui-ready'); root.dataset.pdCardsReady = 'true'; packs.push(p); } catch (error) { p.states.forEach(function (s) { s.open = true; settle(s); s.button.remove(); if (s.icons) s.icons.remove(); s.summary.removeAttribute('data-expanded'); s.summary.classList.remove('pd-card-ui-has-skills'); }); controls.replaceChildren(); root.classList.remove('pd-card-ui-ready'); console.error('PD card demo initialization failed; full content retained.', error); } } function locate() { var id; try { id = decodeURIComponent(location.hash.slice(1)); } catch (_) { return; } var target = document.getElementById(id); selectSkill(target ? ownSkill(target) : null); if (!target) return; packs.forEach(function (p) { p.states.forEach(function (s) { if (s.card === target || s.card.contains(target)) { toggle(s, true, true); requestAnimationFrame(function () { target.scrollIntoView({ block: 'start', behavior: 'instant' }); }); } }); }); } function init() { document.querySelectorAll('.pd-card-ui-pack-root').forEach(initPack); locate(); } window.pdCards = { init: init, resolveAnchors: resolveAnchors, dispose: function (container) { packs = packs.filter(function (p) { if (!container.contains(p.root)) return true; p.states.forEach(settle); return false; }); } }; window.addEventListener('hashchange', locate); window.addEventListener('resize', function () { packs.forEach(function (p) { p.states.forEach(function (s) { settle(s); placeIcons(s); }); }); }); reduce.addEventListener('change', function () { packs.forEach(function (p) { p.states.forEach(settle); }); }); window.addEventListener('beforeprint', function () { packs.forEach(function (p) { p.states.forEach(function (s) { settle(s); s.detail.inert = false; }); }); }); window.addEventListener('afterprint', function () { packs.forEach(function (p) { p.states.forEach(settle); }); }); if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init, { once: true }); else init(); })(); </script>
返回
微件:PD卡牌
。
导航
导航
首页
最近更改
随机页面
操作申请
帮助
入门指南
编辑指南
写作指南
随机
官方
碎数研
谜题保管所
wiki工具
wiki工具
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志