<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>openjournal  - Recent changes [en]</title>
		<link>https://openjournal.wiki/wiki/Special:RecentChanges</link>
		<description>Track the most recent changes to the wiki in this feed.</description>
		<language>en</language>
		<generator>MediaWiki 1.43.9</generator>
		<lastBuildDate>Fri, 11 Sep 2026 02:38:46 GMT</lastBuildDate>
		<item>
			<title>User:Professorlamp/test</title>
			<link>https://openjournal.wiki/wiki/User:Professorlamp/test</link>
			<guid isPermaLink="false">https://openjournal.wiki/wiki/User:Professorlamp/test</guid>
			<description>&lt;p&gt;&lt;a href=&quot;/wiki/User:Professorlamp&quot; class=&quot;mw-userlink&quot; title=&quot;User:Professorlamp&quot;&gt;&lt;bdi&gt;Professorlamp&lt;/bdi&gt;&lt;/a&gt; deleted page &lt;a href=&quot;/index.php?title=User:Professorlamp/test&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Professorlamp/test (page does not exist)&quot;&gt;User:Professorlamp/test&lt;/a&gt; content was: &amp;quot;just a test&amp;quot;, and the only contributor was &amp;quot;&lt;a href=&quot;/wiki/Special:Contributions/Professorlamp&quot; title=&quot;Special:Contributions/Professorlamp&quot;&gt;Professorlamp&lt;/a&gt;&amp;quot; (&lt;a href=&quot;/index.php?title=User_talk:Professorlamp&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Professorlamp (page does not exist)&quot;&gt;talk&lt;/a&gt;)&lt;/p&gt;
</description>
			<pubDate>Thu, 10 Sep 2026 20:31:40 GMT</pubDate>
			<dc:creator>Professorlamp</dc:creator>
			<comments>https://openjournal.wiki/wiki/User_talk:Professorlamp/test</comments>
		</item>
		<item>
			<title>MediaWiki:Common.js</title>
			<link>https://openjournal.wiki/index.php?title=MediaWiki:Common.js&amp;diff=24&amp;oldid=0</link>
			<guid isPermaLink="false">https://openjournal.wiki/index.php?title=MediaWiki:Common.js&amp;diff=24&amp;oldid=0</guid>
			<description>&lt;p&gt;openjournal markdown shortcuts&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*!&lt;br /&gt;
 * openjournal -- Markdown shortcuts for the visual editor.&lt;br /&gt;
 *&lt;br /&gt;
 * Loaded into MediaWiki:Common.js by the seed step. Edit it on-wiki at&lt;br /&gt;
 * /wiki/MediaWiki:Common.js, or here and re-seed.&lt;br /&gt;
 *&lt;br /&gt;
 * MediaWiki stores wikitext, not Markdown, and that does not change here.&lt;br /&gt;
 * What changes is what happens as you type: the visual editor already turns&lt;br /&gt;
 * &amp;quot;* &amp;quot; into a bullet and &amp;quot;1. &amp;quot; into a numbered list, so the rest of a writer&amp;#039;s&lt;br /&gt;
 * Markdown muscle memory is registered the same way. You type Markdown, the&lt;br /&gt;
 * editor formats it immediately, and the page is still wikitext underneath --&lt;br /&gt;
 * which keeps diffs, templates and the API working exactly as before.&lt;br /&gt;
 *&lt;br /&gt;
 * These use ve.ui.sequenceRegistry, VisualEditor&amp;#039;s own public mechanism for&lt;br /&gt;
 * this, and follow the same pattern as its built-in registrations.&lt;br /&gt;
 */&lt;br /&gt;
