<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.arcane-amberfall.ru/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACitizen.js</id>
	<title>MediaWiki:Citizen.js - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.arcane-amberfall.ru/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACitizen.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.arcane-amberfall.ru/index.php?title=MediaWiki:Citizen.js&amp;action=history"/>
	<updated>2026-10-10T01:05:56Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.arcane-amberfall.ru/index.php?title=MediaWiki:Citizen.js&amp;diff=37&amp;oldid=prev</id>
		<title>Maintenance script: Amberfall Wiki: дизайн 2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.arcane-amberfall.ru/index.php?title=MediaWiki:Citizen.js&amp;diff=37&amp;oldid=prev"/>
		<updated>2026-10-09T22:41:47Z</updated>

		<summary type="html">&lt;p&gt;Amberfall Wiki: дизайн 2.1&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* Amberfall Wiki: progressive enhancement for the main page only. */&lt;br /&gt;
(function () {&lt;br /&gt;
  &amp;#039;use strict&amp;#039;;&lt;br /&gt;
  function initialize(root) {&lt;br /&gt;
    if (!root || root.dataset.afInitialized === &amp;#039;1&amp;#039;) { return; }&lt;br /&gt;
    root.dataset.afInitialized = &amp;#039;1&amp;#039;;&lt;br /&gt;
    var reduceMotion = window.matchMedia &amp;amp;&amp;amp; window.matchMedia(&amp;#039;(prefers-reduced-motion: reduce)&amp;#039;).matches;&lt;br /&gt;
    var names = { all: &amp;#039;Все&amp;#039;, world: &amp;#039;Мир&amp;#039;, character: &amp;#039;Персонаж&amp;#039;, mechanics: &amp;#039;Механики&amp;#039;, guide: &amp;#039;Новичкам&amp;#039; };&lt;br /&gt;
    var filters = root.querySelectorAll(&amp;#039;.af-filter&amp;#039;);&lt;br /&gt;
    var entries = root.querySelectorAll(&amp;#039;.af-entry&amp;#039;);&lt;br /&gt;
    function setFilter(which) {&lt;br /&gt;
      Array.prototype.forEach.call(filters, function (f) {&lt;br /&gt;
        var active = f.classList.contains(&amp;#039;af-filter--&amp;#039; + which);&lt;br /&gt;
        f.classList.toggle(&amp;#039;is-active&amp;#039;, active);&lt;br /&gt;
        f.setAttribute(&amp;#039;aria-pressed&amp;#039;, active ? &amp;#039;true&amp;#039; : &amp;#039;false&amp;#039;);&lt;br /&gt;
      });&lt;br /&gt;
      Array.prototype.forEach.call(entries, function (card) {&lt;br /&gt;
        var visible = which === &amp;#039;all&amp;#039; || card.classList.contains(&amp;#039;af-cat--&amp;#039; + which);&lt;br /&gt;
        card.classList.toggle(&amp;#039;is-hidden&amp;#039;, !visible);&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
    Array.prototype.forEach.call(filters, function (f) {&lt;br /&gt;
      var name = Object.keys(names).filter(function (n) { return f.classList.contains(&amp;#039;af-filter--&amp;#039; + n); })[0];&lt;br /&gt;
      if (!name) { return; }&lt;br /&gt;
      f.setAttribute(&amp;#039;role&amp;#039;, &amp;#039;button&amp;#039;);&lt;br /&gt;
      f.setAttribute(&amp;#039;tabindex&amp;#039;, &amp;#039;0&amp;#039;);&lt;br /&gt;
      f.setAttribute(&amp;#039;aria-label&amp;#039;, &amp;#039;Показать: &amp;#039; + names[name]);&lt;br /&gt;
      f.addEventListener(&amp;#039;click&amp;#039;, function () { setFilter(name); });&lt;br /&gt;
      f.addEventListener(&amp;#039;keydown&amp;#039;, function (e) {&lt;br /&gt;
        if (e.key === &amp;#039;Enter&amp;#039; || e.key === &amp;#039; &amp;#039;) { e.preventDefault(); setFilter(name); }&lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
    setFilter(&amp;#039;all&amp;#039;);&lt;br /&gt;
    if (reduceMotion) { return; }&lt;br /&gt;
    var hero = root.querySelector(&amp;#039;.af-hero&amp;#039;);&lt;br /&gt;
    if (hero &amp;amp;&amp;amp; window.matchMedia &amp;amp;&amp;amp; window.matchMedia(&amp;#039;(pointer:fine)&amp;#039;).matches) {&lt;br /&gt;
      var pending = false, relX = 0, relY = 0, pX = 0, pY = 0;&lt;br /&gt;
      hero.addEventListener(&amp;#039;pointermove&amp;#039;, function (event) {&lt;br /&gt;
        var rect = hero.getBoundingClientRect();&lt;br /&gt;
        relX = ((event.clientX - rect.left) / rect.width - .5) * 2;&lt;br /&gt;
        relY = ((event.clientY - rect.top) / rect.height - .5) * 2;&lt;br /&gt;
        pX = (event.clientX - rect.left) / rect.width * 100;&lt;br /&gt;
        pY = (event.clientY - rect.top) / rect.height * 100;&lt;br /&gt;
        if (!pending) {&lt;br /&gt;
          pending = true;&lt;br /&gt;
          window.requestAnimationFrame(function () {&lt;br /&gt;
            hero.style.setProperty(&amp;#039;--af-pointer-x&amp;#039;, pX.toFixed(1) + &amp;#039;%&amp;#039;);&lt;br /&gt;
            hero.style.setProperty(&amp;#039;--af-pointer-y&amp;#039;, pY.toFixed(1) + &amp;#039;%&amp;#039;);&lt;br /&gt;
            hero.style.setProperty(&amp;#039;--af-art-x&amp;#039;, (relX * -13).toFixed(1) + &amp;#039;px&amp;#039;);&lt;br /&gt;
            hero.style.setProperty(&amp;#039;--af-art-y&amp;#039;, (relY * -7).toFixed(1) + &amp;#039;px&amp;#039;);&lt;br /&gt;
            pending = false;&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      }, { passive:true });&lt;br /&gt;
      hero.addEventListener(&amp;#039;pointerleave&amp;#039;, function () {&lt;br /&gt;
        hero.style.setProperty(&amp;#039;--af-art-x&amp;#039;,&amp;#039;0px&amp;#039;);&lt;br /&gt;
        hero.style.setProperty(&amp;#039;--af-art-y&amp;#039;,&amp;#039;0px&amp;#039;);&lt;br /&gt;
      });&lt;br /&gt;
      Array.prototype.forEach.call(entries, function (card) {&lt;br /&gt;
        card.addEventListener(&amp;#039;pointermove&amp;#039;, function (event) {&lt;br /&gt;
          var rect = card.getBoundingClientRect();&lt;br /&gt;
          card.style.setProperty(&amp;#039;--af-card-x&amp;#039;, (event.clientX - rect.left) + &amp;#039;px&amp;#039;);&lt;br /&gt;
          card.style.setProperty(&amp;#039;--af-card-y&amp;#039;, (event.clientY - rect.top) + &amp;#039;px&amp;#039;);&lt;br /&gt;
        }, { passive:true });&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
    // Do not hide whole sections while waiting for scroll events. The wiki must remain readable.&lt;br /&gt;
    root.classList.add(&amp;#039;af-js-ready&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
  function mount() { initialize(document.querySelector(&amp;#039;.af-vanguard&amp;#039;)); }&lt;br /&gt;
  if (typeof mw !== &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; mw.hook) { mw.hook(&amp;#039;wikipage.content&amp;#039;).add(mount); }&lt;br /&gt;
  if (document.readyState === &amp;#039;loading&amp;#039;) { document.addEventListener(&amp;#039;DOMContentLoaded&amp;#039;, mount); }&lt;br /&gt;
  else { mount(); }&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>