diff options
author | Nicolas Lécureuil <neoclust@mageia.org> | 2017-04-19 00:18:12 +0200 |
---|---|---|
committer | Nicolas Lécureuil <neoclust@mageia.org> | 2017-04-19 00:18:12 +0200 |
commit | 0e8b7f021f27e524f8c0b25dca600c00fd2c2468 (patch) | |
tree | a1194ff372adcc235bcfea361af8830ed954456a | |
parent | 14ffe3143e36d79ef7054b293e51f3fb4b658224 (diff) | |
download | mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar.gz mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar.bz2 mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.tar.xz mediawiki-0e8b7f021f27e524f8c0b25dca600c00fd2c2468.zip |
Add mw 1.23.15 themes
232 files changed, 9977 insertions, 0 deletions
diff --git a/CologneBlue.php b/CologneBlue.php new file mode 100644 index 0000000..7c2860e --- /dev/null +++ b/CologneBlue.php @@ -0,0 +1,573 @@ +<?php +/** + * Cologne Blue: A nicer-looking alternative to Standard. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @todo document + * @file + * @ingroup Skins + */ + +if ( !defined( 'MEDIAWIKI' ) ) { + die( -1 ); +} + +/** + * @todo document + * @ingroup Skins + */ +class SkinCologneBlue extends SkinTemplate { + var $skinname = 'cologneblue', $stylename = 'cologneblue', + $template = 'CologneBlueTemplate'; + var $useHeadElement = true; + + /** + * @param $out OutputPage + */ + function setupSkinUserCss( OutputPage $out ) { + parent::setupSkinUserCss( $out ); + $out->addModuleStyles( 'mediawiki.legacy.oldshared' ); + $out->addModuleStyles( 'skins.cologneblue' ); + } + + /** + * Override langlink formatting behavior not to uppercase the language names. + * See otherLanguages() in CologneBlueTemplate. + */ + function formatLanguageName( $name ) { + return $name; + } +} + +class CologneBlueTemplate extends BaseTemplate { + function execute() { + // Suppress warnings to prevent notices about missing indexes in $this->data + wfSuppressWarnings(); + $this->html( 'headelement' ); + echo $this->beforeContent(); + $this->html( 'bodytext' ); + echo "\n"; + echo $this->afterContent(); + $this->html( 'dataAfterContent' ); + $this->printTrail(); + echo "\n</body></html>"; + wfRestoreWarnings(); + } + + /** + * Language/charset variant links for classic-style skins + * @return string + */ + function variantLinks() { + $s = array(); + + $variants = $this->data['content_navigation']['variants']; + + foreach ( $variants as $key => $link ) { + $s[] = $this->makeListItem( $key, $link, array( 'tag' => 'span' ) ); + } + + return $this->getSkin()->getLanguage()->pipeList( $s ); + } + + function otherLanguages() { + global $wgHideInterlanguageLinks; + if ( $wgHideInterlanguageLinks ) { + return ""; + } + + $html = ''; + + // We override SkinTemplate->formatLanguageName() in SkinCologneBlue + // not to capitalize the language names. + $language_urls = $this->data['language_urls']; + if ( !empty( $language_urls ) ) { + $s = array(); + foreach ( $language_urls as $key => $data ) { + $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) ); + } + + $html = wfMessage( 'otherlanguages' )->text() + . wfMessage( 'colon-separator' )->text() + . $this->getSkin()->getLanguage()->pipeList( $s ); + } + + $html .= $this->renderAfterPortlet( 'lang' ); + + return $html; + } + + /** + * @param string $name + */ + protected function renderAfterPortlet( $name ) { + $content = ''; + wfRunHooks( 'BaseTemplateAfterPortlet', array( $this, $name, &$content ) ); + + $html = $content !== '' ? "<div class='after-portlet after-portlet-$name'>$content</div>" : ''; + + return $html; + } + + function pageTitleLinks() { + $s = array(); + $footlinks = $this->getFooterLinks(); + + foreach ( $footlinks['places'] as $item ) { + $s[] = $this->data[$item]; + } + + return $this->getSkin()->getLanguage()->pipeList( $s ); + } + + /** + * Used in bottomLinks() to eliminate repetitive code. + * + * @param $key string Key to be passed to makeListItem() + * @param $navlink array Navlink suitable for processNavlinkForDocument() + * @param $message string Key of the message to use in place of standard text + * + * @return string + */ + function processBottomLink( $key, $navlink, $message = null ) { + if ( !$navlink ) { + // Empty navlinks might be passed. + return null; + } + + if ( $message ) { + $navlink['text'] = wfMessage( $message )->escaped(); + } + + return $this->makeListItem( $key, $this->processNavlinkForDocument( $navlink ), array( 'tag' => 'span' ) ); + } + + function bottomLinks() { + $toolbox = $this->getToolbox(); + $content_nav = $this->data['content_navigation']; + + $lines = array(); + + if ( $this->getSkin()->getOutput()->isArticleRelated() ) { + // First row. Regular actions. + $element = array(); + + $editLinkMessage = $this->getSkin()->getTitle()->exists() ? 'editthispage' : 'create-this-page'; + $element[] = $this->processBottomLink( 'edit', $content_nav['views']['edit'], $editLinkMessage ); + $element[] = $this->processBottomLink( 'viewsource', $content_nav['views']['viewsource'], 'viewsource' ); + + $element[] = $this->processBottomLink( 'watch', $content_nav['actions']['watch'], 'watchthispage' ); + $element[] = $this->processBottomLink( 'unwatch', $content_nav['actions']['unwatch'], 'unwatchthispage' ); + + $element[] = $this->talkLink(); + + $element[] = $this->processBottomLink( 'history', $content_nav['views']['history'], 'history' ); + $element[] = $this->processBottomLink( 'info', $toolbox['info'] ); + $element[] = $this->processBottomLink( 'whatlinkshere', $toolbox['whatlinkshere'] ); + $element[] = $this->processBottomLink( 'recentchangeslinked', $toolbox['recentchangeslinked'] ); + + $element[] = $this->processBottomLink( 'contributions', $toolbox['contributions'] ); + $element[] = $this->processBottomLink( 'emailuser', $toolbox['emailuser'] ); + + $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) ); + + // Second row. Privileged actions. + $element = array(); + + $element[] = $this->processBottomLink( 'delete', $content_nav['actions']['delete'], 'deletethispage' ); + $element[] = $this->processBottomLink( 'undelete', $content_nav['actions']['undelete'], 'undeletethispage' ); + + $element[] = $this->processBottomLink( 'protect', $content_nav['actions']['protect'], 'protectthispage' ); + $element[] = $this->processBottomLink( 'unprotect', $content_nav['actions']['unprotect'], 'unprotectthispage' ); + + $element[] = $this->processBottomLink( 'move', $content_nav['actions']['move'], 'movethispage' ); + + $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) ); + + // Third row. Language links. + $lines[] = $this->otherLanguages(); + } + + return implode( array_filter( $lines ), "<br />\n" ) . "<br />\n"; + } + + function talkLink() { + $title = $this->getSkin()->getTitle(); + + if ( $title->getNamespace() == NS_SPECIAL ) { + // No discussion links for special pages + return ""; + } + + $companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage(); + $companionNamespace = $companionTitle->getNamespace(); + + // TODO these messages are only be used by CologneBlue, + // kill and replace with something more sensibly named? + $nsToMessage = array( + NS_MAIN => 'articlepage', + NS_USER => 'userpage', + NS_PROJECT => 'projectpage', + NS_FILE => 'imagepage', + NS_MEDIAWIKI => 'mediawikipage', + NS_TEMPLATE => 'templatepage', + NS_HELP => 'viewhelppage', + NS_CATEGORY => 'categorypage', + NS_FILE => 'imagepage', + ); + + // Find out the message to use for link text. Use either the array above or, + // for non-talk pages, a generic "discuss this" message. + // Default is the same as for main namespace. + if ( isset( $nsToMessage[$companionNamespace] ) ) { + $message = $nsToMessage[$companionNamespace]; + } else { + $message = $companionTitle->isTalkPage() ? 'talkpage' : 'articlepage'; + } + + // Obviously this can't be reasonable and just return the key for talk namespace, only for content ones. + // Thus we have to mangle it in exactly the same way SkinTemplate does. (bug 40805) + $key = $companionTitle->getNamespaceKey( '' ); + if ( $companionTitle->isTalkPage() ) { + $key = ( $key == 'main' ? 'talk' : $key . "_talk" ); + } + + // Use the regular navigational link, but replace its text. Everything else stays unmodified. + $namespacesLinks = $this->data['content_navigation']['namespaces']; + return $this->processBottomLink( $message, $namespacesLinks[$key], $message ); + } + + /** + * Takes a navigational link generated by SkinTemplate in whichever way + * and mangles attributes unsuitable for repeated use. In particular, this modifies the ids + * and removes the accesskeys. This is necessary to be able to use the same navlink twice, + * e.g. in sidebar and in footer. + * + * @param $navlink array Navigational link generated by SkinTemplate + * @param $idPrefix mixed Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'. + */ + function processNavlinkForDocument( $navlink, $idPrefix = 'cb-' ) { + if ( $navlink['id'] ) { + $navlink['single-id'] = $navlink['id']; // to allow for tooltip generation + $navlink['tooltiponly'] = true; // but no accesskeys + + // mangle or remove the id + if ( $idPrefix === false ) { + unset( $navlink['id'] ); + } else { + $navlink['id'] = $idPrefix . $navlink['id']; + } + } + + return $navlink; + } + + /** + * @return string + */ + function beforeContent() { + ob_start(); +?> +<div id="content"> + <div id="topbar"> + <p id="sitetitle" role="banner"> + <a href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>"> + <?php echo wfMessage( 'sitetitle' )->escaped() ?> + </a> + </p> + <p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p> + <div id="linkcollection" role="navigation"> + <div id="langlinks"><?php echo str_replace( '<br />', '', $this->otherLanguages() ) ?></div> + <?php echo $this->getSkin()->getCategories() ?> + <div id="titlelinks"><?php echo $this->pageTitleLinks() ?></div> + <?php if ( $this->data['newtalk'] ) { ?> + <div class="usermessage"><strong><?php echo $this->data['newtalk'] ?></strong></div> + <?php } ?> + </div> + </div> + <div id="article" class="mw-body" role="main"> + <?php if ( $this->getSkin()->getSiteNotice() ) { ?> + <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div> + <?php } ?> + <h1 id="firstHeading" lang="<?php + $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode(); + $this->text( 'pageLanguage' ); + ?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1> + <?php if ( $this->translator->translate( 'tagline' ) ) { ?> + <p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p> + <?php } ?> + <?php if ( $this->getSkin()->getOutput()->getSubtitle() ) { ?> + <p class="subtitle"><?php echo $this->getSkin()->getOutput()->getSubtitle() ?></p> + <?php } ?> + <?php if ( $this->getSkin()->subPageSubtitle() ) { ?> + <p class="subpages"><?php echo $this->getSkin()->subPageSubtitle() ?></p> + <?php } ?> +<?php + $s = ob_get_contents(); + ob_end_clean(); + + return $s; + } + + /** + * @return string + */ + function afterContent() { + ob_start(); +?> + </div> + <div id="footer"> + <div id="footer-navigation" role="navigation"> +<?php + // Page-related links + echo $this->bottomLinks(); + echo "\n<br />"; + + // Footer and second searchbox + echo $this->getSkin()->getLanguage()->pipeList( array( + $this->getSkin()->mainPageLink(), + $this->getSkin()->aboutLink(), + $this->searchForm( 'footer' ) + ) ); +?> + </div> + <div id="footer-info" role="contentinfo"> +<?php + // Standard footer info + $footlinks = $this->getFooterLinks(); + if ( $footlinks['info'] ) { + foreach ( $footlinks['info'] as $item ) { + echo $this->data[$item] . ' '; + } + } +?> + </div> + </div> +</div> +<div id="mw-navigation"> + <h2><?php echo wfMessage( 'navigation-heading' )->escaped() ?></h2> + <div id="toplinks" role="navigation"> + <p id="syslinks"><?php echo $this->sysLinks() ?></p> + <p id="variantlinks"><?php echo $this->variantLinks() ?></p> + </div> + <?php echo $this->quickBar() ?> +</div> +<?php + $s = ob_get_contents(); + ob_end_clean(); + + return $s; + } + + /** + * @return string + */ + function sysLinks() { + $s = array( + $this->getSkin()->mainPageLink(), + Linker::linkKnown( + Title::newFromText( wfMessage( 'aboutpage' )->inContentLanguage()->text() ), + wfMessage( 'about' )->text() + ), + Linker::makeExternalLink( + Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() ), + wfMessage( 'help' )->text(), + false + ), + Linker::linkKnown( + Title::newFromText( wfMessage( 'faqpage' )->inContentLanguage()->text() ), + wfMessage( 'faq' )->text() + ), + ); + + $personalUrls = $this->getPersonalTools(); + foreach ( array( 'logout', 'createaccount', 'login' ) as $key ) { + if ( $personalUrls[$key] ) { + $s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) ); + } + } + + return $this->getSkin()->getLanguage()->pipeList( $s ); + } + + /** + * Adds CologneBlue-specific items to the sidebar: qbedit, qbpageoptions and qbmyoptions menus. + * + * @param $bar sidebar data + * @return array modified sidebar data + */ + function sidebarAdditions( $bar ) { + // "This page" and "Edit" menus + // We need to do some massaging here... we reuse all of the items, except for $...['views']['view'], + // as $...['namespaces']['main'] and $...['namespaces']['talk'] together serve the same purpose. + // We also don't use $...['variants'], these are displayed in the top menu. + $content_navigation = $this->data['content_navigation']; + $qbpageoptions = array_merge( + $content_navigation['namespaces'], + array( + 'history' => $content_navigation['views']['history'], + 'watch' => $content_navigation['actions']['watch'], + 'unwatch' => $content_navigation['actions']['unwatch'], + ) + ); + $content_navigation['actions']['watch'] = null; + $content_navigation['actions']['unwatch'] = null; + $qbedit = array_merge( + array( + 'edit' => $content_navigation['views']['edit'], + 'addsection' => $content_navigation['views']['addsection'], + ), + $content_navigation['actions'] + ); + + // Personal tools ("My pages") + $qbmyoptions = $this->getPersonalTools(); + foreach ( array( 'logout', 'createaccount', 'login', ) as $key ) { + $qbmyoptions[$key] = null; + } + + // Use the closest reasonable name + $bar['cactions'] = $qbedit; + $bar['pageoptions'] = $qbpageoptions; // this is a non-standard portlet name, but nothing fits + $bar['personal'] = $qbmyoptions; + + return $bar; + } + + /** + * Compute the sidebar + * @access private + * + * @return string + */ + function quickBar() { + // Massage the sidebar. We want to: + // * place SEARCH at the beginning + // * add new portlets before TOOLBOX (or at the end, if it's missing) + // * remove LANGUAGES (langlinks are displayed elsewhere) + $orig_bar = $this->data['sidebar']; + $bar = array(); + $hasToolbox = false; + + // Always display search first + $bar['SEARCH'] = true; + // Copy everything except for langlinks, inserting new items before toolbox + foreach ( $orig_bar as $heading => $data ) { + if ( $heading == 'TOOLBOX' ) { + // Insert the stuff + $bar = $this->sidebarAdditions( $bar ); + $hasToolbox = true; + } + + if ( $heading != 'LANGUAGES' ) { + $bar[$heading] = $data; + } + } + // If toolbox is missing, add our items at the end + if ( !$hasToolbox ) { + $bar = $this->sidebarAdditions( $bar ); + } + + // Fill out special sidebar items with content + $orig_bar = $bar; + $bar = array(); + foreach ( $orig_bar as $heading => $data ) { + if ( $heading == 'SEARCH' ) { + $bar['search'] = $this->searchForm( 'sidebar' ); + } elseif ( $heading == 'TOOLBOX' ) { + $bar['tb'] = $this->getToolbox(); + } else { + $bar[$heading] = $data; + } + } + + // Output the sidebar + // CologneBlue uses custom messages for some portlets, but we should keep the ids for consistency + $idToMessage = array( + 'search' => 'qbfind', + 'navigation' => 'qbbrowse', + 'tb' => 'toolbox', + 'cactions' => 'qbedit', + 'personal' => 'qbmyoptions', + 'pageoptions' => 'qbpageoptions', + ); + + $s = "<div id='quickbar'>\n"; + + foreach ( $bar as $heading => $data ) { + $portletId = Sanitizer::escapeId( "p-$heading" ); + $headingMsg = wfMessage( $idToMessage[$heading] ? $idToMessage[$heading] : $heading ); + $headingHTML = "<h3>" . ( $headingMsg->exists() ? $headingMsg->escaped() : htmlspecialchars( $heading ) ) . "</h3>"; + $listHTML = ""; + + if ( is_array( $data ) ) { + // $data is an array of links + foreach ( $data as $key => $link ) { + // Can be empty due to how the sidebar additions are done + if ( $link ) { + $listHTML .= $this->makeListItem( $key, $link ); + } + } + if ( $listHTML ) { + $listHTML = "<ul>$listHTML</ul>"; + } + } else { + // $data is a HTML <ul>-list string + $listHTML = $data; + } + + if ( $listHTML ) { + $role = ( $heading == 'search' ) ? 'search' : 'navigation'; + $s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n"; + } + + $s .= $this->renderAfterPortlet( $heading ); + } + + $s .= "</div>\n"; + return $s; + } + + /** + * @param $label string + * @return string + */ + function searchForm( $which ) { + global $wgUseTwoButtonsSearchForm; + + $search = $this->getSkin()->getRequest()->getText( 'search' ); + $action = $this->data['searchaction']; + $s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">"; + if ( $which == 'footer' ) { + $s .= wfMessage( 'qbfind' )->text() . ": "; + } + + $s .= $this->makeSearchInput( array( 'class' => 'mw-searchInput', 'type' => 'text', 'size' => '14' ) ); + $s .= ( $which == 'footer' ? " " : "<br />" ); + $s .= $this->makeSearchButton( 'go', array( 'class' => 'searchButton' ) ); + + if ( $wgUseTwoButtonsSearchForm ) { + $s .= $this->makeSearchButton( 'fulltext', array( 'class' => 'searchButton' ) ); + } else { + $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n"; + } + + $s .= '</form>'; + + return $s; + } +} diff --git a/Modern.php b/Modern.php new file mode 100644 index 0000000..8d778cf --- /dev/null +++ b/Modern.php @@ -0,0 +1,169 @@ +<?php +/** + * Modern skin, derived from monobook template. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @todo document + * @file + * @ingroup Skins + */ + +if ( !defined( 'MEDIAWIKI' ) ) { + die( -1 ); +} + +/** + * Inherit main code from SkinTemplate, set the CSS and template filter. + * @todo document + * @ingroup Skins + */ +class SkinModern extends SkinTemplate { + var $skinname = 'modern', $stylename = 'modern', + $template = 'ModernTemplate', $useHeadElement = true; + + /** + * @param $out OutputPage + */ + function setupSkinUserCss( OutputPage $out ) { + parent::setupSkinUserCss( $out ); + $out->addModuleStyles( 'skins.modern' ); + } +} + +/** + * @todo document + * @ingroup Skins + */ +class ModernTemplate extends MonoBookTemplate { + + /** + * Template filter callback for Modern skin. + * Takes an associative array of data set from a SkinTemplate-based + * class, and a wrapper for MediaWiki's localization database, and + * outputs a formatted page. + * + * @access private + */ + function execute() { + // Suppress warnings to prevent notices about missing indexes in $this->data + wfSuppressWarnings(); + + $this->html( 'headelement' ); +?> + + <!-- heading --> + <div id="mw_header"><h1 id="firstHeading" lang="<?php + $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode(); + $this->text( 'pageLanguage' ); + ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div> + + <div id="mw_main"> + <div id="mw_contentwrapper"> + <!-- navigation portlet --> +<?php $this->cactions(); ?> + + <!-- content --> + <div id="mw_content" role="main"> + <!-- contentholder does nothing by default, but it allows users to style the text inside + the content area without affecting the meaning of 'em' in #mw_content, which is used + for the margins --> + <div id="mw_contentholder" class="mw-body"> + <div class='mw-topboxes'> + <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div> + <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div> + <?php if ( $this->data['newtalk'] ) { + ?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div> + <?php } ?> + <?php if ( $this->data['sitenotice'] ) { + ?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div> + <?php } ?> + </div> + + <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div> + + <?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?> + <div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div> + + <?php $this->html( 'bodytext' ) ?> + <div class='mw_clear'></div> + <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?> + <?php $this->html( 'dataAfterContent' ) ?> + </div><!-- mw_contentholder --> + </div><!-- mw_content --> + </div><!-- mw_contentwrapper --> + + <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>> + <h2><?php $this->msg( 'navigation-heading' ) ?></h2> + + <!-- portlets --> + <?php $this->renderPortals( $this->data['sidebar'] ); ?> + + </div><!-- mw_portlets --> + + + </div><!-- main --> + + <div class="mw_clear"></div> + + <!-- personal portlet --> + <div class="portlet" id="p-personal" role="navigation"> + <h3><?php $this->msg( 'personaltools' ) ?></h3> + <div class="pBody"> + <ul> +<?php foreach ( $this->getPersonalTools() as $key => $item ) { ?> + <?php echo $this->makeListItem( $key, $item ); ?> + +<?php } ?> + </ul> + </div> + </div> + + + <!-- footer --> + <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>> + <ul id="f-list"> +<?php + foreach ( $this->getFooterLinks( "flat" ) as $aLink ) { + if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) { +?> <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li> +<?php } + } +?> + </ul> +<?php + foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?> + <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>"> +<?php + foreach ( $footerIcons as $icon ) { ?> + <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?> + +<?php + } ?> + </div> +<?php + } +?> + </div> + + <?php $this->printTrail(); ?> +</body></html> +<?php + wfRestoreWarnings(); + } // end of execute() method +} // end of class + + diff --git a/MonoBook.php b/MonoBook.php new file mode 100644 index 0000000..9346ee0 --- /dev/null +++ b/MonoBook.php @@ -0,0 +1,332 @@ +<?php +/** + * MonoBook nouveau. + * + * Translated from gwicke's previous TAL template version to remove + * dependency on PHPTAL. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @todo document + * @file + * @ingroup Skins + */ + +if ( !defined( 'MEDIAWIKI' ) ) { + die( -1 ); +} + +/** + * Inherit main code from SkinTemplate, set the CSS and template filter. + * @todo document + * @ingroup Skins + */ +class SkinMonoBook extends SkinTemplate { + /** Using monobook. */ + var $skinname = 'monobook', $stylename = 'monobook', + $template = 'MonoBookTemplate', $useHeadElement = true; + + /** + * @param $out OutputPage + */ + function setupSkinUserCss( OutputPage $out ) { + parent::setupSkinUserCss( $out ); + + $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) ); + + // TODO: Migrate all of these + $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' ); + $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' ); + + } +} + +/** + * @todo document + * @ingroup Skins + */ +class MonoBookTemplate extends BaseTemplate { + + /** + * Template filter callback for MonoBook skin. + * Takes an associative array of data set from a SkinTemplate-based + * class, and a wrapper for MediaWiki's localization database, and + * outputs a formatted page. + * + * @access private + */ + function execute() { + // Suppress warnings to prevent notices about missing indexes in $this->data + wfSuppressWarnings(); + + $this->html( 'headelement' ); +?><div id="globalWrapper"> +<div id="column-content"><div id="content" class="mw-body-primary" role="main"> + <a id="top"></a> + <?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?> + + <h1 id="firstHeading" class="firstHeading" lang="<?php + $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode(); + $this->text( 'pageLanguage' ); + ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1> + <div id="bodyContent" class="mw-body"> + <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div> + <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div> +<?php if ( $this->data['undelete'] ) { ?> + <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div> +<?php } ?><?php if ( $this->data['newtalk'] ) { ?> + <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div> +<?php } ?> + <div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div> + + <!-- start content --> +<?php $this->html( 'bodytext' ) ?> + <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?> + <!-- end content --> + <?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?> + <div class="visualClear"></div> + </div> +</div></div> +<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>> + <h2><?php $this->msg( 'navigation-heading' ) ?></h2> +<?php $this->cactions(); ?> + <div class="portlet" id="p-personal" role="navigation"> + <h3><?php $this->msg( 'personaltools' ) ?></h3> + <div class="pBody"> + <ul<?php $this->html( 'userlangattributes' ) ?>> +<?php foreach ( $this->getPersonalTools() as $key => $item ) { ?> + <?php echo $this->makeListItem( $key, $item ); ?> + +<?php } ?> + </ul> + </div> + </div> + <div class="portlet" id="p-logo" role="banner"> +<?php + echo Html::element( 'a', array( + 'href' => $this->data['nav_urls']['mainpage']['href'], + 'style' => "background-image: url({$this->data['logopath']});" ) + + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?> + + </div> +<?php + $this->renderPortals( $this->data['sidebar'] ); +?> +</div><!-- end of the left (by default at least) column --> +<div class="visualClear"></div> +<?php + $validFooterIcons = $this->getFooterIcons( "icononly" ); + $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links + + if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?> +<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>> +<?php + $footerEnd = '</div>'; + } else { + $footerEnd = ''; + } + foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?> + <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico"> +<?php foreach ( $footerIcons as $icon ) { ?> + <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?> + +<?php } +?> + </div> +<?php } + + if ( count( $validFooterLinks ) > 0 ) { +?> <ul id="f-list"> +<?php + foreach ( $validFooterLinks as $aLink ) { ?> + <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li> +<?php + } +?> + </ul> +<?php } +echo $footerEnd; +?> + +</div> +<?php + $this->printTrail(); + echo Html::closeElement( 'body' ); + echo Html::closeElement( 'html' ); + wfRestoreWarnings(); + } // end of execute() method + + /*************************************************************************************************/ + + /** + * @param $sidebar array + */ + protected function renderPortals( $sidebar ) { + if ( !isset( $sidebar['SEARCH'] ) ) { + $sidebar['SEARCH'] = true; + } + if ( !isset( $sidebar['TOOLBOX'] ) ) { + $sidebar['TOOLBOX'] = true; + } + if ( !isset( $sidebar['LANGUAGES'] ) ) { + $sidebar['LANGUAGES'] = true; + } + + foreach ( $sidebar as $boxName => $content ) { + if ( $content === false ) { + continue; + } + + if ( $boxName == 'SEARCH' ) { + $this->searchBox(); + } elseif ( $boxName == 'TOOLBOX' ) { + $this->toolbox(); + } elseif ( $boxName == 'LANGUAGES' ) { + $this->languageBox(); + } else { + $this->customBox( $boxName, $content ); + } + } + } + + function searchBox() { + global $wgUseTwoButtonsSearchForm; +?> + <div id="p-search" class="portlet" role="search"> + <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3> + <div id="searchBody" class="pBody"> + <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform"> + <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/> + <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?> + + <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) ); + if ( $wgUseTwoButtonsSearchForm ) { ?>  + <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) ); + } else { ?> + + <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php + } ?> + + </form> + + <?php $this->renderAfterPortlet( 'search' ); ?> + </div> + </div> +<?php + } + + /** + * Prints the cactions bar. + * Shared between MonoBook and Modern + */ + function cactions() { +?> + <div id="p-cactions" class="portlet" role="navigation"> + <h3><?php $this->msg( 'views' ) ?></h3> + <div class="pBody"> + <ul><?php + foreach ( $this->data['content_actions'] as $key => $tab ) { + echo ' + ' . $this->makeListItem( $key, $tab ); + } ?> + + </ul> +<?php $this->renderAfterPortlet( 'cactions' ); ?> + </div> + </div> +<?php + } + /*************************************************************************************************/ + function toolbox() { +?> + <div class="portlet" id="p-tb" role="navigation"> + <h3><?php $this->msg( 'toolbox' ) ?></h3> + <div class="pBody"> + <ul> +<?php + foreach ( $this->getToolbox() as $key => $tbitem ) { ?> + <?php echo $this->makeListItem( $key, $tbitem ); ?> + +<?php + } + wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) ); + wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) ); +?> + </ul> +<?php $this->renderAfterPortlet( 'tb' ); ?> + </div> + </div> +<?php + } + + /*************************************************************************************************/ + function languageBox() { + if ( $this->data['language_urls'] !== false ) { +?> + <div id="p-lang" class="portlet" role="navigation"> + <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3> + <div class="pBody"> + <ul> +<?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?> + <?php echo $this->makeListItem( $key, $langlink ); ?> + +<?php } ?> + </ul> + +<?php $this->renderAfterPortlet( 'lang' ); ?> + </div> + </div> +<?php + } + } + + /*************************************************************************************************/ + /** + * @param $bar string + * @param $cont array|string + */ + function customBox( $bar, $cont ) { + $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ), 'role' => 'navigation' ); + $tooltip = Linker::titleAttrib( "p-$bar" ); + if ( $tooltip !== false ) { + $portletAttribs['title'] = $tooltip; + } + echo ' ' . Html::openElement( 'div', $portletAttribs ); + $msgObj = wfMessage( $bar ); +?> + + <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3> + <div class='pBody'> +<?php if ( is_array( $cont ) ) { ?> + <ul> +<?php foreach ( $cont as $key => $val ) { ?> + <?php echo $this->makeListItem( $key, $val ); ?> + +<?php } ?> + </ul> +<?php } else { + # allow raw HTML block to be defined by extensions + print $cont; + } + + $this->renderAfterPortlet( $bar ); +?> + </div> + </div> +<?php + } + +} // end of class diff --git a/Vector.php b/Vector.php new file mode 100644 index 0000000..594f1f6 --- /dev/null +++ b/Vector.php @@ -0,0 +1,463 @@ +<?php +/** + * Vector - Modern version of MonoBook with fresh look and many usability + * improvements. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @todo document + * @file + * @ingroup Skins + */ + +if ( !defined( 'MEDIAWIKI' ) ) { + die( -1 ); +} + +/** + * SkinTemplate class for Vector skin + * @ingroup Skins + */ +class SkinVector extends SkinTemplate { + + protected static $bodyClasses = array( 'vector-animateLayout' ); + + var $skinname = 'vector', $stylename = 'vector', + $template = 'VectorTemplate', $useHeadElement = true; + + /** + * Initializes output page and sets up skin-specific parameters + * @param $out OutputPage object to initialize + */ + public function initPage( OutputPage $out ) { + global $wgLocalStylePath; + + parent::initPage( $out ); + + // Append CSS which includes IE only behavior fixes for hover support - + // this is better than including this in a CSS file since it doesn't + // wait for the CSS file to load before fetching the HTC file. + $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min'; + $out->addHeadItem( 'csshover', + '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' . + htmlspecialchars( $wgLocalStylePath ) . + "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->" + ); + + $out->addModules( array( 'skins.vector.js', 'skins.vector.collapsibleNav' ) ); + } + + /** + * Loads skin and user CSS files. + * @param $out OutputPage object + */ + function setupSkinUserCss( OutputPage $out ) { + parent::setupSkinUserCss( $out ); + + $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' ); + wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) ); + $out->addModuleStyles( $styles ); + } + + /** + * Adds classes to the body element. + * + * @param $out OutputPage object + * @param &$bodyAttrs Array of attributes that will be set on the body element + */ + function addToBodyAttributes( $out, &$bodyAttrs ) { + if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) { + $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses ); + } else { + $bodyAttrs['class'] = implode( ' ', static::$bodyClasses ); + } + } +} + +/** + * QuickTemplate class for Vector skin + * @ingroup Skins + */ +class VectorTemplate extends BaseTemplate { + + /* Functions */ + + /** + * Outputs the entire contents of the (X)HTML page + */ + public function execute() { + global $wgVectorUseIconWatch; + + // Build additional attributes for navigation urls + $nav = $this->data['content_navigation']; + + if ( $wgVectorUseIconWatch ) { + $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() ) ? 'unwatch' : 'watch'; + if ( isset( $nav['actions'][$mode] ) ) { + $nav['views'][$mode] = $nav['actions'][$mode]; + $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' ); + $nav['views'][$mode]['primary'] = true; + unset( $nav['actions'][$mode] ); + } + } + + $xmlID = ''; + foreach ( $nav as $section => $links ) { + foreach ( $links as $key => $link ) { + if ( $section == 'views' && !( isset( $link['primary'] ) && $link['primary'] ) ) { + $link['class'] = rtrim( 'collapsible ' . $link['class'], ' ' ); + } + + $xmlID = isset( $link['id'] ) ? $link['id'] : 'ca-' . $xmlID; + $nav[$section][$key]['attributes'] = + ' id="' . Sanitizer::escapeId( $xmlID ) . '"'; + if ( $link['class'] ) { + $nav[$section][$key]['attributes'] .= + ' class="' . htmlspecialchars( $link['class'] ) . '"'; + unset( $nav[$section][$key]['class'] ); + } + if ( isset( $link['tooltiponly'] ) && $link['tooltiponly'] ) { + $nav[$section][$key]['key'] = + Linker::tooltip( $xmlID ); + } else { + $nav[$section][$key]['key'] = + Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( $xmlID ) ); + } + } + } + $this->data['namespace_urls'] = $nav['namespaces']; + $this->data['view_urls'] = $nav['views']; + $this->data['action_urls'] = $nav['actions']; + $this->data['variant_urls'] = $nav['variants']; + + // Reverse horizontally rendered navigation elements + if ( $this->data['rtl'] ) { + $this->data['view_urls'] = + array_reverse( $this->data['view_urls'] ); + $this->data['namespace_urls'] = + array_reverse( $this->data['namespace_urls'] ); + $this->data['personal_urls'] = + array_reverse( $this->data['personal_urls'] ); + } + // Output HTML Page + $this->html( 'headelement' ); +?> + <div id="mw-page-base" class="noprint"></div> + <div id="mw-head-base" class="noprint"></div> + <div id="content" class="mw-body" role="main"> + <a id="top"></a> + <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div> + <?php if ( $this->data['sitenotice'] ) { ?> + <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div> + <?php } ?> + <h1 id="firstHeading" class="firstHeading" lang="<?php + $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode(); + $this->text( 'pageLanguage' ); + ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1> + <?php $this->html( 'prebodyhtml' ) ?> + <div id="bodyContent"> + <?php if ( $this->data['isarticle'] ) { ?> + <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div> + <?php } ?> + <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div> + <?php if ( $this->data['undelete'] ) { ?> + <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div> + <?php } ?> + <?php if ( $this->data['newtalk'] ) { ?> + <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div> + <?php } ?> + <div id="jump-to-nav" class="mw-jump"> + <?php $this->msg( 'jumpto' ) ?> + <a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?> + <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a> + </div> + <?php $this->html( 'bodycontent' ) ?> + <?php if ( $this->data['printfooter'] ) { ?> + <div class="printfooter"> + <?php $this->html( 'printfooter' ); ?> + </div> + <?php } ?> + <?php if ( $this->data['catlinks'] ) { ?> + <?php $this->html( 'catlinks' ); ?> + <?php } ?> + <?php if ( $this->data['dataAfterContent'] ) { ?> + <?php $this->html( 'dataAfterContent' ); ?> + <?php } ?> + <div class="visualClear"></div> + <?php $this->html( 'debughtml' ); ?> + </div> + </div> + <div id="mw-navigation"> + <h2><?php $this->msg( 'navigation-heading' ) ?></h2> + <div id="mw-head"> + <?php $this->renderNavigation( 'PERSONAL' ); ?> + <div id="left-navigation"> + <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?> + </div> + <div id="right-navigation"> + <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?> + </div> + </div> + <div id="mw-panel"> + <div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div> + <?php $this->renderPortals( $this->data['sidebar'] ); ?> + </div> + </div> + <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>> + <?php foreach ( $this->getFooterLinks() as $category => $links ) { ?> + <ul id="footer-<?php echo $category ?>"> + <?php foreach ( $links as $link ) { ?> + <li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li> + <?php } ?> + </ul> + <?php } ?> + <?php $footericons = $this->getFooterIcons( "icononly" ); + if ( count( $footericons ) > 0 ) { ?> + <ul id="footer-icons" class="noprint"> +<?php foreach ( $footericons as $blockName => $footerIcons ) { ?> + <li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico"> +<?php foreach ( $footerIcons as $icon ) { ?> + <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?> + +<?php } ?> + </li> +<?php } ?> + </ul> + <?php } ?> + <div style="clear:both"></div> + </div> + <?php $this->printTrail(); ?> + + </body> +</html> +<?php + } + + /** + * Render a series of portals + * + * @param $portals array + */ + protected function renderPortals( $portals ) { + // Force the rendering of the following portals + if ( !isset( $portals['SEARCH'] ) ) { + $portals['SEARCH'] = true; + } + if ( !isset( $portals['TOOLBOX'] ) ) { + $portals['TOOLBOX'] = true; + } + if ( !isset( $portals['LANGUAGES'] ) ) { + $portals['LANGUAGES'] = true; + } + // Render portals + foreach ( $portals as $name => $content ) { + if ( $content === false ) { + continue; + } + + switch ( $name ) { + case 'SEARCH': + break; + case 'TOOLBOX': + $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' ); + break; + case 'LANGUAGES': + if ( $this->data['language_urls'] !== false ) { + $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' ); + } + break; + default: + $this->renderPortal( $name, $content ); + break; + } + } + } + + /** + * @param $name string + * @param $content array + * @param $msg null|string + * @param $hook null|string|array + */ + protected function renderPortal( $name, $content, $msg = null, $hook = null ) { + if ( $msg === null ) { + $msg = $name; + } + $msgObj = wfMessage( $msg ); + ?> +<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'> + <h3<?php $this->html( 'userlangattributes' ) ?> id='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3> + <div class="body"> +<?php + if ( is_array( $content ) ) { ?> + <ul> +<?php + foreach ( $content as $key => $val ) { ?> + <?php echo $this->makeListItem( $key, $val ); ?> + +<?php + } + if ( $hook !== null ) { + wfRunHooks( $hook, array( &$this, true ) ); + } + ?> + </ul> +<?php + } else { ?> + <?php + echo $content; /* Allow raw HTML block to be defined by extensions */ + } + + $this->renderAfterPortlet( $name ); + ?> + </div> +</div> +<?php + } + + /** + * Render one or more navigations elements by name, automatically reveresed + * when UI is in RTL mode + * + * @param $elements array + */ + protected function renderNavigation( $elements ) { + global $wgVectorUseSimpleSearch; + + // If only one element was given, wrap it in an array, allowing more + // flexible arguments + if ( !is_array( $elements ) ) { + $elements = array( $elements ); + // If there's a series of elements, reverse them when in RTL mode + } elseif ( $this->data['rtl'] ) { + $elements = array_reverse( $elements ); + } + // Render elements + foreach ( $elements as $name => $element ) { + switch ( $element ) { + case 'NAMESPACES': +?> +<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-namespaces-label"> + <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3> + <ul<?php $this->html( 'userlangattributes' ) ?>> + <?php foreach ( $this->data['namespace_urls'] as $link ) { ?> + <li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li> + <?php } ?> + </ul> +</div> +<?php + break; + case 'VARIANTS': +?> +<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-variants-label"> + <h3 id="mw-vector-current-variant"> + <?php foreach ( $this->data['variant_urls'] as $link ) { ?> + <?php if ( stripos( $link['attributes'], 'selected' ) !== false ) { ?> + <?php echo htmlspecialchars( $link['text'] ) ?> + <?php } ?> + <?php } ?> + </h3> + <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3> + <div class="menu"> + <ul> + <?php foreach ( $this->data['variant_urls'] as $link ) { ?> + <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" lang="<?php echo htmlspecialchars( $link['lang'] ) ?>" hreflang="<?php echo htmlspecialchars( $link['hreflang'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li> + <?php } ?> + </ul> + </div> +</div> +<?php + break; + case 'VIEWS': +?> +<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-views-label"> + <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3> + <ul<?php $this->html( 'userlangattributes' ) ?>> + <?php foreach ( $this->data['view_urls'] as $link ) { ?> + <li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php + // $link['text'] can be undefined - bug 27764 + if ( array_key_exists( 'text', $link ) ) { + echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] ); + } + ?></a></span></li> + <?php } ?> + </ul> +</div> +<?php + break; + case 'ACTIONS': +?> +<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-cactions-label"> + <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3> + <div class="menu"> + <ul<?php $this->html( 'userlangattributes' ) ?>> + <?php foreach ( $this->data['action_urls'] as $link ) { ?> + <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li> + <?php } ?> + </ul> + </div> +</div> +<?php + break; + case 'PERSONAL': +?> +<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-personal-label"> + <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3> + <ul<?php $this->html( 'userlangattributes' ) ?>> +<?php + $personalTools = $this->getPersonalTools(); + foreach ( $personalTools as $key => $item ) { + echo $this->makeListItem( $key, $item ); + } +?> + </ul> +</div> +<?php + break; + case 'SEARCH': +?> +<div id="p-search" role="search"> + <h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3> + <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform"> + <?php if ( $wgVectorUseSimpleSearch ) { ?> + <div id="simpleSearch"> + <?php } else { ?> + <div> + <?php } ?> + <?php + echo $this->makeSearchInput( array( 'id' => 'searchInput' ) ); + echo Html::hidden( 'title', $this->get( 'searchtitle' ) ); + // We construct two buttons (for 'go' and 'fulltext' search modes), but only one will be + // visible and actionable at a time (they are overlaid on top of each other in CSS). + // * Browsers will use the 'fulltext' one by default (as it's the first in tree-order), which + // is desirable when they are unable to show search suggestions (either due to being broken + // or having JavaScript turned off). + // * The mediawiki.searchSuggest module, after doing tests for the broken browsers, removes + // the 'fulltext' button and handles 'fulltext' search itself; this will reveal the 'go' + // button and cause it to be used. + echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' ) ); + echo $this->makeSearchButton( 'go', array( 'id' => 'searchButton', 'class' => 'searchButton' ) ); + ?> + </div> + </form> +</div> +<?php + + break; + } + } + } +} diff --git a/cologneblue/print.css b/cologneblue/print.css new file mode 100644 index 0000000..d4b0551 --- /dev/null +++ b/cologneblue/print.css @@ -0,0 +1,6 @@ +#sitetitle, +#sitesub, +#titlelinks, +#footer-navigation { + display: none; +} diff --git a/cologneblue/screen.css b/cologneblue/screen.css new file mode 100644 index 0000000..ef9cf8f --- /dev/null +++ b/cologneblue/screen.css @@ -0,0 +1,277 @@ +body { + margin: 0; + padding: 0; + color: black; + font-family: serif; +} + +#specialform { + display: inline; +} + +#content { + top: 0; + margin: 0; + padding: 0; +} + +#mw-data-after-content { + font-family: Verdana, Arial, sans-serif; + color: black; + font-size: 8pt; +} + +#powersearch { + background: #DDEEFF; + border-style: solid; + border-width: 1px; + padding: 2px; +} + +#quickbar { + width: 140px; + top: 18ex; + padding: 2px; + visibility: visible; + z-index: 99; +} + +#article, #article td, #article th, #article p { + font-family: Verdana, Arial, sans-serif; + font-size: 10pt; + color: black; +} + +#article p { + padding-top: 0; + padding-bottom: 0; + margin-top: 1ex; + margin-bottom: 0; +} + +p, pre, .mw-code, td, th, li, dd, dt { + line-height: 12pt; +} + +textarea { + overflow: auto; + width: 100%; + display: block; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +#footer { + margin-right: 2%; + margin-top: 1em; + padding: 4px; + font-family: verdana, arial, sans-serif; + font-size: 10pt; + text-align: center; +} + +#footer form { + display: inline; +} + +#cb-ca-edit { + font-weight: bold; +} + +#pagestats { + font-family: Verdana, Arial, sans-serif; + color: black; + font-size: 9pt; +} + + + +#quickbar { + font-family: Verdana, Arial, sans-serif; + font-size: 8pt; + font-weight: bold; + line-height: 9.5pt; + text-decoration: none; + color: black; + padding: 0; + margin-top: 0; +} + +#quickbar a { + color: #446688; +} + +/* Hide, but keep accessible for screen-readers */ +#mw-navigation h2 { + position: absolute; + top: -9999px; +} + +#quickbar h3 { + font-family: Verdana, Arial, sans-serif; + font-size: 10pt; + font-weight: bold; + line-height: 12pt; + text-decoration: none; + color: #666666; + padding: 0; + margin-bottom: 2px; + margin-top: 6px; +} + +#quickbar form { + padding: 0; + margin-top: 0; +} + +#quickbar .portlet ul, +#quickbar .portlet li { + list-style-type: none; + margin: 0; + padding: 0; + line-height: inherit; +} + +div.after-portlet { + display: inline; + padding-left: .5em; +} + +h1 { + color: #666666; + font-family: Verdana, Arial, sans-serif; + font-size: 180%; + line-height: 21pt; +} + +h1#firstHeading { + padding-bottom: 0; + margin-bottom: 0; +} + +#article p.subtitle, #article p.subpages, #article p.tagline { + color: #666666; + font-size: 11pt; + font-weight: bold; + padding-top: 0; + margin-top: 0; + padding-bottom: 1ex; +} + +a { + color: #223366; +} + +a.external { + color: #336644; +} + +a:visited { + color: #8D0749; +} + +a.printable { + text-decoration: underline; +} + +a.stub, #quickbar a.stub { + color: #772233; + text-decoration: none; +} + +a.new, #quickbar span.new a, #footer span.new a { + color: #CC2200; +} + +h2, h3, h4, h5, h6 { + margin-bottom: 0; +} + +small { + font-size: 75%; +} + +input.mw-searchInput { + width: 106px; +} + +/* Directionality-specific styles */ +#quickbar { position: absolute; left: 4px; } +#article { margin-left: 148px; margin-right: 4px; } +#footer { margin-left: 152px; } + + +#sitetitle, #sitesub, #toplinks, #linkcollection { + margin-top: 0; + margin-bottom: 0; +} + +#sitetitle, #toplinks { + color: white; + text-transform: uppercase; + height: 32pt; +} +#sitetitle { + padding-left: 8px; + font-family: Times, serif; + font-weight: normal; + font-size: 32pt; + line-height: 32pt; + background-color: #6688AA; +} +#sitetitle a, #toplinks a { + color: white; + text-decoration: none; +} +/* Bring #sitetitle to top. Otherwise #toplinks is overlaid over it, making the link unclickable. */ +#sitetitle a { + position: relative; + z-index: 10 +} + +#toplinks { + font-family: Verdana, Arial, sans-serif; + position: absolute; + top: 0; + right: 8px; + width: 100%; + font-size: 8pt; +} +#toplinks a { + font-size: 10pt; +} +#toplinks p { + position: absolute; + right: 0; + margin: 0; + width: 100%; + text-align: right; +} +#toplinks #syslinks { + bottom: 0; +} +#toplinks #variantlinks { + bottom: 12pt; +} + +#sitesub { + float: left; + margin-left: 8px; + font-family: Verdana, Arial, sans-serif; + font-size: 9pt; + font-weight: bold; + color: black; +} + +#linkcollection { + margin-top: 0.5em; + font-size: small; + margin-right: 8px; + text-align: right; + padding-left: 140px; +} +/* Override text justification (user preference), see bug 31990 */ +#linkcollection * { + text-align: right; +} diff --git a/common/IEFixes.js b/common/IEFixes.js new file mode 100644 index 0000000..545acad --- /dev/null +++ b/common/IEFixes.js @@ -0,0 +1,121 @@ +/** + * IE fixes javascript loaded by wikibits.js for IE <= 6.0 + */ +/*global isMSIE55:true, doneIETransform:true, doneIEAlphaFix:true */ +/*global hookit:true, fixalpha:true */ +( function ( mw, $ ) { + +var expandedURLs, hasClass; + +// Also returns true for IE6, 7, 8, 9 and 10. createPopup is removed in IE11. +// Good thing this is only loaded for IE <= 6 by wikibits. +// Might as well set it to true. +isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup ); +doneIETransform = false; +doneIEAlphaFix = false; + +hookit = function () { + if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) { + doneIETransform = true; + fixalpha(); + } +}; + +if ( document.attachEvent ) { + document.attachEvent( 'onreadystatechange', hookit ); +} + +// png alpha transparency fixes +fixalpha = function ( logoId ) { + // bg + if ( isMSIE55 && !doneIEAlphaFix ) { + var bg, imageUrl, linkFix, logoa, logospan, plogo; + plogo = document.getElementById( logoId || 'p-logo' ); + if ( !plogo ) { + return; + } + + logoa = plogo.getElementsByTagName('a')[0]; + if ( !logoa ) { + return; + } + + bg = logoa.currentStyle.backgroundImage; + imageUrl = bg.substring( 5, bg.length - 2 ); + + doneIEAlphaFix = true; + + if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() === '.png' ) { + logospan = logoa.appendChild( document.createElement( 'span' ) ); + + logoa.style.backgroundImage = 'none'; + logospan.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + imageUrl + ')'; + logospan.style.height = '100%'; + logospan.style.position = 'absolute'; + logospan.style.width = logoa.currentStyle.width; + logospan.style.cursor = 'hand'; + // Center image with hack for IE5.5 + if ( document.documentElement.dir === 'rtl' ) { + logospan.style.right = '50%'; + logospan.style.setExpression( 'marginRight', '"-" + (this.offsetWidth / 2) + "px"' ); + } else { + logospan.style.left = '50%'; + logospan.style.setExpression( 'marginLeft', '"-" + (this.offsetWidth / 2) + "px"' ); + } + logospan.style.top = '50%'; + logospan.style.setExpression( 'marginTop', '"-" + (this.offsetHeight / 2) + "px"' ); + + linkFix = logoa.appendChild( logoa.cloneNode() ); + linkFix.style.position = 'absolute'; + linkFix.style.height = '100%'; + linkFix.style.width = '100%'; + } + } +}; + +if ( isMSIE55 ) { + // ondomready + $( fixalpha ); +} + +// Expand links for printing +hasClass = function ( classText, classWanted ) { + var i = 0, classArr = classText.split(/\s/); + for ( i = 0; i < classArr.length; i++ ) { + if ( classArr[i].toLowerCase() === classWanted.toLowerCase() ) { + return true; + } + } + return false; +}; + +window.onbeforeprint = function () { + var allLinks, contentEl, expandedLink, expandedText, i; + + expandedURLs = []; + contentEl = document.getElementById( 'content' ); + + if ( contentEl ) { + allLinks = contentEl.getElementsByTagName( 'a' ); + + for ( i = 0; i < allLinks.length; i++ ) { + if ( hasClass( allLinks[i].className, 'external' ) && !hasClass( allLinks[i].className, 'free' ) ) { + expandedLink = document.createElement( 'span' ); + expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' ); + expandedLink.appendChild( expandedText ); + allLinks[i].parentNode.insertBefore( expandedLink, allLinks[i].nextSibling ); + expandedURLs[i] = expandedLink; + } + } + } +}; + +window.onafterprint = function () { + for ( var i = 0; i < expandedURLs.length; i++ ) { + if ( expandedURLs[i] ) { + expandedURLs[i].removeNode( true ); + } + } +}; + +}( mediaWiki, jQuery ) ); diff --git a/common/ajax.js b/common/ajax.js new file mode 100644 index 0000000..ab0c793 --- /dev/null +++ b/common/ajax.js @@ -0,0 +1,193 @@ +/** + * Remote Scripting Library + * Copyright 2005 modernmethod, inc + * Under the 3-clause BSD license + * http://www.modernmethod.com/sajax/ + */ + +/*jshint camelcase:false */ +/*global alert */ +( function ( mw ) { + +/** + * if sajax_debug_mode is true, this function outputs given the message into + * the element with id = sajax_debug; if no such element exists in the document, + * it is injected. + */ +function debug( text ) { + if ( !window.sajax_debug_mode ) { + return false; + } + + var e = document.getElementById( 'sajax_debug' ); + + if ( !e ) { + e = document.createElement( 'p' ); + e.className = 'sajax_debug'; + e.id = 'sajax_debug'; + + var b = document.getElementsByTagName( 'body' )[0]; + + if ( b.firstChild ) { + b.insertBefore( e, b.firstChild ); + } else { + b.appendChild( e ); + } + } + + var m = document.createElement( 'div' ); + m.appendChild( document.createTextNode( text ) ); + + e.appendChild( m ); + + return true; +} + +/** + * Compatibility wrapper for creating a new XMLHttpRequest object. + */ +function createXhr() { + debug( 'sajax_init_object() called..' ); + var a; + try { + // Try the new style before ActiveX so we don't + // unnecessarily trigger warnings in IE 7 when + // set to prompt about ActiveX usage + a = new XMLHttpRequest(); + } catch ( xhrE ) { + try { + a = new window.ActiveXObject( 'Msxml2.XMLHTTP' ); + } catch ( msXmlE ) { + try { + a = new window.ActiveXObject( 'Microsoft.XMLHTTP' ); + } catch ( msXhrE ) { + a = null; + } + } + } + if ( !a ) { + debug( 'Could not create connection object.' ); + } + + return a; +} + +/** + * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php + * func_name - the name of the function to call. Must be registered in $wgAjaxExportList + * args - an array of arguments to that function + * target - the target that will handle the result of the call. If this is a function, + * if will be called with the XMLHttpRequest as a parameter; if it's an input + * element, its value will be set to the resultText; if it's another type of + * element, its innerHTML will be set to the resultText. + * + * Example: + * sajax_do_call( 'doFoo', [1, 2, 3], document.getElementById( 'showFoo' ) ); + * + * This will call the doFoo function via MediaWiki's AjaxDispatcher, with + * (1, 2, 3) as the parameter list, and will show the result in the element + * with id = showFoo + */ +function doAjaxRequest( func_name, args, target ) { + var i, x, uri, post_data; + uri = mw.util.wikiScript() + '?action=ajax'; + if ( window.sajax_request_type === 'GET' ) { + if ( uri.indexOf( '?' ) === -1 ) { + uri = uri + '?rs=' + encodeURIComponent( func_name ); + } else { + uri = uri + '&rs=' + encodeURIComponent( func_name ); + } + for ( i = 0; i < args.length; i++ ) { + uri = uri + '&rsargs[]=' + encodeURIComponent( args[i] ); + } + //uri = uri + '&rsrnd=' + new Date().getTime(); + post_data = null; + } else { + post_data = 'rs=' + encodeURIComponent( func_name ); + for ( i = 0; i < args.length; i++ ) { + post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] ); + } + } + x = createXhr(); + if ( !x ) { + alert( 'AJAX not supported' ); + return false; + } + + try { + x.open( window.sajax_request_type, uri, true ); + } catch ( e ) { + if ( location.hostname === 'localhost' ) { + alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' ); + } + throw e; + } + if ( window.sajax_request_type === 'POST' ) { + x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' ); + x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' ); + } + x.setRequestHeader( 'Pragma', 'cache=yes' ); + x.setRequestHeader( 'Cache-Control', 'no-transform' ); + x.onreadystatechange = function () { + if ( x.readyState !== 4 ) { + return; + } + + debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText ); + + //if ( x.status != 200 ) + // alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText ); + //else + + if ( typeof target === 'function' ) { + target( x ); + } else if ( typeof target === 'object' ) { + if ( target.tagName === 'INPUT' ) { + if ( x.status === 200 ) { + target.value = x.responseText; + } + //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' ); + } else { + if ( x.status === 200 ) { + target.innerHTML = x.responseText; + } else { + target.innerHTML = '<div class="error">Error: ' + x.status + + ' ' + x.statusText + ' (' + x.responseText + ')</div>'; + } + } + } else { + alert( 'Bad target for sajax_do_call: not a function or object: ' + target ); + } + }; + + debug( func_name + ' uri = ' + uri + ' / post = ' + post_data ); + x.send( post_data ); + debug( func_name + ' waiting..' ); + + return true; +} + +/** + * @return {boolean} Whether the browser supports AJAX + */ +function wfSupportsAjax() { + var request = createXhr(), + supportsAjax = request ? true : false; + + request = undefined; + return supportsAjax; +} + +// Expose + Mark as deprecated +var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.'; + +// Variables +mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice ); +mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice ); +// Methods +mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice ); +mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice ); +mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice ); +mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice ); + +}( mediaWiki ) ); diff --git a/common/commonContent.css b/common/commonContent.css new file mode 100644 index 0000000..41d20fb --- /dev/null +++ b/common/commonContent.css @@ -0,0 +1,151 @@ +/** + * MediaWiki style sheet for general styles on complex content + * + * Styles for complex things which are a standard part of page content + * (ie: the CSS classing built into the system), like the TOC. + */ + +/* Table of Contents */ +#toc, +.toc, +.mw-warning { + border: 1px solid #aaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; +} + +/** + * We want to display the ToC element with intrinsic width in block mode. The fit-content + * value for width is however not supported by large groups of browsers. + * + * We use display:table. Even though it should only contain other table-* display + * elements, there are no known problems with using this. + * + * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to + * using inline-block mode, which features at least intrinsic width, but won't clear preceding + * inline elements. In practice inline elements surrounding the TOC are uncommon enough that + * this is an acceptable sacrifice. + */ +#toc, +.toc { + display: -moz-inline-block; + display: inline-block; + display: table; + + /* IE7 and earlier */ + zoom: 1; + *display: inline; + + padding: 7px; +} + +/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */ +table#toc, +table.toc { + border-collapse: collapse; +} +/* Remove additional paddings inside table-cells that are not present in <div>s */ +table#toc td, +table.toc td { + padding: 0; +} + +#toc h2, +.toc h2 { + display: inline; + border: none; + padding: 0; + font-size: 100%; + font-weight: bold; +} +#toc #toctitle, +.toc #toctitle, +#toc .toctitle, +.toc .toctitle { + text-align: center; +} +#toc ul, +.toc ul { + list-style-type: none; + list-style-image: none; + margin-left: 0; + padding: 0; + text-align: left; +} +#toc ul ul, +.toc ul ul { + margin: 0 0 0 2em; +} +#toc .toctoggle, +.toc .toctoggle { + font-size: 94%; +} + +.toccolours { + border: 1px solid #aaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; +} + +/* Warning */ +.mw-warning { + margin-left: 50px; + margin-right: 50px; + text-align: center; +} + +/* Images */ +/* @noflip */div.floatright, table.floatright { + margin: 0 0 .5em .5em; + border: 0; +} +div.floatright p { font-style: italic; } +/* @noflip */div.floatleft, table.floatleft { + margin: 0 .5em .5em 0; + border: 0; +} +div.floatleft p { font-style: italic; } +/* Thumbnails */ +div.thumb { + margin-bottom: .5em; + width: auto; + background-color: transparent; +} +div.thumbinner { + border: 1px solid #ccc; + padding: 3px !important; + background-color: #f9f9f9; + font-size: 94%; + text-align: center; + overflow: hidden; +} +html .thumbimage { + border: 1px solid #ccc; +} +html .thumbcaption { + border: none; + line-height: 1.4em; + padding: 3px !important; + font-size: 94%; +} +div.magnify { + border: none !important; + background: none !important; + margin-left: 3px; +} +div.magnify a, div.magnify img { + display: block; + border: none !important; + background: none !important; +} +/* @noflip */div.tright { + margin: .5em 0 1.3em 1.4em; +} +/* @noflip */div.tleft { + margin: .5em 1.4em 1.3em 0; +} +img.thumbborder { + border: 1px solid #dddddd; +} diff --git a/common/commonElements.css b/common/commonElements.css new file mode 100644 index 0000000..ad7942a --- /dev/null +++ b/common/commonElements.css @@ -0,0 +1,235 @@ +/** + * MediaWiki style sheet for general styles on basic content elements + * + * Styles for basic elements: links, lists, etc... + * + * This style sheet is used by the Monobook and Vector skins. + */ + +/* Links */ +a { + text-decoration: none; + color: #0645ad; + background: none; +} +a:visited { + color: #0b0080; +} +a:active { + color: #faa700; +} +a:hover, a:focus { + text-decoration: underline; +} +a.stub { + color: #772233; +} +a.new, #p-personal a.new { + color: #ba0000; +} +a.new:visited, #p-personal a.new:visited { + color: #a55858; +} + +/* Interwiki Styling */ +.mw-body a.extiw, +.mw-body a.extiw:active { + color: #36b; +} +.mw-body a.extiw:visited { + color: #636; +} +.mw-body a.extiw:active { + color: #b63; +} + +/* External links */ +.mw-body a.external { + color: #36b; +} +.mw-body a.external:visited { + color: #636; /* bug 3112 */ +} +.mw-body a.external:active { + color: #b63; +} + +/* Inline Elements */ +img { + border: none; + vertical-align: middle; +} +hr { + height: 1px; + color: #aaa; + background-color: #aaa; + border: 0; + margin: .2em 0; +} + +/* Structural Elements */ +h1, +h2, +h3, +h4, +h5, +h6 { + color: black; + background: none; + font-weight: normal; + margin: 0; + overflow: hidden; + padding-top: .5em; + padding-bottom: .17em; + border-bottom: 1px solid #aaa; +} +h1 { + font-size: 188%; +} +h2 { + font-size: 150%; +} +h3, +h4, +h5, +h6 { + border-bottom: none; + font-weight: bold; +} +h3 { + font-size: 132%; +} +h4 { + font-size: 116%; +} +h5 { + font-size: 108%; +} +h6 { + font-size: 100%; +} + +/* Some space under the headers in the content area */ +h1, +h2 { + margin-bottom: .6em; +} +h3, +h4, +h5 { + margin-bottom: .3em; +} + +p { + margin: .4em 0 .5em 0; + line-height: 1.5em; +} +p img { + margin: 0; +} + +ul { + line-height: 1.5em; + list-style-type: square; + margin: .3em 0 0 1.6em; + padding: 0; +} +ol { + line-height: 1.5em; + margin: .3em 0 0 3.2em; + padding: 0; + list-style-image: none; +} +li { + margin-bottom: .1em; +} +dt { + font-weight: bold; + margin-bottom: .1em; +} +dl { + margin-top: .2em; + margin-bottom: .5em; +} +dd { + line-height: 1.5em; + margin-left: 1.6em; + margin-bottom: .1em; +} + +/* IE 6 and 7 lack support for quotes aroud the <q> element ('::before' and '::after' + pseudoelements, 'quotes' property). Let's italicize it instead (using the star hack). */ +q { + *font-style: italic; +} + +pre, code, tt, kbd, samp, .mw-code { + /* + * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari. + * Specifying any valid, second value will trigger correct behavior without forcing a different font. + */ + font-family: monospace, Courier; +} +code { + background-color: #f9f9f9; +} +pre, .mw-code { + padding: 1em; + border: 1px solid #ddd; + color: black; + background-color: #f9f9f9; +} + +/* Tables */ +table { + font-size: 100%; +} + +/* Forms */ +fieldset { + border: 1px solid #2f6fab; + margin: 1em 0 1em 0; + padding: 0 1em 1em; + line-height: 1.5em; +} +fieldset.nested { + margin: 0 0 0.5em 0; + padding: 0 0.5em 0.5em; +} +legend { + padding: .5em; + font-size: 95%; +} +form { + border: none; + margin: 0; +} +textarea { + width: 100%; + padding: .1em; + display: block; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +select { + vertical-align: top; +} + +/* Emulate Center */ +.center { + width: 100%; + text-align: center; +} +*.center * { + margin-left: auto; + margin-right: auto; +} +/* Small for tables and similar */ +.small { + font-size: 94%; +} +table.small { + font-size: 100%; +} + diff --git a/common/commonInterface.css b/common/commonInterface.css new file mode 100644 index 0000000..7eca070 --- /dev/null +++ b/common/commonInterface.css @@ -0,0 +1,68 @@ +/** + * MediaWiki style sheet for common core styles on interfaces + * + * Styles for the Monobook/Vector pattern of laying out common interfaces. + * These ids/classes are not built into the system, + * they are outputted by the actual MonoBook/Vector code by convention. + */ + +/* Categories */ +.catlinks { + border: 1px solid #aaa; + background-color: #f9f9f9; + padding: 5px; + margin-top: 1em; + clear: both; +} + +/* User Message */ +.usermessage { + background-color: #ffce7b; + border: 1px solid #ffa500; + color: black; + font-weight: bold; + margin: 2em 0 1em; + padding: .5em 1em; + vertical-align: middle; +} + +/* Site Notice (includes notices from CentralNotice extension) */ +#siteNotice { + position: relative; + text-align: center; + margin: 0; +} +#localNotice { + margin-bottom: 0.9em; +} + +/* First h1 */ +.firstHeading, +#firstHeading { + margin-bottom: .1em; + /* These two rules hack around bug 2013 (fix for more limited bug 11325). + * When bug 2013 is fixed properly, they should be removed. */ + line-height: 1.2em; + padding-bottom: 0; +} + +/* Sub-navigation */ +#siteSub { + display: none; +} +#jump-to-nav { + /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */ + margin-top: -1.4em; + margin-bottom: 1.4em +} +#contentSub, #contentSub2 { + font-size: 84%; + line-height: 1.2em; + margin: 0 0 1.4em 1em; + color: #545454; + width: auto; +} +span.subpages { + display: block; +} + diff --git a/common/commonPrint.css b/common/commonPrint.css new file mode 100644 index 0000000..65f3fbe --- /dev/null +++ b/common/commonPrint.css @@ -0,0 +1,401 @@ +/** + * MediaWiki Print style sheet for CSS2-capable browsers. + * Copyright Gabriel Wicke, http://www.aulinx.de/ + * + * Derived from the plone (http://plone.org/) styles + * Copyright Alexander Limi + */ + +/* Thanks to A List Apart (http://alistapart.com/) for useful extras */ +a.stub, +a.new { + color: #ba0000; + text-decoration: none; +} + +#toc { + border: 1px solid #aaaaaa; + background-color: #f9f9f9; + padding: 5px; + display: -moz-inline-block; + display: inline-block; + display: table; + /* IE7 and earlier */ + zoom: 1; + *display: inline; +} + +/* images */ +div.floatright { + float: right; + clear: right; + position: relative; + margin: 0.5em 0 0.8em 1.4em; +} +div.floatright p { + font-style: italic; +} +div.floatleft { + float: left; + clear: left; + position: relative; + margin: 0.5em 1.4em 0.8em 0; +} +div.floatleft p { + font-style: italic; +} +div.center { + text-align: center; +} + +/* thumbnails */ +div.thumb { + border: none; + width: auto; + margin-top: 0.5em; + margin-bottom: 0.8em; + background-color: transparent; +} +div.thumbinner { + border:1px solid #cccccc; + padding: 3px !important; + background-color: White; + font-size: 94%; + text-align: center; + overflow: hidden; +} +html .thumbimage { + border: 1px solid #cccccc; +} +html .thumbcaption { + border: none; + text-align: left; + line-height: 1.4em; + padding: 3px !important; + font-size: 94%; +} + +div.magnify { + display: none; +} +/* @noflip */ +div.tright { + float: right; + clear: right; + margin: 0.5em 0 0.8em 1.4em; +} +/* @noflip */ +div.tleft { + float: left; + clear: left; + margin: 0.5em 1.4em 0.8em 0; +} +img.thumbborder { + border: 1px solid #dddddd; +} + +/* table standards */ +table.rimage { + float: right; + width: 1pt; + position: relative; + margin-left: 1em; + margin-bottom: 1em; + text-align: center; +} + +body { + background: white; + color: black; + margin: 0; + padding: 0; +} + +.noprint, +div#jump-to-nav, +.mw-jump, +div.top, +div#column-one, +#colophon, +.mw-editsection, +.mw-editsection-like, +.toctoggle, +.tochidden, +div#f-poweredbyico, +div#f-copyrightico, +li#viewcount, +li#about, +li#disclaimer, +li#mobileview, +li#privacy, +#footer-places, +.mw-hidden-catlinks, +tr.mw-metadata-show-hide-extended, +span.mw-filepage-other-resolutions, +#filetoc, +.usermessage, +.patrollink, +#mw-navigation { + /* Hides all the elements irrelevant for printing */ + display: none; +} + +ul { + list-style-type: square; +} + +#content { + background: none; + border: none !important; + padding: 0 !important; + margin: 0 !important; + direction: ltr; +} +#footer { + background : white; + color : black; + margin-top: 1em; + border-top: 1px solid #AAA; + direction: ltr; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: bold; +} + +dt { + font-weight: bold; +} + +p { + margin: 1em 0; + line-height: 1.2em; +} + +pre, .mw-code { + border: 1pt dashed black; + white-space: pre; + font-size: 8pt; + overflow: auto; + padding: 1em 0; + background: white; + color: black; +} + +table.listing, +table.listing td { + border: 1pt solid black; + border-collapse: collapse; +} + +a { + color: black !important; + background: none !important; + padding: 0 !important; +} + +a:link, a:visited { + color: #520; + background: transparent; + text-decoration: underline; +} + +#content a.external.text:after, +#content a.external.autonumber:after { + /* Expand URLs for printing */ + content: " (" attr(href) ")"; +} + +#globalWrapper { + width: 100% !important; + min-width: 0 !important; +} + +#content { + background: white; + color: black; +} + +#column-content { + margin: 0 !important; +} + +#column-content #content { + padding: 1em; + margin: 0 !important; +} + +/* MSIE/Win doesn't understand 'inherit' */ +a, +a.external, +a.new, +a.stub { + color: black !important; + text-decoration: none !important; +} + +/* Continue ... */ +a, +a.external, +a.new, +a.stub { + color: inherit !important; + text-decoration: inherit !important; +} + +img { + border: none; + vertical-align: middle; +} + +/* math */ +span.texhtml { + font-family: serif; +} + +#siteNotice { + display: none; +} + +/* Galleries (see shared.css for more info) */ +li.gallerybox { + vertical-align: top; + display: -moz-inline-box; + display: inline-block; +} + +ul.gallery, li.gallerybox { + zoom: 1; + *display: inline; +} + +ul.gallery { + margin: 2px; + padding: 2px; + display: block; +} + +li.gallerycaption { + font-weight: bold; + text-align: center; + display: block; + word-wrap: break-word; +} + +li.gallerybox div.thumb { + text-align: center; + border: 1px solid #ccc; + margin: 2px; +} + +div.gallerytext { + overflow: hidden; + font-size: 94%; + padding: 2px 4px; + word-wrap: break-word; +} + +/** + * Diff rendering + */ +table.diff { + background: white; +} +td.diff-otitle { + background: #ffffff; +} +td.diff-ntitle { + background: #ffffff; +} +td.diff-addedline { + background: #ccffcc; + font-size: smaller; + border: solid 2px black; +} +td.diff-deletedline { + background: #ffffaa; + font-size: smaller; + border: dotted 2px black; +} +td.diff-context { + background: #eeeeee; + font-size: smaller; +} +.diffchange { + color: silver; + font-weight: bold; + text-decoration: underline; +} + +/** + * Table rendering + * As on shared.css but with white background. + */ +table.wikitable, +table.mw_metadata { + margin: 1em 0; + border: 1px #aaa solid; + background: white; + border-collapse: collapse; +} +table.wikitable > tr > th, table.wikitable > tr > td, +table.wikitable > * > tr > th, table.wikitable > * > tr > td, +.mw_metadata th, .mw_metadata td { + border: 1px #aaa solid; + padding: 0.2em; +} +table.wikitable > tr > th, +table.wikitable > * > tr > th, +.mw_metadata th { + text-align: center; + background: white; + font-weight: bold; +} +table.wikitable > caption, +.mw_metadata caption { + font-weight: bold; +} + +a.sortheader { + margin: 0 0.3em; +} + +/* Some pagination options */ +.wikitable, .thumb, img { + page-break-inside: avoid; +} +h2, h3, h4, h5, h6 { + page-break-after: avoid; +} +p { + widows: 3; + orphans: 3; +} + +/** + * Categories + */ +.catlinks ul { + display: inline; + margin: 0; + padding: 0; + list-style: none; + list-style-type: none; + list-style-image: none; + vertical-align: middle !ie; +} + +.catlinks li { + display: inline-block; + line-height: 1.15em; + padding: 0 .4em; + border-left: 1px solid #AAA; + margin: 0.1em 0; + zoom: 1; + display: inline !ie; +} + +.catlinks li:first-child { + padding-left: .2em; + border-left: none; +} diff --git a/common/config-cc.css b/common/config-cc.css new file mode 100644 index 0000000..d81218e --- /dev/null +++ b/common/config-cc.css @@ -0,0 +1,57 @@ +/** + * Copy of CC standard stylesheet, plus tweaks for iframe usage + */ + +body { + margin: 0; + background: #eee; + font-family: Verdana; + color: #333; +} + +#main { + border: 1px solid #D0D0D0; + background: #fff; + margin: 0.5em; +} + +/** + * Looks like you have to specify the width of #menu + * or IE5 Mac stretches it all the way across the div, and + * Opera streches it half way. + */ + +#main #menu { + border-left: 1px dotted #ccc; + float: right; + width: 230px; + background: white; + margin: 0 0 10px 10px; +} + +td, h3, p, h1, pre { + margin: 0 20px 20px 20px; + font-size: 11px; + line-height: 140%; +} + +.header { + padding-left: 10px; + padding-top: 10px; +} + +.nav { + padding-left: 10px; + padding-bottom: 10px; + font-size: 11px; + margin-bottom: 16px; +} + +#menu p { + font-size: 11px; +} + +.dent { + margin-left: 64px; +} + diff --git a/common/config.css b/common/config.css new file mode 100644 index 0000000..d646273 --- /dev/null +++ b/common/config.css @@ -0,0 +1,143 @@ +.env-check { + font-size: 90%; + margin: 1em 0 1em 2.5em; +} + +.config-section { + margin-top: 2em; +} +.config-block { + margin-top: 2em; + display: block; + +} +.config-block-label { + display: block; + margin-bottom: .2em; +} +.config-block-label label, .config-label { + font-weight: bold; + padding-right: .5em; + padding-top: .2em; +} +.config-block-elements { + margin-left: 2em; +} +.config-block-elements li { + list-style: none; +} +.config-input { + clear: left; + zoom: 100%; /* IE hack */ +} + +.config-page-wrapper { + padding: 0.5em; +} + +.config-page-list { + float: right; + width: 12em; + border: 1px solid #aaa; + background: #fff; + padding: 0.5em; + /* 3em left margin to leave space between the list and the page-content */ + margin: 0.5em 0.5em 0.5em 3.5em; +} + +.config-page { + padding: 0.5em 0.5em 0.5em 2em; + margin: 0.5em 0.5em 0.5em 0.5em; + background: #eee; +} + +.config-submit { + clear: left; + text-align: center; + padding: 1em; +} + +.config-submit input { + margin-left: 0.5em; + margin-right: 0.5em; +} + +.config-page-disabled { + color: #aaa; +} + +.config-error-box { + border: 2px solid #f00; +} + +.config-page-current { + font-weight: bold; +} + +.config-message { + display: list-item; + line-height: 1.5em; + /* @embed */ + list-style-image: url(images/bullet.gif); + list-style-type: square; +} + +.config-input-text { + width: 20em; + margin-right: 1em; +} + +.config-input-check { + margin-left: 10em; +} + +.error { + color: red; + background-color: #fff; + font-weight: bold; + left: 1em; + font-size: 100%; +} + +.config-settings-block { + list-style-type: none; + list-style-image: none; + margin: 0; + padding: 0; +} + +.btn-install { + font-weight: bold; + font-size: 110%; + padding: .2em .3em; +} + +.success-message { + font-weight: bold; + font-size: 110%; + color: green; +} +.success-box { + font-size: 130%; +} + +.config-cc-wrapper { + clear: left; + /* If you change this height, also change it in WebInstaller_Options::submitCC() */ + height: 54em; +} + +.config-plainlink a { + background: none !important; + padding: 0 !important; +} + +.config-download-link { + font-size: 1.8em; + margin-left: 2em; +} + +#config-live-log { + overflow: hidden; + min-width: 20em; +} diff --git a/common/config.js b/common/config.js new file mode 100644 index 0000000..2886e08 --- /dev/null +++ b/common/config.js @@ -0,0 +1,108 @@ +( function ( $ ) { + $( function () { + var $label, labelText; + + function syncText() { + var value = $(this).val() + .replace( /[\[\]\{\}|#<>%+? ]/g, '_' ) + .replace( /&/, '&' ) + .replace( /__+/g, '_' ) + .replace( /^_+/, '' ) + .replace( /_+$/, '' ); + value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 ); + $label.text( labelText.replace( '$1', value ) ); + } + + // Set up the help system + $( '.mw-help-field-data' ) + .hide() + .closest( '.mw-help-field-container' ) + .find( '.mw-help-field-hint' ) + .show() + .click( function () { + $(this) + .closest( '.mw-help-field-container' ) + .find( '.mw-help-field-data' ) + .slideToggle( 'fast' ); + } ); + + // Show/hide code for DB-specific options + // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here? + $( '.dbRadio' ).each( function () { + $( document.getElementById( $(this).attr( 'rel' ) ) ).hide(); + } ); + $( document.getElementById( $( '.dbRadio:checked' ).attr( 'rel' ) ) ).show(); + $( '.dbRadio' ).click( function () { + var $checked = $( '.dbRadio:checked' ), + $wrapper = $( document.getElementById( $checked.attr( 'rel' ) ) ); + if ( $wrapper.is( ':hidden' ) ) { + $( '.dbWrapper' ).hide( 'slow' ); + $wrapper.show( 'slow' ); + } + } ); + + // Scroll to the bottom of upgrade log + $( '#config-live-log' ).children( 'textarea' ).each( function () { + this.scrollTop = this.scrollHeight; + } ); + + // Show/hide Creative Commons thingy + $( '.licenseRadio' ).click( function () { + var $wrapper = $( '#config-cc-wrapper' ); + if ( $( '#config__LicenseCode_cc-choose' ).is( ':checked' ) ) { + $wrapper.show( 'slow' ); + } else { + $wrapper.hide( 'slow' ); + } + } ); + + // Show/hide random stuff (email, upload) + $( '.showHideRadio' ).click( function () { + var $wrapper = $( '#' + $(this).attr( 'rel' ) ); + if ( $(this).is( ':checked' ) ) { + $wrapper.show( 'slow' ); + } else { + $wrapper.hide( 'slow' ); + } + } ); + $( '.hideShowRadio' ).click( function () { + var $wrapper = $( '#' + $(this).attr( 'rel' ) ); + if ( $(this).is( ':checked' ) ) { + $wrapper.hide( 'slow' ); + } else { + $wrapper.show( 'slow' ); + } + } ); + + // Hide "other" textboxes by default + // Should not be done in CSS for javascript disabled compatibility + $( '.enabledByOther' ).closest( '.config-block' ).hide(); + + // Enable/disable "other" textboxes + $( '.enableForOther' ).click( function () { + var $textbox = $( document.getElementById( $(this).attr( 'rel' ) ) ); + // FIXME: Ugh, this is ugly + if ( $(this).val() === 'other' ) { + $textbox.removeProp( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' ); + } else { + $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' ); + } + } ); + + // Synchronize radio button label for sitename with textbox + $label = $( 'label[for=config__NamespaceType_site-name]' ); + labelText = $label.text(); + $label.text( labelText.replace( '$1', '' ) ); + $( '#config_wgSitename' ).on( 'keyup change', syncText ).each( syncText ); + + // Show/Hide memcached servers when needed + $( 'input[name$="config_wgMainCacheType"]' ).change( function () { + var $memc = $( '#config-memcachewrapper' ); + if ( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) { + $memc.show( 'slow' ); + } else { + $memc.hide( 'slow' ); + } + } ); + } ); +}( jQuery ) ); diff --git a/common/feed.css b/common/feed.css new file mode 100644 index 0000000..9439663 --- /dev/null +++ b/common/feed.css @@ -0,0 +1,95 @@ +/* +Make RSS and Atom feeds at least semi-legible to folk who accidentally +load them in a browser... + +Compatibility: +* Mozilla is fine. +* Safari 1.2: the RSS <link> text isn't shown +* Opera 7.5 uses the style sheet instead of its native RSS mode. +* IE/Mac 5.2: none of the :before content works; doesn't get the charset right and displays garbage for non-ASCII. +* IE/Win 6.0: No background color, borders, font size, font weight, or :before content. + +*/ + +/* RSS: */ rss, channel, title, link, description, language, generator, lastBuildDate, item, pubDate, author, comments, creator, +/* Atom: */ feed, id, modified, tagline, entry, issued, created, updated, summary, comment { + display: block; +} + +rss, feed { + background: white; + color: black; + margin: 1em; + font-family: "Verdana", "Tahoma", "Arial", "Helvetica", sans-serif; + line-height: 1.5em; + font-size: 76%; +} + +rss:before { + content: "This RSS feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser."; +} + +feed:before { + content: "This Atom feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser."; +} +rss:before, feed:before { + color: red; + text-align: center; + line-height: 2em; +} + +channel>title, +item>title, +feed>title, +entry>title { + font-weight: bold; + border-bottom: solid 1px #aaa; + margin-left: -0.5em; +} +channel>title, feed>title { + font-size: larger; +} +item>title, entry>title { + font-size: large; +} +item, entry { + margin-top: 1em; + margin-left: 2em; +} + +item>description, entry>summary { + white-space: pre; + overflow: auto; + background: #f8f8ff; +} + +pubDate:before { content: "Date: " } +link:before { content: "Link: " } +author:before, creator:before { content: "Author: " } +description:before { content: "Description: " } +id:before { content: "Id: " } + +generator:before { content: "Generator: " } +language:before { content: "Language: " } +lastBuildDate:before { content: "Updated: " } +comments:before { content: "Comments page: " } + +tagline:before { content: "Tagline: " } +issued:before { content: "Issued: " } +created:before { content: "Created: " } +modified:before { content: "Modified: " } +updated:before { content: "Updated: " } +summary:before { content: "Summary: " } +comment:before { content: "Comment: " } + +pubDate:before, link:before, author:before, description:before, +language:before, generator:before, lastBuildDate:before, comments:before, +tagline:before, issued:before, created:before, modified:before, +summary:before, comment:before, creator:before, id:before, updated:before { + color: #224; + font-weight: bold; +} + +feed link:after { + content: attr(href); +} diff --git a/common/images/Arr_.png b/common/images/Arr_.png Binary files differnew file mode 100644 index 0000000..bc67a4b --- /dev/null +++ b/common/images/Arr_.png diff --git a/common/images/Arr_d.png b/common/images/Arr_d.png Binary files differnew file mode 100644 index 0000000..58a9fc6 --- /dev/null +++ b/common/images/Arr_d.png diff --git a/common/images/Arr_l.png b/common/images/Arr_l.png Binary files differnew file mode 100644 index 0000000..2246254 --- /dev/null +++ b/common/images/Arr_l.png diff --git a/common/images/Arr_r.png b/common/images/Arr_r.png Binary files differnew file mode 100644 index 0000000..467a555 --- /dev/null +++ b/common/images/Arr_r.png diff --git a/common/images/Arr_u.png b/common/images/Arr_u.png Binary files differnew file mode 100644 index 0000000..1aa543a --- /dev/null +++ b/common/images/Arr_u.png diff --git a/common/images/Checker-16x16.png b/common/images/Checker-16x16.png Binary files differnew file mode 100644 index 0000000..3e9e3d0 --- /dev/null +++ b/common/images/Checker-16x16.png diff --git a/common/images/Zoom_sans.gif b/common/images/Zoom_sans.gif Binary files differnew file mode 100644 index 0000000..56a49de --- /dev/null +++ b/common/images/Zoom_sans.gif diff --git a/common/images/add.png b/common/images/add.png Binary files differnew file mode 100644 index 0000000..3497423 --- /dev/null +++ b/common/images/add.png diff --git a/common/images/ajax-loader.gif b/common/images/ajax-loader.gif Binary files differnew file mode 100644 index 0000000..72203fd --- /dev/null +++ b/common/images/ajax-loader.gif diff --git a/common/images/ar/button_bold.png b/common/images/ar/button_bold.png Binary files differnew file mode 100644 index 0000000..e524f6c --- /dev/null +++ b/common/images/ar/button_bold.png diff --git a/common/images/ar/button_headline.png b/common/images/ar/button_headline.png Binary files differnew file mode 100644 index 0000000..398e561 --- /dev/null +++ b/common/images/ar/button_headline.png diff --git a/common/images/ar/button_italic.png b/common/images/ar/button_italic.png Binary files differnew file mode 100644 index 0000000..6ec73e9 --- /dev/null +++ b/common/images/ar/button_italic.png diff --git a/common/images/ar/button_link.png b/common/images/ar/button_link.png Binary files differnew file mode 100644 index 0000000..c9c63f6 --- /dev/null +++ b/common/images/ar/button_link.png diff --git a/common/images/ar/button_nowiki.png b/common/images/ar/button_nowiki.png Binary files differnew file mode 100644 index 0000000..743ea61 --- /dev/null +++ b/common/images/ar/button_nowiki.png diff --git a/common/images/arrow_disabled_first_25.png b/common/images/arrow_disabled_first_25.png Binary files differnew file mode 100644 index 0000000..78a493e --- /dev/null +++ b/common/images/arrow_disabled_first_25.png diff --git a/common/images/arrow_disabled_last_25.png b/common/images/arrow_disabled_last_25.png Binary files differnew file mode 100644 index 0000000..2a64fd0 --- /dev/null +++ b/common/images/arrow_disabled_last_25.png diff --git a/common/images/arrow_disabled_left_25.png b/common/images/arrow_disabled_left_25.png Binary files differnew file mode 100644 index 0000000..83df068 --- /dev/null +++ b/common/images/arrow_disabled_left_25.png diff --git a/common/images/arrow_disabled_right_25.png b/common/images/arrow_disabled_right_25.png Binary files differnew file mode 100644 index 0000000..aa4fbf8 --- /dev/null +++ b/common/images/arrow_disabled_right_25.png diff --git a/common/images/arrow_first_25.png b/common/images/arrow_first_25.png Binary files differnew file mode 100644 index 0000000..52b32a5 --- /dev/null +++ b/common/images/arrow_first_25.png diff --git a/common/images/arrow_last_25.png b/common/images/arrow_last_25.png Binary files differnew file mode 100644 index 0000000..caf5033 --- /dev/null +++ b/common/images/arrow_last_25.png diff --git a/common/images/arrow_left_25.png b/common/images/arrow_left_25.png Binary files differnew file mode 100644 index 0000000..f363bf6 --- /dev/null +++ b/common/images/arrow_left_25.png diff --git a/common/images/arrow_right_25.png b/common/images/arrow_right_25.png Binary files differnew file mode 100644 index 0000000..3f8fee3 --- /dev/null +++ b/common/images/arrow_right_25.png diff --git a/common/images/be-tarask/button_bold.png b/common/images/be-tarask/button_bold.png Binary files differnew file mode 100644 index 0000000..5c10cfe --- /dev/null +++ b/common/images/be-tarask/button_bold.png diff --git a/common/images/be-tarask/button_italic.png b/common/images/be-tarask/button_italic.png Binary files differnew file mode 100644 index 0000000..72209d7 --- /dev/null +++ b/common/images/be-tarask/button_italic.png diff --git a/common/images/be-tarask/button_link.png b/common/images/be-tarask/button_link.png Binary files differnew file mode 100644 index 0000000..09c86fb --- /dev/null +++ b/common/images/be-tarask/button_link.png diff --git a/common/images/bullet.gif b/common/images/bullet.gif Binary files differnew file mode 100644 index 0000000..b43de48 --- /dev/null +++ b/common/images/bullet.gif diff --git a/common/images/button_bold.png b/common/images/button_bold.png Binary files differnew file mode 100644 index 0000000..75c3f10 --- /dev/null +++ b/common/images/button_bold.png diff --git a/common/images/button_extlink.png b/common/images/button_extlink.png Binary files differnew file mode 100644 index 0000000..458943c --- /dev/null +++ b/common/images/button_extlink.png diff --git a/common/images/button_headline.png b/common/images/button_headline.png Binary files differnew file mode 100644 index 0000000..9cf751d --- /dev/null +++ b/common/images/button_headline.png diff --git a/common/images/button_hr.png b/common/images/button_hr.png Binary files differnew file mode 100644 index 0000000..47e1ca4 --- /dev/null +++ b/common/images/button_hr.png diff --git a/common/images/button_image.png b/common/images/button_image.png Binary files differnew file mode 100644 index 0000000..6919296 --- /dev/null +++ b/common/images/button_image.png diff --git a/common/images/button_italic.png b/common/images/button_italic.png Binary files differnew file mode 100644 index 0000000..527fbd1 --- /dev/null +++ b/common/images/button_italic.png diff --git a/common/images/button_link.png b/common/images/button_link.png Binary files differnew file mode 100644 index 0000000..eb5634b --- /dev/null +++ b/common/images/button_link.png diff --git a/common/images/button_media.png b/common/images/button_media.png Binary files differnew file mode 100644 index 0000000..4194ec1 --- /dev/null +++ b/common/images/button_media.png diff --git a/common/images/button_nowiki.png b/common/images/button_nowiki.png Binary files differnew file mode 100644 index 0000000..2ba818d --- /dev/null +++ b/common/images/button_nowiki.png diff --git a/common/images/button_sig.png b/common/images/button_sig.png Binary files differnew file mode 100644 index 0000000..fe34b3f --- /dev/null +++ b/common/images/button_sig.png diff --git a/common/images/button_template.png b/common/images/button_template.png Binary files differnew file mode 100644 index 0000000..94d9d0b --- /dev/null +++ b/common/images/button_template.png diff --git a/common/images/cc-0.png b/common/images/cc-0.png Binary files differnew file mode 100644 index 0000000..9d3fe5f --- /dev/null +++ b/common/images/cc-0.png diff --git a/common/images/cc-by-nc-sa.png b/common/images/cc-by-nc-sa.png Binary files differnew file mode 100644 index 0000000..0d24a71 --- /dev/null +++ b/common/images/cc-by-nc-sa.png diff --git a/common/images/cc-by-sa.png b/common/images/cc-by-sa.png Binary files differnew file mode 100644 index 0000000..518fb64 --- /dev/null +++ b/common/images/cc-by-sa.png diff --git a/common/images/cc-by.png b/common/images/cc-by.png Binary files differnew file mode 100644 index 0000000..9cca2f9 --- /dev/null +++ b/common/images/cc-by.png diff --git a/common/images/closewindow.png b/common/images/closewindow.png Binary files differnew file mode 100644 index 0000000..990702e --- /dev/null +++ b/common/images/closewindow.png diff --git a/common/images/closewindow19x19.png b/common/images/closewindow19x19.png Binary files differnew file mode 100644 index 0000000..c96d9ff --- /dev/null +++ b/common/images/closewindow19x19.png diff --git a/common/images/critical-32.png b/common/images/critical-32.png Binary files differnew file mode 100644 index 0000000..9b38e6a --- /dev/null +++ b/common/images/critical-32.png diff --git a/common/images/cyrl/LICENSE b/common/images/cyrl/LICENSE new file mode 100644 index 0000000..bedcec6 --- /dev/null +++ b/common/images/cyrl/LICENSE @@ -0,0 +1,17 @@ +button_bold.png +--------------- +Source : http://commons.wikimedia.org/wiki/Image:Button_bold_ukr.png +License: Public domain +Author : Alexey Belomoev + +button_italic.png +------------------------ +Source : http://commons.wikimedia.org/wiki/Image:Button_italic_ukr.png +License: Public domain +Author : Alexey Belomoev + +button_link.png +----------------- +Source : http://commons.wikimedia.org/wiki/Image:Button_internal_link_ukr.png +License: GPL +Author : Saproj, Erik Möller diff --git a/common/images/cyrl/button_bold.png b/common/images/cyrl/button_bold.png Binary files differnew file mode 100644 index 0000000..eae30d9 --- /dev/null +++ b/common/images/cyrl/button_bold.png diff --git a/common/images/cyrl/button_italic.png b/common/images/cyrl/button_italic.png Binary files differnew file mode 100644 index 0000000..b958d22 --- /dev/null +++ b/common/images/cyrl/button_italic.png diff --git a/common/images/cyrl/button_link.png b/common/images/cyrl/button_link.png Binary files differnew file mode 100644 index 0000000..12ad373 --- /dev/null +++ b/common/images/cyrl/button_link.png diff --git a/common/images/de/button_bold.png b/common/images/de/button_bold.png Binary files differnew file mode 100644 index 0000000..367d5bc --- /dev/null +++ b/common/images/de/button_bold.png diff --git a/common/images/de/button_italic.png b/common/images/de/button_italic.png Binary files differnew file mode 100644 index 0000000..fdd8c9f --- /dev/null +++ b/common/images/de/button_italic.png diff --git a/common/images/diffunderline.gif b/common/images/diffunderline.gif Binary files differnew file mode 100644 index 0000000..e062c56 --- /dev/null +++ b/common/images/diffunderline.gif diff --git a/common/images/download-32.png b/common/images/download-32.png Binary files differnew file mode 100644 index 0000000..e5b8318 --- /dev/null +++ b/common/images/download-32.png diff --git a/common/images/fa/button_bold.png b/common/images/fa/button_bold.png Binary files differnew file mode 100644 index 0000000..c54d094 --- /dev/null +++ b/common/images/fa/button_bold.png diff --git a/common/images/fa/button_headline.png b/common/images/fa/button_headline.png Binary files differnew file mode 100644 index 0000000..9890d15 --- /dev/null +++ b/common/images/fa/button_headline.png diff --git a/common/images/fa/button_italic.png b/common/images/fa/button_italic.png Binary files differnew file mode 100644 index 0000000..33f91ed --- /dev/null +++ b/common/images/fa/button_italic.png diff --git a/common/images/fa/button_link.png b/common/images/fa/button_link.png Binary files differnew file mode 100644 index 0000000..76b939e --- /dev/null +++ b/common/images/fa/button_link.png diff --git a/common/images/fa/button_nowiki.png b/common/images/fa/button_nowiki.png Binary files differnew file mode 100644 index 0000000..743ea61 --- /dev/null +++ b/common/images/fa/button_nowiki.png diff --git a/common/images/feed-icon.png b/common/images/feed-icon.png Binary files differnew file mode 100644 index 0000000..00f49f6 --- /dev/null +++ b/common/images/feed-icon.png diff --git a/common/images/feed-icon.svg b/common/images/feed-icon.svg new file mode 100644 index 0000000..6e5f570 --- /dev/null +++ b/common/images/feed-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 256 256"><defs><linearGradient x1=".085" y1=".085" x2=".915" y2=".915" id="a"><stop offset="0" stop-color="#E3702D"/><stop offset=".107" stop-color="#EA7D31"/><stop offset=".35" stop-color="#F69537"/><stop offset=".5" stop-color="#FB9E3A"/><stop offset=".702" stop-color="#EA7C31"/><stop offset=".887" stop-color="#DE642B"/><stop offset="1" stop-color="#D95B29"/></linearGradient></defs><rect width="256" height="256" rx="55" ry="55" fill="#CC5D15"/><rect width="246" height="246" rx="50" ry="50" x="5" y="5" fill="#F49C52"/><rect width="236" height="236" rx="47" ry="47" x="10" y="10" fill="url(#a)"/><circle cx="68" cy="189" r="24" fill="#FFF"/><path d="M160 213h-34a82 82 0 0 0-82-82v-34a116 116 0 0 1 116 116zM184 213a140 140 0 0 0-140-140v-35a175 175 0 0 1 175 175z" fill="#FFF"/></svg>
\ No newline at end of file diff --git a/common/images/gnu-fdl.png b/common/images/gnu-fdl.png Binary files differnew file mode 100644 index 0000000..3feaf57 --- /dev/null +++ b/common/images/gnu-fdl.png diff --git a/common/images/help-question-hover.gif b/common/images/help-question-hover.gif Binary files differnew file mode 100644 index 0000000..515138d --- /dev/null +++ b/common/images/help-question-hover.gif diff --git a/common/images/help-question.gif b/common/images/help-question.gif Binary files differnew file mode 100644 index 0000000..b4fc9c5 --- /dev/null +++ b/common/images/help-question.gif diff --git a/common/images/icons/COPYING b/common/images/icons/COPYING new file mode 100644 index 0000000..136530a --- /dev/null +++ b/common/images/icons/COPYING @@ -0,0 +1,43 @@ +The icons used here are derived from the crystalsvg icons in the the +pics/crystalsvg/ directory of kdelibs-3.4.0 they were modified on 2005-05-15 +by Ævar Arnfjörð Bjarmason for use in MediaWiki. + +What follows is the contents of the LICENSE.crystalsvg file found in the pics/ +subdirectory of kdelibs-3.4.0: + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +This copyright and license notice covers all CrystalSVG images. +Note the license notice contains an add-on. +******************************************************************************** +KDE Crystal theme icons. +Copyright (C) 2002 and following years KDE Artists +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation, +version 2.1 of the License. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + **** NOTE THIS ADD-ON **** +The GNU Lesser General Public License or LGPL is written for software libraries +in the first place. We expressly want the LGPL to be valid for this artwork +library too. +KDE Crystal theme icons is a special kind of software library, it is an +artwork library, it's elements can be used in a Graphical User Interface, or +GUI. +Source code, for this library means: + - for vectors svg; + - for pixels, if applicable, the multi-layered formats xcf or psd, or +otherwise png. +The LGPL in some sections obliges you to make the files carry +notices. With images this is in some cases impossible or hardly useful. +With this library a notice is placed at a prominent place in the directory +containing the elements. You may follow this practice. +The exception in section 6 of the GNU Lesser General Public License covers +the use of elements of this art library in a GUI. +kde-artists [at] kde.org +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/common/images/icons/fileicon-c.png b/common/images/icons/fileicon-c.png Binary files differnew file mode 100644 index 0000000..0d603b7 --- /dev/null +++ b/common/images/icons/fileicon-c.png diff --git a/common/images/icons/fileicon-cpp.png b/common/images/icons/fileicon-cpp.png Binary files differnew file mode 100644 index 0000000..123688f --- /dev/null +++ b/common/images/icons/fileicon-cpp.png diff --git a/common/images/icons/fileicon-deb.png b/common/images/icons/fileicon-deb.png Binary files differnew file mode 100644 index 0000000..87ca3fa --- /dev/null +++ b/common/images/icons/fileicon-deb.png diff --git a/common/images/icons/fileicon-djvu.png b/common/images/icons/fileicon-djvu.png Binary files differnew file mode 100644 index 0000000..1da2276 --- /dev/null +++ b/common/images/icons/fileicon-djvu.png diff --git a/common/images/icons/fileicon-djvu.xcf b/common/images/icons/fileicon-djvu.xcf Binary files differnew file mode 100644 index 0000000..8043dcd --- /dev/null +++ b/common/images/icons/fileicon-djvu.xcf diff --git a/common/images/icons/fileicon-dvi.png b/common/images/icons/fileicon-dvi.png Binary files differnew file mode 100644 index 0000000..f37878d --- /dev/null +++ b/common/images/icons/fileicon-dvi.png diff --git a/common/images/icons/fileicon-exe.png b/common/images/icons/fileicon-exe.png Binary files differnew file mode 100644 index 0000000..dc020eb --- /dev/null +++ b/common/images/icons/fileicon-exe.png diff --git a/common/images/icons/fileicon-h.png b/common/images/icons/fileicon-h.png Binary files differnew file mode 100644 index 0000000..339bf02 --- /dev/null +++ b/common/images/icons/fileicon-h.png diff --git a/common/images/icons/fileicon-html.png b/common/images/icons/fileicon-html.png Binary files differnew file mode 100644 index 0000000..f28f8a2 --- /dev/null +++ b/common/images/icons/fileicon-html.png diff --git a/common/images/icons/fileicon-iso.png b/common/images/icons/fileicon-iso.png Binary files differnew file mode 100644 index 0000000..c73d229 --- /dev/null +++ b/common/images/icons/fileicon-iso.png diff --git a/common/images/icons/fileicon-java.png b/common/images/icons/fileicon-java.png Binary files differnew file mode 100644 index 0000000..a1b4f22 --- /dev/null +++ b/common/images/icons/fileicon-java.png diff --git a/common/images/icons/fileicon-mid.png b/common/images/icons/fileicon-mid.png Binary files differnew file mode 100644 index 0000000..ce2bebb --- /dev/null +++ b/common/images/icons/fileicon-mid.png diff --git a/common/images/icons/fileicon-mov.png b/common/images/icons/fileicon-mov.png Binary files differnew file mode 100644 index 0000000..952de1f --- /dev/null +++ b/common/images/icons/fileicon-mov.png diff --git a/common/images/icons/fileicon-o.png b/common/images/icons/fileicon-o.png Binary files differnew file mode 100644 index 0000000..f3523d9 --- /dev/null +++ b/common/images/icons/fileicon-o.png diff --git a/common/images/icons/fileicon-ogg.png b/common/images/icons/fileicon-ogg.png Binary files differnew file mode 100644 index 0000000..ef4d801 --- /dev/null +++ b/common/images/icons/fileicon-ogg.png diff --git a/common/images/icons/fileicon-ogg.xcf b/common/images/icons/fileicon-ogg.xcf Binary files differnew file mode 100644 index 0000000..a91024b --- /dev/null +++ b/common/images/icons/fileicon-ogg.xcf diff --git a/common/images/icons/fileicon-pdf.png b/common/images/icons/fileicon-pdf.png Binary files differnew file mode 100644 index 0000000..8c8da92 --- /dev/null +++ b/common/images/icons/fileicon-pdf.png diff --git a/common/images/icons/fileicon-ps.png b/common/images/icons/fileicon-ps.png Binary files differnew file mode 100644 index 0000000..e872833 --- /dev/null +++ b/common/images/icons/fileicon-ps.png diff --git a/common/images/icons/fileicon-psd.png b/common/images/icons/fileicon-psd.png Binary files differnew file mode 100644 index 0000000..598f190 --- /dev/null +++ b/common/images/icons/fileicon-psd.png diff --git a/common/images/icons/fileicon-rm.png b/common/images/icons/fileicon-rm.png Binary files differnew file mode 100644 index 0000000..81dbe0b --- /dev/null +++ b/common/images/icons/fileicon-rm.png diff --git a/common/images/icons/fileicon-rpm.png b/common/images/icons/fileicon-rpm.png Binary files differnew file mode 100644 index 0000000..1903aac --- /dev/null +++ b/common/images/icons/fileicon-rpm.png diff --git a/common/images/icons/fileicon-svg.png b/common/images/icons/fileicon-svg.png Binary files differnew file mode 100644 index 0000000..b782113 --- /dev/null +++ b/common/images/icons/fileicon-svg.png diff --git a/common/images/icons/fileicon-tar.png b/common/images/icons/fileicon-tar.png Binary files differnew file mode 100644 index 0000000..e5fd1b7 --- /dev/null +++ b/common/images/icons/fileicon-tar.png diff --git a/common/images/icons/fileicon-tex.png b/common/images/icons/fileicon-tex.png Binary files differnew file mode 100644 index 0000000..a437284 --- /dev/null +++ b/common/images/icons/fileicon-tex.png diff --git a/common/images/icons/fileicon-ttf.png b/common/images/icons/fileicon-ttf.png Binary files differnew file mode 100644 index 0000000..1ed4e74 --- /dev/null +++ b/common/images/icons/fileicon-ttf.png diff --git a/common/images/icons/fileicon-txt.png b/common/images/icons/fileicon-txt.png Binary files differnew file mode 100644 index 0000000..9e988e7 --- /dev/null +++ b/common/images/icons/fileicon-txt.png diff --git a/common/images/icons/fileicon.png b/common/images/icons/fileicon.png Binary files differnew file mode 100644 index 0000000..59696a3 --- /dev/null +++ b/common/images/icons/fileicon.png diff --git a/common/images/info-32.png b/common/images/info-32.png Binary files differnew file mode 100644 index 0000000..ab09e1d --- /dev/null +++ b/common/images/info-32.png diff --git a/common/images/ksh/LICENSE b/common/images/ksh/LICENSE new file mode 100644 index 0000000..ba56f97 --- /dev/null +++ b/common/images/ksh/LICENSE @@ -0,0 +1,7 @@ + +button_S_italic.png +------------------- +Source : http://commons.wikimedia.org/wiki/Image:Button_S_italic.png +License: Public domain +Author : Purodha Blissenbach, http://ksh.wikipedia.org/wiki/User:Purodha + diff --git a/common/images/ksh/button_S_italic.png b/common/images/ksh/button_S_italic.png Binary files differnew file mode 100644 index 0000000..15496c0 --- /dev/null +++ b/common/images/ksh/button_S_italic.png diff --git a/common/images/link_icon.gif b/common/images/link_icon.gif Binary files differnew file mode 100644 index 0000000..168c1a2 --- /dev/null +++ b/common/images/link_icon.gif diff --git a/common/images/magnify-clip-rtl.png b/common/images/magnify-clip-rtl.png Binary files differnew file mode 100644 index 0000000..ff85c07 --- /dev/null +++ b/common/images/magnify-clip-rtl.png diff --git a/common/images/magnify-clip.png b/common/images/magnify-clip.png Binary files differnew file mode 100644 index 0000000..00a9cee --- /dev/null +++ b/common/images/magnify-clip.png diff --git a/common/images/mediawiki.png b/common/images/mediawiki.png Binary files differnew file mode 100644 index 0000000..8c42118 --- /dev/null +++ b/common/images/mediawiki.png diff --git a/common/images/nextredirectltr.png b/common/images/nextredirectltr.png Binary files differnew file mode 100644 index 0000000..cd657c3 --- /dev/null +++ b/common/images/nextredirectltr.png diff --git a/common/images/nextredirectrtl.png b/common/images/nextredirectrtl.png Binary files differnew file mode 100644 index 0000000..b788f33 --- /dev/null +++ b/common/images/nextredirectrtl.png diff --git a/common/images/poweredby_mediawiki_88x31.png b/common/images/poweredby_mediawiki_88x31.png Binary files differnew file mode 100644 index 0000000..30e1d2e --- /dev/null +++ b/common/images/poweredby_mediawiki_88x31.png diff --git a/common/images/public-domain.png b/common/images/public-domain.png Binary files differnew file mode 100644 index 0000000..ebf0107 --- /dev/null +++ b/common/images/public-domain.png diff --git a/common/images/question-small.png b/common/images/question-small.png Binary files differnew file mode 100644 index 0000000..f7405d2 --- /dev/null +++ b/common/images/question-small.png diff --git a/common/images/question.svg b/common/images/question.svg new file mode 100644 index 0000000..98fbe8d --- /dev/null +++ b/common/images/question.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="21.059" height="21.06"><path fill="#575757" d="M10.529 0c-5.814 0-10.529 4.714-10.529 10.529s4.715 10.53 10.529 10.53c5.816 0 10.529-4.715 10.529-10.53s-4.712-10.529-10.529-10.529zm-.002 16.767c-.861 0-1.498-.688-1.498-1.516 0-.862.637-1.534 1.498-1.534.828 0 1.5.672 1.5 1.534 0 .827-.672 1.516-1.5 1.516zm2.137-6.512c-.723.568-1 .931-1 1.739v.5h-2.205v-.603c0-1.517.449-2.136 1.154-2.688.707-.552 1.139-.845 1.139-1.637 0-.672-.414-1.051-1.24-1.051-.707 0-1.328.189-1.982.638l-1.051-1.807c.861-.604 1.93-1.034 3.342-1.034 1.912 0 3.516 1.051 3.516 3.066-.001 1.43-.794 2.188-1.673 2.877z"/></svg>
\ No newline at end of file diff --git a/common/images/redirectltr.png b/common/images/redirectltr.png Binary files differnew file mode 100644 index 0000000..695f2a1 --- /dev/null +++ b/common/images/redirectltr.png diff --git a/common/images/redirectrtl.png b/common/images/redirectrtl.png Binary files differnew file mode 100644 index 0000000..c954a2a --- /dev/null +++ b/common/images/redirectrtl.png diff --git a/common/images/remove.png b/common/images/remove.png Binary files differnew file mode 100644 index 0000000..cd03d6d --- /dev/null +++ b/common/images/remove.png diff --git a/common/images/spinner.gif b/common/images/spinner.gif Binary files differnew file mode 100644 index 0000000..6146be4 --- /dev/null +++ b/common/images/spinner.gif diff --git a/common/images/tick-32.png b/common/images/tick-32.png Binary files differnew file mode 100644 index 0000000..34cfa9c --- /dev/null +++ b/common/images/tick-32.png diff --git a/common/images/tipsy-arrow.gif b/common/images/tipsy-arrow.gif Binary files differnew file mode 100644 index 0000000..9f1a15b --- /dev/null +++ b/common/images/tipsy-arrow.gif diff --git a/common/images/tooltip_icon.png b/common/images/tooltip_icon.png Binary files differnew file mode 100644 index 0000000..ba5718a --- /dev/null +++ b/common/images/tooltip_icon.png diff --git a/common/images/warning-32.png b/common/images/warning-32.png Binary files differnew file mode 100644 index 0000000..0400734 --- /dev/null +++ b/common/images/warning-32.png diff --git a/common/images/wiki.png b/common/images/wiki.png Binary files differnew file mode 100644 index 0000000..48595b0 --- /dev/null +++ b/common/images/wiki.png diff --git a/common/oldshared.css b/common/oldshared.css new file mode 100644 index 0000000..eea8b8e --- /dev/null +++ b/common/oldshared.css @@ -0,0 +1,469 @@ +/** + * oldshared.css + * This file contains CSS settings common to Wikistandard, Nostalgia and + * CologneBlue, the old pre-Monobook skins + */ + +/* For clarity, explicitly state some recommendations from + * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right + */ + +h1 { font-size: 2em; } +h2 { font-size: 1.5em; } +h3 { font-size: 1.17em; } +h4 { font-size: 1.11em; } +h5 { font-size: 1.05em; } +h6 { font-size: 1em; } +h1, h2, h3, h4, h5, h6 { + font-weight: bolder; +} + +/* Now the custom parts */ + +#footer { clear: both } +/* images */ +/* @noflip */ +div.floatright { + float: right; + clear: right; + margin: 0 0 1em 1em; +} + +/* @noflip */ +div.floatright p { + font-style: italic; +} + +/* @noflip */ +div.floatleft { + float: left; + clear: left; + margin: 0.3em 0.5em 0.5em 0; +} + +/* @noflip */ +div.floatleft p { + font-style: italic; +} + +/* table standards */ +table.rimage { + float: right; + margin-left: 1em; + margin-bottom: 1em; + text-align: center; + font-size: smaller; +} + +/* thumbnails */ +div.thumb { + margin-bottom: .5em; + border-style: solid; + border-color: white; + width: auto; +} +div.thumbinner { + border: 1px solid #ccc; + padding: 3px !important; + background-color: #f9f9f9; + font-size: 94%; + text-align: center; + overflow: hidden; +} +html .thumbimage { + border: 1px solid #ccc; +} +html .thumbcaption { + border: none; + text-align: left; + line-height: 1.4em; + padding: 3px !important; + font-size: 94%; +} +div.magnify { + float: right; + border: none !important; + background: none !important; + margin-left: 3px; +} +div.magnify a, +div.magnify img { + display: block; + border: none !important; + background: none !important; +} +/* @noflip */ +div.tright { + clear: right; + float: right; + border-width: .5em 0 .8em 1.4em; +} +/* @noflip */ +div.tleft { + float: left; + clear: left; + margin-right: .5em; + border-width: .5em 1.4em .8em 0; +} +img.thumbborder { + border: 1px solid #dddddd; +} + +/* Page history styling */ +/* the auto-generated edit comments */ +.autocomment { color: #4b4b4b; } + +img { border: none; } + +#toc, +.toc { + border: 1px solid #bba; + background-color: #f7f8ff; + padding: 5px; + font-size: 95%; + text-align: center; + display: -moz-inline-block; + display: inline-block; + display: table; + + /* IE7 and earlier */ + zoom: 1; + *display: inline; + + padding: 7px; +} +/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */ +table#toc, +table.toc { + border-collapse: collapse; +} +/* Remove additional paddings inside table-cells that are not present in <div>s */ +table#toc td, +table.toc td { + padding: 0; +} +#toc h2, +.toc h2 { + display: inline; + border: none; + padding: 0; + font-size: 100%; + font-weight: bold; +} +#toc ul, +.toc ul { + list-style-type: none; + list-style-image: none; + padding: 0; + text-align: left; +} +#toc ul ul, +.toc ul ul { + margin: 0 0 0 2em; +} +#toc .toctoggle, +.toc .toctoggle { + font-size: 94%; +} + +.error { + color: red; + font-size: larger; +} + +/* preference page with js-genrated toc */ +#preftoc { + float: left; + margin: 1em 1em 1em 1em; + width: 13em; +} +#preftoc li { + border: 1px solid White; +} +#preftoc li.selected { + background-color:#f9f9f9; + border:1px dashed #aaaaaa; +} +#preftoc a, +#preftoc a:active { + display: block; + color: #005189; +} +.mw-prefs-buttons { + clear: left; + float: left; + margin-top: 1em; +} +div.htmlform-tip { + font-size: 94%; + margin-top: 0.4em; + color: #666; +} +fieldset.prefsection { + margin-top: 1em; +} +fieldset.operaprefsection { + margin-left: 15em; +} + +/* emulate center */ +.center { + width: 100%; + text-align: center; +} +*.center * { + margin-left: auto; + margin-right: auto; +} + +/* small for tables and similar */ +.small { + font-size: 94%; +} +table.small { + font-size: 100%; +} + +/* use this instead of #toc for page content */ +.toccolours { + border: 1px solid #aaaaaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; +} +#siteNotice { + border: 1px solid #aaaaaa; + padding-left: 0.5em; + padding-right: 0.5em; +} +.redirectText { + font-size: 150%; + margin: 5px; +} +.sharedUploadNotice { + font-style: italic; +} +span.unpatrolled { + font-weight: bold; + color: red; +} + +span.updatedmarker { + color: black; + background-color: #00FF00; +} + +div.gallerybox { + width: 150px; +} + +span.comment { + font-style: italic; +} + +span.changedby { + font-size: 95%; +} + +.previewnote { + text-align: center; + color: #cc0000; +} +.editExternally { + border-style: solid; + border-width: 1px; + border-color: gray; + background: #ffffff; + padding: 3px; + margin-top: 0.5em; + float: left; + font-size: small; + text-align: center; +} +.editExternallyHelp { + font-style: italic; + color: gray; +} + +li span.deleted { + text-decoration: line-through; + color: #888; + font-style: italic; +} + +/* Classes for Exif data display */ +table.mw_metadata { + margin-left: 0.5em; +} + +table.mw_metadata caption { + font-weight: bold; +} +table.mw_metadata th { + font-weight: normal; +} +table.mw_metadata td { + padding: 0.1em; +} + +table.mw_metadata { + border: none; + border-collapse: collapse; +} +table.mw_metadata td, +table.mw_metadata th { + border: 1px solid #aaaaaa; + padding-left: 4px; + padding-right: 4px; +} +table.mw_metadata th { + background-color: #f9f9f9; +} +table.mw_metadata td { + background-color: #fcfcfc; +} +table.mw_metadata td.spacer { + background: inherit; + border-top: none; + border-bottom: none; +} +table.collapsed tr.collapsable { + display: none; +} + +.visualClear { + clear: both; +} + +/* Allmessages table */ +#allmessagestable th { + background-color: #b2b2ff; +} + +#allmessagestable tr.orig { + background-color: #ffe2e2; +} + +#allmessagestable tr.new { + background-color: #e2ffe2; +} + +#allmessagestable tr.def { + background-color: #f0f0ff; +} + +#jump-to-nav { + display: none; +} + +div.multipageimagenavbox { + border: solid 1px silver; + padding: 4px; + margin: 1em; + background: #f0f0f0; +} + +div.multipageimagenavbox div.thumb { + border: none; + margin-left: 2em; + margin-right: 2em; +} + +div.multipageimagenavbox hr { + margin: 6px; +} + +table.multipageimage td { + text-align: center; +} + +/* + Table pager (e.g. Special:Imagelist) + - remove underlines from the navigation link + - collapse borders + - set the borders to outsets (similar to Special:Allmessages) + - remove line wrapping for all td and th, set background color + - restore line wrapping for the last two table cells (description and size) +*/ +.TablePager_nav a { + text-decoration: none; +} +.TablePager { + border-collapse: collapse; +} +.TablePager, +.TablePager td, +.TablePager th { + border: 0.15em solid #777777; + padding: 0 0.15em 0 0.15em; +} +.TablePager th { + background-color: #eeeeff; +} +.TablePager td { + background-color: #ffffff; +} +.TablePager tr:hover td { + background-color: #eeeeff; +} + +.imagelist td, +.imagelist th { + white-space: nowrap; +} +.imagelist .TablePager_col_links { + background-color: #eeeeff; +} +.imagelist .TablePager_col_img_description { + white-space: normal; +} +.imagelist th.TablePager_sort { + background-color: #ccccff; +} + +.templatesUsed { + margin-top: 1em; +} + +.MediaTransformError { + border: thin solid #777; + background-color: #ccc; + padding: 0.1em; +} +.MediaTransformError td { + text-align: center; + vertical-align: middle; + font-size: 90%; +} + +form#specialpages { + display: inline; +} + +body { + direction: ltr; + unicode-bidi: embed; + background-color: #ffffec; +} +body.ns-0 { + background-color: white; +} + +/** RTL specific CSS starts here **/ + +/** + * Lists: + * The following lines don't have a visible effect on non-Gecko browsers + * They fix a problem with Gecko browsers rendering lists to the right of + * left-floated objects in an RTL layout. + */ +/* @noflip */ +html > body.rtl div#article ul { + display: table; +} +/* @noflip */ +html > body.rtl div#bodyContent ul#filetoc { + display: block; +} + +/* RTL specific CSS ends here **/ diff --git a/common/protect.js b/common/protect.js new file mode 100644 index 0000000..dc142ca --- /dev/null +++ b/common/protect.js @@ -0,0 +1,387 @@ +( function ( mw, $ ) { + +var ProtectionForm = window.ProtectionForm = { + existingMatch: false, + + /** + * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox) + * on the protection form + * + * @param opts Object : parameters with members: + * tableId Identifier of the table containing UI bits + * labelText Text to use for the checkbox label + * numTypes The number of protection types + * existingMatch True if all the existing expiry times match + */ + init: function ( opts ) { + var box, boxbody, row, cell, check, label; + + if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) { + return false; + } + + box = document.getElementById( opts.tableId ); + if ( !box ) { + return false; + } + + boxbody = box.getElementsByTagName( 'tbody' )[0]; + row = document.createElement( 'tr' ); + boxbody.insertBefore( row, boxbody.firstChild.nextSibling ); + + this.existingMatch = opts.existingMatch; + + cell = document.createElement( 'td' ); + row.appendChild( cell ); + // If there is only one protection type, there is nothing to chain + if ( opts.numTypes > 1 ) { + check = document.createElement( 'input' ); + check.id = 'mwProtectUnchained'; + check.type = 'checkbox'; + $( check ).click( function () { + ProtectionForm.onChainClick(); + } ); + + label = document.createElement( 'label' ); + label.htmlFor = 'mwProtectUnchained'; + label.appendChild( document.createTextNode( opts.labelText ) ); + + cell.appendChild( check ); + cell.appendChild( document.createTextNode( ' ' ) ); + cell.appendChild( label ); + + check.checked = !this.areAllTypesMatching(); + this.enableUnchainedInputs( check.checked ); + } + + $( '#mwProtect-reason' ).byteLimit( 180 ); + + this.updateCascadeCheckbox(); + + return true; + }, + + /** + * Sets the disabled attribute on the cascade checkbox depending on the current selected levels + */ + updateCascadeCheckbox: function () { + var i, lists, items, selected; + + // For non-existent titles, there is no cascade option + if ( !document.getElementById( 'mwProtect-cascade' ) ) { + return; + } + lists = this.getLevelSelectors(); + for ( i = 0; i < lists.length; i++ ) { + if ( lists[i].selectedIndex > -1 ) { + items = lists[i].getElementsByTagName( 'option' ); + selected = items[ lists[i].selectedIndex ].value; + if ( !this.isCascadeableLevel( selected ) ) { + document.getElementById( 'mwProtect-cascade' ).checked = false; + document.getElementById( 'mwProtect-cascade' ).disabled = true; + return; + } + } + } + document.getElementById( 'mwProtect-cascade' ).disabled = false; + }, + + /** + * Checks if a cerain protection level is cascadeable. + * @param level {String} + * @return {Boolean} + */ + isCascadeableLevel: function ( level ) { + var cascadeLevels, len, i; + + cascadeLevels = mw.config.get( 'wgCascadeableLevels' ); + // cascadeLevels isn't defined on all pages + if ( cascadeLevels ) { + for ( i = 0, len = cascadeLevels.length; i < len; i += 1 ) { + if ( cascadeLevels[i] === level ) { + return true; + } + } + } + return false; + }, + + /** + * When protection levels are locked together, update the rest + * when one action's level changes + * + * @param source Element Level selector that changed + */ + updateLevels: function ( source ) { + if ( !this.isUnchained() ) { + this.setAllSelectors( source.selectedIndex ); + } + this.updateCascadeCheckbox(); + }, + + /** + * When protection levels are locked together, update the + * expiries when one changes + * + * @param source Element expiry input that changed + */ + + updateExpiry: function ( source ) { + var expiry, listId, list; + + if ( !this.isUnchained() ) { + expiry = source.value; + this.forEachExpiryInput( function ( element ) { + element.value = expiry; + } ); + } + listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' ); + list = document.getElementById( listId ); + if ( list && list.value !== 'othertime' ) { + if ( this.isUnchained() ) { + list.value = 'othertime'; + } else { + this.forEachExpirySelector( function ( element ) { + element.value = 'othertime'; + } ); + } + } + }, + + /** + * When protection levels are locked together, update the + * expiry lists when one changes and clear the custom inputs + * + * @param source Element expiry selector that changed + */ + updateExpiryList: function ( source ) { + var expiry; + if ( !this.isUnchained() ) { + expiry = source.value; + this.forEachExpirySelector( function ( element ) { + element.value = expiry; + } ); + this.forEachExpiryInput( function ( element ) { + element.value = ''; + } ); + } + }, + + /** + * Update chain status and enable/disable various bits of the UI + * when the user changes the "unlock move permissions" checkbox + */ + onChainClick: function () { + if ( this.isUnchained() ) { + this.enableUnchainedInputs( true ); + } else { + this.setAllSelectors( this.getMaxLevel() ); + this.enableUnchainedInputs( false ); + } + this.updateCascadeCheckbox(); + }, + + /** + * Returns true if the named attribute in all objects in the given array are matching + */ + matchAttribute: function ( objects, attrName ) { + var i, element, value; + + // Check levels + value = null; + for ( i = 0; i < objects.length; i++ ) { + element = objects[i]; + if ( value === null ) { + value = element[attrName]; + } else { + if ( value !== element[attrName] ) { + return false; + } + } + } + return true; + }, + + /** + * Are all actions protected at the same level, with the same expiry time? + * + * @return boolean + */ + areAllTypesMatching: function () { + return this.existingMatch + && this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' ) + && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' ) + && this.matchAttribute( this.getExpiryInputs(), 'value' ); + }, + + /** + * Is protection chaining off? + * + * @return bool + */ + isUnchained: function () { + var element = document.getElementById( 'mwProtectUnchained' ); + return element + ? element.checked + : true; // No control, so we need to let the user set both levels + }, + + /** + * Find the highest protection level in any selector + */ + getMaxLevel: function () { + var maxIndex = -1; + this.forEachLevelSelector( function ( element ) { + if ( element.selectedIndex > maxIndex ) { + maxIndex = element.selectedIndex; + } + } ); + return maxIndex; + }, + + /** + * Protect all actions at the specified level + * + * @param index int Protection level + */ + setAllSelectors: function ( index ) { + this.forEachLevelSelector( function ( element ) { + if ( element.selectedIndex !== index ) { + element.selectedIndex = index; + } + } ); + }, + + /** + * Apply a callback to each protection selector + * + * @param func callable Callback function + */ + forEachLevelSelector: function ( func ) { + var i, selectors; + + selectors = this.getLevelSelectors(); + for ( i = 0; i < selectors.length; i++ ) { + func( selectors[i] ); + } + }, + + /** + * Get a list of all protection selectors on the page + * + * @return Array + */ + getLevelSelectors: function () { + var i, ours, all, element; + + all = document.getElementsByTagName( 'select' ); + ours = []; + for ( i = 0; i < all.length; i++ ) { + element = all[i]; + if ( element.id.match( /^mwProtect-level-/ ) ) { + ours[ours.length] = element; + } + } + return ours; + }, + + /** + * Apply a callback to each expiry input + * + * @param func callable Callback function + */ + forEachExpiryInput: function ( func ) { + var i, inputs; + + inputs = this.getExpiryInputs(); + for ( i = 0; i < inputs.length; i++ ) { + func( inputs[i] ); + } + }, + + /** + * Get a list of all expiry inputs on the page + * + * @return Array + */ + getExpiryInputs: function () { + var i, all, element, ours; + + all = document.getElementsByTagName( 'input' ); + ours = []; + for ( i = 0; i < all.length; i++ ) { + element = all[i]; + if ( element.name.match( /^mwProtect-expiry-/ ) ) { + ours[ours.length] = element; + } + } + return ours; + }, + + /** + * Apply a callback to each expiry selector list + * @param func callable Callback function + */ + forEachExpirySelector: function ( func ) { + var i, inputs; + + inputs = this.getExpirySelectors(); + for ( i = 0; i < inputs.length; i++ ) { + func( inputs[i] ); + } + }, + + /** + * Get a list of all expiry selector lists on the page + * + * @return Array + */ + getExpirySelectors: function () { + var i, all, ours, element; + + all = document.getElementsByTagName( 'select' ); + ours = []; + for ( i = 0; i < all.length; i++ ) { + element = all[i]; + if ( element.id.match( /^mwProtectExpirySelection-/ ) ) { + ours[ours.length] = element; + } + } + return ours; + }, + + /** + * Enable/disable protection selectors and expiry inputs + * + * @param val boolean Enable? + */ + enableUnchainedInputs: function ( val ) { + var first = true; + + this.forEachLevelSelector( function ( element ) { + if ( first ) { + first = false; + } else { + element.disabled = !val; + } + } ); + first = true; + this.forEachExpiryInput( function ( element ) { + if ( first ) { + first = false; + } else { + element.disabled = !val; + } + } ); + first = true; + this.forEachExpirySelector( function ( element ) { + if ( first ) { + first = false; + } else { + element.disabled = !val; + } + } ); + } +}; + +}( mediaWiki, jQuery ) ); diff --git a/common/shared.css b/common/shared.css new file mode 100644 index 0000000..6b052b3 --- /dev/null +++ b/common/shared.css @@ -0,0 +1,1216 @@ +/** + * CSS in this file is used by *all* skins (that have any CSS at all). Be + * careful what you put in here, since what looks good in one skin may not in + * another, but don't ignore the poor pre-Monobook users either. + */ + +/* GENERAL CLASSES FOR DIRECTIONALITY SUPPORT */ + +/** + * These classes should be used for text depending on the content direction. + * Content stuff like editsection, ul/ol and TOC depend on this. + */ +.mw-content-ltr { + /* @noflip */ + direction: ltr; +} +.mw-content-rtl { + /* @noflip */ + direction: rtl; +} + +/* Most input fields should be in site direction */ +.sitedir-ltr textarea, +.sitedir-ltr input { + /* @noflip */ + direction: ltr; +} +.sitedir-rtl textarea, +.sitedir-rtl input { + /* @noflip */ + direction: rtl; +} + +/* User-Agent styles for new HTML5 elements */ +mark { + background-color: yellow; + color: black; +} + +/* Input types that should follow user direction, like buttons */ +/* TODO: What about buttons in wikipage content ? */ +input[type="submit"], +input[type="button"], +input[type="reset"], +input[type="file"] { + direction: ltr; +} + +/* Override default values */ +textarea[dir="ltr"], +input[dir="ltr"] { + /* @noflip */ + direction: ltr; +} +textarea[dir="rtl"], +input[dir="rtl"] { + /* @noflip */ + direction: rtl; +} + +/* Default style for semantic tags */ +abbr[title], +.explain[title] { + border-bottom: 1px dotted; + cursor: help; +} + +/* Colored watchlist and recent changes numbers */ +.mw-plusminus-pos { + color: #006400; /* dark green */ +} +.mw-plusminus-neg { + color: #8b0000; /* dark red */ +} +.mw-plusminus-null { + color: #aaa; /* gray */ +} + +/** + * Links to redirects appear italicized on [[Special:AllPages]], [[Special:PrefixIndex]], + * [[Special:Watchlist/edit]] and in category listings. + */ +.allpagesredirect, +.redirect-in-category, +.watchlistredir { + font-style: italic; +} + +/* Comment and username portions of RC entries */ +span.comment { + font-style: italic; +} + +span.changedby { + font-size: 95%; +} + +/* Math */ +.texvc { + direction: ltr; + unicode-bidi: embed; +} +img.tex { + vertical-align: middle; +} +span.texhtml { + font-family: serif; +} + +/** + * Add a bit of margin space between the preview and the toolbar. + * This replaces the ugly <p><br /></p> we used to insert into the page source + */ +#wikiPreview.ontop { + margin-bottom: 1em; +} + +/* Stop floats from intruding into edit area in previews */ +#editform, +#toolbar, +#wpTextbox1 { + clear: both; +} + +#toolbar img { + cursor: pointer; +} + +/** + * File description page + */ + +div.mw-filepage-resolutioninfo { + font-size: smaller; +} + +/** + * File histories + */ +h2#filehistory { + clear: both; +} + +table.filehistory th, +table.filehistory td { + vertical-align: top; +} +table.filehistory th { + text-align: left; +} +table.filehistory td.mw-imagepage-filesize, +table.filehistory th.mw-imagepage-filesize { + white-space: nowrap; +} + +table.filehistory td.filehistory-selected { + font-weight: bold; +} + +/** + * Add a checkered background image on hover for file + * description pages. (bug 26470) + */ +.filehistory a img, +#file img:hover { + /* @embed */ + background: white url(images/Checker-16x16.png) repeat; +} + +/** + * rev_deleted stuff + */ +li span.deleted, +span.history-deleted { + text-decoration: line-through; + color: #888; + font-style: italic; +} + +/** + * Patrol stuff + */ +.not-patrolled { + background-color: #ffa; +} + +.unpatrolled { + font-weight: bold; + color: red; +} + +div.patrollink { + font-size: 75%; + text-align: right; +} + +/** + * Forms + */ +td.mw-label { + text-align: right; +} +td.mw-input { + text-align: left; +} +td.mw-submit { + text-align: left; +} + +td.mw-label { + vertical-align: top; +} +.prefsection td.mw-label { + width: 20%; +} +.prefsection table { + width: 100%; +} +.prefsection table.mw-htmlform-matrix { + width: auto; +} + +.mw-icon-question { + /* SVG support using a transparent gradient to guarantee cross-browser + * compatibility (browsers able to understand gradient syntax support also SVG). + * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */ + background-image: url(images/question-small.png); + /* @embed */ + background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg); + /* @embed */ + background-image: linear-gradient(transparent, transparent), url(images/question.svg); + background-repeat: no-repeat; + background-size: 13px 13px; + display: inline-block; + height: 13px; + width: 13px; + margin-left: 4px; +} + +.mw-icon-question:lang(ar), +.mw-icon-question:lang(fa), +.mw-icon-question:lang(ur) { + -webkit-transform: scaleX(-1); + -ms-transform: scaleX(-1); + transform: scaleX(-1); +} + +td.mw-submit { + white-space: nowrap; +} + +table.mw-htmlform-nolabel td.mw-label { + width: 1px; +} + +tr.mw-htmlform-vertical-label td.mw-label { + text-align: left !important; +} + +.mw-htmlform-invalid-input td.mw-input input { + border-color: red; +} + +.mw-htmlform-flatlist div.mw-htmlform-flatlist-item { + display: inline; + margin-right: 1em; + white-space: nowrap; +} + +.mw-htmlform-matrix td { + padding-left: 0.5em; + padding-right: 0.5em; +} + +input#wpSummary { + width: 80%; + margin-bottom: 1em; +} + +/** + * Image captions + */ +/* @noflip */ +.mw-content-ltr .thumbcaption { + text-align: left; +} +/* @noflip */ +.mw-content-rtl .thumbcaption { + text-align: right; +} +/* @noflip */ +.mw-content-ltr .magnify { + float: right; +} +/* @noflip */ +.mw-content-rtl .magnify { + float: left; +} + +/** + * Categories + */ +#catlinks { + /** + * Overrides text justification (user preference) + * See bug 31990 + */ + text-align: left; +} +.catlinks ul { + display: inline; + margin: 0; + padding: 0; + list-style: none; + list-style-type: none; + list-style-image: none; + vertical-align: middle !ie; +} + +.catlinks li { + display: inline-block; + line-height: 1.25em; + border-left: 1px solid #AAA; + margin: 0.125em 0; + padding: 0 0.5em; + zoom: 1; + display: inline !ie; +} + +.catlinks li:first-child { + padding-left: 0.25em; + border-left: none; +} + +/* (bug 5346) make category redirects italic */ +.catlinks li a.mw-redirect { + font-style: italic; +} +/** + * Hidden categories + */ +.mw-hidden-cats-hidden { + display: none; +} +.catlinks-allhidden { + display: none; +} + +/* Convenience links to edit block, delete and protect reasons */ +p.mw-ipb-conveniencelinks, +p.mw-protect-editreasons, +p.mw-filedelete-editreasons, +p.mw-delete-editreasons, +p.mw-revdel-editreasons { + font-size: 90%; + text-align: right; +} + +/** + * OpenSearch ajax suggestions + */ +.os-suggest { + overflow: auto; + overflow-x: hidden; + position: absolute; + top: 0; + left: 0; + width: 0; + background-color: white; + border-style: solid; + border-color: #AAAAAA; + border-width: 1px; + z-index:99; + font-size:95%; +} + +table.os-suggest-results { + font-size: 95%; + cursor: pointer; + border: 0; + border-collapse: collapse; + width: 100%; +} + +.os-suggest-result, +.os-suggest-result-hl { + white-space: nowrap; + background-color: white; + color: black; + padding: 2px; +} +.os-suggest-result-hl, +.os-suggest-result-hl-webkit { + background-color: #4C59A6; + color: white; +} + +.os-suggest-toggle { + position: relative; + left: 1ex; + font-size: 65%; +} +.os-suggest-toggle-def { + position: absolute; + top: 0; + left: 0; + font-size: 65%; + visibility: hidden; +} + +/* Page history styling */ + +/* The auto-generated edit comments */ +.autocomment { + color: gray; +} +#pagehistory .history-user { + margin-left: 0.4em; + margin-right: 0.2em; +} +#pagehistory span.minor { + font-weight: bold; +} +#pagehistory li { + border: 1px solid white; +} +#pagehistory li.selected { + background-color: #f9f9f9; + border: 1px dashed #aaa; +} + +.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon { + float: right; +} + +/** Generic minor/bot/newpage styling (recent changes) */ +.newpage, +.minoredit, +.botedit { + font-weight: bold; +} + +#shared-image-dup, +#shared-image-conflict { + font-style: italic; +} + +/** + * Recreating deleted page warning + * Reupload file warning + * Page protection warning + * incl. log entries for these warnings + */ +div.mw-warning-with-logexcerpt { + padding: 3px; + margin-bottom: 3px; + border: 2px solid #2F6FAB; + clear: both; +} +div.mw-warning-with-logexcerpt ul li { + font-size: 90%; +} + +/* (show/hide) revision deletion links */ +span.mw-revdelundel-link, +strong.mw-revdelundel-link { + font-size: 90%; +} +span.mw-revdelundel-hidden, +input.mw-revdelundel-hidden { + visibility: hidden; +} + +td.mw-revdel-checkbox, +th.mw-revdel-checkbox { + padding-right: 10px; + text-align: center; +} + +/* red links; see bug 36276 */ +a.new { + color: #BA0000; +} + +/* feed links */ +a.feedlink { + /* SVG support using a transparent gradient to guarantee cross-browser + * compatibility (browsers able to understand gradient syntax support also SVG). + * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */ + background-image: url(images/feed-icon.png); + /* @embed */ + background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg); + /* @embed */ + background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg); + background-position: center left; + background-repeat: no-repeat; + background-size: 12px 12px; + padding-left: 16px; +} + +/* Plainlinks - this can be used to switch + * off special external link styling */ +.plainlinks a { + background: none !important; + padding: 0 !important; +} +/* External URLs should always be treated as LTR (bug 4330) */ +/* @noflip */ .rtl a.external.free, +.rtl a.external.autonumber { + direction: ltr; + unicode-bidi: embed; +} + +/** + * wikitable class for skinning normal tables + * keep in sync with commonPrint.css + */ +table.wikitable { + margin: 1em 0; + background-color: #f9f9f9; + border: 1px #aaa solid; + border-collapse: collapse; + color: black; +} +table.wikitable > tr > th, +table.wikitable > tr > td, +table.wikitable > * > tr > th, +table.wikitable > * > tr > td { + border: 1px #aaa solid; + padding: 0.2em; +} +table.wikitable > tr > th, +table.wikitable > * > tr > th { + background-color: #f2f2f2; + text-align: center; +} +table.wikitable > caption { + font-weight: bold; +} + +/** + * Hide collapsable rows in a collapsed table. + * + * Used by ImagePage and the mediawiki.action.view.metadata module. + */ +table.collapsed tr.collapsable { + display: none; +} + +/* success and error messages */ +.error, +.warning, +.success { + font-size: larger; +} +.error { + color: #cc0000; +} +.warning { + color: #705000; +} +.success { + color: #009000; +} + +.errorbox, +.warningbox, +.successbox { + border: 1px solid; + padding: .5em 1em; + margin-bottom: 1em; + display: -moz-inline-block; + display: inline-block; + zoom: 1; + *display: inline; +} +.errorbox h2, +.warningbox h2, +.successbox h2 { + font-size: 1em; + color: inherit; + font-weight: bold; + display: inline; + margin: 0 .5em 0 0; + border: none; +} +.errorbox { + color: #cc0000; + border-color: #fac5c5; + background-color: #fae3e3; +} +.warningbox { + color: #705000; + border-color: #fde29b; + background-color: #fdf1d1; +} +.successbox { + color: #009000; + border-color: #b7fdb5; + background-color: #e1fddf; +} + +/* general info/warning box for SP */ +.mw-infobox { + border: 2px solid #ff7f00; + margin: 0.5em; + clear: left; + overflow: hidden; +} + +.mw-infobox-left { + margin: 7px; + float: left; + width: 35px; +} + +.mw-infobox-right { + margin: 0.5em 0.5em 0.5em 49px; +} + +/* Note on preview page */ +.previewnote { + color: #c00; + margin-bottom: 1em; +} + +.previewnote p { + text-indent: 3em; + margin: 0.8em 0; +} + +.visualClear { + clear: both; +} + +/** + * Data table style + * + * Transparent table with suddle borders + * and blue row-highlighting. + */ +.mw-datatable { + border-collapse: collapse; +} +.mw-datatable, +.mw-datatable td, +.mw-datatable th { + border: 1px solid #aaaaaa; + padding: 0 0.15em 0 0.15em; +} +.mw-datatable th { + background-color: #ddddff; +} +.mw-datatable td { + background-color: #ffffff; +} +.mw-datatable tr:hover td { + background-color: #eeeeff; +} + + +/** + * TablePager tables generated by the TablePager PHP class + * in MediaWiki (e.g. Special:ListFiles). + */ +.TablePager { + min-width: 80%; +} +.TablePager_nav { + margin: 0 auto; +} +.TablePager_nav td { + padding: 3px; + text-align: center; +} +.TablePager_nav a { + text-decoration: none; +} + +.imagelist td, +.imagelist th { + white-space: nowrap; +} +.imagelist .TablePager_col_links { + background-color: #eeeeff; +} +.imagelist .TablePager_col_img_description { + white-space: normal; +} +.imagelist th.TablePager_sort { + background-color: #ccccff; +} + +/* filetoc */ +ul#filetoc { + text-align: center; + border: 1px solid #aaaaaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; + margin-bottom: 0.5em; + margin-left: 0; + margin-right: 0; +} + +#filetoc li { + display: inline; + list-style-type: none; + padding-right: 2em; +} + +/* Classes for Exif data display */ +table.mw_metadata { + font-size: 0.8em; + margin-left: 0.5em; + margin-bottom: 0.5em; + width: 400px; +} + +table.mw_metadata caption { + font-weight: bold; +} + +table.mw_metadata th { + font-weight: normal; +} + +table.mw_metadata td { + padding: 0.1em; +} + +table.mw_metadata { + border: none; + border-collapse: collapse; +} + +table.mw_metadata td, +table.mw_metadata th { + text-align: center; + border: 1px solid #aaaaaa; + padding-left: 5px; + padding-right: 5px; +} + +table.mw_metadata th { + background-color: #f9f9f9; +} + +table.mw_metadata td { + background-color: #fcfcfc; +} + +table.mw_metadata ul.metadata-langlist { + list-style-type: none; + list-style-image: none; + padding-right: 5px; + padding-left: 5px; + margin: 0; +} + +/* Correct directionality when page dir is different from site/user dir */ +.mw-content-ltr ul, +.mw-content-rtl .mw-content-ltr ul { + /* @noflip */ + margin: 0.3em 0 0 1.6em; + padding: 0; +} +.mw-content-rtl ul, +.mw-content-ltr .mw-content-rtl ul { + /* @noflip */ + margin: 0.3em 1.6em 0 0; + padding: 0; +} +.mw-content-ltr ol, +.mw-content-rtl .mw-content-ltr ol { + /* @noflip */ + margin: 0.3em 0 0 3.2em; + padding: 0; +} +.mw-content-rtl ol, +.mw-content-ltr .mw-content-rtl ol { + /* @noflip */ + margin: 0.3em 3.2em 0 0; + padding: 0; +} +/* @noflip */ +.mw-content-ltr dd, +.mw-content-rtl .mw-content-ltr dd { + margin-left: 1.6em; + margin-right: 0; +} +/* @noflip */ +.mw-content-rtl dd, +.mw-content-ltr .mw-content-rtl dd { + margin-right: 1.6em; + margin-left: 0; +} + +/* Galleries */ +/* These display attributes look nonsensical, but are needed to support IE and FF2 */ +/* Don't forget to update commonPrint.css */ +li.gallerybox { + vertical-align: top; + display: -moz-inline-box; + display: inline-block; +} + +ul.gallery, +li.gallerybox { + zoom: 1; + *display: inline; +} + +ul.gallery { + margin: 2px; + padding: 2px; + display: block; +} + +li.gallerycaption { + font-weight: bold; + text-align: center; + display: block; + word-wrap: break-word; +} + +li.gallerybox div.thumb { + text-align: center; + border: 1px solid #ccc; + background-color: #f9f9f9; + margin: 2px; +} + +li.gallerybox div.thumb img { + display: block; + margin: 0 auto; +} + +div.gallerytext { + overflow: hidden; + font-size: 94%; + padding: 2px 4px; + word-wrap: break-word; +} + +/* new gallery stuff */ +ul.mw-gallery-nolines li.gallerybox div.thumb { + background-color: transparent; + border: none; +} + +ul.mw-gallery-nolines li.gallerybox div.gallerytext { + text-align: center; +} + +/* height constrained gallery */ + +ul.mw-gallery-packed li.gallerybox div.thumb, +ul.mw-gallery-packed-overlay li.gallerybox div.thumb, +ul.mw-gallery-packed-hover li.gallerybox div.thumb { + background-color: transparent; + border: none; +} +ul.mw-gallery-packed li.gallerybox div.thumb img, +ul.mw-gallery-packed-overlay li.gallerybox div.thumb img, +ul.mw-gallery-packed-hover li.gallerybox div.thumb img { + margin: 0 auto; +} + +ul.mw-gallery-packed-hover li.gallerybox, +ul.mw-gallery-packed-overlay li.gallerybox { + position:relative; +} + +ul.mw-gallery-packed-hover div.gallerytextwrapper { + overflow: hidden; + height: 0; +} + +ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper, +ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper, +ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper { + position:absolute; + background: white; + background: rgba(255, 255, 255, 0.8); + padding: 5px 10px; + bottom: 0; + left: 0; /* Needed for IE */ + height: auto; + font-weight: bold; + margin: 2px; /* correspond to style on div.thumb */ +} + +ul.mw-gallery-packed-hover, +ul.mw-gallery-packed-overlay, +ul.mw-gallery-packed { + text-align: center; +} + +.mw-ajax-loader { + /* @embed */ + background-image: url(images/ajax-loader.gif); + background-position: center center; + background-repeat: no-repeat; + padding: 16px; + position: relative; + top: -16px; +} + +.mw-small-spinner { + padding: 10px !important; + margin-right: 0.6em; + /* @embed */ + background-image: url(images/spinner.gif); + background-position: center center; + background-repeat: no-repeat; +} + +/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */ +/* Languages like hi or ml require slightly more vertical space to show diacritics properly */ +h1:lang(anp), +h1:lang(as), +h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */ +h1:lang(bho), +h1:lang(bn), +h1:lang(gu), +h1:lang(hi), +h1:lang(kn), +h1:lang(ks), +h1:lang(ml), +h1:lang(mr), +h1:lang(my), +h1:lang(mai), +h1:lang(ne), +h1:lang(new), +h1:lang(or), +h1:lang(pa), +h1:lang(pi), +h1:lang(sa), +h1:lang(ta), +h1:lang(te) { + line-height: 1.6em !important; +} +h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp), +h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as), +h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho), +h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh), +h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn), +h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu), +h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi), +h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn), +h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks), +h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml), +h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr), +h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my), +h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai), +h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne), +h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new), +h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or), +h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa), +h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi), +h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa), +h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta), +h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) { + line-height: 1.2em; +} + +/* Localised ordered list numbering for some languages */ +ol:lang(bcc) li, +ol:lang(bqi) li, +ol:lang(fa) li, +ol:lang(glk) li, +ol:lang(kk-arab) li, +ol:lang(mzn) li { + list-style-type: -moz-persian; + list-style-type: persian; +} + +ol:lang(ckb) li { + list-style-type: -moz-arabic-indic; + list-style-type: arabic-indic; +} + +ol:lang(hi) li, +ol:lang(mr) li { + list-style-type: -moz-devanagari; + list-style-type: devanagari; +} + +ol:lang(as) li, +ol:lang(bn) li { + list-style-type: -moz-bengali; + list-style-type: bengali; +} + +ol:lang(or) li { + list-style-type: -moz-oriya; + list-style-type: oriya; +} + +#toc ul, .toc ul { + margin: .3em 0; +} + +/* Correct directionality when page dir is different from site/user dir */ +/* @noflip */ .mw-content-ltr .toc ul, +.mw-content-ltr #toc ul, +.mw-content-rtl .mw-content-ltr .toc ul, +.mw-content-rtl .mw-content-ltr #toc ul { + text-align: left; +} +/* @noflip */ .mw-content-rtl .toc ul, +.mw-content-rtl #toc ul, +.mw-content-ltr .mw-content-rtl .toc ul, +.mw-content-ltr .mw-content-rtl #toc ul { + text-align: right; +} +/* @noflip */ .mw-content-ltr .toc ul ul, +.mw-content-ltr #toc ul ul, +.mw-content-rtl .mw-content-ltr .toc ul ul, +.mw-content-rtl .mw-content-ltr #toc ul ul { + margin: 0 0 0 2em; +} +/* @noflip */ .mw-content-rtl .toc ul ul, +.mw-content-rtl #toc ul ul, +.mw-content-ltr .mw-content-rtl .toc ul ul, +.mw-content-ltr .mw-content-rtl #toc ul ul { + margin: 0 2em 0 0; +} + +#toc #toctitle, +.toc #toctitle, +#toc .toctitle, +.toc .toctitle { + direction: ltr; +} + +/* tooltip styles */ +.mw-help-field-hint { + display: none; + margin-left: 2px; + margin-bottom: -8px; + padding: 0 0 0 15px; + /* @embed */ + background-image: url(images/help-question.gif); + background-position: left center; + background-repeat: no-repeat; + cursor: pointer; + font-size: .8em; + text-decoration: underline; + color: #0645ad; +} +.mw-help-field-hint:hover { + /* @embed */ + background-image: url(images/help-question-hover.gif); +} +.mw-help-field-data { + display: block; + background-color: #d6f3ff; + padding:5px 8px 4px 8px; + border: 1px solid #5dc9f4; + margin-left: 20px; +} +.tipsy { + padding: 5px 5px 10px; + font-size: 12px; + position: absolute; + z-index: 100000; + overflow: visible; +} +.tipsy-inner { + padding: 5px 8px 4px 8px; + background-color: #d6f3ff; + color: black; + border: 1px solid #5dc9f4; + max-width: 300px; + text-align: left; +} +.tipsy-arrow { + position: absolute; + /* @embed */ + background: url(images/tipsy-arrow.gif) no-repeat top left; + width: 13px; + height: 13px; +} +.tipsy-se .tipsy-arrow { + bottom: -2px; + right: 10px; + background-position: 0% 100%; +} + +#mw-clearyourcache, +#mw-sitecsspreview, +#mw-sitejspreview, +#mw-usercsspreview, +#mw-userjspreview { + direction: ltr; + unicode-bidi: embed; +} + +/* Correct user & content directionality when viewing a diff */ +.diff-currentversion-title, +.diff { + direction: ltr; + unicode-bidi: embed; +} +/* @noflip */ .diff-contentalign-right td { + direction: rtl; + unicode-bidi: embed; +} +/* @noflip */ .diff-contentalign-left td { + direction: ltr; + unicode-bidi: embed; +} +.diff-multi, +.diff-otitle, +.diff-ntitle, +.diff-lineno { + direction: ltr !important; + unicode-bidi: embed; +} + +#mw-revision-info, +#mw-revision-info-current, +#mw-revision-nav { + direction: ltr; + display: inline; +} + +/* Images */ + +/* @noflip */ div.tright, +div.floatright, +table.floatright { + clear: right; + float: right; +} +/* @noflip */ div.tleft, +div.floatleft, +table.floatleft { + float: left; + clear: left; +} +div.floatright, +table.floatright, +div.floatleft, +table.floatleft { + position: relative; +} + +/* bug 12205 */ +#mw-credits a { + unicode-bidi: embed; +} + +/* Accessibility */ +.mw-jump, +#jump-to-nav { + overflow: hidden; + height: 0; + zoom: 1; /* http://webaim.org/techniques/skipnav/#iequirk */ +} + +/* Print footer should be hidden by default in screen. */ +.printfooter { + display: none; +} + +/* For developers */ +.xdebug-error { + position: absolute; + z-index: 99; +} + +.mw-editsection, +.toctoggle, +#jump-to-nav { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* Display editsection links smaller and next to headings */ +.mw-editsection, +.mw-editsection-like { + font-size: small; + font-weight: normal; + margin-left: 1em; + vertical-align: baseline; + /* Reset line-height; headings tend to have it set to larger values */ + line-height: 1em; + /* As .mw-editsection is a <span> (inline element), it is treated as part */ + /* of the heading content when selecting text by multiple clicks and thus */ + /* selected together with heading content, despite the user-select: none; */ + /* rule set above. This enforces non-selection without changing the look. */ + display: inline-block; +} + +/* Correct directionality when page dir is different from site/user dir */ +/* @noflip */ +.mw-content-ltr .mw-editsection, +.mw-content-rtl .mw-content-ltr .mw-editsection { + margin-left: 1em; +} +/* @noflip */ +.mw-content-rtl .mw-editsection, +.mw-content-ltr .mw-content-rtl .mw-editsection { + margin-right: 1em; +} + +/* Prevent citations and subscripts from interfering with the line-height */ +sup, +sub { + line-height: 1; +} diff --git a/common/upload.js b/common/upload.js new file mode 100644 index 0000000..7933caf --- /dev/null +++ b/common/upload.js @@ -0,0 +1,355 @@ +/*jshint camelcase:false */ +( function ( mw, $ ) { +var licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename, + ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ), + fileExtensions = mw.config.get( 'wgFileExtensions' ), + $spinnerDestCheck, $spinnerLicense; + +licenseSelectorCheck = window.licenseSelectorCheck = function () { + var selector = document.getElementById( 'wpLicense' ), + selection = selector.options[selector.selectedIndex].value; + if ( selector.selectedIndex > 0 ) { + if ( !selection ) { + // Option disabled, but browser is broken and doesn't respect this + selector.selectedIndex = 0; + } + } + // We might show a preview + wgUploadLicenseObj.fetchPreview( selection ); +}; + +function uploadSetup() { + // Disable URL box if the URL copy upload source type is not selected + var ein, + selector, ua, isMacIe, i, + optionsTable, row, td, + wpLicense, wpLicenseRow, wpLicenseTbody, + uploadSourceIds, len, onchange, + e = document.getElementById( 'wpSourceTypeurl' ); + if ( e ) { + if ( !e.checked ) { + ein = document.getElementById( 'wpUploadFileURL' ); + if ( ein ) { + ein.disabled = true; + } + } + } + + // For MSIE/Mac: non-breaking spaces cause the <option> not to render. + // But for some reason, setting the text to itself works + selector = document.getElementById( 'wpLicense' ); + if ( selector ) { + ua = navigator.userAgent; + isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1; + if ( isMacIe ) { + for ( i = 0; i < selector.options.length; i++ ) { + selector.options[i].text = selector.options[i].text; + } + } + } + + // AJAX wpDestFile warnings + if ( ajaxUploadDestCheck ) { + // Insert an event handler that fetches upload warnings when wpDestFile + // has been changed + document.getElementById( 'wpDestFile' ).onchange = function () { + wgUploadWarningObj.checkNow( this.value ); + }; + // Insert a row where the warnings will be displayed just below the + // wpDestFile row + optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0]; + row = optionsTable.insertRow( 1 ); + td = document.createElement( 'td' ); + td.id = 'wpDestFile-warning'; + td.colSpan = 2; + + row.appendChild( td ); + } + + wpLicense = document.getElementById( 'wpLicense' ); + if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) { + // License selector check + wpLicense.onchange = licenseSelectorCheck; + + // License selector table row + wpLicenseRow = wpLicense.parentNode.parentNode; + wpLicenseTbody = wpLicenseRow.parentNode; + + row = document.createElement( 'tr' ); + td = document.createElement( 'td' ); + row.appendChild( td ); + td = document.createElement( 'td' ); + td.id = 'mw-license-preview'; + row.appendChild( td ); + + wpLicenseTbody.insertBefore( row, wpLicenseRow.nextSibling ); + } + + // fillDestFile setup + uploadSourceIds = mw.config.get( 'wgUploadSourceIds' ); + len = uploadSourceIds.length; + onchange = function () { + fillDestFilename( this.id ); + }; + for ( i = 0; i < len; i += 1 ) { + document.getElementById( uploadSourceIds[i] ).onchange = onchange; + } +} + +wgUploadWarningObj = window.wgUploadWarningObj = { + responseCache: { '': ' ' }, + nameToCheck: '', + typing: false, + delay: 500, // ms + timeoutID: false, + + keypress: function () { + var cached, destFile, warningElt; + + if ( !ajaxUploadDestCheck ) { + return; + } + + // Find file to upload + destFile = document.getElementById( 'wpDestFile' ); + warningElt = document.getElementById( 'wpDestFile-warning' ); + if ( !destFile || !warningElt ) { + return; + } + + this.nameToCheck = destFile.value; + + // Clear timer + if ( this.timeoutID ) { + clearTimeout( this.timeoutID ); + } + // Check response cache + for ( cached in this.responseCache ) { + if ( this.nameToCheck === cached ) { + this.setWarning(this.responseCache[this.nameToCheck]); + return; + } + } + + this.timeoutID = setTimeout( function () { + wgUploadWarningObj.timeout(); + }, this.delay ); + }, + + checkNow: function ( fname ) { + if ( !ajaxUploadDestCheck ) { + return; + } + if ( this.timeoutID ) { + clearTimeout( this.timeoutID ); + } + this.nameToCheck = fname; + this.timeout(); + }, + + timeout: function () { + if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) { + return; + } + $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' ); + + var uploadWarningObj = this; + ( new mw.Api() ).get( { + action: 'query', + titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(), + prop: 'imageinfo', + iiprop: 'uploadwarning', + indexpageids: '' + } ).done( function ( result ) { + var resultOut = ''; + if ( result.query ) { + resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0]; + } + uploadWarningObj.processResult( resultOut, uploadWarningObj.nameToCheck ); + } ); + }, + + processResult: function ( result, fileName ) { + $spinnerDestCheck.remove(); + $spinnerDestCheck = undefined; + this.setWarning( result.html ); + this.responseCache[fileName] = result.html; + }, + + setWarning: function ( warning ) { + var warningElt = document.getElementById( 'wpDestFile-warning' ), + ackElt = document.getElementsByName( 'wpDestFileWarningAck' ); + + this.setInnerHTML( warningElt, warning ); + + // Set a value in the form indicating that the warning is acknowledged and + // doesn't need to be redisplayed post-upload + if ( !warning ) { + ackElt[0].value = ''; + } else { + ackElt[0].value = '1'; + } + + }, + setInnerHTML: function ( element, text ) { + // Check for no change to avoid flicker in IE 7 + if ( element.innerHTML !== text ) { + element.innerHTML = text; + } + } +}; + +fillDestFilename = window.fillDestFilename = function ( id ) { + var e, path, slash, backslash, fname, + found, ext, i, + destFile; + if ( !mw.config.get( 'wgUploadAutoFill' ) ) { + return; + } + if ( !document.getElementById ) { + return; + } + // Remove any previously flagged errors + e = document.getElementById( 'mw-upload-permitted' ); + if ( e ) { + e.className = ''; + } + + e = document.getElementById( 'mw-upload-prohibited' ); + if ( e ) { + e.className = ''; + } + + path = document.getElementById( id ).value; + // Find trailing part + slash = path.lastIndexOf( '/' ); + backslash = path.lastIndexOf( '\\' ); + if ( slash === -1 && backslash === -1 ) { + fname = path; + } else if ( slash > backslash ) { + fname = path.substring( slash + 1, 10000 ); + } else { + fname = path.substring( backslash + 1, 10000 ); + } + + // Clear the filename if it does not have a valid extension. + // URLs are less likely to have a useful extension, so don't include them in the + // extension check. + if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) { + found = false; + if ( fname.lastIndexOf( '.' ) !== -1 ) { + ext = fname.substr( fname.lastIndexOf( '.' ) + 1 ); + for ( i = 0; i < fileExtensions.length; i += 1 ) { + if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) { + found = true; + break; + } + } + } + if ( !found ) { + // Not a valid extension + // Clear the upload and set mw-upload-permitted to error + document.getElementById( id ).value = ''; + e = document.getElementById( 'mw-upload-permitted' ); + if ( e ) { + e.className = 'error'; + } + + e = document.getElementById( 'mw-upload-prohibited' ); + if ( e ) { + e.className = 'error'; + } + + // Clear wpDestFile as well + e = document.getElementById( 'wpDestFile' ); + if ( e ) { + e.value = ''; + } + + return false; + } + } + + // Replace spaces by underscores + fname = fname.replace( / /g, '_' ); + // Capitalise first letter if needed + if ( mw.config.get( 'wgCapitalizeUploads' ) ) { + fname = fname.charAt( 0 ).toUpperCase().concat( fname.substring( 1, 10000 ) ); + } + + // Output result + destFile = document.getElementById( 'wpDestFile' ); + if ( destFile ) { + // Call decodeURIComponent function to remove possible URL-encoded characters + // from the file name (bug 30390). Especially likely with upload-form-url. + // decodeURIComponent can throw an exception in input is invalid utf-8 + try { + destFile.value = decodeURIComponent( fname ); + } catch ( err ) { + destFile.value = fname; + } + wgUploadWarningObj.checkNow( fname ); + } +}; + +window.toggleFilenameFiller = function () { + if ( !document.getElementById ) { + return; + } + var destName = document.getElementById( 'wpDestFile' ).value; + mw.config.set( 'wgUploadAutoFill', !destName ); +}; + +wgUploadLicenseObj = window.wgUploadLicenseObj = { + + responseCache: { '': '' }, + + fetchPreview: function ( license ) { + var cached, title; + if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) { + return; + } + for ( cached in this.responseCache ) { + if ( cached === license ) { + this.showPreview( this.responseCache[license] ); + return; + } + } + + $spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' ); + + title = document.getElementById( 'wpDestFile' ).value; + if ( !title ) { + title = 'File:Sample.jpg'; + } + + ( new mw.Api() ).get( { + action: 'parse', + text: '{{' + license + '}}', + title: title, + prop: 'text', + pst: '' + } ).done( function ( result ) { + wgUploadLicenseObj.processResult( result, license ); + } ); + }, + + processResult: function ( result, license ) { + $spinnerLicense.remove(); + $spinnerLicense = undefined; + this.responseCache[license] = result.parse.text['*']; + this.showPreview( this.responseCache[license] ); + }, + + showPreview: function ( preview ) { + var previewPanel = document.getElementById( 'mw-license-preview' ); + if ( previewPanel.innerHTML !== preview ) { + previewPanel.innerHTML = preview; + } + } + +}; + +$( uploadSetup ); + +}( mediaWiki, jQuery ) ); diff --git a/common/wikibits.js b/common/wikibits.js new file mode 100644 index 0000000..516035e --- /dev/null +++ b/common/wikibits.js @@ -0,0 +1,243 @@ +/** + * MediaWiki legacy wikibits + */ +( function ( mw, $ ) { + var msg, + win = window, + ua = navigator.userAgent.toLowerCase(), + isIE6 = ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( ua ) && parseFloat( RegExp.$1 ) <= 6.0 ), + isGecko = /gecko/.test( ua ) && !/khtml|spoofer|netscape\/7\.0/.test( ua ), + onloadFuncts = []; + +if ( mw.config.get( 'wgBreakFrames' ) ) { + // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet) + // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266) + if ( win.top !== win.self ) { + // Un-trap us from framesets + win.top.location = win.location; + } +} + +/** + * Legacy function to scroll to an id while viewing the page over a redirect. + * Superseeded by module 'mediawiki.action.view.redirectToFragment' in version 1.23. + * Kepted because cache can contain still inline script calls to this function. + * Should be removed in version 1.24. + * @deprecated since 1.23 Use mediawiki.action.view.redirectToFragment instead + */ +mw.log.deprecate( win, 'redirectToFragment', function ( fragment ) { + var webKitVersion, + match = navigator.userAgent.match( /AppleWebKit\/(\d+)/ ); + if ( match ) { + webKitVersion = parseInt( match[1], 10 ); + if ( webKitVersion < 420 ) { + // Released Safari w/ WebKit 418.9.1 messes up horribly + // Nightlies of 420+ are ok + return; + } + } + if ( !win.location.hash ) { + win.location.hash = fragment; + + // Mozilla needs to wait until after load, otherwise the window doesn't + // scroll. See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>. + // There's no obvious way to detect this programmatically, so we use + // version-testing. If Firefox fixes the bug, they'll jump twice, but + // better twice than not at all, so make the fix hit future versions as + // well. + if ( isGecko ) { + $( function () { + if ( win.location.hash === fragment ) { + win.location.hash = fragment; + } + } ); + } + } +}, 'Use the module mediawiki.action.view.redirectToFragment instead.' ); + +/** + * User-agent sniffing. + * + * @deprecated since 1.17 Use jquery.client instead + */ + +msg = 'Use feature detection or module jquery.client instead.'; + +mw.log.deprecate( win, 'clientPC', ua, msg ); + +// Ignored dummy values +mw.log.deprecate( win, 'is_gecko', false, msg ); +mw.log.deprecate( win, 'is_chrome_mac', false, msg ); +mw.log.deprecate( win, 'is_chrome', false, msg ); +mw.log.deprecate( win, 'webkit_version', false, msg ); +mw.log.deprecate( win, 'is_safari_win', false, msg ); +mw.log.deprecate( win, 'is_safari', false, msg ); +mw.log.deprecate( win, 'webkit_match', false, msg ); +mw.log.deprecate( win, 'is_ff2', false, msg ); +mw.log.deprecate( win, 'ff2_bugs', false, msg ); +mw.log.deprecate( win, 'is_ff2_win', false, msg ); +mw.log.deprecate( win, 'is_ff2_x11', false, msg ); +mw.log.deprecate( win, 'opera95_bugs', false, msg ); +mw.log.deprecate( win, 'opera7_bugs', false, msg ); +mw.log.deprecate( win, 'opera6_bugs', false, msg ); +mw.log.deprecate( win, 'is_opera_95', false, msg ); +mw.log.deprecate( win, 'is_opera_preseven', false, msg ); +mw.log.deprecate( win, 'is_opera', false, msg ); +mw.log.deprecate( win, 'ie6_bugs', false, msg ); + +/** + * DOM utilities for handling of events, text nodes and selecting elements + * + * @deprecated since 1.17 Use jQuery instead + */ +msg = 'Use jQuery instead.'; + +// Ignored dummy values +mw.log.deprecate( win, 'doneOnloadHook', undefined, msg ); +mw.log.deprecate( win, 'onloadFuncts', [], msg ); +mw.log.deprecate( win, 'runOnloadHook', $.noop, msg ); +mw.log.deprecate( win, 'changeText', $.noop, msg ); +mw.log.deprecate( win, 'killEvt', $.noop, msg ); +mw.log.deprecate( win, 'addHandler', $.noop, msg ); +mw.log.deprecate( win, 'hookEvent', $.noop, msg ); +mw.log.deprecate( win, 'addClickHandler', $.noop, msg ); +mw.log.deprecate( win, 'removeHandler', $.noop, msg ); +mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg ); +mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg ); + +// Run a function after the window onload event is fired +mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) { + if ( onloadFuncts ) { + onloadFuncts.push(hookFunct); + } else { + // If func queue is gone the event has happened already, + // run immediately instead of queueing. + hookFunct(); + } +}, msg ); + +$( win ).on( 'load', function () { + var i, functs; + + // Don't run twice + if ( !onloadFuncts ) { + return; + } + + // Deference and clear onloadFuncts before running any + // hooks to make sure we don't miss any addOnloadHook + // calls. + functs = onloadFuncts.slice(); + onloadFuncts = undefined; + + // Execute the queued functions + for ( i = 0; i < functs.length; i++ ) { + functs[i](); + } +} ); + +/** + * Toggle checkboxes with shift selection + * + * @deprecated since 1.17 Use jquery.checkboxShiftClick instead + */ +msg = 'Use jquery.checkboxShiftClick instead.'; +mw.log.deprecate( win, 'checkboxes', [], msg ); +mw.log.deprecate( win, 'lastCheckbox', null, msg ); +mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg ); +mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg ); +mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg ); + +/** + * Add a button to the default editor toolbar + * + * @deprecated since 1.17 Use mw.toolbar instead + */ +mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' ); +mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' ); + +/** + * Spinner creation, injection and removal + * + * @deprecated since 1.18 Use jquery.spinner instead + */ +mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' ); +mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' ); + +/** + * Escape utilities + * + * @deprecated since 1.18 Use mw.html instead + */ +mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' ); +mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' ); + +/** + * Display a message to the user + * + * @deprecated since 1.17 Use mediawiki.notify instead + * @param {string|HTMLElement} message To be put inside the message box + */ +mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead.' ); + +/** + * Misc. utilities + * + * @deprecated since 1.17 Use mediawiki.util instead + */ +msg = 'Use mediawiki.util instead.'; +mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg ); +mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg ); +mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg ); +mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg ); +mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg ); + +/** + * Wikipage import methods + */ + +// included-scripts tracker +win.loadedScripts = {}; + +win.importScript = function ( page ) { + var uri = mw.config.get( 'wgScript' ) + '?title=' + + mw.util.wikiUrlencode( page ) + + '&action=raw&ctype=text/javascript'; + return win.importScriptURI( uri ); +}; + +win.importScriptURI = function ( url ) { + if ( win.loadedScripts[url] ) { + return null; + } + win.loadedScripts[url] = true; + var s = document.createElement( 'script' ); + s.setAttribute( 'src', url ); + s.setAttribute( 'type', 'text/javascript' ); + document.getElementsByTagName( 'head' )[0].appendChild( s ); + return s; +}; + +win.importStylesheet = function ( page ) { + var uri = mw.config.get( 'wgScript' ) + '?title=' + + mw.util.wikiUrlencode( page ) + + '&action=raw&ctype=text/css'; + return win.importStylesheetURI( uri ); +}; + +win.importStylesheetURI = function ( url, media ) { + var l = document.createElement( 'link' ); + l.rel = 'stylesheet'; + l.href = url; + if ( media ) { + l.media = media; + } + document.getElementsByTagName('head')[0].appendChild( l ); + return l; +}; + +if ( isIE6 ) { + win.importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' ); +} + +}( mediaWiki, jQuery ) ); diff --git a/modern/audio.png b/modern/audio.png Binary files differnew file mode 100644 index 0000000..68c8768 --- /dev/null +++ b/modern/audio.png diff --git a/modern/bullet.gif b/modern/bullet.gif Binary files differnew file mode 100644 index 0000000..b43de48 --- /dev/null +++ b/modern/bullet.gif diff --git a/modern/discussionitem_icon.gif b/modern/discussionitem_icon.gif Binary files differnew file mode 100644 index 0000000..e3ca6d9 --- /dev/null +++ b/modern/discussionitem_icon.gif diff --git a/modern/document.png b/modern/document.png Binary files differnew file mode 100644 index 0000000..ee46a50 --- /dev/null +++ b/modern/document.png diff --git a/modern/external.png b/modern/external.png Binary files differnew file mode 100644 index 0000000..6308383 --- /dev/null +++ b/modern/external.png diff --git a/modern/file_icon.gif b/modern/file_icon.gif Binary files differnew file mode 100644 index 0000000..69dbeaf --- /dev/null +++ b/modern/file_icon.gif diff --git a/modern/footer-grad.png b/modern/footer-grad.png Binary files differnew file mode 100644 index 0000000..72b8724 --- /dev/null +++ b/modern/footer-grad.png diff --git a/modern/link_icon.gif b/modern/link_icon.gif Binary files differnew file mode 100644 index 0000000..168c1a2 --- /dev/null +++ b/modern/link_icon.gif diff --git a/modern/lock_icon.gif b/modern/lock_icon.gif Binary files differnew file mode 100644 index 0000000..8284403 --- /dev/null +++ b/modern/lock_icon.gif diff --git a/modern/mail_icon.gif b/modern/mail_icon.gif Binary files differnew file mode 100644 index 0000000..cf5680d --- /dev/null +++ b/modern/mail_icon.gif diff --git a/modern/main.css b/modern/main.css new file mode 100644 index 0000000..6f73f0e --- /dev/null +++ b/modern/main.css @@ -0,0 +1,912 @@ +body { + margin: 0 0 0 0; + padding: 0 0 0 0; + font-size: x-small; + + + font-family: sans-serif; + color: black; + background-color: #f0f0f0; + + direction: ltr; + unicode-bidi: embed; +} + +#mw_main, +#p-personal, +#mw_header, +.os-suggest { + font-size: 130%; +} + +#mw_header { + position: absolute; + top: 0; + left: 0; + margin: 0 0 0 0; + padding: 0 0em 0 0em; + border: none; + height: 2em; + width: 100%; + + background-color: #003366; + color: white; +} + +#mw_header h1 { + margin: 0 0 0 0.5em; + padding: 0 0 0 0; + text-decoration: none; + font-size: 150%; +} + +#p-personal { + position: absolute; + top: 2em; + left: 0; + height: 1.5em; + margin: 0 0 0 0; + padding: 0 0 0 0; + width: 100%; + +} + +#p-personal div.pBody { + margin: 0 0 0 0; + padding: 0 0 0 0; + height: 1.5em; + font-variant: small-caps; +} + +#p-personal h3 { + display: none; +} + +#p-personal ul { + margin: 0 0 0 0; + padding: 0 0 0 0; + display: block; + height: 1.5em; + background-color: #3c78b5; +} + +#p-personal li { + display: block; + float: left; + height: 1.5em; + margin: 0 0 0 0; + vertical-align: middle; + + font-weight: bold; + text-transform: lowercase; +} + +#p-personal li a { + text-decoration: none; + color: white; + padding: 0 1em 0 1em; +} + +#p-personal li a:hover { + text-decoration: none; + color: white; +} + +#p-personal li:hover { + background-color: #003366; +} + +#jump-to-nav { + display: none; +} + +#mw_contentwrapper { + width: 100%; + margin: 0 0 0 -15em; + float: right; +} + +#mw_content { + margin: 0 0 0 14em; + + background-color: white; + border-top: solid 1px #bbbbbb; + border-left: solid 1px #bbbbbb; + border-bottom: solid 1px #bbbbbb; + + line-height: 1.5em; + padding: 0 1em 1em 1em; +} + +#mw_portlets { + width: 14em; + + border-right: solid 1px #bbbbbb; + background-color: #f0f0f0; +} + +/* Hide, but keep accessible for screen-readers */ +#mw_portlets h2 { + position: absolute; + top: -9999px; +} + +#mw_main { + padding: 0 0 0 0; + margin: 0 0 0 0; + margin-top: 3.5em; +} + +div.mw_clear { + margin: 0 0 0 0; + padding: 0 0 0 0; + clear: both; +} + +.portlet { + padding: 0 0 0 0; + margin: 0 0 0 0; +} + +.portlet div.pBody { + padding: 0em 0 0.5em 0; +} + +textarea { + width: 100%; + padding: .1em; + display: block; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +#searchBody { + text-align: center; +} + +#searchInput { + width: 85%; + margin-left: auto; + margin-right: auto; +} + +#p-search #searchform div div { + margin-top: .4em; +} + +.portlet h3 { + padding: 0.1em 0 0.3em 1em; + margin: 0 0 0 0; + background-color: #dddddd; + font-weight: bold; + font-size: 0.83em; + border-bottom: solid 1px #3c78b5; + height: 1.1em; +} + +.portlet ul { + margin: 0 0 0 1.5em; + padding: 0 0 0 0; +} + +#mw_portlets .portlet ul { + line-height: 1.4em; +} + +ul { + /* @embed */ + list-style-image: url(bullet.gif); +} + +#p-cactions { + height: 1.5em; + padding: 0 0 0 0; + margin: 0 0 0 14em; +} + +#p-cactions div.pBody { + margin: 0 0 0 0; + padding: 0 0 0 0; +} + +#p-cactions a, +#p-cactions a:hover { + color: black; + text-decoration: none; +} + +#p-cactions ul { + display: inline; + margin: 0 0 0 0; + padding: 0 0 0 0; +} + +#p-cactions li { + margin: 0 0.5em 0 0.5em; + padding: 0 0.2em 0 0.2em; + display: block; + float: left; + height: 1.5em; + text-transform: lowercase; +} + +#p-cactions li.selected { + background-color: #bbbbbb; +} + +#p-cactions li a, +#p-cactions li a:hover, +#p-cactions li a:visited { + text-decoration: underline; + color: #003366; +} + +#p-cactions li.selected a, +#p-cactions li.selected a:hover, +#p-cactions li.selected a:visited { + text-decoration: none; + color: white; +} + +#p-cactions h3 { + display: none; +} + +#siteSub { + display: none; +} + +#footer { + background-color: #f0f0f0; + /* @embed */ + background: url(footer-grad.png) repeat-x 0 0; + padding: 10px 1em 1em 1em; + clear:both; + color: #444444; +} + +#footer a, +#footer a:hover, +#footer a:visited { + color: #444444; + text-decoration: underline; +} + +img { + border: none; +} + +#footer li { + display: inline; + list-style-type: none; + padding: 0 0 0 0; + margin: 0 0 0 0; +} + +#footer ul { + padding: 0 0 0 0; + margin: 0 0 0 0; +} + +p { + margin: 1em 0 1em 0; +} + +hr { + height: 1px; + color: #aaa; + background-color: #aaa; + border: 0; + margin: .2em 0 .2em 0; +} + +#contentSub { + color: #545454; + font-size: small; + padding-left: 2em; +} + +#mw_portlets form { + margin: 0 0 0 0; + padding: 0 0 0 0; +} + +a { + text-decoration: none; + color: #003366; + background: none; +} +a:visited { + color: #5a3696; +} +a:active { + color: #faa700; +} +a:hover { + text-decoration: underline; +} +a.stub { + color: #772233; +} +a.new { + color: #ba0000; +} +a.new:visited { + color: #a55858; +} + +h1, h2 { + border-bottom: solid 1px #003366; +} + +h1, h2, h3, h4, h5, h6 { + overflow: hidden; +} + +#preftoc { + width: 100%; + margin: 0 0 0 0; + padding: 0 0 0 0; + height: 1.5em; + clear: right; +} + +#preftoc li { + margin: 0 0.5em 0 0.5em; + padding: 0 0.2em 0 0.2em; + display: block; + float: left; + height: 1.5em; + text-transform: lowercase; +} + +#preferences { + margin: 0 0 0 0; + padding: 0em 1em 1em 1em; + border: solid 1px #bbbbbb; + clear: left; /* Multi-line toc should not push data to horizontally */ +} + +#preferences fieldset { + margin-top: 0; + border: none; +} + +.mainLegend { + display: none; +} + +.htmlform-tip { + font-size: x-small; + padding: .2em 2em; + color: #666; +} + +.prefsection legend { + font-weight: bold; +} + +#preftoc li.selected { + background-color: #bbbbbb; +} + +#preftoc li a, +#preftoc li a:hover, +#preftoc li a:visited { + text-decoration: underline; + color: #003366; +} + +#preftoc li.selected a, +#preftoc li.selected a:hover, +#preftoc li.selected a:visited { + text-decoration: none; + color: white; +} +#mw_content a.external { + /* @embed */ + background: url(external.png) center right no-repeat; + padding-right: 13px; +} +#mw_content a.external[href ^="https://"], +.link-https { + /* @embed */ + background: url(lock_icon.gif) center right no-repeat; + padding-right: 16px; +} +#mw_content a.external[href ^="mailto:"], +.link-mailto { + /* @embed */ + background: url(mail_icon.gif) center right no-repeat; + padding-right: 18px; +} +#mw_content a.external[href ^="news:"] { + /* @embed */ + background: url(news_icon.png) center right no-repeat; + padding-right: 18px; +} +#mw_content a.external[href ^="ftp://"], +.link-ftp { + /* @embed */ + background: url(file_icon.gif) center right no-repeat; + padding-right: 18px; +} +#mw_content a.external[href ^="irc://"], +#mw_content a.external[href ^="ircs://"], +.link-irc { + /* @embed */ + background: url(discussionitem_icon.gif) center right no-repeat; + padding-right: 18px; +} + +#mw_content a.external[href $=".ogg"], #mw_content a.external[href $=".OGG"], +#mw_content a.external[href $=".mid"], #mw_content a.external[href $=".MID"], +#mw_content a.external[href $=".midi"], #mw_content a.external[href $=".MIDI"], +#mw_content a.external[href $=".mp3"], #mw_content a.external[href $=".MP3"], +#mw_content a.external[href $=".wav"], #mw_content a.external[href $=".WAV"], +#mw_content a.external[href $=".wma"], #mw_content a.external[href $=".WMA"], +.link-audio { + /* @embed */ + background: url(audio.png) center right no-repeat; + padding-right: 13px; +} +#mw_content a.external[href $=".ogm"], #mw_content a.external[href $=".OGM"], +#mw_content a.external[href $=".avi"], #mw_content a.external[href $=".AVI"], +#mw_content a.external[href $=".mpeg"], #mw_content a.external[href $=".MPEG"], +#mw_content a.external[href $=".mpg"], #mw_content a.external[href $=".MPG"], +.link-video { + /* @embed */ + background: url(video.png) center right no-repeat; + padding-right: 13px; +} +#mw_content a.external[href $=".pdf"], #mw_content a.external[href $=".PDF"], +#mw_content a.external[href *=".pdf#"], #mw_content a.external[href *=".PDF#"], +#mw_content a.external[href *=".pdf?"], #mw_content a.external[href *=".PDF?"], +.link-document { + /* @embed */ + background: url(document.png) center right no-repeat; + padding-right: 12px; +} + +/* images */ +/* @noflip */div.floatright, table.floatright { + margin: 0 0 .5em .5em; + border: 0; +} +div.floatright p { + font-style: italic; +} +/* @noflip */div.floatleft, table.floatleft { + margin: 0 .5em .5em 0; + border: 0; +} +div.floatleft p { + font-style: italic; +} + +/* thumbnails */ +div.thumb { + margin-bottom: .5em; + width: auto; +} +div.thumbinner { + border: 1px solid #ccc; + padding: 3px !important; + background-color: #f9f9f9; + font-size: 94%; + text-align: center; + overflow: hidden; +} +html .thumbimage { + border: 1px solid #ccc; +} +html .thumbcaption { + border: none; + text-align: left; + line-height: 1.4em; + padding: 3px !important; + font-size: 94%; +} +div.magnify { + float: right; + border: none !important; + background: none !important; + margin-left: 3px; +} +div.magnify a, div.magnify img { + display: block; + border: none !important; + background: none !important; +} +/* @noflip */div.tright { + margin: .5em 0 .8em 1.4em; +} +/* @noflip */div.tleft { + margin: .5em 1.4em .8em 0; +} +img.thumbborder { + border: 1px solid #dddddd; +} +.mw-warning { + border: 1px solid #aaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; +} + +#toc, +.toc { + margin: 0 0 0 0; + padding: 0 0 0 0; + border-spacing: 0; + background-color: #f0f0f0; + border: solid 1px #bbbbbb; + display: -moz-inline-block; + display: inline-block; + display: table; + + /* IE7 and earliers */ + zoom: 1; + *display: inline; + + padding: 7px; +} + +/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */ +table#toc, +table.toc { + border-collapse: collapse; +} + +/* Remove additional paddings inside table-cells that are not present in <div>s */ +table#toc td, +table.toc td { + padding: 0; +} + +#toc tr, #toc td { + margin: 0 0 0 0; + padding: 0 0 0 0; +} + +#toctitle { + border-bottom: solid 1px #3c78b5; + background-color: #dddddd; + margin: 0 0 0 0; +} + +#toc h2, +.toc h2 { + display: inline; + border: none; + padding: 0; + font-size: 100%; + font-weight: bold; +} +#toc #toctitle, +.toc #toctitle, +#toc .toctitle, +.toc .toctitle { + text-align: center; +} + +#toc ul, +.toc ul { + list-style-type: none; + list-style-image: none; + margin: 0 1em 0 1em; + padding: 0; + text-align: left; +} + +#toc ul ul, +.toc ul ul { + margin: 0 0 0 2em; +} + +#toc .toctoggle, +.toc .toctoggle { + font-size: 94%; +} + +.mw-warning { + margin-left: 50px; + margin-right: 50px; + text-align: center; +} + +.catlinks { + border: solid 1px #bbbbbb; + background-color: #f0f0f0; + padding: 0.1em 0.3em 0.1em 0.3em; + margin: 0 0 0 0; +} + +#mw_header h1, +#p-personal, +#p-cactions { + overflow: hidden; +} + +/* disable interwiki styling */ +#mw_content a.extiw, +#mw_content a.extiw:active { + color: #36b; +} +#mw_content a.external { + color: #36b; +} + + +.redirectText { + font-size: 150%; + margin: 5px; +} + +.printfooter { + display: none; +} + +.sharedUploadNotice { + font-style: italic; +} + +span.updatedmarker { + color: black; + background-color: #0f0; +} + +.previewnote { + text-indent: 3em; + color: #c00; + border-bottom: 1px solid #aaa; + padding-bottom: 1em; + margin-bottom: 1em; +} + +.previewnote p { + margin: 0; + padding: 0; +} + +.editExternally { + border: 1px solid gray; + background-color: #ffffff; + padding: 3px; + margin-top: 0.5em; + float: left; + font-size: small; + text-align: center; +} +.editExternallyHelp { + font-style: italic; + color: gray; +} + +.toggle { + margin-left: 2em; + text-indent: -2em; +} + +table.collapsed tr.collapsable { + display: none; +} + +input#wpSummary { + width: 80%; +} + +/* @bug 1714 */ +input#wpSave, input#wpDiff { + margin-right: 0.33em; +} + +#wpSave { + font-weight: bold; +} + +/* noarticletext */ +div.noarticletext { + border: 1px solid #ccc; + background: #fff; + padding: .2em 1em; + color: #000; +} + +div#searchTargetContainer { + left: 10px; + top: 10px; + width: 90%; + background: white; +} + +div#searchTarget { + padding: 3px; + margin: 5px; + background: #F0F0F0; + border: solid 1px blue; +} + +div#searchTarget ul li { + list-style: none; +} + +div#searchTarget ul li:before { + color: orange; + content: "\00BB \0020"; +} + +div#searchTargetHide { + float: right; + border: solid 1px black; + background: #DCDCDC; + padding: 2px; +} + +div.multipageimagenavbox { + border: solid 1px silver; + padding: 4px; + margin: 1em; + background: #f0f0f0; +} + +div.multipageimagenavbox div.thumb { + border: none; + margin-left: 2em; + margin-right: 2em; +} + +div.multipageimagenavbox hr { + margin: 6px; +} + +table.multipageimage td { + text-align: center; +} + +.templatesUsed { + margin-top: 1.5em; +} + +.mw-summary-preview { + margin: 0.1em 0; +} + +/* Friendlier slave lag warnings */ +div.mw-lag-warn-normal, +div.mw-lag-warn-high { + padding: 3px; + text-align: center; + margin: 3px auto; +} +div.mw-lag-warn-normal { + border: 1px solid #FFCC66; + background-color: #FFFFCC; +} +div.mw-lag-warn-high { + font-weight: bold; + border: 2px solid #FF0033; + background-color: #FFCCCC; +} + +.MediaTransformError { + background-color: #ccc; + padding: 0.1em; +} +.MediaTransformError td { + text-align: center; + vertical-align: middle; + font-size: 90%; +} +ul { + line-height: 1.5em; + list-style-type: square; + margin: .3em 0 0 1.5em; + padding: 0; + /* @embed */ + list-style-image: url(bullet.gif); +} +ol { + line-height: 1.5em; + margin: .3em 0 0 3.2em; + padding: 0; + list-style-image: none; +} +li { + margin-bottom: .1em; +} +dt { + font-weight: bold; + margin-bottom: .1em; +} +dl { + margin-top: .2em; + margin-bottom: .5em; +} + +#p-cactions li.new a { + color: #cc2200; +} + +span.subpages { + font-size: 80%; + display: block; +} + +pre, .mw-code { + border: solid 1px #3c78b5; + padding: 0.4em; + background-color: #f0f0f0; +} + +.usermessage { + background-color: #dadaff; +} + +.mw-topboxes { + border-collapse: collapse; + margin: 0 -1em 1em -1em; + padding: 0 0 8px 0; + /* @embed */ + background: url(footer-grad.png) repeat-x bottom left; +} + +.mw-topbox p { + padding: 0 0 0 0; + margin: 0 0 0 0; +} + +.mw-topbox { + color: black; + font-weight: bold; + margin: 0 0 0 0; + padding: 0 1em 0 1em; + vertical-align: middle; + border-collapse: collapse; + border-bottom: solid 1px #bbbbbb; +} + +#siteSub { + background-color: #dddddd; +} + +/* emulate center */ +.center { + width: 100%; + text-align: center; +} +*.center * { + margin-left: auto; + margin-right: auto; +} + +/* table standards */ +.toccolours { + border: 1px solid #bbbbbb; + background-color: #f0f0f0; + border-spacing: 0pt; + margin: 0pt; + padding: 0pt; +} + +/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */ +.tipsy { + font-size: 130%; +} + +/** + * Lists: + * The following lines don't have a visible effect on non-Gecko browsers + * They fix a problem ith Gecko browsers rendering lists to the right of + * left-floated objects in an RTL layout. + */ +/* @noflip */ +html > body.rtl div#mw_contentholder ul { + display: table; +} + +/* @noflip */ +html > body.rtl div#mw_contentholder ul#filetoc { + display: block; +} diff --git a/modern/news_icon.png b/modern/news_icon.png Binary files differnew file mode 100644 index 0000000..4d3cb47 --- /dev/null +++ b/modern/news_icon.png diff --git a/modern/print.css b/modern/print.css new file mode 100644 index 0000000..150d2d2 --- /dev/null +++ b/modern/print.css @@ -0,0 +1,10 @@ +#mw_portlets, +#p-cactions, +#p-personal, +#jump-to-nav, +#footer, +.mw-editsection, +.mw-editsection-like, +.noprint { + display: none; +} diff --git a/modern/video.png b/modern/video.png Binary files differnew file mode 100644 index 0000000..e535c0c --- /dev/null +++ b/modern/video.png diff --git a/monobook/IE60Fixes.css b/monobook/IE60Fixes.css new file mode 100644 index 0000000..f3e4100 --- /dev/null +++ b/monobook/IE60Fixes.css @@ -0,0 +1,112 @@ +/* 6.0 - only fixes */ +/* content area */ +/* workaround for various ie float bugs */ +div#column-content { + float: none; + margin-left: 0; + height: 1%; +} +div#column-content div#content { + margin-left: 12.2em; + margin-top: 3em; + height: 1%; +} +.rtl div#column-content div#content { + margin-right: 12.2em; + margin-left: 0; +} +div#column-one { + position: absolute; + top: 0; + left: 0; + z-index: 4; +} +.rtl div#column-one { + left: auto; + right: 0; +} +div#footer { + margin-left: 13.6em; + border-left: 1px solid #fabd23; +} +.rtl div#footer { + margin-left: 0; + margin-right: 13.6em; + border-left: none; + border-right: 1px solid #fabd23; +} + +/* float/negative margin brokenness */ +* html div#footer { + margin-top: 0; +} + +* html div#column-content { + display: inline; + margin-bottom: 0; +} + +/* the tabs */ + +#p-cactions { + z-index: 3; +} + +#p-cactions li { + padding-bottom: 0 !important; + border: none; + background-color: transparent; + cursor: default; + float: none !important; +} +#p-cactions li a { + display: inline-block !important; + vertical-align: top; + padding-bottom: 0; + border: solid #aaa; + border-width: 1px 1px 0; +} +#p-cactions li.selected a { + border-color: #fabd23; + padding-bottom: 0.17em; +} +#p-cactions li a:hover { + padding-bottom: 0.17em; +} +#p-navigation a { + display: inline-block; + width: 100%; +} +#portal-personaltools { + padding-bottom: 0.1em; +} + +.rtl a.feedlink { + background-position: right; + padding-right: 0; + padding-left: 16px; +} + +/* show the hand */ +#p-logo a, +#p-logo a:hover { + cursor: pointer; +} +div.visualClear { + width:100%; + line-height: 0; +} +textarea { + width: 96%; +} + +#catlinks, +div.tright, +div.tleft { + position: relative; +} + +/* bug 12846 */ +body.rtl #preftoc a, body.rtl #preftoc a:active { + float: left; +} diff --git a/monobook/IE70Fixes.css b/monobook/IE70Fixes.css new file mode 100644 index 0000000..e8d3a8f --- /dev/null +++ b/monobook/IE70Fixes.css @@ -0,0 +1,92 @@ +/* 7.0 - only fixes */ +/* content area */ +/* workaround for various ie float bugs */ + +/* This bit is needed to make links clickable... WTF */ +div#column-content div#content { + margin-left: 12.2em; + margin-top: 3em; + height: 1%; +} +.rtl div#column-content div#content { + margin-right: 12.2em; + margin-left: 0; +} + + +.rtl div#column-one { + /* For some reason it tries to inherit the padding-top into every div, + * and I can't figure out how to get it back off. + * Margin works correctly for this use, though. + */ + padding-top: 0; + margin-top: 160px; +} + +/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped. + * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason. + * Also clear the right margin (originally margin-left: 1em) + */ +li#pt-userpage, li#pt-anonuserpage, li#pt-login { + padding-left: 20px; + margin-right: 0; +} + +.rtl a.feedlink { + background-position: right; + padding-right: 0; + padding-left: 16px; +} +/* the tabs */ + +#p-cactions { + z-index: 3; +} + + +#p-cactions li { + padding-bottom: 0 !important; + border: none; + background-color: transparent; + cursor: default; + float: none !important; +} + +#p-cactions li a { + display: inline-block !important; + vertical-align: top; + padding-bottom: 0; + border: solid #aaa; + border-width: 1px 1px 0; +} +#p-cactions li.selected a { + border-color: #fabd23; + padding-bottom: 0.17em; +} +#p-cactions li a:hover { + padding-bottom: 0.17em; +} +#p-navigation a { + display: inline-block; + width: 100%; +} +#portal-personaltools { + padding-bottom: 0.1em; +} +textarea { + width: 96%; +} + +/* +#catlinks, +div.tright, +div.tleft { + position: relative; +} +*/ + + +div#footer li { + /* Work around bug with inline <li> tags with right margins and nowrap */ + margin-right: 0; +} diff --git a/monobook/audio.png b/monobook/audio.png Binary files differnew file mode 100644 index 0000000..68c8768 --- /dev/null +++ b/monobook/audio.png diff --git a/monobook/bullet.gif b/monobook/bullet.gif Binary files differnew file mode 100644 index 0000000..b43de48 --- /dev/null +++ b/monobook/bullet.gif diff --git a/monobook/discussionitem_icon.gif b/monobook/discussionitem_icon.gif Binary files differnew file mode 100644 index 0000000..e3ca6d9 --- /dev/null +++ b/monobook/discussionitem_icon.gif diff --git a/monobook/document.png b/monobook/document.png Binary files differnew file mode 100644 index 0000000..ee46a50 --- /dev/null +++ b/monobook/document.png diff --git a/monobook/external-ltr.png b/monobook/external-ltr.png Binary files differnew file mode 100644 index 0000000..6308383 --- /dev/null +++ b/monobook/external-ltr.png diff --git a/monobook/external-rtl.png b/monobook/external-rtl.png Binary files differnew file mode 100644 index 0000000..5313234 --- /dev/null +++ b/monobook/external-rtl.png diff --git a/monobook/file_icon.gif b/monobook/file_icon.gif Binary files differnew file mode 100644 index 0000000..69dbeaf --- /dev/null +++ b/monobook/file_icon.gif diff --git a/monobook/headbg.jpg b/monobook/headbg.jpg Binary files differnew file mode 100644 index 0000000..5491c6e --- /dev/null +++ b/monobook/headbg.jpg diff --git a/monobook/link_icon.gif b/monobook/link_icon.gif Binary files differnew file mode 100644 index 0000000..168c1a2 --- /dev/null +++ b/monobook/link_icon.gif diff --git a/monobook/lock_icon.gif b/monobook/lock_icon.gif Binary files differnew file mode 100644 index 0000000..f71cd9b --- /dev/null +++ b/monobook/lock_icon.gif diff --git a/monobook/magnify-clip.png b/monobook/magnify-clip.png Binary files differnew file mode 100644 index 0000000..ffd7637 --- /dev/null +++ b/monobook/magnify-clip.png diff --git a/monobook/mail_icon.gif b/monobook/mail_icon.gif Binary files differnew file mode 100644 index 0000000..cf5680d --- /dev/null +++ b/monobook/mail_icon.gif diff --git a/monobook/main.css b/monobook/main.css new file mode 100644 index 0000000..c32e869 --- /dev/null +++ b/monobook/main.css @@ -0,0 +1,835 @@ +/* +** MediaWiki 'monobook' style sheet for CSS2-capable browsers. +** Copyright Gabriel Wicke - http://wikidev.net/ +** License: GPL (http://www.gnu.org/copyleft/gpl.html) +** +** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John +** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher, +** Michael Zeltner and Geir Bækholt) +** All you guys rock :) +*/ + +div#column-content { + width: 100%; + float: right; + margin: 0 0 .6em -12.2em; + padding: 0; +} +div#content { + margin: 2.8em 0 0 12.2em; + padding: 1em; + position: relative; + z-index: 2; +} +div#column-one { + padding-top: 160px; +} +/* Hide, but keep accessible for screen-readers */ +#column-one h2 { + position: absolute; + top: -9999px; +} +div#content { + background: white; + color: black; + border: 1px solid #aaa; + border-right: none; + line-height: 1.5em; +} +/* the left column width is specified in class .portlet */ + +/* Font size: +** We take advantage of keyword scaling- browsers won't go below 9px +** More at http://www.w3.org/2003/07/30-font-size +** http://style.cleverchimp.com/font_size_intervals/altintervals.html +*/ + +body { + font: x-small sans-serif; + /* @embed */ + background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat; + color: black; + margin: 0; + padding: 0; + direction: ltr; /* Needed for RTL flipping */ + unicode-bidi: embed; +} + +/* scale back up to a sane default */ +div#globalWrapper { + font-size: 127%; + width: 100%; + margin: 0; + padding: 0; +} + +/* general styles */ +a { + color: #002bb8; +} +a:visited { + color: #5a3696; +} +a.new, +#p-personal a.new { + color: #cc2200; +} + +ul { + list-style-type: square; + /* @embed */ + list-style-image: url(bullet.gif); +} + +input.historysubmit { + padding: 0 .3em .3em .3em !important; + font-size: 94%; + cursor: pointer; + height: 1.7em !important; + margin-left: 1.6em; +} + +pre, .mw-code { + line-height: 1.1em; +} + +#firstHeading { + padding-top: 0; +} +/* +** the main content area +*/ + +#siteNotice { + font-size: 95%; + padding: 0 0.9em; +} +#localNotice { + margin: 0; +} +#siteNotice p { + margin: 0; + padding: 0; +} + +/* +** classes for special content elements like town boxes +** intended to be referenced directly from the wiki src +*/ + +/* +** User styles +*/ +/* table standards */ +table.rimage { + float: right; + position: relative; + margin-left: 1em; + margin-bottom: 1em; + text-align: center; +} + +/* +** edit views etc +*/ +.special li { + line-height: 1.4em; + margin: 0; + padding: 0; +} + +/* +** keep the whitespace in front of the ^=, hides rule from konqueror +** this is css3, the validator doesn't like it when validating as css2 +*/ +#bodyContent a.external { + /* @embed */ + background: url(external-ltr.png) center right no-repeat; + padding-right: 13px; +} +#bodyContent a.external[href ^="https://"], +.link-https { + /* @embed */ + background: url(lock_icon.gif) center right no-repeat; + padding-right: 16px; +} +#bodyContent a.external[href ^="mailto:"], +.link-mailto { + /* @embed */ + background: url(mail_icon.gif) center right no-repeat; + padding-right: 18px; +} +#bodyContent a.external[href ^="news:"] { + /* @embed */ + background: url(news_icon.png) center right no-repeat; + padding-right: 18px; +} +#bodyContent a.external[href ^="ftp://"], +.link-ftp { + /* @embed */ + background: url(file_icon.gif) center right no-repeat; + padding-right: 18px; +} +#bodyContent a.external[href ^="irc://"], +#bodyContent a.external[href ^="ircs://"], +.link-irc { + /* @embed */ + background: url(discussionitem_icon.gif) center right no-repeat; + padding-right: 18px; +} +#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"], +#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"], +#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"], +#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"], +#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"], +#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"], +.link-audio { + /* @embed */ + background: url(audio.png) center right no-repeat; + padding-right: 13px; +} +#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"], +#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"], +#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"], +#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"], +.link-video { + /* @embed */ + background: url(video.png) center right no-repeat; + padding-right: 13px; +} +#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"], +#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"], +#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"], +.link-document { + /* @embed */ + background: url(document.png) center right no-repeat; + padding-right: 12px; +} + +/* Interwiki Styling */ +#bodyContent a.extiw, +#bodyContent a.extiw:active { + color: #36b; +} + +/* External links */ +#bodyContent a.external { + color: #36b; +} + +/* +** Structural Elements +*/ + +/* +** general portlet styles (elements in the quickbar) +*/ +.portlet { + border: none; + margin: 0 0 .5em; + padding: 0; + float: none; + width: 11.6em; + overflow: hidden; +} +.portlet h3 { + background: transparent; + padding: 0 1em 0 .5em; + display: inline; + height: 1em; + text-transform: lowercase; + font-size: 91%; + font-weight: normal; + white-space: nowrap; +} +.pBody { + font-size: 95%; + background-color: white; + color: black; + border-collapse: collapse; + border: 1px solid #aaa; + padding: 0 .8em .3em .5em; +} +/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */ +.pBody:after { + content: ''; + clear: both; + display: block; +} +.portlet ul { + line-height: 1.5em; + font-size: 95%; +} +.portlet li { + padding: 0; + margin: 0; +} + +/* +** Logo properties +*/ + +#p-logo { + top: 0; + left: 0; + position: absolute; /*needed to use z-index */ + z-index: 3; + height: 155px; + width: 12em; + overflow: visible; +} +#p-logo h3 { + display: none; +} +#p-logo a, +#p-logo a:hover { + display: block; + height: 155px; + width: 12.2em; + background-repeat: no-repeat; + background-position: 35% 50% !important; + text-decoration: none; +} + +/* +** Search portlet +*/ +#p-search { + position: relative; + z-index: 3; +} +input.searchButton { + margin-top: 1px; + font-size: 95%; +} +#searchGoButton { + padding-left: .5em; + padding-right: .5em; + font-weight: bold; +} +#searchInput { + width: 10.9em; + margin: 0; + font-size: 95%; +} +#p-search .pBody { + padding: .5em .4em .4em .4em; + text-align: center; +} +#p-search #searchform div div { + margin-top: .4em; + font-size: 95%; +} +/* +** the personal toolbar +*/ +#p-personal { + position: absolute; + left: 0; + top: 0; + z-index: 3; +} +#p-personal { + width: 100%; + white-space: nowrap; + padding: 0; + margin: 0; + border: none; + background: none; + overflow: visible; + line-height: 1.2em; +} +#p-personal h3 { + display: none; +} +#p-personal .portlet, +#p-personal .pBody { + z-index: 0; + padding: 0; + margin: 0; + border: none; + overflow: visible; + background: none; +} +/* this is the ul contained in the portlet */ +#p-personal ul { + border: none; + line-height: 1.4em; + color: #2f6fab; + padding: 0 2em 0 3em; + margin: 0; + text-align: right; + list-style-type: none; + list-style-image: none; + z-index: 0; + background: none; + cursor: default; +} +#p-personal li { + z-index: 0; + border: none; + padding: 0; + display: inline; + color: #2f6fab; + margin-left: 1em; + line-height: 1.2em; + background: none; +} +#p-personal li a { + text-decoration: none; + color: #005896; + padding-bottom: .2em; + background: none; +} +#p-personal li a:hover { + background-color: white; + padding-bottom: .2em; + text-decoration: none; +} +#p-personal li.active a:hover { + background-color: transparent; +} +/* The icon in front of the username / login link */ +li#pt-userpage, +li#pt-anonuserpage, +li#pt-login { + /* @embed */ + background: url(user.gif) top left no-repeat; + padding-left: 20px; +} +#p-personal ul { + text-transform: lowercase; +} +/* Don't lowercase username or IP addresses (IPv6) */ +li#pt-userpage, +li#pt-anonuserpage { + text-transform: none; +} +#p-personal li.active { + font-weight: bold; +} +/* +** the page-related actions- page/talk, edit etc +*/ +#p-cactions { + position: absolute; + top: 1.3em; + left: 11.5em; + margin: 0; + white-space: nowrap; + width: 76%; + line-height: 1.1em; + overflow: visible; + background: none; + border-collapse: collapse; + padding-left: 1em; + font-size: 95%; +} +#p-cactions ul { + list-style-type: none; + list-style-image: none; +} +#p-cactions li { + display: inline; + border: 1px solid #aaa; + border-bottom: none; + padding: 0 0 1em 0; + margin: 0 .3em 0 0; + overflow: visible; + background: white; +} +#p-cactions li.selected { + border-color: #fabd23; + font-weight: bold; +} +#p-cactions li a { + background-color: #fbfbfb; + color: #002bb8; + border: none; + padding: 0 .8em .3em; + position: relative; + z-index: 0; + margin: 0; + text-decoration: none; +} +#p-cactions li.selected a { + z-index: 3; + background-color: white; +} +#p-cactions .new a { + color: #ba0000; +} +#p-cactions li a:hover { + z-index: 3; + text-decoration: none; + background-color: white; +} +#p-cactions h3 { + display: none; +} +#p-cactions li.istalk { + margin-right: 0; +} +#p-cactions li.istalk a { + padding-right: .5em; +} +#p-cactions #ca-addsection a { + padding-left: .4em; + padding-right: .4em; +} +/* offsets to distinguish the tab groups */ +li#ca-talk { + margin-right: 1.6em; +} +li#ca-watch, +li#ca-unwatch, +li#ca-varlang-0, +li#ca-print { + margin-left: 1.6em; +} +#p-cactions .pBody { + font-size: 1em; + background-color: transparent; + color: inherit; + border-collapse: inherit; + border: 0; + padding: 0; +} +#p-cactions li a { + text-transform: lowercase; +} + +#p-lang { + position: relative; + z-index: 3; +} + +/* Override text-transform on languages where capitalization is significant */ +.capitalize-all-nouns .portlet h3, +.capitalize-all-nouns #p-personal ul, +.capitalize-all-nouns #p-cactions ul li a { + text-transform: none; +} + +/* TODO: #t-iscite is only used by the Cite extension, come up with some + * system which allows extensions to add to this file on the fly + */ +#t-ispermalink, #t-iscite { + color: #999; +} +/* +** footer +*/ +div#footer { + background-color: white; + border-top: 1px solid #fabd23; + border-bottom: 1px solid #fabd23; + margin: .6em 0 1em 0; + overflow: hidden; + padding: .4em 0 .3em 0; + text-align: center; + font-size: 90%; +} +div#footer li { + display: inline; + margin: 0 1.3em; +} +#f-poweredbyico, #f-copyrightico { + margin: 0 8px; + position: relative; + top: -2px; /* Bump it up just a tad */ +} +#f-poweredbyico { + float: right; + height: 1%; +} +#f-copyrightico { + float: left; + height: 1%; +} + +.mw-htmlform-submit { + font-weight: bold; + padding-left: .3em; + padding-right: .3em; + margin-right: 2em; +} + +/* js pref toc */ +#preftoc { + margin: 0; + padding: 0; + width: 100%; + clear: both; +} +#preftoc li { + background-color: #f0f0f0; + color: #000; +} +#preftoc li { + margin: 1px -2px 1px 2px; + float: left; + padding: 2px 0 3px 0; + border: 1px solid #fff; + border-right-color: #716f64; + border-bottom: 0; + position: relative; + white-space: nowrap; + list-style-type: none; + list-style-image: none; + z-index: 3; +} +#preftoc li.selected { + font-weight: bold; + background-color: #f9f9f9; + border: 1px solid #aaa; + border-bottom: none; + cursor: default; + top: 1px; + padding-top: 2px; + margin-right: -3px; +} +#preftoc > li.selected { + top: 2px; +} +#preftoc a, +#preftoc a:active { + display: block; + color: #000; + padding: 0 .7em; + position: relative; + text-decoration: none; +} +#preftoc li.selected a { + cursor: default; + text-decoration: none; +} +#preferences { + margin: 0; + border: 1px solid #aaa; + clear: both; + padding: 1.5em; + background-color: #F9F9F9; +} +.prefsection { + border: none; + padding: 0; + margin: 0; +} + +.prefsection legend { + font-weight: bold; +} +.prefsection table, .prefsection legend { + background-color: #F9F9F9; +} +.mainLegend { + display: none; +} +td.htmlform-tip { + font-size: x-small; + padding: .2em 2em; + color: #666; +} + +.preferences-login { + clear: both; + margin-bottom: 1.5em; +} + +.prefcache { + font-size: 90%; + margin-top: 2em; +} + +#userloginprompt, #languagelinks { + font-size: 85%; +} + +#login-sectiontip { + font-size: 85%; + line-height: 1.2; + padding-top: 2em; +} + +#userloginlink a, #wpLoginattempt, #wpCreateaccount { + font-weight: bold; +} + +/** + * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004) + * with the commit message "tweaks to page history". + * Unlike the other IE/Mac fixes that used to be present here, this seems to get + * applied on more modern browsers, so let's keep it here until someone has the + * time to properly test it out. + */ +#pagehistory li.selected { + position: relative; +} + +.redirectText { + font-size: 150%; + margin: 5px; +} + +div.patrollink { + clear: both; +} + +.sharedUploadNotice { + font-style: italic; +} + +span.updatedmarker { + color: black; + background-color: #0f0; +} + +.editExternally { + border: 1px solid gray; + background-color: #ffffff; + padding: 3px; + margin-top: 0.5em; + float: left; + font-size: small; + text-align: center; +} +.editExternallyHelp { + font-style: italic; + color: gray; +} + +.toggle { + margin-left: 2em; + text-indent: -2em; +} + +/* @bug 1714 */ +input#wpSave, +input#wpDiff { + margin-right: 0.33em; +} + +#wpSave { + font-weight: bold; +} + +/* noarticletext */ +div.noarticletext { + border: 1px solid #ccc; + background: #fff; + padding: .2em 1em; + color: #000; +} + +div#searchTargetContainer { + left: 10px; + top: 10px; + width: 90%; + background: white; +} + +div#searchTarget { + padding: 3px; + margin: 5px; + background: #F0F0F0; + border: solid 1px blue; +} + +div#searchTarget ul li { + list-style-type: none; + list-style-image: none; +} + +div#searchTarget ul li:before { + color: orange; + content: "\00BB \0020"; +} + +div#searchTargetHide { + float: right; + border: solid 1px black; + background: #DCDCDC; + padding: 2px; +} + +#powersearch p { + margin-top: 0; +} + +div.multipageimagenavbox { + border: solid 1px silver; + padding: 4px; + margin: 1em; + background: #f0f0f0; +} + +div.multipageimagenavbox div.thumb { + border: none; + margin-left: 2em; + margin-right: 2em; +} + +div.multipageimagenavbox hr { + margin: 6px; +} + +table.multipageimage td { + text-align: center; +} + +.templatesUsed { + margin-top: 1.5em; +} + +.mw-summary-preview { + margin: 0.1em 0; +} + +/* Friendlier slave lag warnings */ +div.mw-lag-warn-normal, +div.mw-lag-warn-high { + padding: 3px; + text-align: center; + margin: 3px auto; +} +div.mw-lag-warn-normal { + border: 1px solid #FFCC66; + background-color: #FFFFCC; +} +div.mw-lag-warn-high { + font-weight: bold; + border: 2px solid #FF0033; + background-color: #FFCCCC; +} + +.MediaTransformError { + background-color: #ccc; + padding: 0.1em; +} +.MediaTransformError td { + text-align: center; + vertical-align: middle; + font-size: 90%; +} + +/* God-damned hack for the crappy layout */ +.os-suggest { + font-size: 127%; +} + +/* Sometimes people don't want personal tools to be lowercase! */ +.no-text-transform { + text-transform: none; +} + +/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */ +.tipsy { + font-size: 127%; +} + +/* mediawiki.notification */ +.skin-monobook .mw-notification { + -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125); +} diff --git a/monobook/news_icon.png b/monobook/news_icon.png Binary files differnew file mode 100644 index 0000000..4d3cb47 --- /dev/null +++ b/monobook/news_icon.png diff --git a/monobook/required.gif b/monobook/required.gif Binary files differnew file mode 100644 index 0000000..bd71976 --- /dev/null +++ b/monobook/required.gif diff --git a/monobook/user.gif b/monobook/user.gif Binary files differnew file mode 100644 index 0000000..34b4839 --- /dev/null +++ b/monobook/user.gif diff --git a/monobook/video.png b/monobook/video.png Binary files differnew file mode 100644 index 0000000..d86dbe0 --- /dev/null +++ b/monobook/video.png diff --git a/monobook/wiki-indexed.png b/monobook/wiki-indexed.png Binary files differnew file mode 100644 index 0000000..799ebac --- /dev/null +++ b/monobook/wiki-indexed.png diff --git a/monobook/wiki.png b/monobook/wiki.png Binary files differnew file mode 100644 index 0000000..8c42118 --- /dev/null +++ b/monobook/wiki.png diff --git a/vector/collapsibleNav.js b/vector/collapsibleNav.js new file mode 100644 index 0000000..45258e5 --- /dev/null +++ b/vector/collapsibleNav.js @@ -0,0 +1,152 @@ +/** + * Collapsible navigation for Vector + */ +( function ( mw, $ ) { + 'use strict'; + var map; + + // Use the same function for all navigation headings - don't repeat + function toggle( $element ) { + var isCollapsed = $element.parent().is( '.collapsed' ); + + $.cookie( + 'vector-nav-' + $element.parent().attr( 'id' ), + isCollapsed, + { 'expires': 30, 'path': '/' } + ); + + $element + .parent() + .toggleClass( 'expanded' ) + .toggleClass( 'collapsed' ) + .find( '.body' ) + .slideToggle( 'fast' ); + isCollapsed = !isCollapsed; + + $element + .find( '> a' ) + .attr( { + 'aria-pressed': isCollapsed ? 'false' : 'true', + 'aria-expanded': isCollapsed ? 'false' : 'true' + } ); + } + + /* Browser Support */ + + map = { + // Left-to-right languages + ltr: { + // Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4 + opera: [['>=', 9.6]], + konqueror: [['>=', 4.0]], + blackberry: false, + ipod: false, + iphone: false, + ps3: false + }, + // Right-to-left languages + rtl: { + opera: [['>=', 9.6]], + konqueror: [['>=', 4.0]], + blackberry: false, + ipod: false, + iphone: false, + ps3: false + } + }; + if ( !$.client.test( map ) ) { + return true; + } + + $( function ( $ ) { + var $headings, tabIndex; + + /* General Portal Modification */ + + // Always show the first portal + $( '#mw-panel > .portal:first' ).addClass( 'first persistent' ); + // Apply a class to the entire panel to activate styles + $( '#mw-panel' ).addClass( 'collapsible-nav' ); + // Use cookie data to restore preferences of what to show and hide + $( '#mw-panel > .portal:not(.persistent)' ) + .each( function ( i ) { + var id = $(this).attr( 'id' ), + state = $.cookie( 'vector-nav-' + id ); + $(this).find( 'ul:first' ).attr( 'id', id + '-list' ); + // Add anchor tag to heading for better accessibility + $( this ).find( 'h3' ).wrapInner( + $( '<a>' ) + .attr( { + href: '#', + 'aria-haspopup': 'true', + 'aria-controls': id + '-list', + role: 'button' + } ) + .click( false ) + ); + // In the case that we are not showing the new version, let's show the languages by default + if ( + state === 'true' || + ( state === null && i < 1 ) || + ( state === null && id === 'p-lang' ) + ) { + $(this) + .addClass( 'expanded' ) + .removeClass( 'collapsed' ) + .find( '.body' ) + .hide() // bug 34450 + .show(); + $(this).find( 'h3 > a' ) + .attr( { + 'aria-pressed': 'true', + 'aria-expanded': 'true' + } ); + } else { + $(this) + .addClass( 'collapsed' ) + .removeClass( 'expanded' ); + $(this).find( 'h3 > a' ) + .attr( { + 'aria-pressed': 'false', + 'aria-expanded': 'false' + } ); + } + // Re-save cookie + if ( state !== null ) { + $.cookie( 'vector-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } ); + } + } ); + + /* Tab Indexing */ + + $headings = $( '#mw-panel > .portal:not(.persistent) > h3' ); + + // Get the highest tab index + tabIndex = $( document ).lastTabIndex() + 1; + + // Fix the search not having a tabindex + $( '#searchInput' ).attr( 'tabindex', tabIndex++ ); + + // Make it keyboard accessible + $headings.attr( 'tabindex', function () { + return tabIndex++; + }); + + // Toggle the selected menu's class and expand or collapse the menu + $( '#mw-panel' ) + .delegate( '.portal:not(.persistent) > h3', 'keydown', function ( e ) { + // Make the space and enter keys act as a click + if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) { + toggle( $(this) ); + } + } ) + .delegate( '.portal:not(.persistent) > h3', 'mousedown', function ( e ) { + if ( e.which !== 3 ) { // Right mouse click + toggle( $(this) ); + $(this).blur(); + } + return false; + } ); + }); + +}( mediaWiki, jQuery ) ); diff --git a/vector/collapsibleTabs.js b/vector/collapsibleTabs.js new file mode 100644 index 0000000..0e49744 --- /dev/null +++ b/vector/collapsibleTabs.js @@ -0,0 +1,208 @@ +/** + * Collapsible tabs jQuery Plugin + */ +( function ( $ ) { + var rtl = $( 'html' ).attr( 'dir' ) === 'rtl'; + $.fn.collapsibleTabs = function ( options ) { + // return if the function is called on an empty jquery object + if ( !this.length ) { + return this; + } + // Merge options into the defaults + var $settings = $.extend( {}, $.collapsibleTabs.defaults, options ); + + this.each( function () { + var $el = $( this ); + // add the element to our array of collapsible managers + $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ? + $el : $.collapsibleTabs.instances.add( $el ) ); + // attach the settings to the elements + $el.data( 'collapsibleTabsSettings', $settings ); + // attach data to our collapsible elements + $el.children( $settings.collapsible ).each( function () { + $.collapsibleTabs.addData( $( this ) ); + } ); + } ); + + // if we haven't already bound our resize handler, bind it now + if ( !$.collapsibleTabs.boundEvent ) { + $( window ).on( 'resize', $.debounce( 500, function () { + $.collapsibleTabs.handleResize(); + } ) ); + $.collapsibleTabs.boundEvent = true; + } + + // call our resize handler to setup the page + $.collapsibleTabs.handleResize(); + return this; + }; + /** + * Returns the amount of horizontal distance between the two tabs groups + * (#left-navigation and #right-navigation), in pixels. If negative, this + * means that the tabs overlap, and the value is the width of overlapping + * parts. + * + * Used in default expandCondition and collapseCondition. + * + * @return {Numeric} distance/overlap in pixels + */ + function calculateTabDistance() { + var $leftTab, $rightTab, leftEnd, rightStart; + + // In RTL, #right-navigation is actually on the left and vice versa. + // Hooray for descriptive naming. + if ( !rtl ) { + $leftTab = $( '#left-navigation' ); + $rightTab = $( '#right-navigation' ); + } else { + $leftTab = $( '#right-navigation' ); + $rightTab = $( '#left-navigation' ); + } + + leftEnd = $leftTab.offset().left + $leftTab.width(); + rightStart = $rightTab.offset().left; + + return rightStart - leftEnd; + } + $.collapsibleTabs = { + instances: [], + boundEvent: null, + defaults: { + expandedContainer: '#p-views ul', + collapsedContainer: '#p-cactions ul', + collapsible: 'li.collapsible', + shifting: false, + expandCondition: function ( eleWidth ) { + // If there are at least eleWidth + 1 pixels of free space, expand. + // We add 1 because .width() will truncate fractional values + // but .offset() will not. + return calculateTabDistance() >= (eleWidth + 1); + }, + collapseCondition: function () { + // If there's an overlap, collapse. + return calculateTabDistance() < 0; + } + }, + addData: function ( $collapsible ) { + var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' ); + if ( $settings ) { + $collapsible.data( 'collapsibleTabsSettings', { + expandedContainer: $settings.expandedContainer, + collapsedContainer: $settings.collapsedContainer, + expandedWidth: $collapsible.width(), + prevElement: $collapsible.prev() + } ); + } + }, + getSettings: function ( $collapsible ) { + var $settings = $collapsible.data( 'collapsibleTabsSettings' ); + if ( !$settings ) { + $.collapsibleTabs.addData( $collapsible ); + $settings = $collapsible.data( 'collapsibleTabsSettings' ); + } + return $settings; + }, + handleResize: function () { + $.collapsibleTabs.instances.each( function () { + var $el = $( this ), + data = $.collapsibleTabs.getSettings( $el ); + + if ( data.shifting ) { + return; + } + + // if the two navigations are colliding + if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) { + + $el.trigger( 'beforeTabCollapse' ); + // move the element to the dropdown menu + $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) ); + } + + // if there are still moveable items in the dropdown menu, + // and there is sufficient space to place them in the tab container + if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 && + data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children( + data.collapsible + ':first' ) ).expandedWidth ) ) { + //move the element from the dropdown to the tab + $el.trigger( 'beforeTabExpand' ); + $.collapsibleTabs + .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' ); + } + } ); + }, + moveToCollapsed: function ( ele ) { + var outerData, expContainerSettings, target, + $moving = $( ele ); + + outerData = $.collapsibleTabs.getSettings( $moving ); + if ( !outerData ) { + return; + } + expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) ); + if ( !expContainerSettings ) { + return; + } + expContainerSettings.shifting = true; + + // Remove the element from where it's at and put it in the dropdown menu + target = outerData.collapsedContainer; + $moving.css( 'position', 'relative' ) + .css( ( rtl ? 'left' : 'right' ), 0 ) + .animate( { width: '1px' }, 'normal', function () { + var data, expContainerSettings; + $( this ).hide(); + // add the placeholder + $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this ); + $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData ); + $( this ).attr( 'style', 'display: list-item;' ); + data = $.collapsibleTabs.getSettings( $( ele ) ); + if ( data ) { + expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) ); + if ( expContainerSettings ) { + expContainerSettings.shifting = false; + $.collapsibleTabs.handleResize(); + } + } + } ); + }, + moveToExpanded: function ( ele ) { + var data, expContainerSettings, $target, expandedWidth, + $moving = $( ele ); + + data = $.collapsibleTabs.getSettings( $moving ); + if ( !data ) { + return; + } + expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) ); + if ( !expContainerSettings ) { + return; + } + expContainerSettings.shifting = true; + + // grab the next appearing placeholder so we can use it for replacing + $target = $( data.expandedContainer ).find( 'span.placeholder:first' ); + expandedWidth = data.expandedWidth; + $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' ); + $target.replaceWith( + $moving + .detach() + .css( 'width', '1px' ) + .data( 'collapsibleTabsSettings', data ) + .animate( { width: expandedWidth + 'px' }, 'normal', function () { + $( this ).attr( 'style', 'display: block;' ); + var data, expContainerSettings; + data = $.collapsibleTabs.getSettings( $( this ) ); + if ( data ) { + expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) ); + if ( expContainerSettings ) { + expContainerSettings.shifting = false; + $.collapsibleTabs.handleResize(); + } + } + } ) + ); + } + }; + +}( jQuery ) ); diff --git a/vector/components/animations.less b/vector/components/animations.less new file mode 100644 index 0000000..9163779 --- /dev/null +++ b/vector/components/animations.less @@ -0,0 +1,28 @@ +/* Animate between standard and high definition layouts */ +body.vector-animateLayout { + div#content, + div#footer, + #left-navigation { + .transition(margin-left 250ms, padding 250ms;); + } + + #p-logo { + .transition(left 250ms); + } + + #mw-panel { + .transition(padding-right 250ms); + } + + #p-search { + .transition(margin-right 250ms); + } + + #p-personal { + .transition(right 250ms); + } + + #mw-head-base { + .transition(margin-left 250ms); + } +} diff --git a/vector/components/collapsibleNav.less b/vector/components/collapsibleNav.less new file mode 100644 index 0000000..e6f5c9a --- /dev/null +++ b/vector/components/collapsibleNav.less @@ -0,0 +1,91 @@ +/** + * LESS Stylesheet for collapsible nav + */ +@import "mediawiki.mixins.less"; + +#mw-panel.collapsible-nav { + .portal { + background-position: left top; + background-repeat: no-repeat; + .background-image('images/portal-break.png'); + padding: 0.25em 0 !important; + margin: -11px 9px 10px 11px; + + h3 { + font-size: @menu-main-heading-font-size; + color: @collapsible-nav-heading-color; + font-weight: normal; + background-position: left center; + background-repeat: no-repeat; + .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png'); + padding: @collapsible-nav-heading-padding; + margin-bottom: 0; + + &:hover { + cursor: pointer; + text-decoration: none; + } + + a { + color: @collapsible-nav-heading-color; + text-decoration: none; + } + } + + .body { + margin: @collapsible-nav-body-margin; + background-image: none !important; + padding-top: 0; + display: none; + + ul { + li { + padding: 0.25em 0; + } + } + } + + + /* First */ + &.first { + background-image: none; + margin-top: 0; + h3 { + display: none; + } + } + + /* Persistent */ + &.persistent { + .body { + display: block; + margin-left: 0.5em; + } + + h3 { + background-image: none !important; + padding-left: 0.7em; + cursor: default; + } + } + + /* Collapsed */ + &.collapsed { + h3 { + color: @collapsible-nav-heading-collapsed-color; + background-position: left center; + background-repeat: no-repeat; + .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png'); + margin-bottom: 0; + + &:hover { + text-decoration: underline; + } + + a { + color: @collapsible-nav-heading-collapsed-color; + } + } + } + } +} diff --git a/vector/components/common.less b/vector/components/common.less new file mode 100644 index 0000000..25ba301 --- /dev/null +++ b/vector/components/common.less @@ -0,0 +1,141 @@ +/* + * Any rules which should not be flipped automatically in right-to-left situations should be + * prepended with @noflip in a comment block. + * + * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web + * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using + * a rule that makes things work in IE6, and then following it with a rule that begins with + * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support + * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and + * "IGNORED BY IE6" comments. + */ +@import "mediawiki.mixins"; + +/* Framework */ +html { + font-size: @html-font-size; +} +html, +body { + height: 100%; + margin: 0; + padding: 0; + font-family: @content-font-family; +} +body { + background-color: @menu-background-color; +} + +/* Content */ +div#content { + margin-left: 10em; + padding: @content-padding; + /* Border on top, left, and bottom side */ + border: 1px solid @content-border-color; + border-right-width: 0; + /* Merge the border with tabs' one (in their background image) */ + margin-top: -1px; + background-color: @body-background-color; + color: @content-font-color; + direction: ltr; + + .mw-editsection, + .mw-editsection-like { + font-family: @content-font-family; + } + + p { + line-height: inherit; + margin: 0.5em 0; + } + + h1, + h2, + #firstHeading { + font-family: @content-heading-font-family; + line-height: @heading-line-height; + margin-bottom: 0.25em; + padding: 0; + } + + h1, + #firstHeading { + font-size: @content-heading-font-size; + } + + h2 { + font-size: 1.5em; + margin-top: 1em; + } + + h3, + h4, + h5, + h6 { + line-height: @content-line-height; + margin-top: 0.3em; + margin-bottom: 0; + padding-bottom: 0; + } + + h3 { + font-size: 1.17em; + } + + h3, + h4 { + font-weight: bold; + } + + h4, + h5, + h6 { + font-size: 100%; /* (reset) */ + } + + #toc h2, + .toc h2 { + font-size: 100%; /* (reset) */ + font-family: @content-font-family; + } +} + +/* Hide empty portlets */ +div.emptyPortlet { + display: none; +} + +ul { + list-style-type: disc; + .list-style-image('images/bullet-icon.png'); +} + +pre, .mw-code { + line-height: 1.3em; +} + +/* Site Notice (includes notices from CentralNotice extension) */ +#siteNotice { + font-size: 0.8em; +} + +.redirectText { + font-size: 140%; +} + +.redirectMsg img { + vertical-align: text-bottom; +} + +#bodyContent { + position: relative; + width: 100%; + line-height: @content-line-height; + font-size: @content-font-size; +} + +/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */ +// FIXME: Should be part of jquery.tipsy.css +.tipsy { + font-size: 0.8em; +} diff --git a/vector/components/externalLinks.less b/vector/components/externalLinks.less new file mode 100644 index 0000000..91388c6 --- /dev/null +++ b/vector/components/externalLinks.less @@ -0,0 +1,10 @@ +@import "mediawiki.mixins.less"; +// External links +#content { + .external { + background-position: center right; + background-repeat: no-repeat; + .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png'); + padding-right: 13px; + } +} diff --git a/vector/components/footer.less b/vector/components/footer.less new file mode 100644 index 0000000..3d61b66 --- /dev/null +++ b/vector/components/footer.less @@ -0,0 +1,57 @@ +/* Footer */ +div#footer { + margin-left: 10em; + margin-top: 0; + padding: 0.75em; + direction: ltr; + + ul { + list-style-type: none; + list-style-image: none; + margin: 0; + padding: 0; + + li { + margin: 0; + padding: 0; + padding-top: 0.5em; + padding-bottom: 0.5em; + color: #333; + font-size: 0.7em; + } + } + + #footer-icons { + float: right; + + li { + float: left; + margin-left: 0.5em; + line-height: 2em; + text-align: right; + } + } + + #footer-info { + li { + line-height: 1.4em; + } + } + + #footer-places { + li { + float: left; + margin-right: 1em; + line-height: 2em; + } + } +} + +body.ltr { + div#footer { + #footer-places { + /* @noflip */ + float: left; + } + } +} diff --git a/vector/components/navigation.less b/vector/components/navigation.less new file mode 100644 index 0000000..f3a5a49 --- /dev/null +++ b/vector/components/navigation.less @@ -0,0 +1,134 @@ +@import "mediawiki.mixins"; +@import "personalMenu"; +@import "collapsibleNav"; +@import "search"; +@import "tabs"; + +/* Hide, but keep accessible for screen-readers */ +#mw-navigation h2 { + position: absolute; + top: -9999px; +} + +/* Head */ +#mw-page-base { + height: 5em; + background-position: bottom left; + background-repeat: repeat-x; + /* This image is only a fallback (for IE 6-9), so we do not @embed it. */ + background-image: url('images/page-fade.png'); + .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%); + background-color: @body-background-color; +} + +#mw-head-base { + margin-top: -5em; + margin-left: 10em; + height: 5em; +} + +div#mw-head { + position: absolute; + top: 0; + right: 0; + width: 100%; + + h3 { + margin: 0; + padding: 0; + } +} + +/* Navigation Containers */ +#left-navigation { + float: left; + margin-left: 10em; + margin-top: 2.5em; + /* When right nav would overlap left nav, it's placed below it + (normal CSS floats behavior). This rule ensures that no empty space + is shown between them due to right nav's margin-top. Page layout + is still broken, but at least the nav overlaps only the page title + instead of half the content. */ + margin-bottom: -2.5em; + /* IE 6 double-margin bug fix */ + display: inline; +} + +#right-navigation { + float: right; + margin-top: 2.5em; +} + +/* Logo */ +#p-logo { + position: absolute; + top: -160px; + left: 0; + width: 10em; + height: 160px; + + a { + display: block; + width: 10em; + height: 160px; + background-repeat: no-repeat; + background-position: center center; + text-decoration: none; + } +} + +/* Panel */ +div#mw-panel { + font-size: @menu-main-font-size; + position: absolute; + top: 160px; + padding-top: 1em; + width: 10em; + left: 0; + + div.portal { + padding-bottom: 1.5em; + direction: ltr; + + h3 { + font-weight: normal; + color: #444; + padding: @menu-main-heading-padding; + cursor: default; + border: none; + font-size: @menu-main-heading-font-size; + } + + div.body { + padding-top: 0.5em; + margin: @menu-main-body-margin; + + .background-image('images/portal-break.png'); + background-repeat: no-repeat; + background-position: top left; + + ul { + list-style-type: none; + list-style-image: none; + padding: @menu-main-body-padding; + margin: 0; + + li { + line-height: 1.125em; + padding: 0; + padding-bottom: 0.5em; + margin: 0; + font-size: @menu-main-body-font-size; + word-wrap: break-word; + + a { + color: @menu-main-body-link-color; + &:visited { + color: @menu-main-body-link-visited-color; + } + } + } + } + } + } +} diff --git a/vector/components/notifications.less b/vector/components/notifications.less new file mode 100644 index 0000000..cadb61c --- /dev/null +++ b/vector/components/notifications.less @@ -0,0 +1,20 @@ +/* mediawiki.notification */ +.skin-vector { + .mw-notification-area { + font-size: 0.8em; + } + + .mw-notification-area-layout { + top: 7em; + } + + .mw-notification { + background-color: #fff; + background-color: rgba(255, 255, 255, 0.93); + padding: 0.75em 1.5em; + border: solid 1px @content-border-color; + border-radius: 0.75em; + -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125); + } +} diff --git a/vector/components/personalMenu.less b/vector/components/personalMenu.less new file mode 100644 index 0000000..7256929 --- /dev/null +++ b/vector/components/personalMenu.less @@ -0,0 +1,41 @@ +/* Personal */ +#p-personal { + position: absolute; + top: 0.33em; + right: 0.75em; + /* Display on top of page tabs - bugs 37158, 48078 */ + z-index: 100; + + h3 { + display: none; + } + + ul { + list-style-type: none; + list-style-image: none; + margin: 0; + padding-left: 10em; /* Keep from overlapping logo */ + } + + li { + line-height: 1.125em; + /* @noflip */ + float: left; + margin-left: 0.75em; + margin-top: 0.5em; + font-size: @menu-personal-font-size; + white-space: nowrap; + } +} + +/* Icon for Usernames */ +#pt-userpage, +#pt-anonuserpage, +#pt-login { + background-position: left top; + background-repeat: no-repeat; + /* SVG support using a transparent gradient to guarantee cross-browser + * compatibility (browsers able to understand gradient syntax support also SVG) */ + .background-image-svg('images/user-icon.svg', 'images/user-icon.png'); + padding-left: 15px !important; +} diff --git a/vector/components/search.less b/vector/components/search.less new file mode 100644 index 0000000..46c3030 --- /dev/null +++ b/vector/components/search.less @@ -0,0 +1,113 @@ +/* Search */ +#p-search { + /* @noflip */ + float: left; + margin-right: 0.5em; + margin-left: 0.5em; + + h3 { + display: none; + } + + form, + input { + margin: 0; + margin-top: 0.4em; + } +} + +div#simpleSearch { + display: block; + width: 14em; + height: 1.4em; + margin-top: 0.65em; + position: relative; + min-height: 1px; /* Gotta trigger hasLayout for IE7 */ + border: solid 1px #aaa; + color: black; + background-color: white; + .background-image('images/search-fade.png'); + background-position: top left; + background-repeat: repeat-x; + + // Styles for both the search input and the button + input { + position: absolute; + margin: 0; + padding: 0; + border: 0; + background-color: transparent; + color: black; + } + + // The search input + #searchInput { + top: 0; + left: 0; + width: 90%; + padding: 0.2em 0 0.2em 0.2em; + font-size: 13px; + direction: ltr; + + &:focus { + outline: none; + } + + // These rules MAY NOT be merged because of how CSS requires browsers + // to parse unrecognized selectors! + // Note these rules ensure that placeholder text can be distinguished from + // standard text. In browsers which make this distinction clear these rules + // are not necessary. + // For inputs that use jquery.placeholder.js e.g. IE9- + &.placeholder { + color: #999; + } + // Distinguish placeholder text in IE10+ + &:-ms-input-placeholder { + color: #999; + } + // Distinguish placeholder text in Firefox 18- + &:-moz-placeholder { + color: #999; + } + + // Undo the styles Webkit browsers apply to type=search fields, + // we provide our own + -webkit-appearance: textfield; + + &::-webkit-search-decoration, + &::-webkit-search-cancel-button, + &::-webkit-search-results-button, + &::-webkit-search-results-decoration { + -webkit-appearance: textfield; + } + } + + // The buttons. They are displayed in the same position, and if both are + // present the fulltext search one obscures the 'Go' one. + #searchButton, + #mw-searchButton { + top: 0; + right: 0; + width: 10%; + height: 100%; + cursor: pointer; + /* Hide button text and replace it with the image. */ + /* This would be 100% if not for Firefox shenanigans (bug 60900). */ + text-indent: 200%; + /* Needed to make IE6 respect the text-indent. */ + line-height: 1; + /* Opera 12 on RTL flips the text in a funny way without this. */ + /* @noflip */ + direction: ltr; + white-space: nowrap; + overflow: hidden; + .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png'); + background-position: center center; + background-repeat: no-repeat; + } + + #mw-searchButton { + z-index: 1; + } +} diff --git a/vector/components/tabs.less b/vector/components/tabs.less new file mode 100644 index 0000000..7e24ae7 --- /dev/null +++ b/vector/components/tabs.less @@ -0,0 +1,274 @@ +/* +Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions) +*/ + +/* Navigation Labels */ +div.vectorTabs h3, +div.vectorMenu h3 span { + display: none; +} + +/* Namespaces and Views */ +div.vectorTabs { + /* @noflip */ + float: left; + height: 2.5em; + .background-image('images/tab-break.png'); + background-position: bottom left; + background-repeat: no-repeat; + padding-left: 1px; + + ul { + /* @noflip */ + float: left; + height: 100%; + list-style-type: none; + list-style-image: none; + margin: 0; + padding: 0; + .background-image('images/tab-break.png'); + background-position: right bottom; + background-repeat: no-repeat; + + li { + /* @noflip */ + float: left; + line-height: 1.125em; + /* For IE6, overridden later to display:block by modern browsers */ + display: inline-block; + height: 100%; + margin: 0; + padding: 0; + background-color: #f3f3f3; + .background-image('images/tab-normal-fade.png'); + background-position: bottom left; + background-repeat: repeat-x; + white-space: nowrap; + } + + /* IGNORED BY IE6 which doesn't support child selector */ + > li { + display: block; + } + } + + li { + &.new { + a, + a:visited{ + color: #a55858; + } + } + + &.selected { + .background-image('images/tab-current-fade.png'); + a, + a:visited{ + color: #333; + text-decoration: none; + } + } + + &.icon { + a { + background-position: bottom right; + background-repeat: no-repeat; + } + } + + a { + /* For IE6, overridden later to display:block by modern browsers */ + display: inline-block; + height: 1.9em; + padding-left: 0.5em; + padding-right: 0.5em; + color: @menu-link-color; + cursor: pointer; + font-size: 0.8em; + } + + /* Ignored by IE6 which doesn't support child selector */ + > a { + display: block; + } + } + + span { + display: inline-block; + .background-image('images/tab-break.png'); + background-position: bottom right; + background-repeat: no-repeat; + + a { + /* For IE6, overridden later to display:block by modern browsers */ + display: inline-block; + padding-top: 1.25em; + } + + /* Ignored by IE6 which doesn't support child selector */ + > a { + /* @noflip */ + float: left; + display: block; + } + } +} + +/* Variants and Actions */ +div.vectorMenu { + /* @noflip */ + direction: ltr; + /* @noflip */ + float: left; + .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png'); + /* @noflip */ + background-position: 100% 60%; + background-repeat: no-repeat; + cursor: pointer; + .transition(background-position 250ms); +} + +div.vectorMenu.menuForceShow { + background-position: 100% 100%; +} + +div.vectorMenuFocus { + .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png'); + background-position: 100% 60%; +} + +body.rtl div.vectorMenu { + /* @noflip */ + direction: rtl; +} + +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div#mw-head div.vectorMenu h3 { + /* @noflip */ + float: left; + .background-image('images/tab-break.png'); + background-repeat: no-repeat; + background-position: bottom left; + margin-left: -1px; +} + +/* IGNORED BY IE6 */ +div#mw-head div.vectorMenu > h3 { + background-image: none; +} + +div#mw-head div.vectorMenu h4, +div.vectorMenu#p-variants #mw-vector-current-variant { + display: inline-block; + float: left; + font-size: 0.8em; + padding-left: 0.5em; + padding-top: 1.375em; + font-weight: normal; + border: none; +} + +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div.vectorMenu h3 a { + display: inline-block; + width: 24px; + height: 1.9em; + text-decoration: none; + .background-image('images/tab-break.png'); + background-repeat: no-repeat; + background-position: bottom right; +} + +/* IGNORED BY IE6 */ +div.vectorMenu h3 > a { + display: block; +} + +div.vectorMenu div.menu { + position: relative; + display: none; + clear: both; + text-align: left; +} + +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +body.rtl div.vectorMenu div.menu { + /* @noflip */ + margin-left: 24px; +} + +/* IGNORED BY IE6 */ +body.rtl div.vectorMenu > div.menu { + /* @noflip */ + margin-left: auto; +} + +/* IGNORED BY IE6 */ +/* Also fixes old versions of FireFox */ +body.rtl div.vectorMenu > div.menu, +x:-moz-any-link { + /* @noflip */ + margin-left: 23px; +} + +/* Enable forcing showing of the menu for accessibility */ +div.vectorMenu:hover div.menu, +div.vectorMenu.menuForceShow div.menu { + display: block; +} + +div.vectorMenu ul { + position: absolute; + background-color: white; + border: solid 1px silver; + border-top-width: 0; + list-style-type: none; + list-style-image: none; + padding: 0; + margin: 0; + margin-left: -1px; + text-align: left; +} + +/* Fixes old versions of FireFox */ +div.vectorMenu ul, +x:-moz-any-link { + min-width: 5em; +} + +/* Returns things back to normal in modern versions of FireFox */ +div.vectorMenu ul, +x:-moz-any-link, +x:default { + min-width: 0; +} + +div.vectorMenu li { + padding: 0; + margin: 0; + text-align: left; + line-height: 1em; +} + +/* OVERRIDDEN BY COMPLIANT BROWSERS */ +div.vectorMenu li a { + display: inline-block; + padding: 0.5em; + white-space: nowrap; + color: @menu-link-color; + cursor: pointer; + font-size: 0.8em; +} + +/* IGNORED BY IE6 */ +div.vectorMenu li > a { + display: block; +} + +div.vectorMenu li.selected a, +div.vectorMenu li.selected a:visited { + color: #333; + text-decoration: none; +} + +@import 'watchstar.less'; diff --git a/vector/components/watchstar.less b/vector/components/watchstar.less new file mode 100644 index 0000000..1a6d1fc --- /dev/null +++ b/vector/components/watchstar.less @@ -0,0 +1,46 @@ +@import "mediawiki.mixins.rotation" + +/* Watch/Unwatch Icon Styling */ +#ca-unwatch.icon a, +#ca-watch.icon a { + margin: 0; + padding: 0; + display: block; + width: 26px; + /* This hides the text but shows the background image */ + padding-top: 3.1em; + margin-top: 0; + /* Only applied in IE6 */ + margin-top: -0.8em !ie; + height: 0; + overflow: hidden; + background-position: 5px 60%; +} +#ca-unwatch.icon a { + .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png'); +} +#ca-watch.icon a { + .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png'); +} +#ca-unwatch.icon a:hover, +#ca-unwatch.icon a:focus { + .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png'); +} +#ca-watch.icon a:hover, +#ca-watch.icon a:focus { + .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png'); +} +#ca-unwatch.icon a.loading, +#ca-watch.icon a.loading { + .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png'); + .rotation(700ms); + /* Suppress the hilarious rotating focus outline on Firefox */ + outline: none; + background-position: 50% 60%; + -webkit-transform-origin: 50% 57%; + transform-origin: 50% 57%; +} +#ca-unwatch.icon a span, +#ca-watch.icon a span { + display: none; +} diff --git a/vector/csshover.htc b/vector/csshover.htc new file mode 100644 index 0000000..a13ea68 --- /dev/null +++ b/vector/csshover.htc @@ -0,0 +1,284 @@ +<public:attach event="ondocumentready" onevent="CSSHover()" /> +<script> +/** + * Whatever:hover - V3.11 + * ------------------------------------------------------------ + * Author - Peter Nederlof, http://www.xs4all.nl/~peterned + * License - http://creativecommons.org/licenses/LGPL/2.1 + * + * Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu, + * for fixing the expression loop. + * + * Whatever:hover is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Whatever:hover is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * howto: body { behavior:url("csshover3.htc"); } + * ------------------------------------------------------------ + */ + +window.CSSHover = (function(){ + + // regular expressions, used and explained later on. + var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i; + var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i; + var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i; + var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi; + var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i; + var REG_MSIE = /msie (5|6|7)/i; + var REG_COMPAT = /backcompat/i; + + // property mapping, real css properties must be used in order to clear expressions later on... + // Uses obscure css properties that no-one is likely to use. The properties are borrowed to + // set an expression, and are then restored to the most likely correct value. + var Properties = { + index: 0, + list: ['text-kashida', 'text-kashida-space', 'text-justify'], + get: function() { + return this.list[(this.index++)%this.list.length]; + } + }; + + // camelize is used to convert css properties from (eg) text-kashida to textKashida + var camelize = function(str) { + return str.replace(/-(.)/mg, function(result, match){ + return match.toUpperCase(); + }); + }; + + /** + * Local CSSHover object + * -------------------------- + */ + + var CSSHover = { + + // array of CSSHoverElements, used to unload created events + elements: [], + + // buffer used for checking on duplicate expressions + callbacks: {}, + + // init, called once ondomcontentready via the exposed window.CSSHover function + init:function() { + // don't run in IE8 standards; expressions don't work in standards mode anyway, + // and the stuff we're trying to fix should already work properly + if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) { + return; + } + + // start parsing the existing stylesheets + var sheets = window.document.styleSheets, l = sheets.length; + for(var i=0; i<l; i++) { + this.parseStylesheet(sheets[i]); + } + }, + + // called from init, parses individual stylesheets + parseStylesheet:function(sheet) { + // check sheet imports and parse those recursively + if(sheet.imports) { + try { + var imports = sheet.imports; + var l = imports.length; + for(var i=0; i<l; i++) { + this.parseStylesheet(sheet.imports[i]); + } + } catch(securityException){ + // trycatch for various possible errors + } + } + + // interate the sheet's rules and send them to the parser + try { + var rules = sheet.rules; + var r = rules.length; + for(var j=0; j<r; j++) { + this.parseCSSRule(rules[j], sheet); + } + } catch(someException){ + // trycatch for various errors, most likely accessing the sheet's rules. + } + }, + + // magic starts here ... + parseCSSRule:function(rule, sheet) { + + // The sheet is used to insert new rules into, this must be the same sheet the rule + // came from, to ensure that relative paths keep pointing to the right location. + + // only parse a rule if it contains an interactive pseudo. + var select = rule.selectorText; + if(REG_INTERACTIVE.test(select)) { + var style = rule.style.cssText; + + // affected elements are found by truncating the selector after the interactive pseudo, + // eg: "div li:hover" >> "div li" + var affected = REG_AFFECTED.exec(select)[1]; + + // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active) + // eg: "li:hover" >> "onhover" + var pseudo = select.replace(REG_PSEUDO, 'on$1'); + + // the new selector is going to use that classname in a new css rule, + // since IE6 doesn't support multiple classnames, this is merged into one classname + // eg: "li:hover" >> "li.onhover", "li.folder:hover" >> "li.folderonhover" + var newSelect = select.replace(REG_SELECT, '.$2' + pseudo); + + // the classname is needed for the events that are going to be set on affected nodes + // eg: "li.folder:hover" >> "folderonhover" + var className = REG_CLASS.exec(newSelect)[1]; + + // no need to set the same callback more than once when the same selector uses the same classname + var hash = affected + className; + if(!this.callbacks[hash]) { + + // affected elements are given an expression under a borrowed css property, because fake properties + // can't have their expressions cleared. Different properties are used per pseudo, to avoid + // expressions from overwriting eachother. The expression does a callback to CSSHover.patch, + // rerouted via the exposed window.CSSHover function. + var property = Properties.get(); + var atRuntime = camelize(property); + + // because the expression is added to the stylesheet, and styles are always applied to html that is + // dynamically added to the dom, the expression will also trigger for those new elements (provided + // they are selected by the affected selector). + sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))'); + + // hash it, so an identical selector/class combo does not duplicate the expression + this.callbacks[hash] = true; + } + + // duplicate expressions need not be set, but the style could differ + sheet.addRule(newSelect, style); + } + }, + + // called via the expression, patches individual nodes + patch:function(node, type, className, property) { + + // restores the borrowed css property to the value of its immediate parent, clearing + // the expression so that it's not repeatedly called. + try { + var value = node.parentNode.currentStyle[property]; + node.style[property] = value; + } catch(e) { + // the above reset should never fail, but just in case, clear the runtimeStyle if it does. + // this will also stop the expression. + node.runtimeStyle[property] = ''; + } + + // just to make sure, also keep track of patched classnames locally on the node + if(!node.csshover) { + node.csshover = []; + } + + // and check for it to prevent duplicate events with the same classname from being set + if(!node.csshover[className]) { + node.csshover[className] = true; + + // create an instance for the given type and class + var element = new CSSHoverElement(node, type, className); + + // and store that instance for unloading later on + this.elements.push(element); + } + + // returns a dummy value to the expression + return type; + }, + + // unload stuff onbeforeunload + unload:function() { + try { + + // remove events + var l = this.elements.length; + for(var i=0; i<l; i++) { + this.elements[i].unload(); + } + + // and set properties to null + this.elements = []; + this.callbacks = {}; + + } catch (e) { + } + } + }; + + /** + * CSSHoverElement + * -------------------------- + */ + + // the event types associated with the interactive pseudos + var CSSEvents = { + onhover: { activator: 'onmouseenter', deactivator: 'onmouseleave' }, + onactive: { activator: 'onmousedown', deactivator: 'onmouseup' }, + onfocus: { activator: 'onfocus', deactivator: 'onblur' } + }; + + // CSSHoverElement constructor, called via CSSHover.patch + function CSSHoverElement(node, type, className) { + + // the CSSHoverElement patches individual nodes by manually applying the events that should + // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover. + + this.node = node; + this.type = type; + var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g'); + + // store event handlers for removal onunload + this.activator = function(){ node.className += ' ' + className; }; + this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); }; + + // add the events + node.attachEvent(CSSEvents[type].activator, this.activator); + node.attachEvent(CSSEvents[type].deactivator, this.deactivator); + } + + CSSHoverElement.prototype = { + // onbeforeunload, called via CSSHover.unload + unload:function() { + + // remove events + this.node.detachEvent(CSSEvents[this.type].activator, this.activator); + this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator); + + // and set properties to null + this.activator = null; + this.deactivator = null; + this.node = null; + this.type = null; + } + }; + + // add the unload to the onbeforeunload event + window.attachEvent('onbeforeunload', function(){ + CSSHover.unload(); + }); + + /** + * Public hook + * -------------------------- + */ + + return function(node, type, className, property) { + if(node) { + // called via the css expression; patches individual nodes + return CSSHover.patch(node, type, className, property); + } else { + // called ondomcontentready via the public:attach node + CSSHover.init(); + } + }; + +})(); +</script>
\ No newline at end of file diff --git a/vector/csshover.min.htc b/vector/csshover.min.htc new file mode 100644 index 0000000..7e5c57b --- /dev/null +++ b/vector/csshover.min.htc @@ -0,0 +1,12 @@ +<public:attach event="ondocumentready" onevent="CSSHover()" /> +<script> +/** + * Whatever:hover - V3.11 + * http://www.xs4all.nl/~peterned/ + * + * Copyright (c) 2009 Peter Nederlof + * Licensed under the LGPL license + * http://creativecommons.org/licenses/LGPL/2.1 + */ +window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})(); +</script> diff --git a/vector/images/arrow-collapsed-ltr.png b/vector/images/arrow-collapsed-ltr.png Binary files differnew file mode 100644 index 0000000..063ac6f --- /dev/null +++ b/vector/images/arrow-collapsed-ltr.png diff --git a/vector/images/arrow-collapsed-ltr.svg b/vector/images/arrow-collapsed-ltr.svg new file mode 100644 index 0000000..b943caa --- /dev/null +++ b/vector/images/arrow-collapsed-ltr.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file diff --git a/vector/images/arrow-collapsed-rtl.png b/vector/images/arrow-collapsed-rtl.png Binary files differnew file mode 100644 index 0000000..c346218 --- /dev/null +++ b/vector/images/arrow-collapsed-rtl.png diff --git a/vector/images/arrow-collapsed-rtl.svg b/vector/images/arrow-collapsed-rtl.svg new file mode 100644 index 0000000..5faf356 --- /dev/null +++ b/vector/images/arrow-collapsed-rtl.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file diff --git a/vector/images/arrow-down-focus-icon.png b/vector/images/arrow-down-focus-icon.png Binary files differnew file mode 100644 index 0000000..7640bd1 --- /dev/null +++ b/vector/images/arrow-down-focus-icon.png diff --git a/vector/images/arrow-down-focus-icon.svg b/vector/images/arrow-down-focus-icon.svg new file mode 100644 index 0000000..826c280 --- /dev/null +++ b/vector/images/arrow-down-focus-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file diff --git a/vector/images/arrow-down-icon.png b/vector/images/arrow-down-icon.png Binary files differnew file mode 100644 index 0000000..12e3b93 --- /dev/null +++ b/vector/images/arrow-down-icon.png diff --git a/vector/images/arrow-down-icon.svg b/vector/images/arrow-down-icon.svg new file mode 100644 index 0000000..8e31b2f --- /dev/null +++ b/vector/images/arrow-down-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file diff --git a/vector/images/arrow-expanded.png b/vector/images/arrow-expanded.png Binary files differnew file mode 100644 index 0000000..0221028 --- /dev/null +++ b/vector/images/arrow-expanded.png diff --git a/vector/images/arrow-expanded.svg b/vector/images/arrow-expanded.svg new file mode 100644 index 0000000..e744ec3 --- /dev/null +++ b/vector/images/arrow-expanded.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file diff --git a/vector/images/bullet-icon.png b/vector/images/bullet-icon.png Binary files differnew file mode 100644 index 0000000..7bae98f --- /dev/null +++ b/vector/images/bullet-icon.png diff --git a/vector/images/external-link-ltr-icon.png b/vector/images/external-link-ltr-icon.png Binary files differnew file mode 100644 index 0000000..6308383 --- /dev/null +++ b/vector/images/external-link-ltr-icon.png diff --git a/vector/images/external-link-ltr-icon.svg b/vector/images/external-link-ltr-icon.svg new file mode 100644 index 0000000..5969d03 --- /dev/null +++ b/vector/images/external-link-ltr-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file diff --git a/vector/images/external-link-rtl-icon.png b/vector/images/external-link-rtl-icon.png Binary files differnew file mode 100644 index 0000000..5313234 --- /dev/null +++ b/vector/images/external-link-rtl-icon.png diff --git a/vector/images/external-link-rtl-icon.svg b/vector/images/external-link-rtl-icon.svg new file mode 100644 index 0000000..75a7025 --- /dev/null +++ b/vector/images/external-link-rtl-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file diff --git a/vector/images/link-icon.png b/vector/images/link-icon.png Binary files differnew file mode 100644 index 0000000..b70efaa --- /dev/null +++ b/vector/images/link-icon.png diff --git a/vector/images/magnify-clip.png b/vector/images/magnify-clip.png Binary files differnew file mode 100644 index 0000000..00a9cee --- /dev/null +++ b/vector/images/magnify-clip.png diff --git a/vector/images/page-fade.png b/vector/images/page-fade.png Binary files differnew file mode 100644 index 0000000..b4a6034 --- /dev/null +++ b/vector/images/page-fade.png diff --git a/vector/images/portal-break-ltr.png b/vector/images/portal-break-ltr.png Binary files differnew file mode 100644 index 0000000..20bf366 --- /dev/null +++ b/vector/images/portal-break-ltr.png diff --git a/vector/images/portal-break-rtl.png b/vector/images/portal-break-rtl.png Binary files differnew file mode 100644 index 0000000..e5f6223 --- /dev/null +++ b/vector/images/portal-break-rtl.png diff --git a/vector/images/portal-break.png b/vector/images/portal-break.png Binary files differnew file mode 100644 index 0000000..90c3918 --- /dev/null +++ b/vector/images/portal-break.png diff --git a/vector/images/preferences/break.png b/vector/images/preferences/break.png Binary files differnew file mode 100644 index 0000000..b529308 --- /dev/null +++ b/vector/images/preferences/break.png diff --git a/vector/images/preferences/fade.png b/vector/images/preferences/fade.png Binary files differnew file mode 100644 index 0000000..638084d --- /dev/null +++ b/vector/images/preferences/fade.png diff --git a/vector/images/search-fade.png b/vector/images/search-fade.png Binary files differnew file mode 100644 index 0000000..6cb7d28 --- /dev/null +++ b/vector/images/search-fade.png diff --git a/vector/images/search-ltr.png b/vector/images/search-ltr.png Binary files differnew file mode 100644 index 0000000..1db2eb2 --- /dev/null +++ b/vector/images/search-ltr.png diff --git a/vector/images/search-ltr.svg b/vector/images/search-ltr.svg new file mode 100644 index 0000000..0720f20 --- /dev/null +++ b/vector/images/search-ltr.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file diff --git a/vector/images/search-rtl.png b/vector/images/search-rtl.png Binary files differnew file mode 100644 index 0000000..c26c8d0 --- /dev/null +++ b/vector/images/search-rtl.png diff --git a/vector/images/search-rtl.svg b/vector/images/search-rtl.svg new file mode 100644 index 0000000..622d5f9 --- /dev/null +++ b/vector/images/search-rtl.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file diff --git a/vector/images/tab-break.png b/vector/images/tab-break.png Binary files differnew file mode 100644 index 0000000..6d37af5 --- /dev/null +++ b/vector/images/tab-break.png diff --git a/vector/images/tab-current-fade.png b/vector/images/tab-current-fade.png Binary files differnew file mode 100644 index 0000000..b8f772f --- /dev/null +++ b/vector/images/tab-current-fade.png diff --git a/vector/images/tab-normal-fade.png b/vector/images/tab-normal-fade.png Binary files differnew file mode 100644 index 0000000..f719a88 --- /dev/null +++ b/vector/images/tab-normal-fade.png diff --git a/vector/images/unwatch-icon-hl.png b/vector/images/unwatch-icon-hl.png Binary files differnew file mode 100644 index 0000000..6b2b502 --- /dev/null +++ b/vector/images/unwatch-icon-hl.png diff --git a/vector/images/unwatch-icon-hl.svg b/vector/images/unwatch-icon-hl.svg new file mode 100644 index 0000000..d52d547 --- /dev/null +++ b/vector/images/unwatch-icon-hl.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file diff --git a/vector/images/unwatch-icon.png b/vector/images/unwatch-icon.png Binary files differnew file mode 100644 index 0000000..9fd9436 --- /dev/null +++ b/vector/images/unwatch-icon.png diff --git a/vector/images/unwatch-icon.svg b/vector/images/unwatch-icon.svg new file mode 100644 index 0000000..cde7bc5 --- /dev/null +++ b/vector/images/unwatch-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file diff --git a/vector/images/user-icon.png b/vector/images/user-icon.png Binary files differnew file mode 100644 index 0000000..57f9f8d --- /dev/null +++ b/vector/images/user-icon.png diff --git a/vector/images/user-icon.svg b/vector/images/user-icon.svg new file mode 100644 index 0000000..4335bcf --- /dev/null +++ b/vector/images/user-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file diff --git a/vector/images/watch-icon-hl.png b/vector/images/watch-icon-hl.png Binary files differnew file mode 100644 index 0000000..4cb87cd --- /dev/null +++ b/vector/images/watch-icon-hl.png diff --git a/vector/images/watch-icon-hl.svg b/vector/images/watch-icon-hl.svg new file mode 100644 index 0000000..664c671 --- /dev/null +++ b/vector/images/watch-icon-hl.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file diff --git a/vector/images/watch-icon-loading.png b/vector/images/watch-icon-loading.png Binary files differnew file mode 100644 index 0000000..5f0c490 --- /dev/null +++ b/vector/images/watch-icon-loading.png diff --git a/vector/images/watch-icon-loading.svg b/vector/images/watch-icon-loading.svg new file mode 100644 index 0000000..751eb14 --- /dev/null +++ b/vector/images/watch-icon-loading.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file diff --git a/vector/images/watch-icon.png b/vector/images/watch-icon.png Binary files differnew file mode 100644 index 0000000..39daff2 --- /dev/null +++ b/vector/images/watch-icon.png diff --git a/vector/images/watch-icon.svg b/vector/images/watch-icon.svg new file mode 100644 index 0000000..907b05b --- /dev/null +++ b/vector/images/watch-icon.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file diff --git a/vector/screen-hd.less b/vector/screen-hd.less new file mode 100644 index 0000000..8b286f4 --- /dev/null +++ b/vector/screen-hd.less @@ -0,0 +1,30 @@ +/* Vector screen styles for high definition displays */ + +@import "variables.less"; + +div#content { + margin-left: 11em; + padding: 1.25em 1.5em 1.5em 1.5em; +} +#p-logo { + left: @menu-main-logo-left; +} +div#footer { + margin-left: 11em; + padding: 1.25em; +} +#mw-panel { + padding-left: 0.5em; +} +#p-search { + margin-right: 1em; +} +#left-navigation { + margin-left: 11em; +} +#p-personal { + right: 1em; +} +#mw-head-base { + margin-left: 11em; +} diff --git a/vector/screen.less b/vector/screen.less new file mode 100644 index 0000000..f7b374f --- /dev/null +++ b/vector/screen.less @@ -0,0 +1,10 @@ +/* Vector screen styles */ + +@import "variables.less"; + +@import "components/common.less"; +@import "components/animations.less"; +@import "components/navigation.less"; +@import "components/footer.less"; +@import 'components/notifications.less'; +@import "components/externalLinks.less"; diff --git a/vector/special.less b/vector/special.less new file mode 100644 index 0000000..6af4b1e --- /dev/null +++ b/vector/special.less @@ -0,0 +1,7 @@ +/** + * Adjusts for decreased margin-bottom for h2 elements inside #content div + * introduced in March / April 2014 typography update. + */ +table.mw-specialpages-table { + margin-top: 0; +} diff --git a/vector/special.preferences.less b/vector/special.preferences.less new file mode 100644 index 0000000..a9b1006 --- /dev/null +++ b/vector/special.preferences.less @@ -0,0 +1,114 @@ +@import "mediawiki.mixins"; +@import "variables"; + +/** + * The following code is highly modified from monobook. It would be nice if the + * preftoc id was more human readable like preferences-toc for instance, + * howerver this would require backporting the other skins. + */ + +#preftoc { + /* Tabs */ + width: 100%; + float: left; + clear: both; + margin: 0 !important; + padding: 0 !important; + .background-image('images/preferences/break.png'); + background-position: bottom left; + background-repeat: no-repeat; + + li { + /* Tab */ + float: left; + margin: 0; + padding: 0; + padding-right: 1px; + height: 2.25em; + white-space: nowrap; + list-style-type: none; + list-style-image: none; + .background-image('images/preferences/break.png'); + background-position: bottom right; + background-repeat: no-repeat; + + /* Sadly, IE6 won't understand this */ + &:first-child { + margin-left: 1px; + } + + &.selected { + a { + .background-image('images/preferences/fade.png'); + background-position: bottom; + background-repeat: repeat-x; + color: #333; + text-decoration: none; + } + } + } + + a, + a:active { + display: inline-block; + position: relative; + color: @menu-link-color; + padding: 0.5em; + text-decoration: none; + background-image: none; + font-size: 0.9em; + } + + a:hover, + a:focus { + text-decoration: underline; + } +} + +#preferences { + float: left; + width: 100%; + margin: 0; + margin-top: -2px; + clear: both; + border: solid 1px #ccc; + background-color: #fafafa; + + fieldset { + border: none; + border-top: solid 1px #ccc; + + &.prefsection { + border: none; + padding: 0; + margin: 1em; + + legend.mainLegend { + display: none; + } + } + } + + legend { + color: #666; + } + + td { + padding-left: 0.5em; + padding-right: 0.5em; + } + + div.mw-prefs-buttons { + padding: 1em; + + input { + margin-right: 0.25em; + } + } +} + +.htmlform-tip { + font-size: x-small; + padding: .2em 2em; + color: #666; +} diff --git a/vector/variables.less b/vector/variables.less new file mode 100644 index 0000000..f008a3a --- /dev/null +++ b/vector/variables.less @@ -0,0 +1,43 @@ +@html-font-size: 1em; + +// Page content +// FIXME: Use global variable since Echo and CentralNotice use this variable +@content-border-color: #a7d7f9; +// FIXME: Find an open font that works with this stack and is readable by Windows users +@content-font-family: sans-serif; +@content-font-color: #252525; +@content-font-size: 0.875em; +@content-line-height: 1.6; +@content-padding: 1em; +@content-heading-font-size: 1.8em; +@content-heading-font-family: sans-serif; +@body-background-color: #fff; +@heading-line-height: 1.3; + +// Navigation +@menu-background-color: #f6f6f6; + +// Common menu +@menu-link-color: #0645ad; + +// Main menu +@menu-main-font-size: inherit; +@menu-main-heading-font-size: 0.75em; +@menu-main-heading-padding: 0 1.75em 0.25em 0.25em; + +@menu-main-body-font-size: 0.75em; +@menu-main-body-link-color: #0645ad; +@menu-main-body-link-visited-color: #0b0080; +@menu-main-body-margin: 0 0 0 1.25em; +@menu-main-body-padding: 0; +@menu-main-logo-left: 0.5em; + +// Personal menu +@menu-personal-font-size: 0.75em; + +// Collapsible nav +@collapsible-nav-heading-color: #4d4d4d; +@collapsible-nav-heading-collapsed-color: #0645ad; + +@collapsible-nav-heading-padding: 4px 0 3px 1.5em; +@collapsible-nav-body-margin: 0 0 0 1.25em; diff --git a/vector/vector.js b/vector/vector.js new file mode 100644 index 0000000..0bc114a --- /dev/null +++ b/vector/vector.js @@ -0,0 +1,55 @@ +/** + * Vector-specific scripts + */ +jQuery( function ( $ ) { + $( 'div.vectorMenu' ).each( function () { + var $el = $( this ); + $el.find( '> h3 > a' ).parent() + .attr( 'tabindex', '0' ) + // For accessibility, show the menu when the h3 is clicked (bug 24298/46486) + .on( 'click keypress', function ( e ) { + if ( e.type === 'click' || e.which === 13 ) { + $el.toggleClass( 'menuForceShow' ); + e.preventDefault(); + } + } ) + // When the heading has focus, also set a class that will change the arrow icon + .focus( function () { + $el.find( '> a' ).addClass( 'vectorMenuFocus' ); + } ) + .blur( function () { + $el.find( '> a' ).removeClass( 'vectorMenuFocus' ); + } ) + .find( '> a:first' ) + // As the h3 can already be focused there's no need for the link to be focusable + .attr( 'tabindex', '-1' ); + } ); + + /** + * Collapsible tabs for Vector + */ + var $cactions = $( '#p-cactions' ); + + // Bind callback functions to animate our drop down menu in and out + // and then call the collapsibleTabs function on the menu + $( '#p-views ul' ) + .bind( 'beforeTabCollapse', function () { + // If the dropdown was hidden, show it + if ( $cactions.hasClass( 'emptyPortlet' ) ) { + $cactions + .removeClass( 'emptyPortlet' ) + .find( 'h3' ) + .css( 'width', '1px' ).animate( { 'width': '24px' }, 390 ); + } + } ) + .bind( 'beforeTabExpand', function () { + // If we're removing the last child node right now, hide the dropdown + if ( $cactions.find( 'li' ).length === 1 ) { + $cactions.find( 'h3' ).animate( { 'width': '1px' }, 390, function () { + $( this ).attr( 'style', '' ) + .parent().addClass( 'emptyPortlet' ); + }); + } + } ) + .collapsibleTabs(); +} ); |