<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt">
	<id>https://wiki.atlax2.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AScript%2FTabber.js</id>
	<title>MediaWiki:Script/Tabber.js - Histórico de revisões</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.atlax2.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AScript%2FTabber.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.atlax2.com/index.php?title=MediaWiki:Script/Tabber.js&amp;action=history"/>
	<updated>2026-06-17T12:43:03Z</updated>
	<subtitle>Histórico de edições para esta página nesta wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.atlax2.com/index.php?title=MediaWiki:Script/Tabber.js&amp;diff=676&amp;oldid=prev</id>
		<title>Tmbt1ag0: Criou a página com &quot;function changeDisplay(button, textContainer, method) {   button.classList[method](&quot;tabber-active&quot;);   textContainer.children[button.dataset.position].classList[method](&quot;tabber-active&quot;); }  function globalChange(button, allButton, allText, toggleButton, changeUrl, bool = false) {   var activeButton = allButton.querySelector(&quot;.tabber-active&quot;);   if (toggleButton || button !== activeButton) {     if (bool &amp;&amp; changeUrl) {       var newHash = &quot;#&quot;+button.id;       history.p...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.atlax2.com/index.php?title=MediaWiki:Script/Tabber.js&amp;diff=676&amp;oldid=prev"/>
		<updated>2026-03-29T20:55:15Z</updated>

		<summary type="html">&lt;p&gt;Criou a página com &amp;quot;function changeDisplay(button, textContainer, method) {   button.classList[method](&amp;quot;tabber-active&amp;quot;);   textContainer.children[button.dataset.position].classList[method](&amp;quot;tabber-active&amp;quot;); }  function globalChange(button, allButton, allText, toggleButton, changeUrl, bool = false) {   var activeButton = allButton.querySelector(&amp;quot;.tabber-active&amp;quot;);   if (toggleButton || button !== activeButton) {     if (bool &amp;amp;&amp;amp; changeUrl) {       var newHash = &amp;quot;#&amp;quot;+button.id;       history.p...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nova página&lt;/b&gt;&lt;/p&gt;&lt;div&gt;function changeDisplay(button, textContainer, method) {&lt;br /&gt;
  button.classList[method](&amp;quot;tabber-active&amp;quot;);&lt;br /&gt;
  textContainer.children[button.dataset.position].classList[method](&amp;quot;tabber-active&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function globalChange(button, allButton, allText, toggleButton, changeUrl, bool = false) {&lt;br /&gt;
  var activeButton = allButton.querySelector(&amp;quot;.tabber-active&amp;quot;);&lt;br /&gt;
  if (toggleButton || button !== activeButton) {&lt;br /&gt;
    if (bool &amp;amp;&amp;amp; changeUrl) {&lt;br /&gt;
      var newHash = &amp;quot;#&amp;quot;+button.id;&lt;br /&gt;
      history.pushState({}, &amp;quot;&amp;quot;, newHash);&lt;br /&gt;
    }&lt;br /&gt;
    changeDisplay(button, allText, &amp;quot;toggle&amp;quot;);&lt;br /&gt;
    if (button !== activeButton &amp;amp;&amp;amp; activeButton !== null) {&lt;br /&gt;
      changeDisplay(activeButton, allText, &amp;quot;remove&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function updateTabber(buttonContainer, textContainer, toggleButton, changeUrl) {&lt;br /&gt;
  var targetButton = buttonContainer.querySelector(&amp;quot;:target&amp;quot;);&lt;br /&gt;
  if (targetButton !== null &amp;amp;&amp;amp; targetButton.classList.contains(&amp;quot;button&amp;quot;)) {&lt;br /&gt;
    globalChange(targetButton, buttonContainer, textContainer, false, false);&lt;br /&gt;
  }&lt;br /&gt;
  buttonContainer.addEventListener(&amp;quot;click&amp;quot;, function(event) {&lt;br /&gt;
    var target = event.target.closest(&amp;quot;.button&amp;quot;);&lt;br /&gt;
    if (target) {&lt;br /&gt;
      globalChange(target, buttonContainer, textContainer, toggleButton, changeUrl, true);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function updateTabberWithUrlChange() {&lt;br /&gt;
  window.addEventListener(&amp;quot;hashchange&amp;quot;, function(e) {&lt;br /&gt;
  var newHash = e.target.location.hash;&lt;br /&gt;
  if (newHash !== &amp;quot;&amp;quot;) {&lt;br /&gt;
    var targetButton = document.getElementById(newHash.slice(1));&lt;br /&gt;
    if (targetButton) {&lt;br /&gt;
      if (targetButton.classList.contains(&amp;quot;button&amp;quot;)) {&lt;br /&gt;
        var [buttonContainer, textContainer] = targetButton.parentElement.parentElement.children;&lt;br /&gt;
        globalChange(targetButton, buttonContainer, textContainer, false, false);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
  var tabberContainer = document.querySelectorAll(&amp;quot;div.tabber-container&amp;quot;);&lt;br /&gt;
  tabberContainer.forEach(function(tabber) {&lt;br /&gt;
    var [buttonContainer, textContainer] = tabber.children;&lt;br /&gt;
    var toggleButton = tabber.dataset.toggle === &amp;quot;1&amp;quot;;&lt;br /&gt;
    var changeUrl = tabber.dataset.url === &amp;quot;1&amp;quot;;&lt;br /&gt;
    updateTabber(buttonContainer, textContainer, toggleButton, changeUrl);&lt;br /&gt;
  });&lt;br /&gt;
  updateTabberWithUrlChange();&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/* NOVO */&lt;br /&gt;
&lt;br /&gt;
class SpawnLayerManager {&lt;br /&gt;
  static SPAWN_COLOR_KEY = &amp;quot;mt2.spawn.color&amp;quot;;&lt;br /&gt;
  static OPTION_MAPPING = {&lt;br /&gt;
    0: &amp;quot;🟥 Vermelho&amp;quot;,&lt;br /&gt;
    50: &amp;quot;🟫 Castanho&amp;quot;,&lt;br /&gt;
    140: &amp;quot;🟩 Verde&amp;quot;,&lt;br /&gt;
    230: &amp;quot;🟦 Azul&amp;quot;,&lt;br /&gt;
    290: &amp;quot;🟪 Roxo&amp;quot;,&lt;br /&gt;
    black: &amp;quot;⬛ Preto&amp;quot;,&lt;br /&gt;
    white: &amp;quot;⬜ Branco&amp;quot;,&lt;br /&gt;
  };&lt;br /&gt;
  static STYLE_MAPPING = {&lt;br /&gt;
    position: &amp;quot;absolute&amp;quot;,&lt;br /&gt;
    top: &amp;quot;0&amp;quot;,&lt;br /&gt;
    left: &amp;quot;0&amp;quot;,&lt;br /&gt;
    margin: &amp;quot;4px&amp;quot;,&lt;br /&gt;
    background: &amp;quot;#434242b3&amp;quot;,&lt;br /&gt;
    color: &amp;quot;white&amp;quot;,&lt;br /&gt;
    borderRadius: &amp;quot;5px&amp;quot;,&lt;br /&gt;
    cursor: &amp;quot;pointer&amp;quot;,&lt;br /&gt;
    border: &amp;quot;1px white solid&amp;quot;,&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  constructor(containerSelector = &amp;quot;.spawn-map-container&amp;quot;) {&lt;br /&gt;
    this.containerSelector = containerSelector;&lt;br /&gt;
    this.currentFilter = null;&lt;br /&gt;
    this.selects = [];&lt;br /&gt;
    this.spawnLayers = [];&lt;br /&gt;
    this.isClipboardImageSupported = this._isClipboardImageSupported();&lt;br /&gt;
    this._initialize();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _isClipboardImageSupported() {&lt;br /&gt;
    const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);&lt;br /&gt;
    return !!(navigator.clipboard?.write &amp;amp;&amp;amp; window.ClipboardItem) &amp;amp;&amp;amp; !isSafari;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _initialize() {&lt;br /&gt;
    const containers = this._getContainers();&lt;br /&gt;
    if (!containers.length) return;&lt;br /&gt;
&lt;br /&gt;
    containers.forEach((container) =&amp;gt; this._setupContainer(container));&lt;br /&gt;
&lt;br /&gt;
    const savedColor = this._getSavedColor();&lt;br /&gt;
    if (savedColor) this._applyColor(savedColor);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _getContainers() {&lt;br /&gt;
    return document.querySelectorAll(this.containerSelector);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _getSavedColor() {&lt;br /&gt;
    return localStorage.getItem(SpawnLayerManager.SPAWN_COLOR_KEY);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _saveColor(value) {&lt;br /&gt;
    localStorage.setItem(SpawnLayerManager.SPAWN_COLOR_KEY, value);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _setupContainer(container) {&lt;br /&gt;
    const [mapContainer, spawnContainer] = container.children;&lt;br /&gt;
&lt;br /&gt;
    if (!mapContainer || !spawnContainer) return;&lt;br /&gt;
&lt;br /&gt;
    const map = mapContainer.querySelector(&amp;quot;img&amp;quot;);&lt;br /&gt;
    const spawnLayer = spawnContainer.querySelector(&amp;quot;img&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!map || !spawnLayer) return;&lt;br /&gt;
&lt;br /&gt;
    const select = this._createColorSelect();&lt;br /&gt;
    spawnContainer.appendChild(select);&lt;br /&gt;
&lt;br /&gt;
    this.selects.push(select);&lt;br /&gt;
    this.spawnLayers.push(spawnLayer);&lt;br /&gt;
&lt;br /&gt;
    select.addEventListener(&amp;quot;change&amp;quot;, (e) =&amp;gt; this._onColorChange(e));&lt;br /&gt;
&lt;br /&gt;
    if (this.isClipboardImageSupported) {&lt;br /&gt;
      this._setupCopyButton(spawnContainer, map, spawnLayer);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _createColorSelect() {&lt;br /&gt;
    const select = document.createElement(&amp;quot;select&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (const [value, label] of Object.entries(&lt;br /&gt;
      SpawnLayerManager.OPTION_MAPPING&lt;br /&gt;
    )) {&lt;br /&gt;
      const option = document.createElement(&amp;quot;option&amp;quot;);&lt;br /&gt;
      option.value = value;&lt;br /&gt;
      option.textContent = label;&lt;br /&gt;
      select.appendChild(option);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Object.assign(select.style, SpawnLayerManager.STYLE_MAPPING);&lt;br /&gt;
    return select;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _onColorChange(event) {&lt;br /&gt;
    const value = event.target.value;&lt;br /&gt;
    this._applyColor(value);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _applyColor(value) {&lt;br /&gt;
    if (!SpawnLayerManager.OPTION_MAPPING.hasOwnProperty(value)) return;&lt;br /&gt;
&lt;br /&gt;
    const filter = this._getFilterForValue(value);&lt;br /&gt;
    this.currentFilter = filter;&lt;br /&gt;
&lt;br /&gt;
    this.selects.forEach((select) =&amp;gt; (select.value = value));&lt;br /&gt;
    this.spawnLayers.forEach((layer) =&amp;gt; (layer.style.filter = filter));&lt;br /&gt;
    this._saveColor(value);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _getFilterForValue(value) {&lt;br /&gt;
    switch (value) {&lt;br /&gt;
      case &amp;quot;black&amp;quot;:&lt;br /&gt;
        return &amp;quot;invert(1) brightness(0) contrast(100%)&amp;quot;;&lt;br /&gt;
      case &amp;quot;white&amp;quot;:&lt;br /&gt;
        return &amp;quot;invert(1) sepia(1) saturate(100%) brightness(3)&amp;quot;;&lt;br /&gt;
      default:&lt;br /&gt;
        return `hue-rotate(${value}deg)`;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _setupCopyButton(spawnContainer, map, spawnLayer) {&lt;br /&gt;
    const copyButton = spawnContainer.querySelector(&amp;quot;.copy-to-clipboard&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!copyButton) return;&lt;br /&gt;
&lt;br /&gt;
    const defaultEmoji = copyButton.querySelector(&amp;quot;[data-default]&amp;quot;);&lt;br /&gt;
    const clickedEmoji = copyButton.querySelector(&amp;quot;[data-clicked]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (!defaultEmoji || !clickedEmoji) return;&lt;br /&gt;
&lt;br /&gt;
    showElement(copyButton);&lt;br /&gt;
&lt;br /&gt;
    copyButton.addEventListener(&amp;quot;click&amp;quot;, () =&amp;gt; {&lt;br /&gt;
      this._copyCombinedImageToClipboard(map, spawnLayer);&lt;br /&gt;
      this._copyAnimation(defaultEmoji, clickedEmoji);&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _copyCombinedImageToClipboard(map, spawnLayer) {&lt;br /&gt;
    const canvas = document.createElement(&amp;quot;canvas&amp;quot;);&lt;br /&gt;
    canvas.width = Math.max(map.naturalWidth, spawnLayer.naturalWidth);&lt;br /&gt;
    canvas.height = Math.max(map.naturalHeight, spawnLayer.naturalHeight);&lt;br /&gt;
&lt;br /&gt;
    const ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
    ctx.drawImage(map, 0, 0);&lt;br /&gt;
&lt;br /&gt;
    const filteredLayer = this._drawFilteredLayer(spawnLayer);&lt;br /&gt;
    ctx.drawImage(filteredLayer, 0, 0);&lt;br /&gt;
&lt;br /&gt;
    this._copyCanvasContentsToClipboard(canvas);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _drawFilteredLayer(layer) {&lt;br /&gt;
    const canvas = document.createElement(&amp;quot;canvas&amp;quot;);&lt;br /&gt;
    canvas.width = layer.naturalWidth;&lt;br /&gt;
    canvas.height = layer.naturalHeight;&lt;br /&gt;
&lt;br /&gt;
    const ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
    ctx.filter = this.currentFilter || &amp;quot;none&amp;quot;;&lt;br /&gt;
    ctx.drawImage(layer, 0, 0);&lt;br /&gt;
&lt;br /&gt;
    return canvas;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  async _getBlobFromCanvas(canvas) {&lt;br /&gt;
    return new Promise((resolve, reject) =&amp;gt; {&lt;br /&gt;
      canvas.toBlob((blob) =&amp;gt; {&lt;br /&gt;
        if (blob) {&lt;br /&gt;
          resolve(blob);&lt;br /&gt;
        } else {&lt;br /&gt;
          reject(new Error(&amp;quot;Canvas toBlob failed&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  async _copyCanvasContentsToClipboard(canvas) {&lt;br /&gt;
    try {&lt;br /&gt;
      const blob = await this._getBlobFromCanvas(canvas);&lt;br /&gt;
      const data = [new ClipboardItem({ [blob.type]: blob })];&lt;br /&gt;
      await navigator.clipboard.write(data);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      console.error(error);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  _copyAnimation(defaultEmoji, clickedEmoji) {&lt;br /&gt;
    hideElement(defaultEmoji);&lt;br /&gt;
    showElement(clickedEmoji);&lt;br /&gt;
&lt;br /&gt;
    setTimeout(() =&amp;gt; {&lt;br /&gt;
      hideElement(clickedEmoji);&lt;br /&gt;
      showElement(defaultEmoji);&lt;br /&gt;
    }, 1500);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
new SpawnLayerManager();&lt;/div&gt;</summary>
		<author><name>Tmbt1ag0</name></author>
	</entry>
</feed>