From 60ecb5962d2fcc2643a71fb6743d99ae3dfd199d Mon Sep 17 00:00:00 2001 From: Sascha Date: Thu, 4 Jun 2026 16:25:01 +0200 Subject: [PATCH] feat: WCAG-AAA-Kontraste, Cavendish-Skin, Deploy-Pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Barrierefreiheit (cavendish.css / header.css): - Header auf dunkles Teal (#003535) umgestellt, Titel weiß - Tab-Buttons an dunklen Header angepasst (Kontrast 12:1 AAA) - Status-Boxen (.successbox/.errorbox/.warningbox) von <2:1 auf 7-8:1 angehoben - Grau-Texte (#888, #808080, #7d7d7d) auf #595959 (7:1 AAA) vereinheitlicht - Aktive Links, Footer, Nav-Labels auf WCAG-AAA-Kontrast gebracht - header.css in skin.json registriert (war nie geladen) - Cavendish-Skin vollständig versioniert Deploy-Infrastruktur: - .forgejo/workflows/deploy.yml: Auto-Deploy via Forgejo Actions bei Push auf main - scripts/deploy.ps1: manuelles Windows-Deploy (WSL rsync / scp-Fallback) - mediawiki/LocalSettings.production.example.php: Produktions-Konfigurationsvorlage - .deploy.example.env: Verbindungsdaten-Template - package.json: deploy / deploy:all / deploy:initial Skripte ergänzt Co-Authored-By: Claude Sonnet 4.6 --- .deploy.example.env | 13 + .forgejo/workflows/deploy.yml | 38 + .gitignore | 1 + CLAUDE.md | 82 + docs/INSTALLATION_WINDOWS.md | 54 +- .../LocalSettings.production.example.php | 79 + mediawiki/composer.json | 3 +- mediawiki/extensions/.gitignore | 3 + .../assets/regulatory_wiki_icon_medical.svg | 37 + mediawiki/skins/.gitignore | 1 + mediawiki/skins/Cavendish/.gitignore | 168 ++ mediawiki/skins/Cavendish/.gitreview | 7 + mediawiki/skins/Cavendish/COPYING | 339 +++ .../skins/Cavendish/CavendishTemplate.php | 542 +++++ mediawiki/skins/Cavendish/Gruntfile.js | 20 + mediawiki/skins/Cavendish/README.md | 22 + mediawiki/skins/Cavendish/composer.json | 16 + mediawiki/skins/Cavendish/i18n/en.json | 13 + .../skins/Cavendish/resources/cavendish.css | 2127 +++++++++++++++++ .../skins/Cavendish/resources/colors/blue.css | 79 + .../Cavendish/resources/colors/brown.css | 91 + .../Cavendish/resources/colors/green.css | 80 + .../skins/Cavendish/resources/dynamic.css | 6 + .../Cavendish/resources/extensions/babel.css | 134 ++ .../resources/extensions/ext.cite.style.css | 24 + .../extensions/ext.echo.styles.badge.css | 12 + .../extensions/ext.flaggedRevs.basic.css | 10 + .../extensions/ext.inputBox.styles.css | 4 + .../extensions/ext.liquidThreads.css | 25 + .../resources/extensions/ext.openid.plain.css | 17 + .../extensions/ext.pageforms.main.css | 37 + .../resources/extensions/ext.pygments.css | 11 + .../extensions/ext.semanticdrilldown.main.css | 4 + .../resources/extensions/ext.smw.style.css | 69 + .../resources/extensions/extensions.css | 107 + .../extensions/jquery.wikiEditor.css | 12 + .../skins/Cavendish/resources/header.css | 29 + .../Cavendish/resources/images/audio.png | Bin 0 -> 1464 bytes .../Cavendish/resources/images/body_back.gif | Bin 0 -> 526 bytes .../Cavendish/resources/images/bullet.gif | Bin 0 -> 50 bytes .../Cavendish/resources/images/document.png | Bin 0 -> 1130 bytes .../Cavendish/resources/images/envelope.png | Bin 0 -> 1242 bytes .../Cavendish/resources/images/external.png | Bin 0 -> 1428 bytes .../Cavendish/resources/images/folder.png | Bin 0 -> 1213 bytes .../Cavendish/resources/images/headbg.jpg | Bin 0 -> 7881 bytes .../resources/images/header_logo.gif | Bin 0 -> 5162 bytes .../resources/images/key-point_bl.gif | Bin 0 -> 102 bytes .../resources/images/key-point_tl.gif | Bin 0 -> 103 bytes .../Cavendish/resources/images/locked.png | Bin 0 -> 1261 bytes .../resources/images/magnify-clip.png | Bin 0 -> 237 bytes .../Cavendish/resources/images/minus.png | Bin 0 -> 1209 bytes .../Cavendish/resources/images/newspaper.png | Bin 0 -> 1170 bytes .../skins/Cavendish/resources/images/plus.png | Bin 0 -> 1241 bytes .../Cavendish/resources/images/required.gif | Bin 0 -> 47 bytes .../resources/images/speech-bubble-left-4.png | Bin 0 -> 1323 bytes .../resources/images/subsite_back.gif | Bin 0 -> 791 bytes .../resources/images/subsite_back.png | Bin 0 -> 248 bytes .../resources/images/subsite_mozilla-org.gif | Bin 0 -> 2098 bytes .../Cavendish/resources/images/top-left.png | Bin 0 -> 281 bytes .../Cavendish/resources/images/top-mid.png | Bin 0 -> 163 bytes .../Cavendish/resources/images/top-right.png | Bin 0 -> 266 bytes .../skins/Cavendish/resources/images/user.gif | Bin 0 -> 932 bytes .../Cavendish/resources/images/video.png | Bin 0 -> 1200 bytes .../resources/images/wiki_header_logo.gif | Bin 0 -> 4974 bytes .../resources/mediawiki/action.edit.css | 10 + .../mediawiki/action.history.styles.css | 36 + .../mediawiki/action.view.filepage.css | 28 + .../mediawiki/action.view.redirectPage.css | 4 + .../resources/mediawiki/diff.styles.css | 31 + .../mediawiki/page.gallery.styles.css | 33 + .../special.changeslist.enhanced.css | 19 + .../resources/mediawiki/special.version.css | 37 + .../Cavendish/resources/mediawiki/toc.css | 56 + mediawiki/skins/Cavendish/resources/print.css | 76 + mediawiki/skins/Cavendish/skin.json | 213 ++ package.json | 5 +- scripts/deploy.ps1 | 153 ++ scripts/templates/Cat_Clinical.wiki | 11 + scripts/templates/Cat_IVD.wiki | 22 + scripts/templates/Cat_Labelling.wiki | 11 + scripts/templates/Cat_MedicalDevices.wiki | 21 + scripts/templates/Cat_PostMarket.wiki | 11 + scripts/templates/DocumentIndex.wiki | 70 + scripts/templates/IVDR_MainPage.wiki | 45 + scripts/templates/MainPage.wiki | 44 + scripts/templates/Properties.wiki | 1 + scripts/templates/Ref_IVDR_PMPF.wiki | 34 + scripts/templates/Ref_IVDR_PerfEval.wiki | 36 + scripts/templates/Ref_IVDR_UDI.wiki | 39 + scripts/templates/Ref_MDR_PostMarket.wiki | 34 + scripts/templates/Ref_MDR_UDI.wiki | 38 + scripts/templates/Reference.wiki | 40 + scripts/templates/RegDocument.wiki | 88 + scripts/templates/Sidebar.wiki | 9 + scripts/templates/TestPage_MDR.wiki | 49 + 95 files changed, 5617 insertions(+), 3 deletions(-) create mode 100644 .deploy.example.env create mode 100644 .forgejo/workflows/deploy.yml create mode 100644 CLAUDE.md create mode 100644 mediawiki/LocalSettings.production.example.php create mode 100644 mediawiki/resources/assets/regulatory_wiki_icon_medical.svg create mode 100644 mediawiki/skins/Cavendish/.gitignore create mode 100644 mediawiki/skins/Cavendish/.gitreview create mode 100644 mediawiki/skins/Cavendish/COPYING create mode 100644 mediawiki/skins/Cavendish/CavendishTemplate.php create mode 100644 mediawiki/skins/Cavendish/Gruntfile.js create mode 100644 mediawiki/skins/Cavendish/README.md create mode 100644 mediawiki/skins/Cavendish/composer.json create mode 100644 mediawiki/skins/Cavendish/i18n/en.json create mode 100644 mediawiki/skins/Cavendish/resources/cavendish.css create mode 100644 mediawiki/skins/Cavendish/resources/colors/blue.css create mode 100644 mediawiki/skins/Cavendish/resources/colors/brown.css create mode 100644 mediawiki/skins/Cavendish/resources/colors/green.css create mode 100644 mediawiki/skins/Cavendish/resources/dynamic.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/babel.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.cite.style.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.echo.styles.badge.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.flaggedRevs.basic.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.inputBox.styles.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.liquidThreads.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.openid.plain.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.pageforms.main.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.pygments.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.semanticdrilldown.main.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/ext.smw.style.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/extensions.css create mode 100644 mediawiki/skins/Cavendish/resources/extensions/jquery.wikiEditor.css create mode 100644 mediawiki/skins/Cavendish/resources/header.css create mode 100644 mediawiki/skins/Cavendish/resources/images/audio.png create mode 100644 mediawiki/skins/Cavendish/resources/images/body_back.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/bullet.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/document.png create mode 100644 mediawiki/skins/Cavendish/resources/images/envelope.png create mode 100644 mediawiki/skins/Cavendish/resources/images/external.png create mode 100644 mediawiki/skins/Cavendish/resources/images/folder.png create mode 100644 mediawiki/skins/Cavendish/resources/images/headbg.jpg create mode 100644 mediawiki/skins/Cavendish/resources/images/header_logo.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/key-point_bl.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/key-point_tl.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/locked.png create mode 100644 mediawiki/skins/Cavendish/resources/images/magnify-clip.png create mode 100644 mediawiki/skins/Cavendish/resources/images/minus.png create mode 100644 mediawiki/skins/Cavendish/resources/images/newspaper.png create mode 100644 mediawiki/skins/Cavendish/resources/images/plus.png create mode 100644 mediawiki/skins/Cavendish/resources/images/required.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/speech-bubble-left-4.png create mode 100644 mediawiki/skins/Cavendish/resources/images/subsite_back.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/subsite_back.png create mode 100644 mediawiki/skins/Cavendish/resources/images/subsite_mozilla-org.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/top-left.png create mode 100644 mediawiki/skins/Cavendish/resources/images/top-mid.png create mode 100644 mediawiki/skins/Cavendish/resources/images/top-right.png create mode 100644 mediawiki/skins/Cavendish/resources/images/user.gif create mode 100644 mediawiki/skins/Cavendish/resources/images/video.png create mode 100644 mediawiki/skins/Cavendish/resources/images/wiki_header_logo.gif create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/action.edit.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/action.history.styles.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/action.view.filepage.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/action.view.redirectPage.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/diff.styles.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/page.gallery.styles.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/special.changeslist.enhanced.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/special.version.css create mode 100644 mediawiki/skins/Cavendish/resources/mediawiki/toc.css create mode 100644 mediawiki/skins/Cavendish/resources/print.css create mode 100644 mediawiki/skins/Cavendish/skin.json create mode 100644 scripts/deploy.ps1 create mode 100644 scripts/templates/Cat_Clinical.wiki create mode 100644 scripts/templates/Cat_IVD.wiki create mode 100644 scripts/templates/Cat_Labelling.wiki create mode 100644 scripts/templates/Cat_MedicalDevices.wiki create mode 100644 scripts/templates/Cat_PostMarket.wiki create mode 100644 scripts/templates/DocumentIndex.wiki create mode 100644 scripts/templates/IVDR_MainPage.wiki create mode 100644 scripts/templates/MainPage.wiki create mode 100644 scripts/templates/Properties.wiki create mode 100644 scripts/templates/Ref_IVDR_PMPF.wiki create mode 100644 scripts/templates/Ref_IVDR_PerfEval.wiki create mode 100644 scripts/templates/Ref_IVDR_UDI.wiki create mode 100644 scripts/templates/Ref_MDR_PostMarket.wiki create mode 100644 scripts/templates/Ref_MDR_UDI.wiki create mode 100644 scripts/templates/Reference.wiki create mode 100644 scripts/templates/RegDocument.wiki create mode 100644 scripts/templates/Sidebar.wiki create mode 100644 scripts/templates/TestPage_MDR.wiki diff --git a/.deploy.example.env b/.deploy.example.env new file mode 100644 index 0000000..4194ff2 --- /dev/null +++ b/.deploy.example.env @@ -0,0 +1,13 @@ +# Deployment-Konfiguration für GPLX +# Kopiere diese Datei als .deploy.env und fülle deine Werte ein. +# .deploy.env wird NICHT ins Git-Repository übernommen. + +# SSH-Verbindung +DEPLOY_HOST=deine-subdomain.bitpalast.de +DEPLOY_USER=dein-ssh-user + +# Absoluter Pfad zu mediawiki/ auf dem Server +DEPLOY_MW_PATH=/var/www/html/gplx/mediawiki + +# Absoluter Pfad zum Projektverzeichnis (eine Ebene über mediawiki/) +DEPLOY_PROJECT_PATH=/var/www/html/gplx diff --git a/.forgejo/workflows/deploy.yml b/.forgejo/workflows/deploy.yml new file mode 100644 index 0000000..88ef3bb --- /dev/null +++ b/.forgejo/workflows/deploy.yml @@ -0,0 +1,38 @@ +name: Deploy to Bitpalast + +# Triggert nur wenn relevante Dateien geändert werden +on: + push: + branches: + - main + paths: + - "mediawiki/skins/Cavendish/**" + - "scripts/templates/**" + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: SSH-Key einrichten + run: | + mkdir -p ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + ssh-keyscan -H "${{ secrets.DEPLOY_HOST }}" >> ~/.ssh/known_hosts + + - name: Cavendish-Skin deployen + run: | + rsync -az --delete \ + mediawiki/skins/Cavendish/ \ + "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:${{ secrets.DEPLOY_MW_PATH }}/skins/Cavendish/" + + - name: Wiki-Templates deployen + if: ${{ secrets.DEPLOY_PROJECT_PATH != '' }} + run: | + rsync -az \ + scripts/templates/ \ + "${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:${{ secrets.DEPLOY_PROJECT_PATH }}/scripts/templates/" diff --git a/.gitignore b/.gitignore index 6762bed..d522526 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ mediawiki/images/ mediawiki/vendor/ mediawiki/LocalSettings.php .lighthouseci/ +.deploy.env diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..99bc494 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,82 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project overview + +GPLX is a local-first MediaWiki 1.43 installation on Windows, purpose-built for an accessibility-focused content workflow. The Node/npm layer wraps PowerShell scripts for setup and tooling; the actual MediaWiki application lives in `./mediawiki/`. + +## Commands + +| Task | Command | +|---|---| +| Clone MediaWiki core | `npm run mw:init` | +| Install PHP (Composer) deps | `npm run mw:deps` | +| First-time setup (both above) | `npm run mw:setup` | +| Start dev server (PHP built-in, port 8080) | `npm run dev` | +| Run Pa11y accessibility checks | `npm run a11y:pa11y` | +| Run Lighthouse accessibility checks | `npm run a11y:lighthouse` | +| Run all accessibility checks | `npm run a11y:all` | + +**Prerequisites:** Node.js 20+, PHP 8.1+ (XAMPP or WampServer, or PHP in PATH). + +After first setup, open `http://127.0.0.1:8080/mw-config/index.php` to finish the MediaWiki installer. + +## Architecture + +``` +gplx/ +├── mediawiki/ # MediaWiki 1.43 core (cloned from Gerrit, branch REL1_43) +│ ├── LocalSettings.php # All site config and custom hooks live here +│ ├── extensions/ # 35 bundled extensions + SemanticMediaWiki 6.0.1 via Composer +│ └── skins/ # Cavendish (default), Vector, MonoBook, Timeless, MinervaNeue +├── scripts/ # PowerShell scripts (dev.ps1, mw-init.ps1, mw-deps.ps1) +│ └── templates/ # Wiki page source files (.wiki) — pushed via maintenance/run.php edit +├── tests/accessibility/ # Pa11y (pa11y.config.json) + Lighthouse (lighthouserc.json) configs +├── docs/ # Project docs (ACCESSIBILITY_WORKFLOW.md, INSTALLATION_WINDOWS.md) +└── package.json # npm entry point — all commands delegate to scripts/ +``` + +### Key architectural decisions + +**LocalSettings.php is the customization layer.** All MediaWiki configuration, hook registrations, and inline CSS lives in `mediawiki/LocalSettings.php`. There is no separate plugin or theme source tree — customizations are PHP hooks injected at startup. + +**Approval workflow via ApprovedRevs.** Pages require explicit admin/reviewer approval before public visibility. A `BeforePageDisplay` hook enforces this: unapproved pages are hidden from non-creators and from the public; creators see a pending-review notice. Roles: `sysop`, `bureaucrat`, `reviewer` (the last is assignable by bureaucrats). + +**Anonymous editing is disabled.** `$wgGroupPermissions["*"]["edit"] = false` — only registered users can edit. + +**Default skin is Cavendish.** Loaded with `wfLoadSkin('Cavendish')`. + +**PHP built-in server for local dev.** `dev.ps1` uses `php -S 127.0.0.1:8080 -t ./mediawiki`. It probes XAMPP/WampServer paths if `php` is not in PATH. + +**composer.phar lives at the project root**, not inside `mediawiki/`. The `mw-deps.ps1` script downloads it on first run if absent. + +**Semantic MediaWiki (SMW) 6.0.1 is installed.** Enabled via `enableSemantics('127.0.0.1:8080')` in `LocalSettings.php`. SMW adds 39 database tables (`smw_*`) and enables structured property annotations and `{{#ask:}}` queries across all wiki pages. + +**Template:RegDocument annotates SMW properties.** Every page using `{{RegDocument}}` writes nine structured properties (Scope, Status, Area of validity, etc.) via `{{#set:}}`. These power the automatic queries on `Document_Index` and the category pages. + +**Wiki page sources live in `scripts/templates/`.** All template and infrastructure page content is maintained as `.wiki` files and pushed via `php mediawiki/maintenance/run.php edit`. To update a wiki page, edit the `.wiki` file and re-run the push command: + +```powershell +Get-Content scripts/templates/.wiki -Raw | D:\xampp\php\php.exe mediawiki/maintenance/run.php edit --user "Gxplex admin" --summary "..." "" +``` + +**Navigation is two-layered.** The sidebar (MediaWiki:Sidebar) links to `Document_Index` and `Special:Ask`. Category pages (e.g. `Category:Medical Devices`) embed `{{#ask:}}` queries showing all pages in that category with their metadata. + +## SMW maintenance commands + +| Task | Command | +|---|---| +| Initial SMW DB setup | `php mediawiki/extensions/SemanticMediaWiki/maintenance/setupStore.php --nochecks` | +| Rebuild SMW data index | `php mediawiki/extensions/SemanticMediaWiki/maintenance/rebuildData.php` | +| Rebuild property statistics | `php mediawiki/extensions/SemanticMediaWiki/maintenance/rebuildPropertyStatistics.php` | + +Run `rebuildData.php` after bulk-importing pages via the maintenance script, or after updating a template that contains `{{#set:}}`. + +## Accessibility baseline + +- Required: WCAG 2.1 AA +- Stretch target: WCAG 2.1 AAA where practical +- Checks must pass after any template, style, or interaction change: `npm run a11y:all` +- Pa11y targets `http://127.0.0.1:8080/` and `/index.php/Main_Page` (WCAG2AA profile) +- Lighthouse asserts minimum accessibility score of 0.9 (warns, does not fail hard) diff --git a/docs/INSTALLATION_WINDOWS.md b/docs/INSTALLATION_WINDOWS.md index 22a7ac6..4eab5b7 100644 --- a/docs/INSTALLATION_WINDOWS.md +++ b/docs/INSTALLATION_WINDOWS.md @@ -35,7 +35,59 @@ Open http://127.0.0.1:8080 and complete the MediaWiki web installer. After installer completion, place generated LocalSettings.php in mediawiki/. -## 6. Run accessibility checks +## 6. Install Semantic MediaWiki + +```powershell +php .\composer.phar --working-dir=mediawiki require mediawiki/semantic-media-wiki "~6.0" --prefer-dist --optimize-autoloader +``` + +Add to `mediawiki/LocalSettings.php` (after `wfLoadSkin`): + +```php +wfLoadExtension( 'SemanticMediaWiki' ); +enableSemantics( '127.0.0.1:8080' ); +``` + +Run the SMW database setup: + +```powershell +php mediawiki/extensions/SemanticMediaWiki/maintenance/setupStore.php --nochecks +``` + +## 7. Push wiki infrastructure pages + +Templates, the sidebar, the document index, and category pages are maintained as `.wiki` files in `scripts/templates/`. Push them once after a fresh install: + +```powershell +$php = "D:\xampp\php\php.exe" +$mw = "mediawiki\maintenance\run.php" +$usr = "Gxplex admin" # replace with your admin username + +$pages = @{ + "Template:RegDocument" = "scripts\templates\RegDocument.wiki" + "Template:Reference" = "scripts\templates\Reference.wiki" + "MediaWiki:Sidebar" = "scripts\templates\Sidebar.wiki" + "Document Index" = "scripts\templates\DocumentIndex.wiki" + "Category:Medical Devices" = "scripts\templates\Cat_MedicalDevices.wiki" + "Category:In Vitro Diagnostics" = "scripts\templates\Cat_IVD.wiki" + "Category:Clinical" = "scripts\templates\Cat_Clinical.wiki" + "Category:Post-Market Surveillance" = "scripts\templates\Cat_PostMarket.wiki" + "Category:Labelling" = "scripts\templates\Cat_Labelling.wiki" + "Main_Page" = "scripts\templates\MainPage.wiki" +} + +foreach ($title in $pages.Keys) { + Get-Content $pages[$title] -Raw | & $php $mw edit --user $usr --summary "Initial setup" $title +} +``` + +Then rebuild the SMW data index: + +```powershell +php mediawiki/extensions/SemanticMediaWiki/maintenance/rebuildData.php +``` + +## 8. Run accessibility checks ```bash npm run a11y:all diff --git a/mediawiki/LocalSettings.production.example.php b/mediawiki/LocalSettings.production.example.php new file mode 100644 index 0000000..6c8135b --- /dev/null +++ b/mediawiki/LocalSettings.production.example.php @@ -0,0 +1,79 @@ + "$wgResourceBasePath/resources/assets/regulatory_wiki_icon_medical.svg", + 'icon' => "$wgResourceBasePath/resources/assets/regulatory_wiki_icon_medical.svg", +]; + +# E-Mail (Zugangsdaten deines Mailservers eintragen) +$wgEnableEmail = true; +$wgEnableUserEmail = true; +$wgEmergencyContact = "admin@deine-domain.de"; +$wgPasswordSender = "wiki@deine-domain.de"; +$wgEnotifUserTalk = false; +$wgEnotifWatchlist = false; +$wgEmailAuthentication = true; + +# Datenbankverbindung (Zugangsdaten von Bitpalast-Kundencenter) +$wgDBtype = "mysql"; +$wgDBserver = "localhost"; +$wgDBname = "DATENBANKNAME"; +$wgDBuser = "DATENBANKBENUTZER"; +$wgDBpassword = "DATENBANKPASSWORT"; +$wgDBprefix = ""; +$wgDBssl = false; + +# Cache +$wgMainCacheType = CACHE_NONE; +$wgMemCachedServers = []; + +# Uploads +$wgEnableUploads = true; + +$wgUseInstantCommons = false; +$wgPingback = false; +$wgLanguageCode = "en"; +$wgLocaltimezone = "Europe/Berlin"; + +# Neuen Secret Key generieren: php maintenance/run.php generateSecretKey +$wgSecretKey = "NEUEN_KEY_GENERIEREN"; +$wgAuthenticationTokenVersion = "1"; +$wgUpgradeKey = "NEUEN_UPGRADE_KEY_GENERIEREN"; + +# Rechte +$wgRightsPage = ""; +$wgRightsUrl = "https://creativecommons.org/licenses/by/4.0/"; +$wgRightsText = "Creative Commons Attribution"; +$wgRightsIcon = "$wgResourceBasePath/resources/assets/licenses/cc-by.png"; + +$wgDiff3 = ""; + +# Skin +$wgDefaultSkin = "Cavendish"; +wfLoadSkin( 'Cavendish' ); + +# Fehlerdetails in Produktion deaktivieren +$wgShowExceptionDetails = false; + +# === CUSTOM CONFIGURATION === +# Ab hier: identisch mit lokaler LocalSettings.php (Hooks, Permissions, SMW etc.) +# Den Abschnitt ab "// === Approved Revisions Configuration ===" aus der +# lokalen LocalSettings.php hierher kopieren. +# +# Wichtig: enableSemantics() muss die Produktions-URL verwenden: +# enableSemantics( 'DEINE-SUBDOMAIN.bitpalast.de' ); diff --git a/mediawiki/composer.json b/mediawiki/composer.json index a0da808..488820a 100644 --- a/mediawiki/composer.json +++ b/mediawiki/composer.json @@ -85,7 +85,8 @@ "wikimedia/wait-condition-loop": "2.0.2", "wikimedia/wrappedstring": "4.0.1", "wikimedia/xmp-reader": "0.10.2", - "zordius/lightncandy": "1.2.6" + "zordius/lightncandy": "1.2.6", + "mediawiki/semantic-media-wiki": "~6.0" }, "require-dev": { "composer/spdx-licenses": "1.5.8", diff --git a/mediawiki/extensions/.gitignore b/mediawiki/extensions/.gitignore index df80c2a..3d0d6d7 100644 --- a/mediawiki/extensions/.gitignore +++ b/mediawiki/extensions/.gitignore @@ -1,3 +1,6 @@ !README !.gitignore !/.vsls.json + +# Composer-managed extensions (installed via mediawiki/composer.json) +SemanticMediaWiki/ diff --git a/mediawiki/resources/assets/regulatory_wiki_icon_medical.svg b/mediawiki/resources/assets/regulatory_wiki_icon_medical.svg new file mode 100644 index 0000000..1c22e9e --- /dev/null +++ b/mediawiki/resources/assets/regulatory_wiki_icon_medical.svg @@ -0,0 +1,37 @@ + + Regulatory Wiki Icon – Medical + Square icon with a structured regulatory node network on a clinical teal-green background. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mediawiki/skins/.gitignore b/mediawiki/skins/.gitignore index 8d09425..3d05c6b 100644 --- a/mediawiki/skins/.gitignore +++ b/mediawiki/skins/.gitignore @@ -2,3 +2,4 @@ !/.gitignore !/.vsls.json !/README +!/Cavendish diff --git a/mediawiki/skins/Cavendish/.gitignore b/mediawiki/skins/Cavendish/.gitignore new file mode 100644 index 0000000..f37e6d7 --- /dev/null +++ b/mediawiki/skins/Cavendish/.gitignore @@ -0,0 +1,168 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + +/node_modules +/vendor +/composer.lock +/.eslintcache + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/mediawiki/skins/Cavendish/.gitreview b/mediawiki/skins/Cavendish/.gitreview new file mode 100644 index 0000000..8ceb478 --- /dev/null +++ b/mediawiki/skins/Cavendish/.gitreview @@ -0,0 +1,7 @@ +[gerrit] +host=gerrit.wikimedia.org +port=29418 +project=mediawiki/skins/Cavendish.git +track=1 +defaultrebase=0 +defaultbranch=master diff --git a/mediawiki/skins/Cavendish/COPYING b/mediawiki/skins/Cavendish/COPYING new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/mediawiki/skins/Cavendish/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/mediawiki/skins/Cavendish/CavendishTemplate.php b/mediawiki/skins/Cavendish/CavendishTemplate.php new file mode 100644 index 0000000..843e1f8 --- /dev/null +++ b/mediawiki/skins/Cavendish/CavendishTemplate.php @@ -0,0 +1,542 @@ +getBox( 'tb', + $this->data['sidebar']['TOOLBOX'], + 'toolbox' + ); + } + + /** + * Generate the languages box + * + * @return string html + */ + protected function getLanguageBox() { + $html = ''; + + if ( $this->data['language_urls'] !== false ) { + $html .= $this->getBox( 'lang', $this->data['language_urls'], 'otherlanguages' ); + } + + return $html; + } + + /** + * Helper function for getPortlet + * + * Merge all provided css classes into a single array + * Account for possible different input methods matching what Html::element stuff takes + * + * @param string|array $class base portlet/body class + * @param string|array $extraClasses any extra classes to also include + * + * @return array all classes to apply + */ + protected function mergeClasses( $class, $extraClasses ) { + if ( !is_array( $class ) ) { + $class = [ $class ]; + } + if ( !is_array( $extraClasses ) ) { + $extraClasses = [ $extraClasses ]; + } + + return array_merge( $class, $extraClasses ); + } + + /** + * Generates a block of navigation links with a header + * + * @param string $name + * @param array|string $content array of links for use with makeListItem, or a block of text + * @param null|string|array $msg + * @param array $setOptions random crap to rename/do/whatever + * + * @return string html + */ + protected function getPortlet( $name, $content, $msg = null, $setOptions = [] ) { + // random stuff to override with any provided options + $options = array_merge( [ + // handle role=search a little differently + 'role' => 'navigation', + 'search-input-id' => 'searchInput', + // extra classes/ids + 'id' => 'p-' . $name, + 'class' => 'mw-portlet', + 'extra-classes' => '', + 'body-id' => null, + 'body-class' => 'mw-portlet-body', + 'body-extra-classes' => '', + // wrapper for individual list items + 'text-wrapper' => [ 'tag' => 'span' ], + // old toolbox hook support (use: [ 'SkinTemplateToolboxEnd' => [ &$skin, true ] ]) + 'hooks' => '', + // option to stick arbitrary stuff at the beginning of the ul + 'list-prepend' => '' + ], $setOptions ); + + // Handle the different $msg possibilities + if ( $msg === null ) { + $msg = $name; + $msgParams = []; + } elseif ( is_array( $msg ) ) { + $msgString = array_shift( $msg ); + $msgParams = $msg; + $msg = $msgString; + } else { + $msgParams = []; + } + $msgObj = $this->getMsg( $msg, $msgParams ); + if ( $msgObj->exists() ) { + $msgString = $msgObj->parse(); + } else { + $msgString = htmlspecialchars( $msg ); + } + + $labelId = Sanitizer::escapeIdForAttribute( "p-$name-label" ); + + if ( is_array( $content ) ) { + $contentText = Html::openElement( 'ul', + [ 'lang' => $this->get( 'userlang' ), 'dir' => $this->get( 'dir' ) ] + ); + $contentText .= $options['list-prepend']; + foreach ( $content as $key => $item ) { + if ( is_array( $options['text-wrapper'] ) ) { + $contentText .= $this->makeListItem( + $key, + $item, + [ 'text-wrapper' => $options['text-wrapper'] ] + ); + } else { + $contentText .= $this->makeListItem( + $key, + $item + ); + } + } + + $contentText .= Html::closeElement( 'ul' ); + } else { + $contentText = $content; + } + + // Special handling for role=search + $divOptions = [ + 'role' => $options['role'], + 'class' => $this->mergeClasses( $options['class'], $options['extra-classes'] ), + 'id' => Sanitizer::escapeIdForAttribute( $options['id'] ), + 'title' => Linker::titleAttrib( $options['id'] ) + ]; + if ( $options['role'] !== 'search' ) { + $divOptions['aria-labelledby'] = $labelId; + } + $labelOptions = [ + 'id' => $labelId, + 'lang' => $this->get( 'userlang' ), + 'dir' => $this->get( 'dir' ) + ]; + if ( $options['role'] == 'search' ) { + $msgString = Html::rawElement( 'label', [ 'for' => $options['search-input-id'] ], $msgString ); + } + + $bodyDivOptions = [ + 'class' => $this->mergeClasses( $options['body-class'], $options['body-extra-classes'] ) + ]; + if ( is_string( $options['body-id'] ) ) { + $bodyDivOptions['id'] = $options['body-id']; + } + + $html = Html::rawElement( 'div', $divOptions, + Html::rawElement( 'h3', $labelOptions, $msgString ) . + Html::rawElement( 'div', $bodyDivOptions, + $contentText . + $this->getSkin()->getAfterPortlet( $name ) + ) + ); + + return $html; + } + + /** + * Generate a sidebar box using getPortlet(); prefill some common stuff + * + * @param string $name + * @param array|string $contents + * @param-taint $contents escapes_htmlnoent + * @param null|string|array|bool $msg + * @param array $setOptions + * + * @return string html + */ + protected function getBox( $name, $contents, $msg = null, $setOptions = [] ) { + $options = array_merge( [ + 'class' => 'portlet', + 'body-class' => 'pBody', + 'text-wrapper' => '' + ], $setOptions ); + + // Do some special stuff for the personal menu + if ( $name == 'personal' ) { + $prependiture = ''; + + // Extension:UniversalLanguageSelector order - T121793 + if ( array_key_exists( 'uls', $contents ) ) { + $prependiture .= $this->makeListItem( 'uls', $contents['uls'] ); + unset( $contents['uls'] ); + } + if ( !$this->getSkin()->getUser()->isLoggedIn() && + MediaWikiServices::getInstance()->getGroupPermissionsLookup() + ->groupHasPermission( '*', 'edit' ) + ) { + $prependiture .= Html::rawElement( + 'li', + [ 'id' => 'pt-anonuserpage' ], + $this->getMsg( 'notloggedin' )->escaped() + ); + } + $options['list-prepend'] = $prependiture; + } + + return $this->getPortlet( $name, $contents, $msg, $options ); + } + + /** + * Generate the search, using config options for buttons (?) + * + * @return string html + */ + protected function getSearchBox() { + $html = ''; + + $optionButtons = "\u{00A0} " . $this->makeSearchButton( + 'fulltext', + [ + 'id' => 'mw-searchButton', + 'class' => 'searchButton', + 'value' => $this->getMsg( 'searchbutton' )->text() + ] + ); + $searchInputId = 'searchInput'; + $searchForm = Html::rawElement( 'form', [ + 'action' => $this->get( 'wgScript' ), + 'id' => 'searchform' + ], + Html::hidden( 'title', $this->get( 'searchtitle' ) ) . + $this->makeSearchInput( [ 'id' => $searchInputId ] ) . + $this->makeSearchButton( 'go', [ + 'id' => 'searchGoButton', + 'class' => 'searchButton', + 'value' => $this->getMsg( 'searcharticle' )->text() + ] ) . + $optionButtons + ); + + $html .= $this->getBox( 'search', $searchForm, null, [ + 'search-input-id' => $searchInputId, + 'role' => 'search', + 'body-id' => 'searchBody' + ] ); + + return $html; + } + + /** + * Generate the class for the globalWrapper element + * @return string + */ + private function getGlobalWrapperAttributes( Config $config, string $action ): string { + $siteWidth = $config->get( 'CavendishSiteWidth' ); + $qrCodeMode = $config->get( 'CavendishQRCodeMode' ); + $sidebarSearchbox = $config->get( 'CavendishSidebarSearchbox' ); + + $classes = [ + htmlspecialchars( $action, ENT_QUOTES ) + ]; + if ( $qrCodeMode === 'print' ) { + $classes[] = 'cavendish-qr-code-mode-print'; + } elseif ( $qrCodeMode === 'all' ) { + $classes[] = 'cavendish-qr-code-mode-all'; + } + + if ( $sidebarSearchbox ) { + $classes[] = 'cavendish-sidebar-searchbox'; + } + return Html::expandAttributes( [ + 'id' => 'globalWrapper', + 'class' => $classes, + 'style' => $siteWidth !== false ? 'width: ' . $sideWidth . 'px;' : null, + ] ); + } + + /** + * Template filter callback for Cavendish 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. + */ + function execute() { + $this->skin = $skin = $this->data['skin']; + $action = $skin->getRequest()->getText( 'action', 'view' ); + $config = $skin->getConfig(); + + $this->data['pageLanguage'] = + $skin->getTitle()->getPageLanguage()->getHtmlCode(); + + // starts here +?> +
+
getGlobalWrapperAttributes( $config, $action ) ?>> +
+
msg( 'personaltools' ) ?>
+
+ html( 'userlangattributes' ) ?>> + getPersonalTools(); + foreach ( $personalTools as $key => $item ) { + ?> +
  • " class="active top-nav-element"> +   + makeLink( $key, $item['links'][0], [ 'link-class' => 'top-nav-mid' ] ); + } else { + // Stupid hack for anonuserpage, which is the "Not logged in" text, which is indeed + // just a snippet of text, not a link; but we still need the class there to have the area + // display properly + echo '

    ' . $this->makeLink( $key, $item['links'][0] ) . '

    '; + } + ?> +   +
  • + + +
    +
    + +
    +
    + +
    +
    +
    +
    + + data['sitenotice'] ) { ?>
    html( 'sitenotice' ) ?>
    + getIndicators() ?> +

    html( 'title' ) ?>

    +
    +

    msg( 'tagline' ) ?>

    +
    html( 'userlangattributes' ) ?>>html( 'subtitle' ) ?>
    + data['undelete'] ) { ?>
    html( 'undelete' ) ?>
    + data['newtalk'] ) { ?>
    html( 'newtalk' ) ?>
    + + + html( 'bodytext' ); + if ( $this->data['catlinks'] ) { + $this->html( 'catlinks' ); + } + ?> + + data['dataAfterContent'] ) { + $this->html( 'dataAfterContent' ); + } + ?> +
    +
    +
    +
    +
    + + + $content ) { + if ( $content === false ) { + continue; + } + + // Numeric strings gets an integer when set as key, cast back - T73639 + $boxName = (string)$boxName; + + if ( $boxName == 'SEARCH' ) { + // ignore. + } elseif ( $boxName == 'TOOLBOX' ) { + $html .= $this->getToolboxBox( $content ); + } elseif ( $boxName == 'LANGUAGES' ) { + $languagesHTML = $this->getLanguageBox( $content ); + } else { + $html .= $this->getBox( + $boxName, + $content, + null, + [ 'extra-classes' => 'generated-sidebar' ] + ); + } + } + + // Output language portal last given it can be long + // on articles which support multiple languages (T254546) + return $html . $languagesHTML; + } +} // end of class diff --git a/mediawiki/skins/Cavendish/Gruntfile.js b/mediawiki/skins/Cavendish/Gruntfile.js new file mode 100644 index 0000000..9c56558 --- /dev/null +++ b/mediawiki/skins/Cavendish/Gruntfile.js @@ -0,0 +1,20 @@ +/*jshint node:true */ +module.exports = function ( grunt ) { + grunt.loadNpmTasks( 'grunt-banana-checker' ); + grunt.loadNpmTasks( 'grunt-jsonlint' ); + + grunt.initConfig( { + banana: { + all: 'i18n/' + }, + jsonlint: { + all: [ + '**/*.json', + '!node_modules/**' + ] + } + } ); + + grunt.registerTask( 'test', [ 'jsonlint', 'banana' ] ); + grunt.registerTask( 'default', 'test' ); +}; diff --git a/mediawiki/skins/Cavendish/README.md b/mediawiki/skins/Cavendish/README.md new file mode 100644 index 0000000..15cd5cb --- /dev/null +++ b/mediawiki/skins/Cavendish/README.md @@ -0,0 +1,22 @@ +# Cavendish +Cavendish MediaWiki skin version 2.6.0 + +## Compatibility +This version of the skin is compatible with MW 1.35+ + +## Customization +There are different options that can be set in `LocalSettings.php`. + +`$wgLogos['1x-options'] = [ 'width' => 10, 'height' => 20, 'margin' => 10 ]` +* width of the logo as a number in px +* height of the logo as a number in px +* offset on top of the logo + +`$wgCavendishSiteWidth` +fixed width of the content area, if not set it's dynamic (default is false, that means dynamic) + +`$wgCavendishQRCode` +Whether to add QR code to all pages (true) or not (false) + +`$wgCavendishQRUrlAdd` +Used to track campaign for entry through QR Code in analytics software (e.g. Google Analytics, Piwik, ...); default is "?pk_campaign=qr-code" diff --git a/mediawiki/skins/Cavendish/composer.json b/mediawiki/skins/Cavendish/composer.json new file mode 100644 index 0000000..f06f48b --- /dev/null +++ b/mediawiki/skins/Cavendish/composer.json @@ -0,0 +1,16 @@ +{ + "require-dev": { + "mediawiki/minus-x": "1.1.3", + "php-parallel-lint/php-console-highlighter": "1.0.0", + "php-parallel-lint/php-parallel-lint": "1.4.0" + }, + "scripts": { + "test": [ + "parallel-lint . --exclude vendor --exclude node_modules", + "minus-x check ." + ], + "fix": [ + "minus-x fix ." + ] + } +} diff --git a/mediawiki/skins/Cavendish/i18n/en.json b/mediawiki/skins/Cavendish/i18n/en.json new file mode 100644 index 0000000..c79bb48 --- /dev/null +++ b/mediawiki/skins/Cavendish/i18n/en.json @@ -0,0 +1,13 @@ +{ + "@metadata": { + "authors": ["DaSch"] + }, + "cavendish-prefs-talkpage": "[[mw:Skin talk:Cavendish|{{int:talk}}]]", + "cavendish.css": "/* CSS placed here will affect users of the Cavendish skin */", + "cavendish.js": "/* Any JavaScript here will be loaded for users using the Cavendish skin */", + "skinname-cavendish": "Cavendish (Blue)", + "skinname-cavendish-green": "Cavendish (Green)", + "skinname-cavendish-brown": "Cavendish (Brown)", + "cavendish-desc": "Mozilla Cavendish skin. Modified by DaSch for MW 1.19 and WeCoWi.", + "cavendish-skin-info": "Mozilla Cavendish skin
    [https://phabricator.wikimedia.org/maniphest/task/edit/form/43/?tags=mediawiki-skins-Cavendish Report a bug] – Skin version: $1" +} diff --git a/mediawiki/skins/Cavendish/resources/cavendish.css b/mediawiki/skins/Cavendish/resources/cavendish.css new file mode 100644 index 0000000..a9eff5b --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/cavendish.css @@ -0,0 +1,2127 @@ +/* + ** MediaWiki 'Cavendish' style sheet for CSS2-capable browsers. + ** Copyright Mozilla Foundation - http://www.mozilla.org/ + ** License: GPL (http://www.gnu.org/copyleft/gpl.html) + ** + ** Loosely based on the monobook style by Gabriel Wicke + */ + +/* mozilla.org Cavendish Content Styles + * Design by SilverOrange + * Markup Reference classes organized by fantasai + */ + +/* Suggested order: + * display + * list-style + * position + * float + * clear + * width + * height + * margin + * padding + * border + * background + * color + * font + * text-decoration + * text-align + * vertical-align + * white-space + * other text + * content + * + */ + +/* TOC: + Body + Random HTML Styles + Forms + General Structure + Navigation + Quotations + Comments and Other Asides + Emphasis + Computers - General + Code + Examples and Figures + Q and A (FAQ) + Tables + Meta + + Body */ +#column-content, #side { + background: #fff; + line-height: 1.75em; + color: #1a1a1a; +} +#column-content #content { + margin-top: 0; + padding: 1.5rem 2rem; +} + +.deepLevel #column-content { + line-height: 1.4em; +} + +/* Random HTML Styles */ +hr { + height: 1px; + background-color: #aaa; + color: #aaa; + margin: .2em 0 .2em 0; + border: 1px solid #fff; + border-top: 1px solid #ccc; +} +/* General Structure */ +body { + font-family: 'Quicksand', system-ui, -apple-system, sans-serif; + background-color: #f4f6f6; + margin-top: 0; + margin-left: 5%; + margin-right: 5%; + margin-bottom: 20px; + padding-top: 0; + color: #1a1a1a; +} +/* Headings */ +h1, +h2, +h3, +h4, +h5, +h6 { + color: #000; + background: none; + font-weight: normal; + margin-top: 0.5em; + margin-bottom: 0.3em; + padding-top: .5em; + padding-bottom: .17em; + border-bottom: 1px solid #aaa; + overflow: hidden; +} + +h3, +h4 +h5, +h6 { + border-bottom: none; + font-weight: bold; +} + +h1 .editsection, +h2 .editsection, +h3 .editsection, +h4 .editsection, +h5 .editsection, +h6 .editsection, +h1 .mw-editsection, +h2 .mw-editsection, +h3 .mw-editsection, +h4 .mw-editsection, +h5 .mw-editsection, +h6 .mw-editsection { + font-size: 7pt; + font-weight: normal; +} + +.editsection, .mw-editsection { + float: right; + line-height: inherit; +} + +h1 { + font-size: 1.75rem; + font-weight: normal; +} + +#firstHeading { + margin-top: 0.1em; + padding-top: 0.2em; +} + +h2 { + font-size: 1.5rem; + font-weight: normal; +} + +h3 { + font-size: 1.25rem; +} + +h4 { + font-size: 1.1rem; +} + +h5 { + font-size: 1rem; +} + +h6 { + font-size: 0.95rem; + border: 0; +} + +caption { + font-size: 1.3em; + font-weight: bold; + margin-bottom: 2pt; +} + +/* Navigation */ +:link, a { + text-decoration: none; + color: #039; +} + +:visited { + color: #5a3696; + text-decoration: none; +} + +:link :hover, +a:hover { + color: #333; + text-decoration: underline; +} +:link :focus, +a:focus { + color: #333; + text-decoration: underline; +} + +:link :active, +a:active { + color: #7A4100; +} + +a.stub { + color: #723; +} + +a.new, #p-personal a.new { + color: #ba0000; +} + +a.new:visited, +#p-personal a.new:visited { + color: #a55858; +} + +/* Comments and other Asides */ +.note { + color: #666; + font-style: normal; +} + +.remark { + color: #666; +} + +.sidenote { + border: #666; +} + +.key-point:before { + line-height: 0.1; + font-size: 1px; + margin: -15px -15px 0 -15px; + height: 15px; + display: block; + border: none; + /* @embed */ + content: url("images/key-point_tl.gif"); +} + +.key-point { + padding: 15px; + margin-bottom: 1em; +} + +.key-point:after { + display: block; + clear: both; + padding-top: 15px; + line-height: 0.1; + font-size: 1px; + /* @embed */ + content: url("images/key-point_bl.gif"); + margin: -15px; + height: 8px; +} + +.key-point h2, +.key-point h3, +.key-point h4, +.key-point h5 { + border: none; + margin-top: 0; + color: #4c5c5c; +} + +.news dt { + font-weight: normal; + color: #666; +} + +.news dt a { + font-weight: bold; +} + +ul.compact { + margin-left: 0; + padding-left: 20px; +} +/* Emphasis */ +/* Computers - General */ +kbd { + background-color: #fafafa; + border-color: #ccc #ccc #fff; + border-radius: 4px; + border-style: solid solid none; + border-width: 1px 1px medium; + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.2), 0 0 0 1px #fff inset; + color: #444; + font-weight: normal; + padding: 0 6px; + white-space: nowrap; +} + +kbd.command, +code.command { + color: #6b5839; +} +/* Code */ +pre.code { + background: #eeecf6; +} + +code > em, +code > strong, +pre.code > em, +pre.code > strong { + font-style: normal; +} +/* Examples and Figures */ +div.example { + border-color: #554FA0; +} + +div.example:before { + color: #666; +} +/* Q and A (FAQ) */ +ol.faq li a { + text-decoration: none; + border-bottom: 1px dotted #6C98EE; +} + +ol.faq li a:hover { + border-color: #039; +} +/* Tables */ +table { + line-height: 1.6em; +} + +#content table { + border-radius: 10px; +} + +table.data { + border-collapse: collapse; + margin: 0.5em auto; + border: 1px solid; +} + +table.data caption { + margin: 1em auto 0.2em; + font-size: small; + font-style: italic; + text-align: center; +} + +table.data th, +table.data td { + padding: 0.2em; + border: 1px solid #ccc; + vertical-align: baseline; +} + +table.data tbody th:first-child { + text-align: right; +} + +table.data thead th { + background: #e4ecec; + empty-cells: hide; + vertical-align: bottom; +} + +tr.odd { + background: #f5f5f5; +} + +table.wikitable { + margin-top: 0; + margin-bottom: 1em; + background-color: #f9f9f9; + border-collapse: collapse; + empty-cells: show; + border: 1px solid #c8d8d8; + padding: 0; + line-height: 1.7em; + border-radius: 10px; + overflow: hidden; + table-layout: auto; +} + +table.wikitable th { + background-color: #d8eaea; + border: 1px #aaa solid; + padding-top: 0.4em; + padding-bottom: 0.4em; + color: #003f3f; + font-weight: 600; +} + +table.sortable th { + white-space: nowrap; +} + +table.wikitable td { + border: 1px #aaa solid; + padding: 0.2em; +} + +table.wikitable caption { + margin-left: inherit; + margin-right: inherit; + font-weight: bold; +} + +.mw-datatable { + margin-bottom: 1em; +} + +.NavFrame, +.BoxenVerschmelzen { + border-radius: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,0.10); +} +.NavFrame .wikitable { + table-layout: auto; +} + +.BoxenVerschmelzen .NavFrame, +.wikitable .NavFrame { + border-radius: none; + box-shadow: none; +} + +table.infobox { + border-radius: 10px; + overflow: hidden; + box-shadow: 0 1px 4px rgba(0,0,0,0.10); +} +/* Meta */ +address { + color: #666; + text-align: right; +} + +.author { + margin-bottom: 1em; + text-align: left; +} + +/* [[mw:Help:Page status indicators]]; styles copied from MonoBook */ +.mw-indicators { + float: right; + line-height: 1.5em; + font-size: 95%; +} + +.mw-indicator { + display: -moz-inline-block; + display: inline-block; +} + +#globalWrapper { + margin: 0 auto; + font-size: 1rem; +} + +#mBody { + clear: both; + padding: 0; + margin-top: 1.25rem; +} + +#side { + float: left; + width: 15%; + margin-bottom: 1em; + font-size: 0.9rem; +} + +#column-content { + float: right; + width: 83%; + margin-bottom: 1em; +} + +.nomenu #column-content { + float: none; + width: 100%; +} + +.bodyleft { + float: right !important; + width: 75% !important; +} + +#column-content.right { + float: left; + width: 62%; + font-size: 9pt; +} + +#side.right { + float: right; + width: 35%; +} + +/* Sidebar */ +#getcd { + margin: 1em 0 0 45px; +} + +/* accessibility tweaks */ +.skipLink { + position: absolute; + left: -999px; + width: 990px; +} + +hr.hide { + display: none; +} + +/* Header */ +#header { + margin-bottom: 0; + position: relative; + min-height: 72px; + padding: 12px 0; + background: #003535; + border-bottom: 2px solid #002828; + color: #ffffff; +} + +#p-cactions { + position: absolute; + bottom: 0; + right: 0; + margin: 0; + padding: 0 10px 0 0; + overflow: hidden; + z-index: 3; + white-space: nowrap; +} + +#p-cactions h5 { + display: none; +} + +#p-cactions .pBody { + padding: 0; + background-color: transparent; + border: none; + font-size: 85%; + font-weight: bold; +} + +#p-cactions ul { + list-style: none; + line-height: 0.8em; +} +#p-cactions li { + float: left; + margin: 0 2px 0 0; + padding: 0 6px 0 0; + overflow: visible; + display: inline; + white-space: nowrap; + font-size: 0.8rem; + border-top-right-radius: 6px; + border-top-left-radius: 6px; + border-top-width: 2px; + border-top-style: solid; + border-top-color: #4a9e9e; +} + +#p-cactions li a { + display: block; + float: left; + margin: 0; + padding: 2px 2px 4px 8px; + z-index: 0; + color: #e0f4f4; + border: none; + text-decoration: none; +} + +#p-cactions li:hover a, +#p-cactions li a:hover { + text-decoration: none; + border-bottom: 0; +} + +#p-cactions li.selected, +#p-cactions li.selected:hover { + border-top-color: #7ec8c8; + background-color: #afc4fb; +} + +#p-cactions li.selected { + border-bottom: 1px solid #afc4fb; + font-weight: bold; +} + +#p-cactions li.selected a, +#p-cactions li.selected a:hover { + color: #0D2020; +} + +#p-cactions .new a { + color: #ffb3b3; +} + +/* offsets to distinguish the tab groups */ +#p-cactions li#ca-talk, +#p-cactions li#ca-watch, +#p-cactions li#ca-unwatch { + margin-right: 1.6em; +} + +#p-cactions li#ca-edit { + font-weight: bold; +} + +div#header { + clear: both; +} + +#header #site-logo { + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + margin: 0; + z-index: 100; + padding-left: 12px; + overflow: visible; +} + +/* P-Personal */ +#p-personal { + margin-bottom: 0; +} + +#p-personal h5 { + display: none; +} + +#p-personal .pBody { + line-height: 19px; + margin: 0 0 1.4em 0; + text-align: right; + white-space: nowrap; + border: none; + z-index: 0; + overflow: visible; + background: none; + padding: 0; +} + +#p-personal .portlet { + padding: 0; + margin: 0; + border: none; + z-index: 0; + overflow: visible; + background: none; +} + +#p-personal .top-nav-element { + display: inline; + margin: 0; + height: 25px; + font-size: 10px; + padding: 0; +} + +#p-personal .top-nav-left { + width: 7px; + height: 25px; + display: inline; + /* @embed */ + background: url("images/top-left.png") no-repeat; + padding-top: 5px; + padding-right: 4px; + padding-bottom: 8px; + margin-left: 3px; + margin-right: -1px; +} + +#p-personal .top-nav-right { + width: 7px; + height: 25px; + display: inline; + /* @embed */ + background: url("images/top-right.png") no-repeat; + padding-top: 5px; + padding-left: 4px; + padding-bottom: 8px; + margin-left: -1px; + margin-right: 3px; +} + +#p-personal .top-nav-mid { + text-decoration: none; + height: 25px; + display: inline; + /* @embed */ + background: url("images/top-mid.png") repeat-x; + padding-top: 5px; + padding-left: 3px; + padding-right: 3px; + padding-bottom: 8px; + margin-left: -4px; + margin-right: -4px; + font-size: 10px; +} + +#pt-userpage a, #pt-mytalk a { + font-weight: bold; +} + +/* this is the ul contained in the portlet */ +#p-personal ul { + border: none; + line-height: 22px; + color: #e0f4f4; + margin: 0; + text-align: right; + list-style: none; + z-index: 0; + background: none; +} + +/* + ** the main content area + */ +h3#siteSub { + display: none; + font-size: 0.75em; + color: #595959; +} + +#contentSub, +#contentSub2 { + font-size: 0.875rem; + line-height: 1.4em; + margin: 0 0 0.8em 0; + color: #595959; + width: auto; +} + +#contentSub div, +#contentSub2 div { + margin-right: 0; +} + +#contentSub2 .breadcrumb { + list-style-type: none; + margin-left: 0.1em; +} + +#contentSub2 .breadcrumb li { + display: inline; +} + +#jump-to-nav { + display: none; +} + +span.subpages { + display: block; +} + +img { + border: none; + vertical-align: middle; +} + +p { + margin: .4em 0 .5em 0; + line-height: 1.6em; +} + +p img { + margin: 0; +} + +ul { + line-height: 1.6em; + list-style-type: square; + margin: 0.4em 0 0.4em 1.5em; + padding: 0; + /* @embed */ + list-style-image: url("images/bullet.gif"); + font-weight: normal; +} + +ol { + line-height: 1.6em; + margin: .3em 0 0 3.2em; + padding: 0; + list-style-image: none; + font-weight: normal; +} + +li { + margin-top: 0.2em; + margin-bottom: 0.2em; +} + +dt { + font-weight: bold; + margin-bottom: .1em; +} + +dl { + margin-top: .2em; + margin-bottom: .5em; +} + +dd { + line-height: 1.6em; + margin-left: 2em; + margin-bottom: .1em; +} + +sup, +sub { + font-size: 0.8em; +} + +del { + text-decoration: line-through; +} + +legend { + font-size: 10pt; + font-weight: bold; + margin-bottom: 0.3em; +} + +fieldset { + margin: 1em 0 1em 0; + padding: 0 1em 1em; + line-height: 1.6em; + border-radius: 6px; +} + +fieldset.nested { + margin: 0 0 0.5em 0; + padding: 0 0.5em 0.5em; +} + +form { + border: none; + margin: 0; +} + +textarea { + width: 100%; + padding: .1em; +} + +input.historysubmit { + padding: 0 .3em .3em .3em !important; + cursor: pointer; + height: 1.7em !important; + margin-left: 1.6em; +} + +input { + margin: 2px; + vertical-align: middle; +} + +input[type="submit"] { + cursor: pointer; +} + +iframe { + border-width: 0; +} + +/* nested elements */ +td > p, td > div { + margin: 0; + padding: 0; +} + +#wpSave { + font-weight: bold; +} + +select { + vertical-align: middle; +} + +abbr, +acronym, +.explain { + border-bottom: 1px dotted #000; + color: #000; + background: none; + cursor: help; +} + +q, +blockquote { + font-family: "Palatino Linotype", Georgia, "DejaVu Serif", serif; + font-size: 1em; + color: #595959; +} + +/* Code */ +code, +pre, +tt, +kbd, +samp {/* override IE6 default */ + font-size: 1em; + overflow: auto; + overflow-y: hidden; + font-family: Menlo, Monaco, "Courier New", "Nimbus Mono L", monospace, sans-serif; +} + +code, +tt { + background-color: #f9f9f9; + white-space: nowrap; +} + +code.long, +tt.long { + display: block; + margin: 0.1em 1em; + white-space: normal; +} + +pre { + border: 1px dashed #2f6fab; + color: #000; + background-color: #f9f9f9; + line-height: 1.1em; + padding: 15px 20px 15px 20px; + border-radius: 6px; +} + +pre.code { + overflow: auto; + margin: 1em .5em; + padding: .2em; + border: solid 1px; +} + +pre.code .remark { + font-size: 1em; + font-style: italic; +} + +/* turn off content generation */ +pre.code .remark:before, +pre.code .remark:after, +pre.code .note:before { + content: ""; +} + +/* user notification thing */ +.usermessage { + background-color: #ffce7b; + border: 1px solid #ffa500; + color: #000; + font-weight: bold; + margin: 2em 0 1em 0; + padding: 0.5em 1em; + vertical-align: middle; + border-radius: 6px; +} + +#sitenotice { + text-align: center; + font-size: 95%; + padding: 0.9em 0.9em 0 0.9em; + margin-top: -1em; + margin-bottom: 0.5em; +} + +#sitenotice p { + margin: 0; + padding: 0; +} + +#catlinks, .catlinks { + border: 1px solid #aaa; + background-color: #F9F9F9; + padding-top: 3px; + padding-bottom: 3px; + padding-right: 5px; + padding-left: 5px; + margin-top: 1em; + clear: both; + border-radius: 6px; + box-shadow: 1px 1px 1px grey; +} + +/* emulate center */ +.center { + width: 100%; + text-align: center; +} + +* .center * { + margin-left: auto; + margin-right: auto; +} + +/* small for tables and similar */ +.small, .small * { + font-size: 94%; +} + +table.small { + font-size: 100% +} + +/* + ** content styles + */ +.successbox, +.errorbox, +.warningbox { + border-width: 1px; + border-radius: 6px; + margin-bottom: 1em; + padding-left: 5em; + padding-right: 5em; + text-align: center; + margin-left: auto; + margin-right: auto; +} + +.successbox p, +.errorbox p, +.warningbox p { + width: 100%; +} + +.successbox { + color: #1E6000; + box-shadow: 0 0 2px #1E6000; +} + +.errorbox { + color: #8B0000; + background-color: #fdd; + box-shadow: 0 0 2px #8B0000; +} + +.warningbox { + color: #7A4100; + box-shadow: 0 0 2px #7A4100; +} + +.mw-warning { + margin-left: 50px; + margin-right: 50px; + text-align: center; +} + +#mw-anon-edit-warning, +.mw-warning-with-logexcerpt, +.mw-editinginterface { + border-radius: 6px; + border-width: 1px; +} + +.skin-cavendish .mw-icon-arrow-expanded, +.skin-cavendish .mw-collapsible-arrow.mw-collapsible-toggle-expanded { + /* @embed */ + background: url("images/minus.png") no-repeat scroll left center transparent; + background-size: 12px 12px; +} + +.skin-cavendish .mw-icon-arrow-collapsed, +.skin-cavendish .mw-collapsible-arrow.mw-collapsible-toggle-collapsed { + /* @embed */ + background: url("images/plus.png") no-repeat scroll left center transparent; + background-size: 12px 12px; +} + +#mw-hidden-catlinks { + font-style: italic; + color: #595959; +} + +span.comment { + color: #595959; +} + +.mw-specialpagecached { + font-style: italic; +} + +/* images */ +img.floatright, +img.float-right { + clear: right; + float: right; + position: relative; + margin-bottom: 0.5em; + margin-left: 0.5em; + padding: 5px; +} + +img div.floatright p, +img div.float-right p { + font-style: italic; +} + +img.floatleft, +img.float-left { + float: left; + clear: left; + position: relative; + margin-right: 0.5em; + margin-bottom: 0.5em; + padding: 5px; +} + +img div.floatleft p, +img div.float-left p { + font-style: italic; +} + +/* thumbnails */ +div.thumb { + margin-bottom: 0.5em; + border-style: solid; + border-color: #fff; + width: auto; +} + +div.thumb div { + background-color: #f9f9f9; + font-size: 8.5pt; + text-align: center; + overflow: hidden; +} + +div.thumbinner { + border: 1px solid #cccccc; + padding: 3px !important; + background-color: #f9f9f9; + font-size: 8.5pt; + text-align: center; + overflow: hidden; + border-radius: 6px; +} + +li.gallerybox div.thumb { + border-radius: 6px; + box-shadow: 1px 1px 1px grey; +} + +div.thumb div a img { + /* border: 1px solid #cccccc; */ +} + +div.thumbinner div.thumbcaption { + border: none; + text-align: left; + line-height: 1.4em; + padding: 0.3em 0 0.1em 0.2em; +} + +div.magnify { + float: right; + border: none !important; + background: none !important; +} + +div.magnify a, +div.magnify img { + display: block; + border: none !important; + background: none !important; +} + +div.tright, +.float-right, +.floatright { + clear: right; + float: right; + position: relative; + margin-left: 0.7em; + margin-right: 0; +} + +table.float-right, +table.floatright { + margin-left: 0.7em; + margin-right: 0; +} + +div.tleft, +.float-left, +.floatleft { + float: left; + clear: left; + position: relative; + margin-right: 0.7em; + margin-left: 0; +} + +table.float-left, +table.floatleft { + margin-right: 0.7em; + margin-left: 0; +} + +.urlexpansion { + display: none; +} + +img.tex { + vertical-align: middle; + margin-left: auto; + margin-right: auto; + text-align: center; +} + +span.texhtml { + font-family: "Palatino Linotype", Georgia, "DejaVu Serif", serif; +} + +/* + ** classes for special content elements + ** 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; +} + +.toccolours { + border: 1px solid #aaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; +} + +/* + ** edit views etc + */ +.special li { + line-height: 1.4em; + margin: 0; + padding: 0; +} + +/* + ** External link icons + */ +#bodyContent a.external, #bodyContent a[href^="gopher://"] { + /* @embed */ + background: url("images/external.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#bodyContent a[href^="https://"], +.link-https { + /* @embed */ + background: url("images/locked.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#bodyContent a[href^="mailto:"], +.link-mailto { + /* @embed */ + background: url("images/envelope.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#bodyContent a[href^="news://"] { + /* @embed */ + background: url("images/newspaper.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#bodyContent a[href^="ftp://"], +.link-ftp { + /* @embed */ + background: url("images/folder.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#bodyContent a[href^="irc://"], #bodyContent a.extiw[href^="irc://"], +.link-irc { + /* @embed */ + background: url("images/speech-bubble-left-4.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#bodyContent a[href^="skype:"], +.link-skype { + /* @embed */ + background: url("images/speech-bubble-left-4.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#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"], +#bodyContent a.external[href$=".m4a"], +.link-audio { + /* @embed */ + background: url("images/audio.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#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"], +#bodyContent a.external[href$=".m4v"], #bodyContent a.external[href$=".M4V"], +.link-video { + /* @embed */ + background: url("images/video.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +#bodyContent a.external[href$=".pdf"], #bodyContent a.external[href$=".PDF"], +#bodyContent a.external[href$=".doc"], #bodyContent a.external[href$=".DOC"], +#bodyContent a.external[href$=".docx"], #bodyContent a.external[href$=".DOCX"], +#bodyContent a.external[href$=".odt"], #bodyContent a.external[href$=".ODT"], +.link-document { + /* @embed */ + background: url("images/document.png") center right no-repeat; + padding-right: 16px; + background-size: 12px 12px; +} + +/* disable interwiki styling */ +#bodyContent a.extiw, +#bodyContent a.extiw:active { + color: #36b; + background: none; + padding: 0; +} + +#bodyContent a.external { + color: #36b; +} + +/* + ** Structural Elements + */ + +/* + ** general portlet styles (elements in the quickbar) + */ +.portlet { + border: none; + margin: 0 0 0.5em 0; + float: none; + padding: 0; + /* width: 11.6em; */ + overflow: hidden; +} + +.portlet h4 { + font-size: 95%; + font-weight: normal; + white-space: nowrap; +} + +.portlet h5, +.portlet h3 { + background: transparent; + padding: 0 1em 0 0.5em; + display: inline; + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + height: 1em; + white-space: nowrap; + border-bottom: none; + color: #004F4F; +} + +.portlet h6 { + background: #ffae2e; + border: 1px solid #2f6fab; + border-style: solid solid none solid; + padding: 0 1em; + text-transform: lowercase; + display: block; + font-size: 1em; + height: 1.2em; + font-weight: normal; + white-space: nowrap; +} + +.pBody { + font-size: 95%; + background: white; + border-collapse: collapse; + border: 1px solid #aaa; + padding: 0 0.8em 0.3em 0.5em; +} + +/* Sidebar */ +#nav { + padding: 6px 0; + line-height: 1em; + margin: 0 0 1em 0; + border-radius: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,0.12); + overflow: hidden; + background: #fff; +} + +#nav ul { + margin: 0; + padding: 0; + list-style: none; +} + +#nav div, #nav li { + display: inline; + padding: 0; + margin: 0; +} + +#nav div span {/* used for un-linked menu items */ + display: block; + padding: 6px 10px; + font-weight: bold; + color: #4a4a4a; +} + +#nav div h5, +#nav div h3 { + display: block; + padding: 0.6em 1.0em 0.4em; + font-weight: 600; + color: #004F4F; + font-size: 0.75rem; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +#nav div span#configParent, +#nav div span #configuration { + display: inline; + font-weight: normal; + padding: 0; +} + +#nav div li span {/* used for un-linked menu items */ + padding: 4px 8px 4px 20px; +} + +#nav div li a { + padding: 8px 8px 8px 20px; +} + +#nav div#searchBody { + text-align: center; +} + +#nav div form#searchform { + background: #EDF2F2; +} +#nav div form#searchform input#searchInput { + margin-top: 1em; +} +#nav div form#searchform input { + margin-bottom: 1em; +} + +#oN { + background-color: #e0e9e9; +} + +#oN :hover { + background-color: #c6dcdc; +} + +#nav div ul #feedlinks { + display: block; + padding: 8px 20px; + text-decoration: none; + background: #edf2f2; + border-bottom: 1px solid #ddd; + border-top: 1px solid #fff; + border-right: 1px solid #ddd; +} + +#nav div ul #feedlinks #feed-rss, +#nav div ul #feedlinks #feed-atom { + display: inline; + background: #EDF2F2; + border: none; + padding: 0; +} + +#nav div ul #feedlinks a.feedlink:last-child:before { + content: " | "; +} + +#nav div ul #feedlinks #feed-atom:only-child:before { + content: ""; +} + +#nav .pBody { + border: none; +} + +#nav div a, +#nav div span.social { + display: block; + padding: 8px 10px; + text-decoration: none; + font-size: 0.9rem; +} + +/* + ** Logo properties + */ +#p-logo { + z-index: 3; + position: absolute; /* needed to use z-index */ + top: 0; + left: 0; + height: 155px; + width: 12em; + overflow: visible; +} + +#p-logo h5 { + 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; +} + +/* + ** the navigation portlet + */ +#p-nav { + position: relative; + z-index: 3; +} + +/* + ** Search portlet + */ +#header form { + display: inline; +} + +#header #p-search { + position: absolute; + font-size: 0.95rem; + top: 0; + right: 0; + padding: 15px 20px 0 0; + margin: 0; /* need for IE Mac */ + text-align: right; /* need for IE Mac */ + white-space: nowrap; /* for Opera */ +} + +#header #p-search h3 { + display: none; +} + +#searchBody { + background-color: transparent; + border: 0; + display: inline; +} + +#header form label, +#header label { + font-size: 8.5pt; +} + +#header form input { + font-size: 8.5pt; +} + +#header form #submit { + font-size: 8.5pt; + background: #005A5A; + color: #fff; + padding: 1px 4px; + border: 1px solid #004040; + border-radius: 4px; +} + +#header form #searchInput:hover, +#header form #searchInput:focus { + background: #fff; +} + +#p-search { + /* position: relative; */ + z-index: 3; + border-bottom: none; +} + +#p-search .pBody { + text-align: center; + padding: 0.5em 0.4em 0.4em 0.4em; +} + +#searchform input.searchbutton { + margin-top: 1px; + font-size: 8.5pt; +} +#searchform div { + display: inline +} + +#searchgobutton, #searchGoButton { + padding-left: .5em; + padding-right: .5em; + font-weight: bold; +} + +#header form #searchInput { + width: 270px; + font-size: 8.5pt; + padding: 2px; + margin: 0 0.5em 0 0.5em; + border-radius: 6px; + background-color: #ffffff; + color: #1a1a1a; + border: 1px solid #a0c8c8; +} + +#searchInputResult { + font-size: 8.5pt; +} + +.suggestions { + margin-right: 142px; +} + +/* + ** the remaining portlets + */ +#p-tbx, #p-lang { + position: relative; + z-index: 3; +} + +/* + ** Footer + */ +#footer { + clear: both; + margin-top: 1em; + font-size: 7pt; + border-top: 1px solid #999; + padding-top: 2em; + color: #525252; +} + +#footer ul { + margin: 0 0 1em 0; + padding: 0; + line-height: 1.6em; + list-style: none; +} + +#footer li { + margin: 0; + white-space: nowrap; +} + +#footer table { + width: 100%; + text-align: center; +} + +#f-list { + width: 70%; +} + +#f-list #f-credits { + white-space: normal; +} + +#footer td.f-iconsection { + width: 5%; + text-align: center; + vertical-align: top; + padding-right: 1em; + white-space: nowrap; +} + +#f-list li { + list-style: none; + list-style-image: none; + list-style-type: none; +} + +#footer #f-poweredbyico a, +#footer #f-copyrightico a { + display: list-item; + margin-bottom: 5px; + list-style: none; + list-style-image: none; + list-style-type: none; +} + +#footer p, #footer a { + margin: 0.6em 0; + display: inline; + white-space: nowrap; +} + +#f-about, +#f-disclaimer, +#f-privacy, +#f-viewcount, +#f-numberofwatchingusers { + display: inline; + padding-left: 5px; + padding-right: 5px; +} + +/* footer icons need a fixed width */ +* > html #f-poweredbyico, +* > html #f-copyrightico { + width: 88px; +} + +* > html #mBody, +* > html #mBody pre { + overflow-x: auto; + width: 100%; + padding-bottom: 25px; +} +/* more IE fixes */ +/* float/negative margin brokenness */ +* html #footer { + margin-top: 0; +} + +* html #column-content { + display: inline; + margin-bottom: 0; +} + +* html div.editsection, +* html div.mw-editsection { + font-size: smaller; +} + +.printfooter { + display: none; +} + +.not_patrolled { + background-color: #ffa; +} + +div.patrollink { + font-size: 75%; + text-align: right; +} + +span.newpage, +span.minor, +span.searchmatch { + font-weight: bold; +} + +span.unpatrolled { + font-weight: bold; + color: #f00; +} + +span.searchmatch { + color: #f00; +} + +.sharedUploadNotice { + font-style: italic; + width: 100%; + font-size: 100%; + border: 1px solid #00d; + background-color: #ddf; + margin-top: 3pt; + padding: 5px; + border-radius: 5px; + box-shadow: 0 0 2px #00d; +} + +span.newpageletter { + font-weight: bold; + color: #000; + background-color: #ff0; +} + +span.minoreditletter { + color: #000; + background-color: #c5ffe6; +} + +/* ADDED BY DEB@DRIA.ORG FOR DEVMO WIKI */ +.standard-table { + border: solid #000 1px; + border-collapse: collapse; +} + +.standard-table td { + text-align: left; + vertical-align: top; + padding: 5px; + border: solid #bbb 1px; +} + +.standard-table td.header, +.standard-table th { + font-weight: bold; + background: #ddd; + border: solid #bbb 1px; + text-align: left; + padding: 0 5px; +} + +.fullwidth-table { + border: solid #666 1px; + border-collapse: collapse; + width: 100%; + margin-bottom: 10px; + background: #fff; +} + +.fullwidth-table td { + text-align: left; + vertical-align: top; + padding: 5px 15px; + border: solid #bbb 1px; +} + +.fullwidth-table td.header, +.fullwidth-table th { + background: #ddd; + border: solid #bbb 1px; + font-weight: bold; + font-size: 1.2em; + text-align: left; + padding: 0 5px; +} + +div.breadcrumbs { + border: solid #888 1px; + padding: 0 5px; + background: #ddd; + margin: 5px 0 10px 0; + font-size: 0.9em; +} + +div.breadcrumbs a.breadcrumbs { + text-decoration: none; +} + +div.breadcrumbs span.breadcrumbs { + font-weight: bold; +} + +div.tip { + border: solid #0f0 2px; + padding: 0 10px 0 10px; + margin: 10px 0 10px 0; + background: #dfd; +} + +div.note { + /* border: solid goldenrod 2px; */ + padding: 0 10px; + margin: 10px 0; + background: #ffd; + color: #000; +} + +div.note:before { + content: ""; +} + +.originaldocinfo { + font-size: 0.8em; + background: #ffd; + border: solid #cce 1px; + width: auto; + padding: 0 10px; + margin: 15px 0; +} + +.originaldocinfo p { + line-height: 0.8em; +} + +.originaldocinfo h2 { + font-size: 1.3em; + font-weight: bold; +} + +.licenseblock { + border: dashed #888 1px; + background: #ddd; + font-size: 0.8em; + padding: 0 10px; +} + +.wrong-source-code { + color: #d00; +} + +.right-source-code { + color: #0a0; +} + +.template-toc { + background: #ddd; + font-size: 0.9em; + border: solid #000 1px; + padding: 0 10px; + margin: 15px 0; + width: auto; +} + +.prevnext { + font-size: 0.9em; + margin: 10px 0 20px 0; +} + +div.highlight { + border-left: solid #00f 3px; + padding-left: 15px; +} + +span.highlightblue { + color: #00f; +} + +span.highlightred { + color: #f00; +} + +.side-note { + width: auto; + padding: 0 20px; + margin: 10px 0; + border: solid #666 1px; + background: #eee; +} + +.side-note-left { + float: left; + width: 40%; + padding: 0 20px; + margin: 10px 10px 10px 0; + border: solid #666 1px; + background: #eee; +} + +.side-note-right { + float: right; + width: 40%; + padding: 0 20px; + margin: 10px 0 10px 10px; + border: solid #666 1px; + background: #eee; +} + +/* new for devmo topic pages */ +.callout-box { + float: right; + border: solid #000 1px; + text-align: center; + width: 200px; + margin: 0 0 15px 15px; + padding: 10px; + background: #eee; +} + +.topicpage-table { + width: 100%; +} + +.topicpage-table td { + width: 50%; + vertical-align: top; + padding: 10px; +} + +.alllinks { + font-size: 10px; + float: right; +} + +.date { + color: #668; + font-style: italic; +} + +.disambig { + font-size: 0.9em; + border-top: solid #aaa 1px; + border-bottom: solid #aaa 1px; +} + +.notice { + font-size: 0.9em; + border: solid #aaa 1px; + padding: 5px; + margin: 5px 0 5px 0; +} + +/* Special:RecentChanges */ +.mw-special-Recentchanges ul.special { + margin: 0; + border-radius: 6px; + border: 1px #fff solid; +} + +.mw-special-Recentchanges ul.special li { + list-style-type: none; + list-style-image: none; +} + +/* Special:AllPages */ +.allpageslist { + margin: auto; +} + +.newpage { + color: #0f0; +} + +.minor, .minoredit { + color: #808080; +} + +/* Portal page style */ +.portalseite div.portal-container, +.hauptseite-oben, +.hauptseite-links, +.hauptseite-rechts, +.hauptseite-unten { + box-shadow: 1px 1px 1px #88080; + margin-bottom: 1em; + border-radius: 6px; +} + +h2.portal-heading, +.portalseite h2, +#hauptseite h2 { + border-width: 1px; + border-color: #aaa; + border-style: solid solid dotted; + background-color: #f0f0f0; + padding: 0.2em 0; + margin: 0; + font-size: 1.1em; + font-weight: bold; + text-indent: 0.5em; + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +h3.portal-heading, +.portalseite h3, +#hauptseite h3 { + background-color: #f0f0f0; + border-bottom: 1px dotted #aaa; + font-size: 1em; + font-weight: bold; + margin-bottom: 0.5em; + margin-top: 0.5em; + padding-bottom: 0.1em; + padding-left: 0.3em; + padding-top: 0.1em; +} + +.portalseite div.inhalt, +div.portal-content, +#hauptseite .inhalt { + border: 1px solid #aaa; + border-top: 0; + background-color: #fff; + margin-bottom: 1em; + padding: 0.5em 0.8em 0.5em 0.8em; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; +} + +.hauptseite-links, +.portalseite .portal-left { + margin-right: 0.5em; +} + +.hauptseite-rechts, +.portalseite .portal-right { + margin-left: 0.5em; +} diff --git a/mediawiki/skins/Cavendish/resources/colors/blue.css b/mediawiki/skins/Cavendish/resources/colors/blue.css new file mode 100644 index 0000000..ade77c9 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/colors/blue.css @@ -0,0 +1,79 @@ +/* Blue color */ + +#header { + background: #455372; /* Old browsers */ + background: -moz-linear-gradient(top, #455372 0%, #455372 52%, #3f4c6b 67%, #2a3753 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#455372), color-stop(52%,#455372), color-stop(67%,#3f4c6b), color-stop(100%,#2a3753)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #455372 0%,#455372 52%,#3f4c6b 67%,#2a3753 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #455372 0%,#455372 52%,#3f4c6b 67%,#2a3753 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #455372 0%,#455372 52%,#3f4c6b 67%,#2a3753 100%); /* IE10+ */ + background: linear-gradient(to bottom, #455372 0%,#455372 52%,#3f4c6b 67%,#2a3753 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#455372', endColorstr='#2a3753',GradientType=0 ); /* IE6-9 */ +} + +#header form label, #header label { + color: #ddd; +} + +#header form #searchInput { + border: 1px solid #9097a2; + background-color: #d9dbe1; +} + +/* p-cactions */ +#p-cactions li { + border-bottom: 1px solid #515358; + background-color: #5F697e; + border-top-color: #5F697e; +} + +#p-cactions li:hover { + border-top-color: #747f96; + background-color: #747f96; +} + +#p-cactions li.selected a { + color: #455372; +} + +/* NAV */ +#nav { + background: #e0e9e9; +} + +#nav div a:hover { + background: #e0e9e9; +} + +#nav div a, +#nav div span.social { + background: #edf2f2; + border-bottom: 1px solid #ddd; + border-top: 1px solid #fff; + border-right: 1px solid #ddd; +} + +/* preftoc */ +#preftoc li:hover, +#preftoc li:focus, +#preftoc li.selected { + background-color: #e0e9e9; +} + +/* fieldset */ +fieldset { + border: 1px solid #2f6fab; +} + +fieldset fieldset { + background-color: #e0e9e9; +} + +/* mw-line */ +.mw-line-odd { + background-color: #edf2f2; +} + +.mw-line-even { + background-color: #e0e9e9; +} diff --git a/mediawiki/skins/Cavendish/resources/colors/brown.css b/mediawiki/skins/Cavendish/resources/colors/brown.css new file mode 100644 index 0000000..44cf358 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/colors/brown.css @@ -0,0 +1,91 @@ +/* Brown color */ + +#header { + background: #e3cead; /* Old browsers */ + background: -moz-linear-gradient(top, #e3cead 0%, #dac39e 35%, #ccb186 75%, #c5aa7d 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e3cead), color-stop(35%,#dac39e), color-stop(75%,#ccb186), color-stop(100%,#c5aa7d)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #e3cead 0%,#dac39e 35%,#ccb186 75%,#c5aa7d 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #e3cead 0%,#dac39e 35%,#ccb186 75%,#c5aa7d 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #e3cead 0%,#dac39e 35%,#ccb186 75%,#c5aa7d 100%); /* IE10+ */ + background: linear-gradient(to bottom, #e3cead 0%,#dac39e 35%,#ccb186 75%,#c5aa7d 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e3cead', endColorstr='#c5aa7d',GradientType=0 ); /* IE6-9 */ +} + +#header form label, +#header label { + color: #774f03; +} + +#header form #searchInput { + border: 1px solid #774f03; + background-color: #fbf4e8; +} + +/* p-cactions */ +#p-cactions li { + border-bottom: 1px solid #b48a48; + background-color: #885e1b; + border-top-color: #885e1b; +} + +#p-cactions li:hover { + border-top-color: #b48a48; + background-color: #b48a48; +} + +#p-cactions li.selected a { + color: #780000; +} + +/* NAV */ +#nav { + background: #e8ddca; +} + +#nav div a:hover { + background: #e8ddca; +} + +#nav div a, +#nav div span.social { + background-color:#fbf4e8; + border-bottom: 1px solid #ddd; + border-right: 1px solid #ddd; + border-top: 1px solid #fff; +} + +/* preftoc */ +#preftoc li:hover, +#preftoc li:focus, +#preftoc li.selected { + background-color: #e8ddca; +} + +/* fieldset */ +fieldset { + border: 1px solid #774F03; +} + +fieldset fieldset { + background-color: #e8ddca; +} + +/* mw-line */ +.mw-line-odd { + background-color: #FBF4E8; +} + +.mw-line-even { + background-color: #e8ddca; +} + +/* different from blue.css */ +.portlet li a:link { + color: #780000; + text-decoration: none; +} + +.portlet li a:visited { + color: #774f03; + text-decoration: none; +} diff --git a/mediawiki/skins/Cavendish/resources/colors/green.css b/mediawiki/skins/Cavendish/resources/colors/green.css new file mode 100644 index 0000000..63b26e9 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/colors/green.css @@ -0,0 +1,80 @@ +/* Green color */ + +#header { + background: #379940; /* Old browsers */ + background: -moz-linear-gradient(top, #379940 0%, #36983f 56%, #32903a 68%, #216d2b 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#379940), color-stop(56%,#36983f), color-stop(68%,#32903a), color-stop(100%,#216d2b)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #379940 0%,#36983f 56%,#32903a 68%,#216d2b 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #379940 0%,#36983f 56%,#32903a 68%,#216d2b 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #379940 0%,#36983f 56%,#32903a 68%,#216d2b 100%); /* IE10+ */ + background: linear-gradient(to bottom, #379940 0%,#36983f 56%,#32903a 68%,#216d2b 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#379940', endColorstr='#216d2b',GradientType=0 ); /* IE6-9 */ +} + +#header form label, +#header label { + color: #89cc92; +} + +#header form #searchInput { + border: 1px solid #23712d; + background-color: #89cc92; +} + +/* p-cactions */ +#p-cactions li { + border-bottom: 1px solid #56a05f; + background-color: #58ac64; + border-top-color: #58ac64; +} + +#p-cactions li:hover { + border-top-color: #68cc76; + background-color: #68cc76; +} + +#p-cactions li.selected a { + color: #455372; +} + +/* NAV */ +#nav { + background: #379940; +} + +#nav div a:hover { + background: #379940; +} + +#nav div a, +#nav div span.social { + background: #89cc92; + border-bottom: 1px solid #ddd; + border-top: 1px solid #fff; + border-right: 1px solid #ddd; +} + +/* preftoc */ +#preftoc li:hover, +#preftoc li:focus, +#preftoc li.selected { + background-color: #89cc92; +} + +/* fieldset */ +fieldset { + border: 1px solid #1fd931; +} + +fieldset fieldset { + background-color: #89cc92; +} + +/* mw-line */ +.mw-line-odd { + background-color: #379940; +} + +.mw-line-even { + background-color: #89cc92; +} diff --git a/mediawiki/skins/Cavendish/resources/dynamic.css b/mediawiki/skins/Cavendish/resources/dynamic.css new file mode 100644 index 0000000..e28512a --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/dynamic.css @@ -0,0 +1,6 @@ +/** These styles are configurable via configuration */ +.cavendish-qr-code-mode-all #f-poweredbyico, +.cavendish-qr-code-mode-print #qrcode, +.cavendish-sidebar-searchbox #nav #p-search { + display: none; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/babel.css b/mediawiki/skins/Cavendish/resources/extensions/babel.css new file mode 100644 index 0000000..421214a --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/babel.css @@ -0,0 +1,134 @@ +/** + * Stylesheet for Babel extension. + * + * This should be added to your MediaWiki:Common.css page when installing this + * extension and should not be modified. You may modify the CSS code on the + * MediaWiki:Common.css page to adjust colours etc. + * + * @addtogroup Extensions + */ + +/* Babel wrapper layout. */ +table.mw-babel-wrapper { + width: 238px; + float: right; + clear: right; + border-style: solid; + margin-right: 0; + border-width: 1px; + border-color: #99b3ff; +} + +/* Babel box layout. */ +div.mw-babel-box { + float: left; + clear: left; + margin: 1px; +} + +div.mw-babel-box table { + width: 238px; +} + +div.mw-babel-box table th { + width: 238px; + width: 45px; + height: 45px; + font-size: 14pt; + font-family: monospace; +} + +div.mw-babel-box table td { + font-size: 8pt; + padding: 4pt; + line-height: 1.25em; +} + +/* Babel box colours. */ +div.mw-babel-box-0 { + border: solid #b7b7b7 1px; +} + +div.mw-babel-box-1 { + border: solid #c0c8ff 1px; +} + +div.mw-babel-box-2 { + border: solid #77e0e8 1px; +} + +div.mw-babel-box-3 { + border: solid #99b3ff 1px; +} + +div.mw-babel-box-4 { + border: solid #cc0 1px; +} + +div.mw-babel-box-5 { + border: solid #f99c99 1px; +} + +div.mw-babel-box-N { + border: solid #6ef7a7 1px; +} + +div.mw-babel-box-0 table th { + background-color: #b7b7b7; +} + +div.mw-babel-box-1 table th { + background-color: #c0c8ff; +} + +div.mw-babel-box-2 table th { + background-color: #77e0e8; +} + +div.mw-babel-box-3 table th { + background-color: #99b3ff; +} + +div.mw-babel-box-4 table th { + background-color: #cc0; +} + +div.mw-babel-box-5 table th { + background-color: #f99c99; +} + +div.mw-babel-box-N table th{ + background-color: #6ef7a7; +} + +div.mw-babel-box-0 table { + background-color: #e8e8e8; +} + +div.mw-babel-box-1 table { + background-color: #f0f8ff; +} + +div.mw-babel-box-2 table { + background-color: #d0f8ff; +} + +div.mw-babel-box-3 table { + background-color: #e0e8ff; +} + +div.mw-babel-box-4 table { + background-color: #ff9; +} + +div.mw-babel-box-5 table { + background-color: #f9cbc9; +} + +div.mw-babel-box-N table { + background-color: #c5fcdc; +} + +.babel-box td.babel-footer { + text-align: center; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.cite.style.css b/mediawiki/skins/Cavendish/resources/extensions/ext.cite.style.css new file mode 100644 index 0000000..692a510 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.cite.style.css @@ -0,0 +1,24 @@ +ol.references { + font-size: 0.9em; +} + +sup.reference { + font-size: 0.8em; + line-height: 0.8em; + vertical-align: top; + position: relative; + top: -0.2em; + white-space: nowrap; +} + +.reference * { + vertical-align: top; +} + +ol.references > li:target { + background-color: #def; +} + +sup.reference:target { + background-color: #def; +} \ No newline at end of file diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.echo.styles.badge.css b/mediawiki/skins/Cavendish/resources/extensions/ext.echo.styles.badge.css new file mode 100644 index 0000000..579e127 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.echo.styles.badge.css @@ -0,0 +1,12 @@ +/* Hide Echo's colorful little boxes indicating how many new alerts/notices + * the user has, because: + * 1) the data is already shown on the personal tools area, and thus + * 2) these visual indicators conflict with the above and look messy since + * Cavendish does not render the icons (should it? IMHO, yes. But I was + * unable to figure out how to get it to render the Echo icons, so this'll + * have to do for the time being.) + */ +li#pt-notifications-alert .mw-echo-notifications-badge::after, +li#pt-notifications-notice .mw-echo-notifications-badge::after { + display: none; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.flaggedRevs.basic.css b/mediawiki/skins/Cavendish/resources/extensions/ext.flaggedRevs.basic.css new file mode 100644 index 0000000..ada5315 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.flaggedRevs.basic.css @@ -0,0 +1,10 @@ +div.flaggedrevs_basic, +div.flaggedrevs_quality, +div.flaggedrevs_pristine, +div.flaggedrevs_notice { + border-radius: 6px; +} + +table.flaggedrevs_editnotice { + margin-bottom: 1em; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.inputBox.styles.css b/mediawiki/skins/Cavendish/resources/extensions/ext.inputBox.styles.css new file mode 100644 index 0000000..e362c6d --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.inputBox.styles.css @@ -0,0 +1,4 @@ +.inputbox-element { + white-space: nowrap; + display: inline-block; +} \ No newline at end of file diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.liquidThreads.css b/mediawiki/skins/Cavendish/resources/extensions/ext.liquidThreads.css new file mode 100644 index 0000000..65731fe --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.liquidThreads.css @@ -0,0 +1,25 @@ +div.lqt-thread-toolbar { + right: 3em; +} + +.lqt-thread-toolbar-command-list { + display: inline; +} + +.lqt-talkpage-header { + border-radius: 6px; + border-width: 1px; +} + +.lqt_header_content { + border-bottom-right-radius: 6px; + border-width: 1px; +} + +a.lqt_watchlist_messages_notice { + border-radius: 6px; + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; + padding: 0.5em 1.5em; +} \ No newline at end of file diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.openid.plain.css b/mediawiki/skins/Cavendish/resources/extensions/ext.openid.plain.css new file mode 100644 index 0000000..bd073c6 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.openid.plain.css @@ -0,0 +1,17 @@ +#p-personal .pBody li#pt-openidlogin { + background: none; + padding-left: 0; +} + +.openid_large_link { + border-radius: 6px; + border-width: 1px; +} + +.openid_small_providers_block { + padding-right: 5em; +} + +#provider_form_openid input { + margin-top: 5px; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.pageforms.main.css b/mediawiki/skins/Cavendish/resources/extensions/ext.pageforms.main.css new file mode 100644 index 0000000..039fe56 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.pageforms.main.css @@ -0,0 +1,37 @@ +input.createboxInput { + margin-top: 1px; + margin-bottom: 1px; +} +/* +.mandatoryFieldSpan { + border: 1px solid #8B0000; + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + background: #FFA07A; +} + +.inputSpan { + padding-top: 5px; + padding-bottom: 7px; +} +*/ + +.formtable td { + padding-top: 7px; + padding-bottom: 7px; +} + +.formtable th { + padding-top: 7px; + padding-bottom: 7px; + padding-right: 4px; +} + +#pfForm div.warningbox { + border: 1px solid #ff8c00 !important; +} + +.checkboxLabel, .ui-widget { + white-space: nowrap; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.pygments.css b/mediawiki/skins/Cavendish/resources/extensions/ext.pygments.css new file mode 100644 index 0000000..e1dec87 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.pygments.css @@ -0,0 +1,11 @@ +.mw-highlight { + padding: 1em; + margin: 1em 0; + border: 1px dashed #2fab6f; + border-radius: 6px; + overflow-y: hidden; +} + +.mw-highlight ol { + padding-left: 1em; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.semanticdrilldown.main.css b/mediawiki/skins/Cavendish/resources/extensions/ext.semanticdrilldown.main.css new file mode 100644 index 0000000..b66db2e --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.semanticdrilldown.main.css @@ -0,0 +1,4 @@ +div div#drilldown-categories-wrapper { + padding-left: 0; + padding-right: 0; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/ext.smw.style.css b/mediawiki/skins/Cavendish/resources/extensions/ext.smw.style.css new file mode 100644 index 0000000..930c7f0 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/ext.smw.style.css @@ -0,0 +1,69 @@ +table.smwtable tr.smwfooter td.sortbottom { + padding-top: 3px; + padding-bottom: 3px; +} + +table.smwtable { + margin: 1em 1em 1em 0; + border: 1px #aaa solid; + border-collapse: collapse; + empty-cells: show; + border-radius: 6px; +} + +table.smwtable th { + background-color: #e0e9e9; + border: 1px #aaa solid; + padding: 0.2em; + white-space: nowrap; + padding: 0.2em; +} + +table.smwtable td { + border: 1px #aaa solid; + padding: 0.2em; +} + +table.smwtable caption { + margin-left: inherit; + margin-right: inherit; + font-weight: bold; +} + +table.smwtable tr.row-odd { + background-color: #f9f9f9; +} +table.smwtable tr.row-odd td { + border-top: none; + border-bottom: none; +} + +table.smwtable tr.row-even { + background-color: #f1f1f1; +} +table.smwtable tr.row-even td { + border-top: none; + border-bottom: none; +} + +.smwttactiveinline { + white-space: nowrap; +} + +.smwfact { + border-radius: 6px; + box-shadow: 2px 2px 2px #808080; +} + +#content div.smwfact table.smwfacttable { + border-radius: 0; +} + +.smwtt { + font-size: 10pt; +} + +#content table.smwb-factbox, +#content table.smwb-ifactbox { + border-radius: 0; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/extensions.css b/mediawiki/skins/Cavendish/resources/extensions/extensions.css new file mode 100644 index 0000000..e20313b --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/extensions.css @@ -0,0 +1,107 @@ +/* + * Styles for extensions + */ + +/* + * Poem Extension + */ +.poem { + margin-left: 1.5em; + white-space: nowrap; + overflow: auto; +} + +.poem p { + padding-left: 0.5em; + border-left: 1px solid #ffd700; +} + +/* HeaderTabs */ +#headertabs { + border: 1px solid #aaa; +} + +/* Google Maps */ +.pmap { + margin-top: -5px; + margin-bottom: 5px; +} + +.google-map { + margin-bottom: 1.5em; + width: auto; +} + +/* Semantic Result Formats */ +/** + * As of 1 November 2020 there doesn't appear to be a ResourceLoader module we could piggyback on + * to load these styles when needed. + * @see https://github.com/SemanticMediaWiki/SemanticResultFormats/blob/master/formats/calendar/SRF_Calendar.php#L330 + */ +#bodyContent table.navigation_table tr td.month_name { + font-size: 18pt; +} + +#bodyContent table.month_calendar tr.weekdays { + background: #e0e9e9; +} + +#bodyContent table.month_calendar td.today div.day { + background: #e0e9e9; +} + +#bodyContent table.month_calendar td.weekend_day div.day { + color: red; +} + +#bodyContent .srf-datatables select { + padding: 4px; +} + +/* 4sq */ +table .tips-4sq blockquote { + margin-right: 20px; + margin-left: 20px; + overflow-wrap: break-word; + word-wrap: break-word; +} + +/* yelp */ +table .yelp-reviews blockquote { + margin-right: 20px; + margin-left: 20px; +} + +/* Social Sidebar WeCoWi */ +#nav div li span.social { + padding-bottom: 6px; + padding-top: 6px; +} + +#nav div li#buffer span.social { + padding-left: 19px; +} + +#nav div li#facebook span span { + margin-left: -10px; + margin-top: -5px; +} + +#nav div li#facebook span.social { + height: 19px; +} + +#nav div li#twitter span.social iframe { + margin-left: 9px; +} + +#nav a.twitter-share-button { + font-weight: normal; + border: none; + padding: 0 0 0 10px; +} + +#nav li#google span.social, +#nav li#flattr span.social { + padding-left: 20px; +} diff --git a/mediawiki/skins/Cavendish/resources/extensions/jquery.wikiEditor.css b/mediawiki/skins/Cavendish/resources/extensions/jquery.wikiEditor.css new file mode 100644 index 0000000..e29393b --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/extensions/jquery.wikiEditor.css @@ -0,0 +1,12 @@ +div.wikiEditor-ui div.section { + padding-left: 0; +} + +div.wikiEditor-ui div.wikiEditor-ui-top { + font-size: 8.5pt; +} + +div.wikiEditor-ui div.wikiEditor-ui-tabs div { + font-size: 9pt; + padding-bottom: 1px; +} diff --git a/mediawiki/skins/Cavendish/resources/header.css b/mediawiki/skins/Cavendish/resources/header.css new file mode 100644 index 0000000..b274584 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/header.css @@ -0,0 +1,29 @@ +@import url('https://fonts.googleapis.com/css2?family=Comfortaa:wght@600;700&family=Quicksand:wght@400;500&display=swap'); + +#header #site-logo-link { + display: flex; + align-items: center; + gap: 10px; + text-decoration: none; +} + +#header #site-logo-link:hover, +#header #site-logo-link:focus { + text-decoration: none; +} + +#header #site-logo-link img { + width: 48px; + height: 48px; + display: block; + flex-shrink: 0; +} + +#site-name { + font-family: 'Comfortaa', sans-serif; + font-weight: 700; + font-size: 1.25rem; + color: #ffffff; + letter-spacing: -0.01em; + line-height: 1.2; +} diff --git a/mediawiki/skins/Cavendish/resources/images/audio.png b/mediawiki/skins/Cavendish/resources/images/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..ca609d40c82bc536725aac4e877cb8de4faa4d48 GIT binary patch literal 1464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%o&*>5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT-VtFWlg~VrW1CgG|37u|VHY&pf(~1RD?6IsxA(xEJ)Q4 zN-fSWElLK)N18HBGcfG%TLe-Fbd8mNQ6?}_5_4SglS^|`^GZBjY?XjAdMTMHRxWNP zmX5AwZpJP~24)t9h87miX3kD##)dBDW^NXSMldt5=`}JnH+BUna&s{>G;}qxa5eyj zo{_PexuLnCp`!^*uV-FyNn&1dD$L$YpuJGN26**aITxiSmgEa%LV#1QbCK|GK0WWtOF;xE1B+Du6@SDiezf3@j`R3=Pdq49uZE zcQZ3`vaoP+a&a+qGjVfMg6d5nC)D(Tj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53 z_~dX!iGhLfnWu|mNX4xq;qmS+jw13$Rh9Hk3)#B5tQXw-?FxIx3(aY&-JjJ?m*{?B7% z<72ZHW6E{#@whX2@29`gH+FnEz4>r>*5gA?49n+Fn^Bl3UjOsP7XNr1i^{qQ+G;N4Iy0_FtypnhSeP;EiS&lGC9#Wki}@Vb8KxuLsC(?b?UfZD zel0HWQI}^5>g&ksX_8&PzgZ1JYqu#CILwO=tUUHfk@L*Sq??LP zQae?$`CpZ{E1N0Ry|hki(qxO1n5)T~I$uEdxYHHB(2g3f!rPM%$a2{vYhJ7St~&90 zkKTz1lcfCACM)TNcEx(!xK(&|yX@^HkwprgGLJOFzs+ROGM*$Vb@{c=sUnsz2HwK~ zv!<;zo|v`pztObh%!)W4H^p_C)hc=xOvY3D0vF7i+{s;K>APxI-_B#M3t#_S&%n$e XT{mwbP0l+XkKeYXf* literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/body_back.gif b/mediawiki/skins/Cavendish/resources/images/body_back.gif new file mode 100644 index 0000000000000000000000000000000000000000..72a0d3ee6aa3df255245125b5fdca9287640951c GIT binary patch literal 526 zcmV+p0`dJvNk%w1VI}}u0K@+9<3>gnm}=;-L@=jZ0;=H=z( z|Ns900000000000A^8LW000~SEC2ui044xi000I5;3ke_X`X1Ru59bRa4gSSZQppV z?|kq7z#uO}EEin3mE$jQpf%+1ct4$;!n)YaD4(GA+$+}+;a z;Njxq;tb~J=;`X~?CtLF?hEqs^!4`l`1$(#`U?L400RmfNU)&6g9Z~QT*$DY!-o(f zN}MPWfyIj$Giuz(v7^V29uJ5dNwTELlPFV*s$9vkrOT8CV#=IJv!>0PICJXES)ixS zpFo2O9ZIyQ(V_&BDqYI7sne%Wqe`7hwJOvBShH%~%C)Q4uVBN99ZUABfU{`Rs$I*r zt=qS7(BTJr4xw7TUm@{kM Q%(=7Y&!9t#P8RW@!>v=h`%`VCU=#>qTakd|N}8hsiga^&mq$ zs3_iifCtfmUKG6eV4_Yu=uPo3)QLNI5EMM9;6?Gv)=m$@gMs9Gr7ZAOnUOlW(AO;H`4p{E-agux&hwwx6GW%3aXEHg#-x97RMmqBH#yXK?5 zT2IlaRSemrJNJN&P$2>~!a4};5hqZ>6g{V_kbQK`(qImPD=B*3sZzcdWLzJCc7}@^ zoCtv^Fi_xRL2d&)2RRn1D~hcPWvQ8hvC%8FV-m z>w!#PI|D&pH!LT*i3&6yuZn!@C^9wQwZUA56>AX>glsmQ%m^aS*CW?NJ}pV)a{6-n3axZlt~rUOxLQ zcH`jm%kj3W&5!fzukHk=KDOLz)hPPJ`=^IDuUo(2T8Wx%PR*V?K6Pp9vDKBHp&u(( z?4_2h8>gB974sbR+vLEN&Y4%|4ou9}9tySAfy&I?Ywr$?$EXKuw<))4H+M(VpUd{B Jx6+4?{|4(`X(a#v literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/envelope.png b/mediawiki/skins/Cavendish/resources/images/envelope.png new file mode 100644 index 0000000000000000000000000000000000000000..14824c7678ddae0f7bc47a0c6e519d7e6169cb7a GIT binary patch literal 1242 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 LwO^UezkKi?a!`|2 literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/headbg.jpg b/mediawiki/skins/Cavendish/resources/images/headbg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5491c6e4acbc576eb5397d1091fdd7ea7e03de00 GIT binary patch literal 7881 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 literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/header_logo.gif b/mediawiki/skins/Cavendish/resources/images/header_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..e00acf1e56e469bd4ace5dff5efef204bf8ea24a GIT binary patch literal 5162 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 literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/locked.png b/mediawiki/skins/Cavendish/resources/images/locked.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8169741e78fcc65e1e37d2d1dcf44439d2c2ec GIT binary patch literal 1261 zcmbVMTWs4@7PsV|Ia1MQ)JgeDjdln0(rH<@#X%z|4|Y>373<_N@7 zx-ts0P{~)G{R;MCn6IeGIX9O+%&VpzR6LzvS+@`x!+QJ5mZFY97axJ6njsLkE?y>Z zEiVv9deT(dO2DFauxi7h>VT|P$J9uk=sSS-mU(1AhpvK`^>M@D%L1`(mq&X~OcMCI ziaRC{8$spL89ZUy5bp_60hM9_&N4y3P!T5b7*11wA^}ZO;Q*lco-j`Vy#5f#o1HK4 zSy8I{LMMSJx~|2OWT{jNmO??(9wk8}5+Ny?r0D?C2sjnPRmuUw>1tRIp`+TG$6*d+NbBq`Vw3LhikfgZ;h1jD*QW%5*h%pUp%5Yr8P+`NbhWysC z)IG6$!iI`#+OlbmH##6wG+omvniifI>Iniot*DyeNxTAWS;s>7nk=eQk5v2is1aRObO?|f2Cy++dVn#yD)R&?ky=}T>DU--!T(j*eS0FD}Qz#!_pJez6n zx#v6QJAd=q^wbl(cMb1i7-n~IQZLgLByazn^c%HWztd%iOjOCNKS!Eoh?#NQuVYYj z&3RnLroH^)w|InMdK*rqN~)zNHOqH7GtuEn33Y~yBz6TPEX5C*R zS(Y;048aXbr7go=)JYUg86TSgk2uJ?ZW7mqc0|hfUmDwLN0sFO^JN_QOQA*UF}Jr1 zrn$SlqePLi(GG+TEsD9Q`___+JyO)OEWP1u$JTU1RL3VIBdrTiQV>#g*$X{5`N zp&+4aV>@gHW&}}|kznW$p$S1LK$<-vZOBMQXk6@Ki(W)b&%#~54)xo?!rNlCLWoV` zhZWyn>~_F(!zX^!@B>ho&2R{mOv~{SNm8KAcy$~)FJapVeHUzGSaY^v05b|@EsId@ zL~ckzUQzOST}Os!7;Fb?|DUY!lnkG=$A8+TE22G^Y`2=99=65@dvs<(Ivn2hZ_d-f z`mv~wSK`a{T8@#x_dVBob2kT9Z_N(fI(+=S-cJU0PWJw`JY0Q!;Qd!G-}UET`?P2F zwBM;c{AQYYyA9X8Bkjh@$yl&Xj>1F7-&nkV%{zL>BVXqBgI7+#p;LF;=hkx1zFdE3 zu+1Er={u^`F7x zg{x|XfBuH?%Ss0a`fh%8v3TmfoP1+oRXOsM=6*1qIR`cjn&N$?VQFYrDI%W0$&V+$=Vr;NHyKWQSya zGIP_N?1Q8QrG=E1QiAwkP$ATpLVZx7H0EK!77S`Ah<)m_2v!j6o8C!w(>{bgbYSM* zd+zzp&v(w5i=!iNr*H+($uu{ljBm>^TOo9F+!^#c!V zE6<-9s=}&YB2D{bJ0N52k-FKQHdTv1{uUUHG-kjd6obf_aYHT2^P6@xwvWXk4>nck zbe`V|YP>oMN?t&~kO0#rR1i>P0m)F6)uTXy2#QD&VK$ARHk8#M0^Nsa-U4e!lvhg(%6uIKoy&|8%yE>ZRM+zz&=YXBk&xs$*^Yc5P@7S7qcZ< zk)&?sh9VVnxnfb*ks%uf-^E(b!kWl}5##oFqFs6-)`RhOyZPB+dwht?W+q_6vHx)5 z4K`S76}?c8?oZ%Gvy%A0J~!K0>RTNA_T>Z8dhjmz zDAhUkOXtCZBlo_8N2?#dhol>8U#`6P=D!C!>L)As*uGPvzb3%mmkR6G7QVrsCx2hR za=E`SRbukC6!|Hjt`{N=vq4sh-E(oer}-wW|y NqEa5wZxkEn{|EYsdwu`_ literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/plus.png b/mediawiki/skins/Cavendish/resources/images/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5a7bf0e4470d4b2742e830c9d0738d635a2799 GIT binary patch literal 1241 zcmbVMTWB0r7@n}vByCcKR+>ahjuT5kyEEs^-lx0mUMAD5bYs{oxEL#$ojJ)4o4Ism z(w*$n8q;dUf>NRGdeep#ULBy7=vPHCDU)oZ^3MIZt!3!;gcqZA6K7>9vFmulN z&;R}Z_uuBk_}Ia|ErVMqit5Xb3VE^u@9ln+eC=B853&q6BSmMzn0Bg?g{hQclrYF@ z(hSaHNtr)#1;;7MS5^x}rKZv_LF`!{b0UNf!@?lMK)(#b2!w+S3c^@0wij>^K^Ac=jQA1cLlGV#(0XX%%~GcMydbuG zkyC;$JC4b-Y_(ctssYBZW>^%9#aPI(9Oow*etTYbB-gLo!)*%!wq;8-9o5i*XHhB{ zb54RLOxHuu%v^56ux_^!MN-DPlF1?lvYO__wWe)5dHgSpO||X9youR7wv9PUCiR#e zZi7kg9`49fBy9K>ER_^RniULrPQ$vB6%sVLVH8#21u+;)jfBO3z`<}7p=dM{&ZNTu zBt*hu6me}En_)vR#04Xf5GM){p%E^cfh2oeK#ZUWLaAUIo7HVc(q-KCs}jF0Z1AC2 zK4W3YF|2}N%(gpVylgmzT{cXRnFuim_trsYkIQT80MJGR&)+Fo2;b zVI2v=NGozN%%!8zbXpLQ7!*aig;oAf)>uM@_1fbw%})*+=LaN~2ER~W}82s4rt1tOr`x~nh1FMT?KJb0M^^sBE-TA@dn_JJmezWKA zd%O9Uwlz*qJ^fCAdanVS`te42;hf9K=k~+b&YYax+0@_a+;b_p54^er2hR5@7n{k+ zdTD5TgYrH9)YM~__ng1J^b<&ZcX?rDw6=7rGPGN*KYRbUGuR*7R$o4vKJmoirQdF) zn!l{>VB{c7FYAbo$+Sxv6bBe%F`zeLqwh zx3AInk1d}{KUdfP+WGjAUjHj!T)Tkxc7&e1!My!*?>*mjbY*DA;Xv`$%O8Grr(ZqU nH~36fxqMf;u**E_>+Gj)pPu|AQ+dC~``Khi#)MDPQw#q9^Ld%< literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/required.gif b/mediawiki/skins/Cavendish/resources/images/required.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd7197698e1cb85d97ddc5f047f44b22cd3a3b43 GIT binary patch literal 47 xcmZ?wbhEHbWMyDyXkcLY4@Cd}EB<6*WME)q&|v@qkPHJ8TTlOj({E!KtN{^=3!4A{ literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/speech-bubble-left-4.png b/mediawiki/skins/Cavendish/resources/images/speech-bubble-left-4.png new file mode 100644 index 0000000000000000000000000000000000000000..6608d22b622cc4f7e070c877d14423785733a7fb GIT binary patch literal 1323 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%o&*>5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT-VtFWlg~VrW1CgG|37u|VHY&pf(~1RD?6IsxA(xEJ)Q4 zN-fSWElLK)N18HBGcfG%TLe-Fbd8mNQ6?}_5_4SglS^|`^GZBjY?XjAdMTMHRxWNP zmX5AwZpJP~24)t9h87miX3kD##)dBDW^NXSMldt5>2-52~4kNUU5lcUUDkT-b|pqP`!?L^;$U>r6!i-7lq{K=fF}xKt_H^ zesM;Afr4|esh**NZ(?$09!LZfK@k7Cq!wkCrKY$Q<>xAZL)a=4iwg`)Ees3|%}or< zp+0vrGjg)9aB^~SF?2I=b5nxqO(7@L^ns4i2PF@r4 z&ZfA7UK=+FXwN;tV)oi^-|pGR*!i98jP;H6t)-8xO62ru2!F6!G5&yr1ViP~Jvl6Q zwtIMeDQUg#n!WGyYaI7GKCZ#wKNRSby?T;WSz)oMNW$j z?s<;&J@lVXRn-qmKgsE^f?0Dze}bJ|KPoi$Bety#KeX|1#mwp!s)wzV~CrJ2n!ZO(N#%dJE_QdBJS zS|+HaFNcDnq5|TP7o=!psh}W;^73*c$m!eaH}rgXK0e!XBmVluOKIm2_YsQ-#Lmu+ z-ELQ@RNLFz8jVJ;=~5^ZAPDNzomz;hRJ21%61dr6G#d3s3_mYYE@f+QAamu z>1vQ{Fc`F2t;6B4TCHZYS*O#f)oP2yVltWZdj0P1E(AeNr_*M$xm+$7h7tdjP@DU| zUc_JjeL{G^BV{?rh@<%FC-29e#t`O#7xot@+7dOFugUP1(({ted=jJ=y`IfxN%VQK zS7;)gmHp;zsTD536k>~tF@EpL%5fEyRd}5DhnkPIb@dI6wFjF%Hxr00t!;#T?HvG# zOrds?yy)FMjNZO}Cc}4##pVoiM@BgZzD-O{P0#T7Qyz1I`Gp_CpNk87mzGyV;?*^Y z$W12SP;71~K^3IdfT4PW(X?&0>{xAfhtsv|40Q7fMAC_)SkFVJA58m%VoH6ECp00u zTPJV#p z35S8=He}7|hrC{ru;X@H!pjvRd69x*WUli3D5bPVZ^0VB!67>;Z#(x+Xkzjy-7F;-5tl zZgGap&=Mm{GRMi!^_7m}f|G~YHj`3FNfiup@+~K1d_ppJ*yXUAAc=s>g<%&aL|WkP zkCtLQPXf}yeHWBctWOMTtmyDv^m=hX2C!Zdn5&FlFAXUPlf64phnAIvwF9#9h<>FE l7daUwuZaGImRDZf1msnhElN2)&g0ZZ^)>%jk9`oae*isoyLtcs literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/subsite_back.png b/mediawiki/skins/Cavendish/resources/images/subsite_back.png new file mode 100644 index 0000000000000000000000000000000000000000..11baba1792d5638b9266822f9dcefb41e67d9d9c GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^MnD|J!2~2re@(gwq*&4&eH|GX)}JtE?Rp91OP07s zlmzFem6RtIr7}3Chg4P45_&F=1L%EgM)zU#mJB8 z(jBd9vK7uML^zl?&G)yM{GdSIXZQNOpYrPFb)|$Z%3gOOCfP+tM`um_#=g&9DY~zx zop`lZebX`3O;Op6YgQ`x>ng8WIxQ+|C6I6n@z&jXB?w4t=vgr>O0Gq)H^W6)N{|}` fygt2`iHAYWMCG^myOkwCS21|H`njxgN@xNAAuv~- literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/subsite_mozilla-org.gif b/mediawiki/skins/Cavendish/resources/images/subsite_mozilla-org.gif new file mode 100644 index 0000000000000000000000000000000000000000..b18706fe106f5eb41704c694ed8c17df3c13ee80 GIT binary patch literal 2098 zcmV-22+j9LNk%w1VQv5!0QUd@yA%N8;@ITm&B~Hj6%M1Ss>H*V zJ3Kqp)X7T-0NK}@nwW3EzKWopa?Z`M{~Q4N`uh6%^tH5t@frZf$Ho{M8hZ)=ViO8O zN=pP47sbPk_89=ayob5Cgt)hZ#l^zz833aa0N&f4-P)hQ6aX^?0I~@HtEqbG833~r z0dorg^YinepmVMg0NB=?PXPeQ6#(8D0LR6f$HkDN2mk>90cZ;V4Gj&&6aa1x1D_E9 z8Ug^85CB^V09FYA{Tl%L8UW`R0P5$c=H#X5<)-7|qUGbH|0=BMG`pyJ@6n3ipo zlxvfcX_Ap>l#^|LpAS&&`zW?d{IYlfAo!nU`+W)0^t* z>b|{*%*vV6(U`x!iNwN{&(4*rs(a|@=&7iA($AK;w}qaZaM#tDvao=vsCk%|ZR_jn zzr2a4rg!7uq@<#CuC0B^#*o6li@dsrvax^n_xHH9gVoZR*3+8g;-tgDjNsm&Z|MMsqX8n;ohI`?5*G2o#El(#l)B3-Ja>`>EGO*@b0hi z?y&IfuJZ4&A^8LV00000EC2ui0B!&o000R80RIUbNU)&6g9sBUT*$DY!-D-HN}Ncs zqQ#3CGiuz(u_Hx(AVZ2ANwTELlPFWFT*-2zzn3s$%A85Frp=o;bL!kFv!2hNK!f`H z70!gEG-<~18ill}C8Oek37tx{s@1Dlug=@bwX4^y0V1qs7YDv=WWf zxEu1duHCy|hh*7m$d#e3IFR5S>@}X@!-x|b9;YUkEGEo$^h!bmf`@kyG^hchCdE0$ zphJsJtOx`T!yrIhigzjX=+}wi$(~KSw(L+TEI<*0!pVgi08&ZOp`^v;5;P>)Ue3IE z?GqqG$W9Fj9;DRHv)7i#y}S4C+>!17QX-{C4hX!XTyP?R$*xkw}6@iIE&g$cr=*az!1I*mwmPVAOFVj|g%?Vu=eDsbCjKCaL6-NP?n* z5;l-!$a zcEKY8T_C_Ck_wy&1_4YKs$>?3CaUP7h-#yR4giplLk?6NaKHemcwmH-2XsTsFfS-- z%Nc-Bg25SQU_c3~d}QIs84lq8fP({PIHIT`sA7->uC^e`Y8HH;iYNwv{E-D9XY|VG zvWe2s02a_jEA6xqoZ>?bB%~AN0VLGoff7(WQ3ba(=m3qhd6*Fb7896Z2DI)@fJG2y zECTH!X0#HmC+?mAZ3t%M0k0YIw)^hB6Pyt6vV)% zG0(ik3qQ*oM$r~WO)(0CM#b_Zz^PXql`5myxvB4MMhcEv4*>G^m5}aPTjt&qo zU=1l5tUwJ1Cyc*<7;k)mff!HOG zH2mQY48-68@5jFcj_-ru+dwY7=Y5ToG?Ka2qr zGhl=Ru7Scbnoxv;*Z@7&$i_Chu^JJ05CDuoM*t8(7Y`_h0SxefPZ(ehZVaR#2T906 z8uE~B+&}^bafBP>MS2YuM{ cp7_kCKKIEF&wl#zp8yT$KjpB7HUtC!JF;;GlK=n! literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/top-left.png b/mediawiki/skins/Cavendish/resources/images/top-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d78354a1419444be5016cc5a5443288b4d016d GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BZ!2~3W-Ym`sQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x?djqeQgQ3b#8|FF1_CXUOM?x# zj>!vry~zAR&}NhPC)bc)VcDv^kEFJXZRy?FaJuEd_QNR(pC;uVJ-^_)lA9~b;*Ob? z57%qR^tl%9wcnf1wX16GbMyOh5;Izh`x_Pobu~AYObO!BbdHKQd@tR8k55C1|H6yY z%dgL$-go1#U_q0l-dfe@Nh|7B2Tfh@HO1=ooXvMN?{1HK>^f=2#R^xK`)PZeT^Lqq c?_-f*NNev%+{Z2T9_VZaPgg&ebxsLQ07BSq<^TWy literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/top-mid.png b/mediawiki/skins/Cavendish/resources/images/top-mid.png new file mode 100644 index 0000000000000000000000000000000000000000..37d3276fe511d75de77ce6503407da239e175e1f GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O!2~4hKV8-UQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$J^>lFzskoK&>q{N;<^TVAeEv)R zGdBG5pFidC@&5%K%3q8O3>nT=eS0K6xo3^IFgrWDLjxlN&tBVi=7&78fCeyly85}S Ib4q9e0P4Xt%>V!Z literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/top-right.png b/mediawiki/skins/Cavendish/resources/images/top-right.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8c450b8392bccb26f1047b076df1186ca77a80 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BZ!2~3W-Ym`sQY`6?zK#qG>ra@ocD)2imbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%cyNAT)i~s$lQ<&srpG43l)}ivVWL(_4x6}6B}=TRp~M@?2-}{z0)!44DWwe zXTSD`H@|=1dAj44@-drpdso~IshS$Z%Ict5pQBMP#AsyBq8NBq-^6PFh1*NIOBQ~4 z^J4AS)9)DW6zsE6o0xHZ?KhX~WeGh$O+4+ld(+|7PI_f+B zc-ZnYsVmQB9-12UXsYw`#bM8vhP~aI^I?DW{OLW57cbs*y>0KUj`Le5+}P21{Qm4y zj~1VOyyD`sbyr_(d3}32R1zH zW917v@FRht;ixRX(S;d;%8m{Fsv##71eFdo^jrCKFeoxQ_VrtrINYeboa7^{Trfex zV1fF<8Tt_-3W<)+t&3QF?-Xo&)WXUqq2W{Ed7-6OOgNzA#)HNK*P2`|uTt&Wy!Q5X JR%Rv!YXF{{qdNcq literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/video.png b/mediawiki/skins/Cavendish/resources/images/video.png new file mode 100644 index 0000000000000000000000000000000000000000..5615e093b8da453506cd78dd91238697ee2e3320 GIT binary patch literal 1200 zcmbVMPi)&%7&i>6sbaez#)igfxvGR7@JP_mJw#

    E_hrWzyH=O9r-CJg@|%-55s!T}7joBQt-T z|B|6CQ)c!i3ZURBsAlyyJv7uTmW}4Pkv5sWU370K5d$^~bUL&r9A64$X2q^V_K}!l z=oOVw(OWNLN#^-9ll_u;aIgB9w8V?sAX?oNY&Wt!Vo}3H=+!y4rqu%0*lW`MB;G zq#h&PZ7|{P!HyzD5{)$AS)?fXgo=&2jhrB_$_%+-P0N&2O-N^Qq83+qAf_Npr4&)g zigBnWMJ)ySwvF|$IY9tgE+g<-PJ}SWrxZZg~vR8b=P};zrW?i6CWHF#@_De{$jS{RBYz(I%xN_F7(?7rXQ~uH;?sKNH z*fV)->{{R0so&1ME5q$?gkQaC@Xg5s^S-^~;=TJ1&;0WF@gsA?FLlj+yno^9eD>)( z{^K7l@8A5&^8ID%=)wln^~{dplXsuLS*+Zdz929CI`}Me?)7h*!+-wXgAW(KIXZTJ zr>PuSs$MlG6SLzdHXj_guxGyi`kOc2*=j5fJk&ugc0YM(`4hv4{vr8XQ9Y9#e(fJx C(3ztE literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/images/wiki_header_logo.gif b/mediawiki/skins/Cavendish/resources/images/wiki_header_logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac06c7bb1e1da8ad6ac497fd5581a32172b8546b GIT binary patch literal 4974 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 literal 0 HcmV?d00001 diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/action.edit.css b/mediawiki/skins/Cavendish/resources/mediawiki/action.edit.css new file mode 100644 index 0000000..f303e46 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/action.edit.css @@ -0,0 +1,10 @@ +#editpage-copywarn { + margin-top: 2em; + margin-bottom: 2em; + border-radius: 6px; + padding: 0.5em; +} + +input#wpSummary { + width: 80%; +} \ No newline at end of file diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/action.history.styles.css b/mediawiki/skins/Cavendish/resources/mediawiki/action.history.styles.css new file mode 100644 index 0000000..0d67a27 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/action.history.styles.css @@ -0,0 +1,36 @@ +/* the auto-generated edit comments */ +.autocomment { + color: #808080; +} + +#pagehistory span.user { + margin-left: 1.4em; + margin-right: 0.4em; +} + +#pagehistory span.minor { + font-weight: bold; +} + +#pagehistory li { + border: 1px solid #fff; + padding: 2px; + border-radius: 6px; +} + +#pagehistory li:focus, +#pagehistory li:hover { + box-shadow: 0 0 2px inset; +} + +#pagehistory li.selected { + background-color: #f9f9f9; + border: 1px dashed #aaa; + border-radius: 6px; + position: relative; +} + +span.updatedmarker { + /* color: black; */ + color: #00ff00; +} diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/action.view.filepage.css b/mediawiki/skins/Cavendish/resources/mediawiki/action.view.filepage.css new file mode 100644 index 0000000..d1b25d3 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/action.view.filepage.css @@ -0,0 +1,28 @@ +ul#filetoc { + text-align: center; + border: 1px solid #aaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 95%; + margin-bottom: 0.5em; + margin-left: 0; + margin-right: 0; + border-radius: 6px; +} + +#filetoc li { + display: inline; + list-style-type: none; + padding-right: 2em; +} + +table.filehistory { + overflow: scroll; + width: 100%; + font-size: 0.9em; +} + +table.mw_metadata { + margin-left: 0; + margin-top: 1em; +} diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/action.view.redirectPage.css b/mediawiki/skins/Cavendish/resources/mediawiki/action.view.redirectPage.css new file mode 100644 index 0000000..7641801 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/action.view.redirectPage.css @@ -0,0 +1,4 @@ +.redirectText { + font-size: 150%; + margin: 5px; +} \ No newline at end of file diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/diff.styles.css b/mediawiki/skins/Cavendish/resources/mediawiki/diff.styles.css new file mode 100644 index 0000000..1993265 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/diff.styles.css @@ -0,0 +1,31 @@ +table.diff { + background: #fff; +} + +td.diff-otitle { + background: #fff; +} + +td.diff-ntitle { + background: #fff; +} + +td.diff-addedline { + background: #cfc; + font-size: smaller; +} + +td.diff-deletedline { + background: #ffa; + font-size: smaller; +} + +td.diff-context { + background: #eee; + font-size: smaller; +} + +span.diffchange { + color: #f00; + font-weight: bold; +} diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/page.gallery.styles.css b/mediawiki/skins/Cavendish/resources/mediawiki/page.gallery.styles.css new file mode 100644 index 0000000..032f3d3 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/page.gallery.styles.css @@ -0,0 +1,33 @@ +table.gallery { + border: 1px solid #ccc; + margin: 2px; + padding: 2px; + background-color: #fff; +} + +table.gallery tr { + vertical-align: top; +} + +table.gallery td { + vertical-align: top; + background-color: #f9f9f9; + border: solid 2px #fff; +} + +div.gallerybox { + margin: 2px; + width: 150px; +} + +div.gallerybox div.thumb { + text-align: center; + border: 1px solid #ccc; + margin: 2px; +} + +div.gallerytext { + font-size: 94%; + padding: 2px 4px; + text-align: left; +} diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/special.changeslist.enhanced.css b/mediawiki/skins/Cavendish/resources/mediawiki/special.changeslist.enhanced.css new file mode 100644 index 0000000..ee37df5 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/special.changeslist.enhanced.css @@ -0,0 +1,19 @@ +#content table.mw-enhanced-rc { + margin-bottom: 0.1em; +} + +td.mw-enhanced-rc { + font-family: Verdana, "DejaVu Sans", sans-serif; + font-weight: normal; +} + +table.mw-enhanced-rc th, +table.mw-enhanced-rc td { + vertical-align: middle; +} + +td.mw-enhanced-rc .newpage, +td.mw-enhanced-rc .minoredit, +td.mw-enhanced-rc .botedit { + font-weight: normal; +} \ No newline at end of file diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/special.version.css b/mediawiki/skins/Cavendish/resources/mediawiki/special.version.css new file mode 100644 index 0000000..69ec0f9 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/special.version.css @@ -0,0 +1,37 @@ +table#sv-ext, +table#sv-hooks, +table#sv-software, +table#mw-version-entrypoints-table, +.mw-special-Version #mw-content-text table { + padding: 0; +} + +#sv-ext td, +#sv-hooks td, +#sv-software td, +#sv-ext th, +#sv-hooks th, +#sv-software th, +.mw-special-Version #bodyContent td, +.mw-special-Version #bodyContent th { + border: 1px solid #a0a0a0; + padding: 0.1em 0.2em 0.1em 0.2em; +} + +#sv-ext th, +#sv-hooks th, +#sv-software th, +.mw-special-Version #bodyContent th { + background-color: #f0f0f0; + color: #000; + padding: 0.1em 0.2em 0.1em 0.2em; +} + +tr.sv-space { + height: 0.8em; + border: none; +} + +tr.sv-space td { + display: none; +} \ No newline at end of file diff --git a/mediawiki/skins/Cavendish/resources/mediawiki/toc.css b/mediawiki/skins/Cavendish/resources/mediawiki/toc.css new file mode 100644 index 0000000..e409b82 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/mediawiki/toc.css @@ -0,0 +1,56 @@ +/* Table of Contents */ +#toc, +.toc, +.mw-warning { + border: 1px solid #aaa; + background-color: #f9f9f9; + padding: 5px; + font-size: 9pt; + border-radius: 6px; + box-shadow: 1px 1px 1px grey; +} + +#toc, +.toc { + display: inline-block; +} + +#toctitle h2 { + display: inline; + border: none; + padding: 0; + font-size: 9.5pt; + 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-left: 0; + text-align: left; +} + +#toc ul ul, +.toc ul ul { + margin: 0 0 0 2em; +} + +#toctitle .toctoggle { + font-size: 8pt; +} + +.toccolours { + background-color: #f9f9f9; + border: 1px solid #aaa; + font-size: 95%; + padding: 5px; +} diff --git a/mediawiki/skins/Cavendish/resources/print.css b/mediawiki/skins/Cavendish/resources/print.css new file mode 100644 index 0000000..a77b238 --- /dev/null +++ b/mediawiki/skins/Cavendish/resources/print.css @@ -0,0 +1,76 @@ +/* Stylesheet for printing */ +body { + margin-left: 5em; + margin-right: 5em; + font-size: 11pt; +} + +#p-personal, +#side, +#header, +#skin-info, +#f-numberofwatchingusers, +#f-viewcount, +#f-privacy, +#f-about, +#f-disclaimer { + display: none; +} + +.f-iconsection #f-copyrightico { + display: block; +} + +#qrcode { + display: block; + margin-left: 10px; + text-align:right; +} + +#footer #f-list li { + white-space: normal; +} + +#footer li { + list-style-type: none; +} + +#footer table { + width: 100%; +} + +#catlinks { + border-top: 1px solid #aaa; + margin-top: 1em; + padding-top: 1em; +} + +#catlinks ul li { + font-style: italic; +} + +table.float-right, +table.floatright, +div.float-right, +div.floatright { + clear: right; + float: right; + margin-left: 0.7em; + margin-right: 0; + position: relative; +} + +table.float-left, +table.floatleft, +div.float-left, +div.floatleft { + clear: left; + float: left; + margin-right: 0.7em; + margin-left: 0; + position: relative; +} + +table p { + margin: 0; +} diff --git a/mediawiki/skins/Cavendish/skin.json b/mediawiki/skins/Cavendish/skin.json new file mode 100644 index 0000000..87c3835 --- /dev/null +++ b/mediawiki/skins/Cavendish/skin.json @@ -0,0 +1,213 @@ +{ + "name": "Cavendish", + "author": [ + "Daniel Schuba", + "Jack Phoenix", + "Samantha Nguyen", + "Jon Robson" + ], + "version": "3.0.0", + "@note": "Remember to update the version number in CavendishTemplate.php, too, since it's passed to the \"cavendish-skin-info\" i18n message!", + "url": "https://www.mediawiki.org/wiki/Skin:Cavendish", + "descriptionmsg": "cavendish-desc", + "namemsg": "skinname-cavendish", + "license-name": "GPL-2.0-or-later", + "type": "skin", + "requires": { + "MediaWiki": ">= 1.41.0" + }, + "ConfigRegistry": { + "cavendish": "MediaWiki\\Config\\GlobalVarConfig::newInstance" + }, + "config": { + "CavendishQRUrlAdd": "?pk_campaign=qr-code", + "CavendishQRCode": false, + "CavendishQRCodeMode": "all", + "CavendishSiteWidth": false, + "CavendishSidebarSearchbox": false + }, + "ValidSkinNames": { + "cavendish": { + "class": "SkinTemplate", + "args": [ + { + "name": "cavendish", + "bodyOnly": true, + "template": "CavendishTemplate", + "styles": [ + "skins.cavendish", + "skins.cavendish.blue" + ] + } + ] + }, + "cavendish-brown": { + "class": "SkinTemplate", + "args": [ + { + "name": "cavendish-brown", + "template": "CavendishTemplate", + "styles": [ + "skins.cavendish", + "skins.cavendish.brown" + ] + } + ] + }, + "cavendish-green": { + "class": "SkinTemplate", + "args": [ + { + "name": "cavendish-green", + "template": "CavendishTemplate", + "styles": [ + "skins.cavendish", + "skins.cavendish.green" + ] + } + ] + } + }, + "MessagesDirs": { + "Cavendish": [ + "i18n" + ] + }, + "ResourceModules": { + "skins.cavendish": { + "class": "MediaWiki\\ResourceLoader\\SkinModule", + "features": [ + "elements", + "interface", + "logo", + "content-links", + "content-media", + "interface-message-box", + "interface-category", + "content-tables", + "i18n-ordered-lists", + "i18n-all-lists-margins", + "i18n-headings" + ], + "styles": { + "resources/cavendish.css": { + "media": "screen" + }, + "resources/header.css": { + "media": "screen" + }, + "resources/print.css": { + "media": "print" + }, + "resources/dynamic.css": true + } + }, + "skins.cavendish.extensions": { + "styles": { + "resources/extensions/extensions.css": { + "media": "screen" + } + } + }, + "skins.cavendish.blue": { + "styles": { + "resources/colors/blue.css": { + "media": "screen" + } + } + }, + "skins.cavendish.brown": { + "styles": { + "resources/colors/brown.css": { + "media": "screen" + } + } + }, + "skins.cavendish.green": { + "styles": { + "resources/colors/green.css": { + "media": "screen" + } + } + } + }, + "ResourceFileModulePaths": { + "localBasePath": "", + "remoteSkinPath": "Cavendish" + }, + "AutoloadClasses": { + "CavendishTemplate": "CavendishTemplate.php" + }, + "ResourceModuleSkinStyles": { + "cavendish-brown": { + "+ext.babel": "resources/extensions/babel.css", + "+ext.cite.style": "resources/extensions/ext.cite.style.css", + "+ext.echo.styles.badge": "resources/extensions/ext.echo.styles.badge.css", + "+ext.flaggedRevs.basic": "resources/extensions/ext.flaggedRevs.basic.css", + "+ext.inputBox.styles": "resources/extensions/ext.inputBox.styles.css", + "+ext.liquidThreads": "resources/extensions/ext.liquidThreads.css", + "+ext.openid.plain": "resources/extensions/ext.openid.plain.css", + "+ext.pageforms.main": "resources/extensions/ext.pageforms.main.css", + "+ext.pygments": "resources/extensions/ext.pygments.css", + "+ext.semanticdrilldown.main": "resources/extensions/ext.semanticdrilldown.main.css", + "+ext.smw.style": "resources/extensions/ext.smw.style.css", + "+jquery.wikiEditor": "resources/extensions/jquery.wikiEditor.css", + "+mediawiki.action.edit": "resources/mediawiki/action.edit.css", + "+mediawiki.action.history.styles": "resources/mediawiki/action.history.styles.css", + "+mediawiki.action.view.filepage": "resources/mediawiki/action.view.filepage.css", + "+mediawiki.action.view.redirectPage": "resources/mediawiki/action.view.redirectPage.css", + "+mediawiki.diff.styles": "resources/mediawiki/diff.styles.css", + "+mediawiki.page.gallery.styles": "resources/mediawiki/page.gallery.styles.css", + "+mediawiki.special.changeslist.enhanced": "resources/mediawiki/special.changeslist.enhanced.css", + "+mediawiki.special.version": "resources/mediawiki/special.version.css", + "+mediawiki.toc": "resources/mediawiki/toc.css" + }, + "cavendish-green": { + "+ext.babel": "resources/extensions/babel.css", + "+ext.cite.style": "resources/extensions/ext.cite.style.css", + "+ext.echo.styles.badge": "resources/extensions/ext.echo.styles.badge.css", + "+ext.flaggedRevs.basic": "resources/extensions/ext.flaggedRevs.basic.css", + "+ext.inputBox.styles": "resources/extensions/ext.inputBox.styles.css", + "+ext.liquidThreads": "resources/extensions/ext.liquidThreads.css", + "+ext.openid.plain": "resources/extensions/ext.openid.plain.css", + "+ext.pageforms.main": "resources/extensions/ext.pageforms.main.css", + "+ext.pygments": "resources/extensions/ext.pygments.css", + "+ext.semanticdrilldown.main": "resources/extensions/ext.semanticdrilldown.main.css", + "+ext.smw.style": "resources/extensions/ext.smw.style.css", + "+jquery.wikiEditor": "resources/extensions/jquery.wikiEditor.css", + "+mediawiki.action.edit": "resources/mediawiki/action.edit.css", + "+mediawiki.action.history.styles": "resources/mediawiki/action.history.styles.css", + "+mediawiki.action.view.filepage": "resources/mediawiki/action.view.filepage.css", + "+mediawiki.action.view.redirectPage": "resources/mediawiki/action.view.redirectPage.css", + "+mediawiki.diff.styles": "resources/mediawiki/diff.styles.css", + "+mediawiki.page.gallery.styles": "resources/mediawiki/page.gallery.styles.css", + "+mediawiki.special.changeslist.enhanced": "resources/mediawiki/special.changeslist.enhanced.css", + "+mediawiki.special.version": "resources/mediawiki/special.version.css", + "+mediawiki.toc": "resources/mediawiki/toc.css" + }, + "cavendish": { + "+ext.babel": "resources/extensions/babel.css", + "+ext.cite.style": "resources/extensions/ext.cite.style.css", + "+ext.echo.styles.badge": "resources/extensions/ext.echo.styles.badge.css", + "+ext.flaggedRevs.basic": "resources/extensions/ext.flaggedRevs.basic.css", + "+ext.inputBox.styles": "resources/extensions/ext.inputBox.styles.css", + "+ext.liquidThreads": "resources/extensions/ext.liquidThreads.css", + "+ext.openid.plain": "resources/extensions/ext.openid.plain.css", + "+ext.pageforms.main": "resources/extensions/ext.pageforms.main.css", + "+ext.pygments": "resources/extensions/ext.pygments.css", + "+ext.semanticdrilldown.main": "resources/extensions/ext.semanticdrilldown.main.css", + "+ext.smw.style": "resources/extensions/ext.smw.style.css", + "+jquery.wikiEditor": "resources/extensions/jquery.wikiEditor.css", + "+mediawiki.action.edit": "resources/mediawiki/action.edit.css", + "+mediawiki.action.history.styles": "resources/mediawiki/action.history.styles.css", + "+mediawiki.action.view.filepage": "resources/mediawiki/action.view.filepage.css", + "+mediawiki.action.view.redirectPage": "resources/mediawiki/action.view.redirectPage.css", + "+mediawiki.diff.styles": "resources/mediawiki/diff.styles.css", + "+mediawiki.page.gallery.styles": "resources/mediawiki/page.gallery.styles.css", + "+mediawiki.special.changeslist.enhanced": "resources/mediawiki/special.changeslist.enhanced.css", + "+mediawiki.special.version": "resources/mediawiki/special.version.css", + "+mediawiki.toc": "resources/mediawiki/toc.css" + } + }, + "manifest_version": 1 +} diff --git a/package.json b/package.json index e901878..423f165 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,10 @@ "dev": "pwsh -ExecutionPolicy Bypass -File ./scripts/dev.ps1", "a11y:pa11y": "pa11y-ci --config ./tests/accessibility/pa11y.config.json", "a11y:lighthouse": "lhci autorun --config=./tests/accessibility/lighthouserc.json", - "a11y:all": "npm run a11y:pa11y && npm run a11y:lighthouse" + "a11y:all": "npm run a11y:pa11y && npm run a11y:lighthouse", + "deploy": "pwsh -ExecutionPolicy Bypass -File ./scripts/deploy.ps1 -Mode skin", + "deploy:all": "pwsh -ExecutionPolicy Bypass -File ./scripts/deploy.ps1 -Mode all", + "deploy:initial": "pwsh -ExecutionPolicy Bypass -File ./scripts/deploy.ps1 -Mode initial" }, "devDependencies": { "@lhci/cli": "^0.14.0", diff --git a/scripts/deploy.ps1 b/scripts/deploy.ps1 new file mode 100644 index 0000000..bce9c11 --- /dev/null +++ b/scripts/deploy.ps1 @@ -0,0 +1,153 @@ +<# +.SYNOPSIS + Deployt GPLX MediaWiki auf den Bitpalast-Server. + +.PARAMETER Mode + skin - Cavendish-Skin synchronisieren (Standard, schnell) + templates - Wiki-Seiten-Vorlagen synchronisieren + all - Skin + Templates + initial - Erstinstallation: gesamten MediaWiki-Core übertragen + +.EXAMPLE + .\deploy.ps1 # Skin deployen + .\deploy.ps1 -Mode all # Skin + Templates + .\deploy.ps1 -Mode initial +#> +param( + [ValidateSet('skin', 'templates', 'all', 'initial')] + [string]$Mode = 'skin' +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +# === Config laden === +$envFile = Join-Path $PSScriptRoot '..' '.deploy.env' +if (-not (Test-Path $envFile)) { + Write-Error @" +.deploy.env nicht gefunden. +Kopiere .deploy.example.env zu .deploy.env und trage deine Zugangsdaten ein. +"@ + exit 1 +} + +Get-Content $envFile | ForEach-Object { + if ($_ -match '^\s*([^#][^=]+)=(.*)$') { + [System.Environment]::SetEnvironmentVariable($Matches[1].Trim(), $Matches[2].Trim(), 'Process') + } +} + +$deployHost = $env:DEPLOY_HOST +$deployUser = $env:DEPLOY_USER +$mwPath = $env:DEPLOY_MW_PATH +$projectPath = $env:DEPLOY_PROJECT_PATH +$target = "${deployUser}@${deployHost}" + +foreach ($var in @('DEPLOY_HOST','DEPLOY_USER','DEPLOY_MW_PATH')) { + if (-not [System.Environment]::GetEnvironmentVariable($var, 'Process')) { + Write-Error "$var ist nicht in .deploy.env gesetzt." + exit 1 + } +} + +# === WSL rsync oder scp === +$hasWsl = $null -ne (Get-Command 'wsl' -ErrorAction SilentlyContinue) + +function ConvertTo-WslPath([string]$winPath) { + $abs = [System.IO.Path]::GetFullPath($winPath) + $drive = $abs.Substring(0, 1).ToLower() + $rest = $abs.Substring(2).Replace('\', '/') + return "/mnt/$drive$rest" +} + +function Sync-Dir([string]$localDir, [string]$remoteDir, [bool]$delete = $false) { + Write-Host " $localDir" -ForegroundColor DarkGray + Write-Host " -> ${target}:${remoteDir}" -ForegroundColor DarkGray + + if ($hasWsl) { + $wslSrc = (ConvertTo-WslPath $localDir) + '/' + $rsyncArgs = @('-az', '--progress') + if ($delete) { $rsyncArgs += '--delete' } + $rsyncArgs += $wslSrc + $rsyncArgs += "${target}:${remoteDir}/" + wsl rsync @rsyncArgs + } else { + # Fallback: scp (kein automatisches Loeschen von Remotedateien) + Write-Warning "WSL nicht gefunden – nutze scp. Geloeschte lokale Dateien bleiben auf dem Server." + ssh $target "mkdir -p '$remoteDir'" + scp -r "${localDir}\." "${target}:${remoteDir}/" + } + + if ($LASTEXITCODE -ne 0) { + Write-Error "Uebertragung fehlgeschlagen (Exit $LASTEXITCODE)." + exit $LASTEXITCODE + } +} + +$repoRoot = Split-Path $PSScriptRoot + +# === Deploy-Modi === +switch ($Mode) { + + 'skin' { + Write-Host "Deploye Cavendish-Skin..." -ForegroundColor Cyan + Sync-Dir "$repoRoot\mediawiki\skins\Cavendish" "$mwPath/skins/Cavendish" -delete $true + Write-Host "Fertig." -ForegroundColor Green + } + + 'templates' { + if (-not $projectPath) { + Write-Error "DEPLOY_PROJECT_PATH muss in .deploy.env gesetzt sein." + exit 1 + } + Write-Host "Deploye Wiki-Templates..." -ForegroundColor Cyan + Sync-Dir "$repoRoot\scripts\templates" "$projectPath/scripts/templates" + Write-Host "Fertig." -ForegroundColor Green + } + + 'all' { + Write-Host "Deploye Skin + Templates..." -ForegroundColor Cyan + Sync-Dir "$repoRoot\mediawiki\skins\Cavendish" "$mwPath/skins/Cavendish" -delete $true + if ($projectPath) { + Sync-Dir "$repoRoot\scripts\templates" "$projectPath/scripts/templates" + } + Write-Host "Fertig." -ForegroundColor Green + } + + 'initial' { + Write-Host "Erstinstallation – uebertraege MediaWiki-Core..." -ForegroundColor Yellow + Write-Host "Das kann einige Minuten dauern." -ForegroundColor DarkGray + + $excludes = @( + '--exclude=.git', + '--exclude=vendor/', + '--exclude=images/', + '--exclude=cache/', + '--exclude=LocalSettings.php' + ) + + if ($hasWsl) { + $wslSrc = (ConvertTo-WslPath "$repoRoot\mediawiki") + '/' + $rsyncArgs = @('-az', '--progress') + $excludes + @($wslSrc, "${target}:${mwPath}/") + wsl rsync @rsyncArgs + } else { + Write-Warning "Fuer die Erstinstallation wird WSL empfohlen (grosse Datenmenge)." + Write-Warning "Alternative: WinSCP GUI verwenden oder WSL installieren." + exit 1 + } + + Write-Host "" + Write-Host "Erstinstallation abgeschlossen." -ForegroundColor Green + Write-Host "" + Write-Host "Naechste Schritte auf dem Server:" -ForegroundColor Yellow + Write-Host " 1. LocalSettings.php anlegen:" + Write-Host " Vorlage: mediawiki/LocalSettings.production.example.php" + Write-Host " 2. Composer-Abhaengigkeiten installieren:" + Write-Host " cd $mwPath && composer install --no-dev" + Write-Host " 3. Datenbank einrichten:" + Write-Host " php maintenance/run.php install ..." + Write-Host " oder: Dump importieren mit mysql -u user -p dbname < dump.sql" + Write-Host " 4. SMW initialisieren:" + Write-Host " php maintenance/run.php setupStore" + } +} diff --git a/scripts/templates/Cat_Clinical.wiki b/scripts/templates/Cat_Clinical.wiki new file mode 100644 index 0000000..c9bd48d --- /dev/null +++ b/scripts/templates/Cat_Clinical.wiki @@ -0,0 +1,11 @@ +Pages in this category cover clinical evaluation, clinical performance, post-market clinical follow-up (PMCF), and post-market performance follow-up (PMPF). + +== Pages in this category == + +{{#ask: [[Category:Clinical]] +| ?Document name = Name +| ?Scope = Scope +| format=table +| headers=show +| limit=50 +}} diff --git a/scripts/templates/Cat_IVD.wiki b/scripts/templates/Cat_IVD.wiki new file mode 100644 index 0000000..f8922ae --- /dev/null +++ b/scripts/templates/Cat_IVD.wiki @@ -0,0 +1,22 @@ +Pages in this category cover regulatory documents and references in the In Vitro Diagnostics (IVD) scope. + +== Documents == + +{{#ask: [[Category:In Vitro Diagnostics]] [[Status::+]] +| ?Document name = Name +| ?Status = Status +| ?Area of validity = Region +| ?Version = Version +| format=table +| headers=show +| limit=50 +| sort=Status +}} + +== Browse by topic == + +* [[:Category:Clinical|Clinical]] +* [[:Category:Post-Market Surveillance|Post-Market Surveillance]] +* [[:Category:Labelling|Labelling]] +* [[:Category:Traceability|Traceability]] +* [[:Category:Performance Evaluation|Performance Evaluation]] diff --git a/scripts/templates/Cat_Labelling.wiki b/scripts/templates/Cat_Labelling.wiki new file mode 100644 index 0000000..2ca4dfe --- /dev/null +++ b/scripts/templates/Cat_Labelling.wiki @@ -0,0 +1,11 @@ +Pages in this category cover labelling requirements, UDI carriers, and packaging obligations. + +== Pages in this category == + +{{#ask: [[Category:Labelling]] +| ?Document name = Name +| ?Scope = Scope +| format=table +| headers=show +| limit=50 +}} diff --git a/scripts/templates/Cat_MedicalDevices.wiki b/scripts/templates/Cat_MedicalDevices.wiki new file mode 100644 index 0000000..df24770 --- /dev/null +++ b/scripts/templates/Cat_MedicalDevices.wiki @@ -0,0 +1,21 @@ +Pages in this category cover regulatory documents and references in the Medical Devices (MD) scope. + +== Documents == + +{{#ask: [[Category:Medical Devices]] [[Status::+]] +| ?Document name = Name +| ?Status = Status +| ?Area of validity = Region +| ?Version = Version +| format=table +| headers=show +| limit=50 +| sort=Status +}} + +== Browse by topic == + +* [[:Category:Clinical|Clinical]] +* [[:Category:Post-Market Surveillance|Post-Market Surveillance]] +* [[:Category:Labelling|Labelling]] +* [[:Category:Traceability|Traceability]] diff --git a/scripts/templates/Cat_PostMarket.wiki b/scripts/templates/Cat_PostMarket.wiki new file mode 100644 index 0000000..86db301 --- /dev/null +++ b/scripts/templates/Cat_PostMarket.wiki @@ -0,0 +1,11 @@ +Pages in this category cover post-market surveillance (PMS), post-market clinical follow-up (PMCF), post-market performance follow-up (PMPF), and periodic safety update reports (PSUR). + +== Pages in this category == + +{{#ask: [[Category:Post-Market Surveillance]] +| ?Document name = Name +| ?Scope = Scope +| format=table +| headers=show +| limit=50 +}} diff --git a/scripts/templates/DocumentIndex.wiki b/scripts/templates/DocumentIndex.wiki new file mode 100644 index 0000000..c44e524 --- /dev/null +++ b/scripts/templates/DocumentIndex.wiki @@ -0,0 +1,70 @@ +This page lists all regulatory documents in this wiki. Use the sections below to browse by status or scope. + +== Current documents == + +{{#ask: [[Status::Current]] +| ?Document name = Name +| ?Scope = Scope +| ?Area of validity = Region +| ?Document type = Type +| format=table +| headers=show +| limit=100 +| sort=Scope +}} + +== Grouped by scope == + +=== Medical Devices (MD) === + +{{#ask: [[Scope::~*MD*]] +| ?Document name = Name +| ?Status = Status +| ?Area of validity = Region +| format=table +| headers=show +| limit=50 +}} + +=== In Vitro Diagnostics (IVD) === + +{{#ask: [[Scope::~*IVD*]] +| ?Document name = Name +| ?Status = Status +| ?Area of validity = Region +| format=table +| headers=show +| limit=50 +}} + +=== GMP / PV / NIS === + +{{#ask: [[Scope::~*GMP*]] OR [[Scope::~*PV*]] OR [[Scope::~*NIS*]] +| ?Document name = Name +| ?Scope = Scope +| ?Status = Status +| format=table +| headers=show +| limit=50 +}} + +== Draft and not yet promulgated == + +{{#ask: [[Status::Draft]] OR [[Status::Final not promulgated]] +| ?Document name = Name +| ?Scope = Scope +| ?Area of validity = Region +| format=table +| headers=show +| limit=50 +}} + +== Superseded == + +{{#ask: [[Status::Superseded]] +| ?Document name = Name +| ?Scope = Scope +| format=table +| headers=show +| limit=50 +}} diff --git a/scripts/templates/IVDR_MainPage.wiki b/scripts/templates/IVDR_MainPage.wiki new file mode 100644 index 0000000..142ec40 --- /dev/null +++ b/scripts/templates/IVDR_MainPage.wiki @@ -0,0 +1,45 @@ +{{RegDocument +| area_of_validity = EU +| scope = IVD +| document_type = Regulation +| name = In Vitro Diagnostic Medical Devices Regulation (EU) 2017/746 +| version = 2017/746, amended by 2022/1107 +| source = https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0746 +| language = EN, DE, FR (all EU official languages) +| status = Current +| restricted_access = No +}} + +The In Vitro Diagnostic Medical Devices Regulation (IVDR) 2017/746 replaces the former IVD Directive (IVDD 98/79/EC). It introduces a significantly stricter framework for in vitro diagnostic medical devices, including reclassification of the majority of IVDs into higher risk classes requiring Notified Body involvement. + +Full application started on 26 May 2022. The amendment 2022/1107 introduced a phased transition for legacy devices based on device class and Notified Body capacity. + +== Key references == + +{| class="wikitable" style="width:100%;" +! Topic / Keyword(s) !! Category / Chapter !! Scope !! Linked document !! Description +{{Reference +| topic = Post-market performance follow-up, PMPF +| category = Clinical +| scope = IVD +| linked_document = [[IVDR (EU) 2017/746 – Articles 78–81 & Annex XIII Part B: Post-Market Performance Follow-Up]] +| description = Articles 78–81 and Annex XIII Part B define the mandatory post-market performance follow-up (PMPF) system, equivalent to PMCF under MDR. +}} +{{Reference +| topic = Unique Device Identification, UDI, Traceability +| category = Labelling +| scope = IVD +| linked_document = [[IVDR (EU) 2017/746 – Articles 24–26 & Annex VI: UDI]] +| description = Articles 24–26 and Annex VI establish the UDI system for IVDs, aligned with the MDR UDI framework. +}} +{{Reference +| topic = Performance evaluation, Scientific validity +| category = Clinical +| scope = IVD +| linked_document = [[IVDR (EU) 2017/746 – Article 56 & Annex XIII Part A: Performance Evaluation]] +| description = Article 56 and Annex XIII Part A define performance evaluation requirements, including analytical performance, clinical performance, and scientific validity. +}} +|} + +[[Category:In Vitro Diagnostics]] +[[Category:EU Regulation]] diff --git a/scripts/templates/MainPage.wiki b/scripts/templates/MainPage.wiki new file mode 100644 index 0000000..feae9f4 --- /dev/null +++ b/scripts/templates/MainPage.wiki @@ -0,0 +1,44 @@ +This wiki is a structured reference database for regulatory documents in the medical devices, in vitro diagnostics, and pharmaceutical sectors. Each document is stored with standardized metadata (scope, validity status, region, official source) and linked to individual pages for its key articles, annexes, and provisions, organized by topic. + +The database currently covers regulations, directives, and guidelines in the MD, IVD, GMP, PV, and NIS scopes. Cross-references between equivalent provisions in different regulations are maintained explicitly, for example between MDR and IVDR requirements on post-market surveillance or UDI. + +Structured queries are available on the [[Document_Index|Document Index]] and on each category page. Use [[Special:Ask|Special:Ask]] for custom queries across any combination of scope, status, region, or topic. + +All registered users can contribute. New pages require reviewer approval before becoming publicly visible. + +== Quick navigation == + +{| style="width:100%; border-collapse:collapse;" +|- +| style="width:33%; vertical-align:top; padding:0 1em 1em 0;" | +=== By document === +* [[Document_Index|All documents]] +* [[Special:RecentChanges|Recent changes]] +* [[Special:Ask|Custom query]] + +| style="width:33%; vertical-align:top; padding:0 1em 1em 0;" | +=== By scope === +* [[:Category:Medical Devices|Medical Devices (MD)]] +* [[:Category:In Vitro Diagnostics|In Vitro Diagnostics (IVD)]] + +| style="width:33%; vertical-align:top; padding:0 1em 1em 0;" | +=== By topic === +* [[:Category:Clinical|Clinical]] +* [[:Category:Post-Market Surveillance|Post-Market Surveillance]] +* [[:Category:Labelling|Labelling]] +* [[:Category:Traceability|Traceability]] +|} + +== Current documents == + +{{#ask: [[Status::Current]] +| ?Document name = Name +| ?Scope = Scope +| ?Area of validity = Region +| format=table +| headers=show +| limit=10 +| sort=Scope +}} + +[[Document_Index|View all documents →]] diff --git a/scripts/templates/Properties.wiki b/scripts/templates/Properties.wiki new file mode 100644 index 0000000..5bec5ae --- /dev/null +++ b/scripts/templates/Properties.wiki @@ -0,0 +1 @@ +PROPERTIES_BATCH \ No newline at end of file diff --git a/scripts/templates/Ref_IVDR_PMPF.wiki b/scripts/templates/Ref_IVDR_PMPF.wiki new file mode 100644 index 0000000..1ac252d --- /dev/null +++ b/scripts/templates/Ref_IVDR_PMPF.wiki @@ -0,0 +1,34 @@ +{{RegDocument +| area_of_validity = EU +| scope = IVD +| document_type = Regulation – Article Reference +| name = IVDR (EU) 2017/746 – Articles 78–81 & Annex XIII Part B: Post-Market Performance Follow-Up +| version = 2017/746 +| source = https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0746#d1e6179-1-1 +| language = EN, DE, FR +| status = Current +| restricted_access = No +}} + +Articles 78 to 81 and Annex XIII Part B of the IVDR establish the mandatory post-market performance follow-up (PMPF) system for IVD manufacturers. PMPF is the IVD equivalent of PMCF under the MDR. + +== Summary == + +Manufacturers must proactively collect and evaluate data from devices already on the market to confirm safety, performance, and scientific validity throughout the device lifetime. + +Key obligations: + +* Article 78 – General post-market surveillance requirements +* Article 79 – Post-market surveillance plan +* Article 80 – Post-market surveillance report (Class A and B devices) +* Article 81 – Periodic Safety Update Report (PSUR, Class C and D devices) +* Annex XIII Part B – PMPF plan and PMPF evaluation report requirements + +== Related documents == + +* [[In Vitro Diagnostic Medical Devices Regulation (EU) 2017/746]] – Parent document +* [[MDR 2017/745 – Articles 83–86 & Annex XIV Part B: Post-Market Surveillance and PMCF]] – Equivalent provision for medical devices + +[[Category:In Vitro Diagnostics]] +[[Category:Post-Market Surveillance]] +[[Category:Clinical]] diff --git a/scripts/templates/Ref_IVDR_PerfEval.wiki b/scripts/templates/Ref_IVDR_PerfEval.wiki new file mode 100644 index 0000000..06f71e9 --- /dev/null +++ b/scripts/templates/Ref_IVDR_PerfEval.wiki @@ -0,0 +1,36 @@ +{{RegDocument +| area_of_validity = EU +| scope = IVD +| document_type = Regulation – Article Reference +| name = IVDR (EU) 2017/746 – Article 56 & Annex XIII Part A: Performance Evaluation +| version = 2017/746 +| source = https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0746#d1e4774-1-1 +| language = EN, DE, FR +| status = Current +| restricted_access = No +}} + +Article 56 and Annex XIII Part A of the IVDR define the requirements for performance evaluation of IVDs. Performance evaluation is the IVD equivalent of clinical evaluation under the MDR. + +== Summary == + +Manufacturers must demonstrate that their device achieves its intended performance through a systematic and planned process covering scientific validity, analytical performance, and clinical performance. + +Key obligations: + +* Article 56 – Performance evaluation requirements and documentation +* Annex XIII Part A – Performance evaluation plan (PEP) and performance evaluation report (PER) + +The three pillars of performance evaluation: + +* **Scientific validity** – the association between the analyte and a clinical condition or physiological state +* **Analytical performance** – the ability to correctly detect or measure a particular analyte (sensitivity, specificity, precision, etc.) +* **Clinical performance** – the ability of the device to yield results correlated with a clinical condition in a defined target population + +== Related documents == + +* [[In Vitro Diagnostic Medical Devices Regulation (EU) 2017/746]] – Parent document + +[[Category:In Vitro Diagnostics]] +[[Category:Clinical]] +[[Category:Performance Evaluation]] diff --git a/scripts/templates/Ref_IVDR_UDI.wiki b/scripts/templates/Ref_IVDR_UDI.wiki new file mode 100644 index 0000000..2de8a50 --- /dev/null +++ b/scripts/templates/Ref_IVDR_UDI.wiki @@ -0,0 +1,39 @@ +{{RegDocument +| area_of_validity = EU +| scope = IVD +| document_type = Regulation – Article Reference +| name = IVDR (EU) 2017/746 – Articles 24–26 & Annex VI: UDI +| version = 2017/746 +| source = https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0746#d1e3362-1-1 +| language = EN, DE, FR +| status = Current +| restricted_access = No +}} + +Articles 24 to 26 and Annex VI of the IVDR establish the Unique Device Identification (UDI) system for IVDs placed on the EU market. The framework is aligned with the MDR UDI system. + +== Summary == + +The UDI system enables unambiguous identification and traceability of IVDs throughout the supply chain and in clinical laboratories. + +Key obligations: + +* Article 24 – UDI assignment and registration in EUDAMED +* Article 25 – UDI database (part of EUDAMED) +* Article 26 – Registration of devices and economic operators in EUDAMED +* Annex VI Part C – Requirements for the UDI carrier (label placement, symbology) + +Application dates by device class: +* Class D: May 2022 +* Class C: May 2023 +* Class B and A (sterile): May 2025 +* Class A (non-sterile): May 2027 + +== Related documents == + +* [[In Vitro Diagnostic Medical Devices Regulation (EU) 2017/746]] – Parent document +* [[MDR 2017/745 – Articles 27–29 & Annex VI: Unique Device Identification (UDI)]] – Equivalent provision for medical devices + +[[Category:In Vitro Diagnostics]] +[[Category:Labelling]] +[[Category:Traceability]] diff --git a/scripts/templates/Ref_MDR_PostMarket.wiki b/scripts/templates/Ref_MDR_PostMarket.wiki new file mode 100644 index 0000000..1f656b9 --- /dev/null +++ b/scripts/templates/Ref_MDR_PostMarket.wiki @@ -0,0 +1,34 @@ +{{RegDocument +| area_of_validity = EU +| scope = MD +| document_type = Regulation – Article Reference +| name = MDR 2017/745 – Articles 83–86 & Annex XIV Part B: Post-Market Surveillance and PMCF +| version = 2017/745 +| source = https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0745#d1e6354-1-1 +| language = EN, DE, FR +| status = Current +| restricted_access = No +}} + +Articles 83 to 86 of the MDR establish the mandatory post-market surveillance (PMS) system for all medical device manufacturers. Annex XIV Part B specifies the requirements for post-market clinical follow-up (PMCF). + +== Summary == + +Manufacturers must plan, establish, document, implement, maintain, and update a PMS system proportionate to the risk class of the device. + +Key obligations: + +* Article 83 – General PMS requirements and system structure +* Article 84 – PMS plan (content requirements) +* Article 85 – PMS report (required for Class I devices) +* Article 86 – Periodic Safety Update Report (PSUR, required for Class IIa, IIb, III) +* Annex XIV Part B – PMCF plan and PMCF evaluation report requirements + +== Related documents == + +* [[Medical Device Regulation (EU) 2017/745]] – Parent document +* [[IVDR (EU) 2017/746 – Articles 78–81 & Annex XIII Part B: Post-Market Performance Follow-Up]] – Equivalent provision for IVDs + +[[Category:Medical Devices]] +[[Category:Post-Market Surveillance]] +[[Category:Clinical]] diff --git a/scripts/templates/Ref_MDR_UDI.wiki b/scripts/templates/Ref_MDR_UDI.wiki new file mode 100644 index 0000000..a8193b3 --- /dev/null +++ b/scripts/templates/Ref_MDR_UDI.wiki @@ -0,0 +1,38 @@ +{{RegDocument +| area_of_validity = EU +| scope = MD +| document_type = Regulation – Article Reference +| name = MDR 2017/745 – Articles 27–29 & Annex VI: Unique Device Identification (UDI) +| version = 2017/745 +| source = https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0745#d1e3455-1-1 +| language = EN, DE, FR +| status = Current +| restricted_access = No +}} + +Articles 27 to 29 and Annex VI of the MDR establish the Unique Device Identification (UDI) system for medical devices placed on the EU market. + +== Summary == + +The UDI system enables unambiguous identification and traceability of devices throughout the supply chain and during clinical use. + +Key obligations: + +* Article 27 – UDI assignment and registration in EUDAMED +* Article 28 – UDI database (part of EUDAMED) +* Article 29 – Registration of devices and economic operators in EUDAMED +* Annex VI Part C – Requirements for the UDI carrier (label placement, symbology) + +Application dates vary by device class: +* Class III and implantable: May 2021 +* Class IIa and IIb: May 2023 +* Class I: May 2025 + +== Related documents == + +* [[Medical Device Regulation (EU) 2017/745]] – Parent document +* [[IVDR (EU) 2017/746 – Articles 24–26 & Annex VI: UDI]] – Equivalent provision for IVDs + +[[Category:Medical Devices]] +[[Category:Labelling]] +[[Category:Traceability]] diff --git a/scripts/templates/Reference.wiki b/scripts/templates/Reference.wiki new file mode 100644 index 0000000..915679e --- /dev/null +++ b/scripts/templates/Reference.wiki @@ -0,0 +1,40 @@ +|- +| {{{topic|}}} || {{{category|}}} || {{{scope|}}} || {{{linked_document|}}} || {{{description|}}} + +== Template:Reference == + +Use this template to add a row to a reference table. Place all {{Reference}} calls between a table header and the closing |}. + +=== Usage === + +

    +{| class="wikitable"
    +! Topic / Keyword(s) !! Category / Chapter !! Scope !! Linked document !! Description
    +{{Reference
    +| topic           =
    +| category        =
    +| scope           =
    +| linked_document =
    +| description     =
    +}}
    +|}
    +
    + +=== Fields === + +{| class="wikitable" +! Field !! Description !! Example values +|- +| topic || Keyword(s) or topic(s), comma-separated || Post-market surveillance, PMCF +|- +| category || Predefined chapter or database category || Clinical, Labelling, Quality Management +|- +| scope || Regulatory scope(s), comma-separated || MD, IVD, GMP, PV +|- +| linked_document || Link to the corresponding RegDocument page || [[MDR 2017/745]] +|- +| description || Short summary of what this reference covers || Defines requirements for PMCF per Annex XIV Part B. +|} + +[[Category:Templates]] + diff --git a/scripts/templates/RegDocument.wiki b/scripts/templates/RegDocument.wiki new file mode 100644 index 0000000..ecb68ab --- /dev/null +++ b/scripts/templates/RegDocument.wiki @@ -0,0 +1,88 @@ +{{#set: + Area of validity={{{area_of_validity|}}} +|Scope={{{scope|}}} +|Document type={{{document_type|}}} +|Document name={{{name|}}} +|Version={{{version|}}} +|Source={{{source|}}} +|Language={{{language|}}} +|Status={{{status|}}} +|Restricted access={{{restricted_access|}}} +}}{| class="wikitable" style="float:right; clear:right; margin:0 0 1em 1em; width:320px; font-size:0.9em;" +! colspan="2" style="background:#f0f4f8; text-align:center;" | Document Information +|- +! Area of validity +| {{{area_of_validity|}}} +|- +! Scope(s) +| {{{scope|}}} +|- +! Document type +| {{{document_type|}}} +|- +! Document name +| {{{name|}}} +|- +! Version / Revision +| {{{version|}}} +|- +! Official source +| {{#if:{{{source|}}}|[{{{source}}} Official link]|—}} +|- +! Language(s) +| {{{language|}}} +|- +! Status +| {{{status|}}} +|- +! Restricted access +| {{{restricted_access|}}} +|} +== Template:RegDocument == + +Use this template on any page that documents a regulatory document. Place it at the top of the page before any prose content. + +This template also annotates each field as a [[Help:Semantic MediaWiki|Semantic MediaWiki]] property, enabling structured queries across all document pages. + +=== Usage === + +
    +{{RegDocument
    +| area_of_validity  =
    +| scope             =
    +| document_type     =
    +| name              =
    +| version           =
    +| source            =
    +| language          =
    +| status            =
    +| restricted_access =
    +}}
    +
    + +=== Fields === + +{| class="wikitable" +! Field !! Description !! Example values +|- +| area_of_validity || Region or country where the document applies || EU, USA, Global, DE +|- +| scope || Regulatory scope(s), comma-separated || MD, IVD — or NIS, GMP, PV, IMP, GEP, HM +|- +| document_type || Type of document || Regulation, Directive, Guideline, Scientific article, Treaty +|- +| name || Full official document name || Medical Device Regulation (EU) 2017/745 +|- +| version || Version, revision or amendment || 2017/745, amended by 2023/607 +|- +| source || URL to the official source || https://eur-lex.europa.eu/... +|- +| language || Available language(s) || EN, DE, FR +|- +| status || Validity status || Current, Draft, Final not promulgated, Superseded +|- +| restricted_access || Blocks copy/paste of content, referencing still allowed || Yes / No +|} + +[[Category:Templates]] +
    diff --git a/scripts/templates/Sidebar.wiki b/scripts/templates/Sidebar.wiki new file mode 100644 index 0000000..98cb41e --- /dev/null +++ b/scripts/templates/Sidebar.wiki @@ -0,0 +1,9 @@ +* Document Database +** Document_Index|All documents +** Special:Ask|Custom query +** Special:Categories|Browse categories + +* navigation +** mainpage|mainpage-description +** Special:RecentChanges|recentchanges +** Special:Random|randompage diff --git a/scripts/templates/TestPage_MDR.wiki b/scripts/templates/TestPage_MDR.wiki new file mode 100644 index 0000000..51e760e --- /dev/null +++ b/scripts/templates/TestPage_MDR.wiki @@ -0,0 +1,49 @@ +{{RegDocument +| area_of_validity = EU +| scope = MD +| document_type = Regulation +| name = Medical Device Regulation (EU) 2017/745 +| version = 2017/745, amended by 2023/607 +| source = https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017R0745 +| language = EN, DE, FR (all EU official languages) +| status = Current +| restricted_access = No +}} + +The Medical Device Regulation (MDR) 2017/745 replaces the former Medical Device Directive (MDD 93/42/EEC) and the Active Implantable Medical Device Directive (AIMDD 90/385/EEC). It establishes a uniform regulatory framework for medical devices across EU member states, with a strong focus on clinical evidence, post-market surveillance, and traceability. + +Full application started on 26 May 2021. The amendment 2023/607 introduced a phased transition period for legacy devices. + +== Key references == + +{| class="wikitable" style="width:100%;" +! Topic / Keyword(s) !! Category / Chapter !! Scope !! Linked document !! Description +{{Reference +| topic = Post-market surveillance, PMCF +| category = Clinical +| scope = MD +| linked_document = [[MDR 2017/745 – Articles 83–86 & Annex XIV Part B: Post-Market Surveillance and PMCF]] +| description = Articles 83–86 define the mandatory PMS system; Annex XIV Part B specifies PMCF requirements. +}} +{{Reference +| topic = Unique Device Identification, UDI, Traceability +| category = Labelling +| scope = MD +| linked_document = [[MDR 2017/745 – Articles 27–29 & Annex VI: Unique Device Identification (UDI)]] +| description = Articles 27–29 and Annex VI establish the UDI system. All devices must carry a UDI carrier on label and packaging. +}} +{{Reference +| topic = Clinical evaluation, Clinical evidence +| category = Clinical +| scope = MD +| linked_document = +| description = Article 61 and Annex XIV Part A define the clinical evaluation process and documentation requirements (CER). ''Page not yet created.'' +}} +|} + +== Related documents == + +* [[In Vitro Diagnostic Medical Devices Regulation (EU) 2017/746]] – Parallel regulation for IVDs + +[[Category:Medical Devices]] +[[Category:EU Regulation]]