11// Citizen.js
22// needs a heavy refactor
33
4+ // configs
5+ const DISCORD_INVITE_URL = 'https://discord.gg/vuJsnzKkKY' ;
6+
47/**
58 * @name SidebarIcons
69 * Prepend icons to the MediaWiki sidebar (also needs a refactor!)
@@ -20,6 +23,7 @@ const icons_by_ids = {
2023
2124for ( const [ k , v ] of Object . entries ( icons_by_ids ) ) {
2225 const element = document . querySelector ( '.citizen-menu__content ' + '#n-' + k + ' a' )
26+ if ( ! element ) { continue }
2327
2428 const icon_element = document . createElement ( 'span' )
2529 icon_element . classList . add ( 'citizen-ui-icon' , v . class )
@@ -74,3 +78,81 @@ setTimeout(() => {
7478 } ) ;
7579} , 250 ) ;
7680} ) ;
81+
82+ /**
83+ * @name DiscordHeaderButton
84+ * Animation adapted from https://github.com/wlft/discord-logo-2021
85+ */
86+
87+ const discord_button_html = `
88+ <a
89+ class="citizen-discord-button citizen-cdx-button--size-large cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--icon-only cdx-button--weight-quiet"
90+ href="${ DISCORD_INVITE_URL } "
91+ title="Discord"
92+ aria-label="ObbyWiki on Discord"
93+ target="_blank"
94+ rel="noopener noreferrer"
95+ >
96+ <svg class="citizen-discord-logo" viewBox="0 0 48 48" width="20" height="20" aria-hidden="true" focusable="false">
97+ <defs>
98+ <path
99+ id="citizen-discord-face"
100+ fill="currentColor"
101+ fill-rule="evenodd"
102+ transform="translate(2 2) scale(1.8333)"
103+ d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7913 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"
104+ />
105+ <mask id="citizen-discord-mask-outer">
106+ <rect width="100%" height="100%" fill="#fff"/>
107+ <circle r="42%" cx="50%" cy="50%" fill="#000"/>
108+ </mask>
109+ <mask id="citizen-discord-mask-middle">
110+ <rect width="100%" height="100%" fill="#000"/>
111+ <circle r="43%" cx="50%" cy="50%" fill="#fff"/>
112+ <circle r="32%" cx="50%" cy="50%" fill="#000"/>
113+ </mask>
114+ <mask id="citizen-discord-mask-inner">
115+ <rect width="100%" height="100%" fill="#000"/>
116+ <circle r="32%" cx="50%" cy="50%" fill="#fff"/>
117+ </mask>
118+ </defs>
119+ <use href="#citizen-discord-face" class="citizen-discord-logo__original"/>
120+ <use href="#citizen-discord-face" class="citizen-discord-logo__outer" mask="url(#citizen-discord-mask-outer)"/>
121+ <use href="#citizen-discord-face" class="citizen-discord-logo__middle" mask="url(#citizen-discord-mask-middle)"/>
122+ <use href="#citizen-discord-face" class="citizen-discord-logo__inner" mask="url(#citizen-discord-mask-inner)"/>
123+ </svg>
124+ <span>Discord</span>
125+ </a>
126+ ` . trim ( ) ;
127+
128+ function insert_discord_button ( ) {
129+ if ( document . getElementById ( 'citizen-discord' ) ) {
130+ return ;
131+ }
132+
133+ const header = document . querySelector ( '.citizen-header' ) ;
134+ if ( ! header ) {
135+ return ;
136+ }
137+
138+ const item = document . createElement ( 'div' ) ;
139+ item . id = 'citizen-discord' ;
140+ item . className = 'citizen-header__item citizen-discord' ;
141+ item . innerHTML = discord_button_html ;
142+
143+ const prefs = header . querySelector ( '.citizen-preferences-dropdown' ) ;
144+ const header_end = header . querySelector ( '.citizen-header__end' ) ;
145+ if ( prefs && prefs . parentNode ) {
146+ prefs . parentNode . insertBefore ( item , prefs ) ;
147+ } else if ( header_end ) {
148+ header_end . insertBefore ( item , header_end . firstChild ) ;
149+ } else {
150+ header . appendChild ( item ) ;
151+ }
152+ }
153+
154+ if ( document . readyState === 'loading' ) {
155+ document . addEventListener ( 'DOMContentLoaded' , insert_discord_button ) ;
156+ } else {
157+ insert_discord_button ( ) ;
158+ }
0 commit comments