( function () {&lt;br /&gt;
	&amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// Names of the commands the inline shortcuts run, and whether registration&lt;br /&gt;
	// has already happened. Both hooks below are safe to run more than once.&lt;br /&gt;
	var inlineCommandNames = [],&lt;br /&gt;
		registered = false;&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * A sequence that fires at the start of a paragraph, e.g. &amp;quot;## &amp;quot; or &amp;quot;&amp;gt; &amp;quot;.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param {string} name Registry name; reusing an existing name replaces it&lt;br /&gt;
	 * @param {string} command VisualEditor command to run&lt;br /&gt;
	 * @param {string} prefix Characters typed before the space&lt;br /&gt;
	 * @param {boolean} space Whether a trailing space is part of the trigger&lt;br /&gt;
	 * @return {ve.ui.Sequence}&lt;br /&gt;
	 */&lt;br /&gt;
	function paragraphPrefix( name, command, prefix, space ) {&lt;br /&gt;
		var data = [ { type: &amp;#039;paragraph&amp;#039; } ].concat( prefix.split( &amp;#039;&amp;#039; ) );&lt;br /&gt;
		if ( space ) {&lt;br /&gt;
			data.push( &amp;#039; &amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
		// Strip everything the user typed; the paragraph element is not typed.&lt;br /&gt;
		return new ve.ui.Sequence( name, command, data, data.length - 1 );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function registerMarkdownSequences() {&lt;br /&gt;
		var registry = ve.ui.sequenceRegistry,&lt;br /&gt;
			level;&lt;br /&gt;
&lt;br /&gt;
		for ( level = 1; level &amp;lt;= 6; level++ ) {&lt;br /&gt;
			registry.register( paragraphPrefix(&lt;br /&gt;
				// MediaWiki registers &amp;quot;# &amp;quot; as a wikitext numbered list under the&lt;br /&gt;
				// name &amp;quot;numberHash&amp;quot;. Reusing that name replaces it, so a lone&lt;br /&gt;
				// &amp;quot;# &amp;quot; means a heading here, as a Markdown writer expects.&lt;br /&gt;
				// &amp;quot;1. &amp;quot; still makes a numbered list, which is the Markdown way.&lt;br /&gt;
				level === 1 ? &amp;#039;numberHash&amp;#039; : &amp;#039;openjournalHeading&amp;#039; + level,&lt;br /&gt;
				&amp;#039;heading&amp;#039; + level,&lt;br /&gt;
				new Array( level + 1 ).join( &amp;#039;#&amp;#039; ),&lt;br /&gt;
				true&lt;br /&gt;
			) );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;- &amp;quot; for bullets. VisualEditor ships &amp;quot;* &amp;quot; already; Markdown uses both.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &amp;#039;openjournalBulletDash&amp;#039;, &amp;#039;bulletWrapOnce&amp;#039;, &amp;#039;-&amp;#039;, true )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;&amp;gt; &amp;quot; for a blockquote. MediaWiki maps &amp;quot;: &amp;quot; to this; Markdown uses &amp;quot;&amp;gt;&amp;quot;.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &amp;#039;openjournalBlockquote&amp;#039;, &amp;#039;blockquoteWrap&amp;#039;, &amp;#039;&amp;gt;&amp;#039;, true )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;```&amp;quot; opens a code block.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &amp;#039;openjournalCodeBlock&amp;#039;, &amp;#039;preformatted&amp;#039;, &amp;#039;```&amp;#039;, false )&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		// &amp;quot;---&amp;quot; is a horizontal rule. VisualEditor wants four dashes; Markdown&lt;br /&gt;
		// takes three, and three fires first, so this supersedes it.&lt;br /&gt;
		registry.register(&lt;br /&gt;
			paragraphPrefix( &amp;#039;openjournalHorizontalRule&amp;#039;, &amp;#039;insertHorizontalRule&amp;#039;, &amp;#039;---&amp;#039;, false )&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Inline Markdown: **bold**, *italic*, `code`.&lt;br /&gt;
	 *&lt;br /&gt;
	 * Block shortcuts above are plain sequences, because the characters that&lt;br /&gt;
	 * trigger them sit at the start of a paragraph and VisualEditor&amp;#039;s `strip`&lt;br /&gt;
	 * removes them. Inline Markdown wraps text instead, and `strip` only takes&lt;br /&gt;
	 * characters off the right-hand end -- so the opening delimiter would be&lt;br /&gt;
	 * left behind. These use a regular expression to match the whole&lt;br /&gt;
	 * &amp;quot;**text**&amp;quot;, select it, and hand it to the action below, which swaps in&lt;br /&gt;
	 * the text without its delimiters and styles it.&lt;br /&gt;
	 */&lt;br /&gt;
	function registerInlineAction() {&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction = function VeUiOpenJournalMarkdownAction() {&lt;br /&gt;
			ve.ui.OpenJournalMarkdownAction.super.apply( this, arguments );&lt;br /&gt;
		};&lt;br /&gt;
		OO.inheritClass( ve.ui.OpenJournalMarkdownAction, ve.ui.Action );&lt;br /&gt;
&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction.static.name = &amp;#039;openjournalMarkdown&amp;#039;;&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction.static.methods = [ &amp;#039;wrap&amp;#039; ];&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @param {string} delimiter The Markdown characters, e.g. &amp;quot;**&amp;quot;&lt;br /&gt;
		 * @param {string} annotation VisualEditor annotation, e.g. &amp;quot;textStyle/bold&amp;quot;&lt;br /&gt;
		 * @return {boolean} Whether the text was styled&lt;br /&gt;
		 */&lt;br /&gt;
		ve.ui.OpenJournalMarkdownAction.prototype.wrap = function ( delimiter, annotation ) {&lt;br /&gt;
			var surfaceModel = this.surface.getModel(),&lt;br /&gt;
				fragment = surfaceModel.getFragment(),&lt;br /&gt;
				text = fragment.getText(),&lt;br /&gt;
				width = delimiter.length;&lt;br /&gt;
&lt;br /&gt;
			// Returning false makes VisualEditor undo the selection change, so&lt;br /&gt;
			// anything that does not really look like &amp;quot;**text**&amp;quot; is left alone.&lt;br /&gt;
			if (&lt;br /&gt;
				text.length &amp;lt;= width * 2 ||&lt;br /&gt;
				text.slice( 0, width ) !== delimiter ||&lt;br /&gt;
				text.slice( text.length - width ) !== delimiter&lt;br /&gt;
			) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			fragment&lt;br /&gt;
				.insertContent( text.slice( width, text.length - width ), false )&lt;br /&gt;
				.annotateContent( &amp;#039;set&amp;#039;, annotation )&lt;br /&gt;
				.collapseToEnd()&lt;br /&gt;
				.select();&lt;br /&gt;
&lt;br /&gt;
			// Without this the annotation stays armed and the next word typed&lt;br /&gt;
			// comes out bold too.&lt;br /&gt;
			surfaceModel.setInsertionAnnotations( null );&lt;br /&gt;
&lt;br /&gt;
			return true;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		ve.ui.actionFactory.register( ve.ui.OpenJournalMarkdownAction );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function registerInlineSequences() {&lt;br /&gt;
		[&lt;br /&gt;
			// label,  delimiter, annotation,         pattern&lt;br /&gt;
			[ &amp;#039;Bold&amp;#039;, &amp;#039;**&amp;#039;, &amp;#039;textStyle/bold&amp;#039;, &amp;#039;\\*\\*[^*]+\\*\\*$&amp;#039; ],&lt;br /&gt;
			// &amp;quot;*text*&amp;quot; must not fire midway through typing &amp;quot;**text**&amp;quot;, so the&lt;br /&gt;
			// opening star may not itself be preceded by one. Lookbehind is&lt;br /&gt;
			// unsupported on some older browsers, hence the per-pattern guard.&lt;br /&gt;
			[ &amp;#039;Italic&amp;#039;, &amp;#039;*&amp;#039;, &amp;#039;textStyle/italic&amp;#039;, &amp;#039;(?&amp;lt;!\\*)\\*[^*]+\\*$&amp;#039; ],&lt;br /&gt;
			[ &amp;#039;Code&amp;#039;, &amp;#039;`&amp;#039;, &amp;#039;textStyle/code&amp;#039;, &amp;#039;`[^`]+`$&amp;#039; ],&lt;br /&gt;
			// Markdown&amp;#039;s other pair of emphasis characters. These refuse an&lt;br /&gt;
			// opening underscore that follows a word character, which is what&lt;br /&gt;
			// stops snake_case_names turning italic halfway through -- the&lt;br /&gt;
			// same rule CommonMark applies, and the reason &amp;quot;_&amp;quot; needs a guard&lt;br /&gt;
			// that &amp;quot;*&amp;quot; does not. \w covers &amp;quot;_&amp;quot; itself, so it doubles as the&lt;br /&gt;
			// &amp;quot;not midway through __bold__&amp;quot; check.&lt;br /&gt;
			[ &amp;#039;BoldUnderscore&amp;#039;, &amp;#039;__&amp;#039;, &amp;#039;textStyle/bold&amp;#039;, &amp;#039;(?&amp;lt;!\\w)__[^_]+__$&amp;#039; ],&lt;br /&gt;
			[ &amp;#039;ItalicUnderscore&amp;#039;, &amp;#039;_&amp;#039;, &amp;#039;textStyle/italic&amp;#039;, &amp;#039;(?&amp;lt;!\\w)_[^_]+_$&amp;#039; ],&lt;br /&gt;
			[ &amp;#039;Strikethrough&amp;#039;, &amp;#039;~~&amp;#039;, &amp;#039;textStyle/strikethrough&amp;#039;, &amp;#039;~~[^~]+~~$&amp;#039; ]&lt;br /&gt;
		].forEach( function ( spec ) {&lt;br /&gt;
			var name = &amp;#039;openjournalMarkdown&amp;#039; + spec[ 0 ],&lt;br /&gt;
				pattern;&lt;br /&gt;
&lt;br /&gt;
			inlineCommandNames.push( name );&lt;br /&gt;
&lt;br /&gt;
			try {&lt;br /&gt;
				pattern = new RegExp( spec[ 3 ] );&lt;br /&gt;
			} catch ( e ) {&lt;br /&gt;
				mw.log.warn( &amp;#039;openjournal: skipping &amp;#039; + name + &amp;#039; shortcut&amp;#039;, e );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			ve.ui.commandRegistry.register( new ve.ui.Command(&lt;br /&gt;
				name, &amp;#039;openjournalMarkdown&amp;#039;, &amp;#039;wrap&amp;#039;,&lt;br /&gt;
				{ args: [ spec[ 1 ], spec[ 2 ] ], supportedSelections: [ &amp;#039;linear&amp;#039; ] }&lt;br /&gt;
			) );&lt;br /&gt;
			ve.ui.sequenceRegistry.register( new ve.ui.Sequence(&lt;br /&gt;
				name, name, pattern, 0, { setSelection: true }&lt;br /&gt;
			) );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Register through VisualEditor&amp;#039;s plugin hook, which runs after its modules&lt;br /&gt;
	// load but before the editing surface is built. That timing matters: a&lt;br /&gt;
	// surface copies the command registry once, at construction, and&lt;br /&gt;
	// ve.ui.Sequence refuses to run a command the surface does not list. A&lt;br /&gt;
	// custom command registered any later is silently ignored -- the sequence&lt;br /&gt;
	// matches, nothing happens. Sequences themselves are read live on every&lt;br /&gt;
	// keystroke, which is why the block shortcuts survived being registered&lt;br /&gt;
	// late and the inline ones did not.&lt;br /&gt;
	function registerEverything() {&lt;br /&gt;
		if ( registered ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		registered = true;&lt;br /&gt;
		registerInlineAction();&lt;br /&gt;
		registerInlineSequences();&lt;br /&gt;
		registerMarkdownSequences();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Top up the live surface&amp;#039;s command list.&lt;br /&gt;
	 *&lt;br /&gt;
	 * The plugin hook below runs early enough that this should be redundant.&lt;br /&gt;
	 * It is here because the failure it guards against is silent: if anything&lt;br /&gt;
	 * builds a surface without the plugin hook having run, every inline&lt;br /&gt;
	 * shortcut matches and then quietly does nothing, which is a miserable&lt;br /&gt;
	 * thing to debug from the outside.&lt;br /&gt;
	 */&lt;br /&gt;
	function backfillSurfaceCommands() {&lt;br /&gt;
		var surface = ve.init &amp;amp;&amp;amp; ve.init.target &amp;amp;&amp;amp;&lt;br /&gt;
			ve.init.target.getSurface &amp;amp;&amp;amp; ve.init.target.getSurface();&lt;br /&gt;
&lt;br /&gt;
		if ( !surface ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var commands = surface.getCommands();&lt;br /&gt;
		inlineCommandNames.forEach( function ( name ) {&lt;br /&gt;
			if ( commands.indexOf( name ) === -1 ) {&lt;br /&gt;
				commands.push( name );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function guard( fn ) {&lt;br /&gt;
		return function () {&lt;br /&gt;
			try {&lt;br /&gt;
				fn.apply( null, arguments );&lt;br /&gt;
			} catch ( e ) {&lt;br /&gt;
				// A broken shortcut must never take the editor down with it.&lt;br /&gt;
				mw.log.error( &amp;#039;openjournal: Markdown shortcuts failed&amp;#039;, e );&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;ve.loadModules&amp;#039; ).add( guard( function ( addPlugin ) {&lt;br /&gt;
		addPlugin( guard( registerEverything ) );&lt;br /&gt;
	} ) );&lt;br /&gt;
&lt;br /&gt;
	// Belt and braces, once the editor is actually up.&lt;br /&gt;
	mw.hook( &amp;#039;ve.activationComplete&amp;#039; ).add( guard( function () {&lt;br /&gt;
		registerEverything();&lt;br /&gt;
		backfillSurfaceCommands();&lt;br /&gt;
	} ) );&lt;br /&gt;
}() );&lt;/div&gt;</description>
			<pubDate>Thu, 10 Sep 2026 19:58:31 GMT</pubDate>
			<dc:creator>OpenJournalAdmin</dc:creator>
			<comments>https://openjournal.wiki/wiki/MediaWiki_talk:Common.js</comments>
		</item>
		<item>
			<title>MediaWiki:Common.css</title>
			<link>https://openjournal.wiki/index.php?title=MediaWiki:Common.css&amp;diff=23&amp;oldid=0</link>
			<guid isPermaLink="false">https://openjournal.wiki/index.php?title=MediaWiki:Common.css&amp;diff=23&amp;oldid=0</guid>
			<description>&lt;p&gt;openjournal styles&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* openjournal -- loaded into MediaWiki:Common.css by the seed step.&lt;br /&gt;
   Edit it on-wiki at /wiki/MediaWiki:Common.css, or here and re-seed.&lt;br /&gt;
&lt;br /&gt;
   Colours are MediaWiki&amp;#039;s Codex design tokens rather than literals, so this&lt;br /&gt;
   file follows the reader&amp;#039;s Light/Dark/Automatic choice without needing a&lt;br /&gt;
   second set of rules. The hex values after each token are the light-mode&lt;br /&gt;
   fallback, used only if a skin does not define the token. */&lt;br /&gt;
&lt;br /&gt;
.oj-hero {&lt;br /&gt;
	margin: 0 0 1.5em;&lt;br /&gt;
	padding: 2em 0 1.6em;&lt;br /&gt;
	border-bottom: 1px solid var( --border-color-subtle, #c8ccd1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-hero-title {&lt;br /&gt;
	font-size: 2.6em;&lt;br /&gt;
	line-height: 1.1;&lt;br /&gt;
	font-weight: 700;&lt;br /&gt;
	letter-spacing: -0.02em;&lt;br /&gt;
	color: var( --color-emphasized, #101418 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-hero-sub {&lt;br /&gt;
	margin-top: 0.4em;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
	max-width: 34em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* One article in a feed. */&lt;br /&gt;
.oj-entry {&lt;br /&gt;
	padding: 0.7em 0;&lt;br /&gt;
	border-bottom: 1px solid var( --border-color-muted, #eaecf0 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-entry a {&lt;br /&gt;
	font-size: 1.12em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-byline {&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
	font-size: 0.88em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-journal .oj-feed {&lt;br /&gt;
	margin-top: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-footnote {&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
	font-size: 0.92em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The author list is a run of spans; CSS supplies the separators so there is&lt;br /&gt;
   never a trailing one. */&lt;br /&gt;
.oj-authors span + span::before {&lt;br /&gt;
	content: &amp;quot; \00b7 &amp;quot;;&lt;br /&gt;
	color: var( --color-subtle, #54595d );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The &amp;quot;start a new article&amp;quot; box reads as a call to action, not a search field. */&lt;br /&gt;
.oj-journal .inputbox-element {&lt;br /&gt;
	max-width: 26em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------------------------------------------------------------- Dark mode&lt;br /&gt;
&lt;br /&gt;
   Codex&amp;#039;s dark palette puts body text at #eaecf0 and headings at #f8f9fa on a&lt;br /&gt;
   #101418 page: contrast ratios of 15.6:1 and 17.6:1. WCAG AAA asks for 7:1,&lt;br /&gt;
   so that is roughly twice the contrast anyone needs, and on a near-black&lt;br /&gt;
   ground it is where text starts to glow and smear (halation).&lt;br /&gt;
&lt;br /&gt;
   Soften the text and lift the page a little off black. The ratios below stay&lt;br /&gt;
   above AAA, so nothing becomes harder to read:&lt;br /&gt;
&lt;br /&gt;
     headings   #f8f9fa 17.6:1  -&amp;gt;  #dfe3e7 13.7:1&lt;br /&gt;
     body text  #eaecf0 15.6:1  -&amp;gt;  #ccd1d6 11.5:1&lt;br /&gt;
     bylines    #a2a9b1  7.8:1  -&amp;gt;  #9fa6ae  7.2:1&lt;br /&gt;
&lt;br /&gt;
   These override Codex tokens, so everything on the page follows -- article&lt;br /&gt;
   text, the skin&amp;#039;s own chrome and the styles above alike. */&lt;br /&gt;
&lt;br /&gt;
.oj-dark-palette,&lt;br /&gt;
html.skin-theme-clientpref-night {&lt;br /&gt;
	--color-base: #ccd1d6;&lt;br /&gt;
	--color-emphasized: #dfe3e7;&lt;br /&gt;
	--color-subtle: #9fa6ae;&lt;br /&gt;
	--background-color-base: #17191c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The same, for readers on Automatic whose system is set to dark. */&lt;br /&gt;
@media screen and ( prefers-color-scheme: dark ) {&lt;br /&gt;
	html.skin-theme-clientpref-os {&lt;br /&gt;
		--color-base: #ccd1d6;&lt;br /&gt;
		--color-emphasized: #dfe3e7;&lt;br /&gt;
		--color-subtle: #9fa6ae;&lt;br /&gt;
		--background-color-base: #17191c;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* A single external link styled as a button, for the one place that needs it:&lt;br /&gt;
   the database dump on OpenJournal:Helping out. */&lt;br /&gt;
.oj-download {&lt;br /&gt;
	margin: 1em 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-download a {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	padding: 0.55em 1.1em;&lt;br /&gt;
	border-radius: 2px;&lt;br /&gt;
	background: var( --background-color-progressive, #36c );&lt;br /&gt;
	color: var( --color-inverted, #fff );&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.oj-download a:hover {&lt;br /&gt;
	background: var( --background-color-progressive--hover, #4b77d6 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* MediaWiki marks every external link with a small icon by default; it reads&lt;br /&gt;
   oddly against a button. */&lt;br /&gt;
.oj-download a.external {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-right: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Prev/next links at the bottom of each page of the front-page feed. */&lt;br /&gt;
.oj-pager {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	padding-top: 0.6em;&lt;br /&gt;
	border-top: 1px solid var( --border-color-muted, #eaecf0 );&lt;br /&gt;
	font-size: 0.92em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Either link can be absent (first or last page). flexbox alone can&amp;#039;t tell&lt;br /&gt;
   &amp;quot;only Older present&amp;quot; from &amp;quot;only Newer present&amp;quot; -- both are a lone&lt;br /&gt;
   first-child -- so the template gives Older its own class to push right. */&lt;br /&gt;
.oj-pager .oj-older {&lt;br /&gt;
	margin-left: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Appearance (theme/font-size/width) is removed from every page rather than&lt;br /&gt;
   relocated -- Vector wires it into the right column with no config to move&lt;br /&gt;
   it, and Special:Preferences already has a real, working &amp;quot;Color&amp;quot; setting&lt;br /&gt;
   under Appearance, so nothing is lost for anyone with an account; readers&lt;br /&gt;
   without one still get the site&amp;#039;s OJ_DEFAULT_THEME default. */&lt;br /&gt;
.vector-appearance-landmark {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* &amp;quot;Switch to old look&amp;quot; (legacy Vector opt-out), shown to logged-in users at&lt;br /&gt;
   the bottom of the left menu. Vector hardcodes this with no config flag to&lt;br /&gt;
   turn it off -- confirmed by rendering the component directly rather than&lt;br /&gt;
   guessing from the template -- so it&amp;#039;s removed the same way as Appearance. */&lt;br /&gt;
.vector-main-menu-action-opt-out {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The right panel&amp;#039;s &amp;quot;Last modified&amp;quot; link already says this. No config gate&lt;br /&gt;
   exists for the footer&amp;#039;s own copy (unlike Privacy/About/Disclaimers just&lt;br /&gt;
   above, which are disabled the proper way, via their interface messages),&lt;br /&gt;
   so it&amp;#039;s hidden the same way Appearance and the old-look link are. */&lt;br /&gt;
#footer-info-lastmod {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Vector deliberately gives the page title (h1) and h2 section headings a&lt;br /&gt;
   serif font -- Wikipedia&amp;#039;s own visual identity -- while body text, and&lt;br /&gt;
   even h3-h6, stay sans-serif. Confirmed in skins.vector.styles: the rule&lt;br /&gt;
   is .mw-body h1, .mw-body-content h1/h2 { font-family: &amp;#039;Linux Libertine&amp;#039; ...&lt;br /&gt;
   That split reads as inconsistent here, so headings inherit the body font&lt;br /&gt;
   instead of overriding it -- one font, everywhere, and it stays that way&lt;br /&gt;
   even if the body font ever changes. */&lt;br /&gt;
.mw-body h1,&lt;br /&gt;
.mw-body .mw-heading1,&lt;br /&gt;
.mw-body-content h1,&lt;br /&gt;
.mw-body-content .mw-heading1,&lt;br /&gt;
.mw-body-content h2,&lt;br /&gt;
.mw-body-content .mw-heading2 {&lt;br /&gt;
	font-family: inherit;&lt;br /&gt;
}&lt;/div&gt;</description>
			<pubDate>Thu, 10 Sep 2026 19:58:30 GMT</pubDate>
			<dc:creator>OpenJournalAdmin</dc:creator>
			<comments>https://openjournal.wiki/wiki/MediaWiki_talk:Common.css</comments>
		</item>
		<item>
			<title>OpenJournal:Seeded</title>
			<link>https://openjournal.wiki/index.php?title=OpenJournal:Seeded&amp;diff=22&amp;oldid=0</link>
			<guid isPermaLink="false">https://openjournal.wiki/index.php?title=OpenJournal:Seeded&amp;diff=22&amp;oldid=0</guid>
			<description>&lt;p&gt;seed marker&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Seed data was loaded on 2026-09-10.&lt;/div&gt;</description>
			<pubDate>Thu, 10 Sep 2026 19:58:30 GMT</pubDate>
			<dc:creator>OpenJournalAdmin</dc:creator>
			<comments>https://openjournal.wiki/wiki/OpenJournal_talk:Seeded</comments>
		</item>
		<item>
			<title>User:Professorlamp</title>
			<link>https://openjournal.wiki/index.php?title=User:Professorlamp&amp;diff=2&amp;oldid=0</link>
			<guid isPermaLink="false">https://openjournal.wiki/index.php?title=User:Professorlamp&amp;diff=2&amp;oldid=0</guid>
			<description>&lt;p&gt;Starting a journal&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Journal}}&lt;/div&gt;</description>
			<pubDate>Thu, 10 Sep 2026 19:29:07 GMT</pubDate>
			<dc:creator>Professorlamp</dc:creator>
			<comments>https://openjournal.wiki/wiki/User_talk:Professorlamp</comments>
		</item>
		<item>
			<title>Main Page</title>
			<link>https://openjournal.wiki/index.php?title=Main_Page&amp;diff=1&amp;oldid=0</link>
			<guid isPermaLink="false">https://openjournal.wiki/index.php?title=Main_Page&amp;diff=1&amp;oldid=0</guid>
			<description>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&amp;#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</description>
			<pubDate>Wed, 09 Sep 2026 15:19:37 GMT</pubDate>
			<dc:creator>MediaWiki default</dc:creator>
			<comments>https://openjournal.wiki/wiki/Talk:Main_Page</comments>
		</item>
</channel></rss>