diff --git a/extension.json b/extension.json
index 3a80bcf7..f2fa010d 100644
--- a/extension.json
+++ b/extension.json
@@ -1,255 +1,258 @@
{
"name": "TwoColConflict",
"version": "1.0.0",
"author": [
"TCB team (Wikimedia Deutschland)",
"Christoph Jauera",
"Addshore",
"Andrew Kostka"
],
"url": "https://www.mediawiki.org/wiki/Extension:TwoColConflict",
"descriptionmsg": "twocolconflict-desc",
"license-name": "GPL-2.0-or-later",
"type": "other",
"manifest_version": 1,
"requires": {
"MediaWiki": ">= 1.32.0"
},
"config": {
"@TwoColConflictBetaFeature": "Make the TwoColConflict feature a BetaFeature. Setting this requires the BetaFeature extension and requires each user to enable the BetaFeature.",
"TwoColConflictBetaFeature": true,
"@TwoColConflictUseInline": "Use the inline view for solving edit conflicts.",
"TwoColConflictUseInline": true
},
"AutoloadNamespaces": {
"TwoColConflict\\": "includes/"
},
"Hooks": {
"GetBetaFeaturePreferences": [
"TwoColConflict\\TwoColConflictHooks::onGetBetaFeaturePreferences"
],
"AlternateEdit": [
"TwoColConflict\\TwoColConflictHooks::onAlternateEdit"
],
"EditPage::importFormData": [
"TwoColConflict\\TwoColConflictHooks::onImportFormData"
],
"EditPageBeforeConflictDiff": [
"TwoColConflict\\TwoColConflictHooks::onEditPageBeforeConflictDiff"
],
"EditPageBeforeEditButtons": [
"TwoColConflict\\TwoColConflictHooks::onEditPageBeforeEditButtons"
],
"ResourceLoaderTestModules": [
"TwoColConflict\\TwoColConflictHooks::onResourceLoaderTestModules"
]
},
"MessagesDirs": {
"TwoColConflict": [
"i18n"
]
},
"ExtensionMessagesFiles": {
"TwoColConflictAlias": "TwoColConflict.alias.php"
},
"ResourceModules": {
"ext.TwoColConflict.InlineCss": {
"styles": [
"modules/InlineTwoColConflict/ext.TwoColConflict.Inline.css"
],
"messages": [],
"dependencies": []
},
"ext.TwoColConflict.Inline.initJs": {
"scripts": [
"modules/InlineTwoColConflict/ext.TwoColConflict.Inline.init.js"
],
"dependencies": [
"ext.TwoColConflict.Settings",
"ext.TwoColConflict.Inline.AutoScroll",
"ext.TwoColConflict.Inline.BaseVersionSelector",
"ext.TwoColConflict.Inline.HelpDialog"
]
},
"ext.TwoColConflict.Settings": {
"scripts": [
"modules/ext.TwoColConflict.Settings.js"
],
"dependencies": [
"mediawiki.user",
"mediawiki.storage",
"mediawiki.cookie",
"mediawiki.api"
]
},
"ext.TwoColConflict.Inline.filterOptionsJs": {
"scripts": [
"modules/InlineTwoColConflict/ext.TwoColConflict.Inline.filterOptions.js"
],
"messages": [
"twocolconflict-label-show-unchanged",
"twocolconflict-label-hide-unchanged"
],
"dependencies": [
"ext.TwoColConflict.Inline.AutoScroll",
"oojs-ui"
]
},
"ext.TwoColConflict.Inline.AutoScroll": {
"scripts": [
"modules/InlineTwoColConflict/ext.TwoColConflict.AutoScroll.js"
]
},
"ext.TwoColConflict.Inline.BaseVersionSelector": {
"scripts": [
"modules/InlineTwoColConflict/ext.TwoColConflict.BaseVersionSelector.js"
],
"messages": [
"twocolconflict-base-selection-dialog-text",
"twocolconflict-base-selection-own-label",
"twocolconflict-base-selection-foreign-label",
"twocolconflict-base-selection-submit-label"
],
"dependencies": [
"oojs-ui"
]
},
"ext.TwoColConflict.Inline.BaseVersionSelectorCss": {
"styles": [
"modules/InlineTwoColConflict/ext.TwoColConflict.BaseVersionSelector.css"
]
},
"ext.TwoColConflict.Inline.HelpDialog": {
"scripts": [
"modules/InlineTwoColConflict/ext.TwoColConflict.HelpDialog.js"
],
"dependencies": [
"oojs-ui",
"oojs-ui.styles.icons-interactions",
"ext.TwoColConflict.Inline.HelpDialogImages"
],
"messages": [
"twocolconflict-show-help-tooltip",
"twocolconflict-help-dialog-slide1",
"twocolconflict-help-dialog-slide2",
"twocolconflict-help-dialog-slide3",
"twocolconflict-help-dialog-slide4",
"twocolconflict-help-dialog-slide5",
"twocolconflict-label-show",
"twocolconflict-tutorial",
"twocolconflict-previous-dialog",
"twocolconflict-next-dialog",
"twocolconflict-close-dialog"
]
},
"ext.TwoColConflict.Inline.HelpDialogCss": {
"styles": [
"modules/InlineTwoColConflict/ext.TwoColConflict.HelpDialog.css"
]
},
"ext.TwoColConflict.Inline.HelpDialogImages": {
"class": "ResourceLoaderImageModule",
"selector": ".mw-twocolconflict-help-dialog-slide-{name}",
"images": {
"1": {
"file": {
"ltr": "resources/ext.TwoColConflict.helpDialog/slide1-ltr.svg",
"rtl": "resources/ext.TwoColConflict.helpDialog/slide1-rtl.svg"
}
},
"2": {
"file": {
"ltr": "resources/ext.TwoColConflict.helpDialog/slide2-ltr.svg",
"rtl": "resources/ext.TwoColConflict.helpDialog/slide2-rtl.svg"
}
},
"3": {
"file": {
"ltr": "resources/ext.TwoColConflict.helpDialog/slide3-ltr.svg",
"rtl": "resources/ext.TwoColConflict.helpDialog/slide3-rtl.svg"
}
},
"4": {
"file": {
"ltr": "resources/ext.TwoColConflict.helpDialog/slide4-ltr.svg",
"rtl": "resources/ext.TwoColConflict.helpDialog/slide4-rtl.svg"
}
},
"5": {
"file": {
"ltr": "resources/ext.TwoColConflict.helpDialog/slide5-ltr.svg",
"rtl": "resources/ext.TwoColConflict.helpDialog/slide5-rtl.svg"
}
}
}
},
"ext.TwoColConflict.SpecialConflictTestPageCss": {
"styles": [
"modules/SpecialConflictTestPage/ext.TwoColConflict.SpecialConflictTestPage.css"
]
},
"ext.TwoColConflict.SplitJs": {
"scripts": [
"modules/SplitTwoColConflict/ext.TwoColConflict.Split.init.js"
],
"dependencies": [
"oojs-ui",
"ext.TwoColConflict.Split.Tour"
]
},
"ext.TwoColConflict.SplitCss": {
"styles": [
"modules/SplitTwoColConflict/ext.TwoColConflict.Split.less",
"modules/SplitTwoColConflict/ext.TwoColConflict.Split.editable.less"
]
},
"ext.TwoColConflict.Split.TourImages": {
"class": "ResourceLoaderImageModule",
"selector": ".mw-twocolconflict-split-tour-slide-{name}",
"images": {
"1": {
"file": {
"ltr": "resources/ext.TwoColConflict.Split.Tour/slide1-ltr.png",
"rtl": "resources/ext.TwoColConflict.Split.Tour/slide1-rtl.png"
}
}
}
},
"ext.TwoColConflict.Split.Tour": {
"scripts": [
"modules/SplitTwoColConflict/ext.TwoColConflict.Split.Tour.js"
],
"styles": [
"modules/SplitTwoColConflict/ext.TwoColConflict.Split.Tour.less"
],
"dependencies": [
"oojs-ui",
"oojs-ui.styles.icons-interactions",
"ext.TwoColConflict.Split.TourImages",
"ext.TwoColConflict.Settings"
],
"messages": [
"twocolconflict-split-tour-dialog-header",
"twocolconflict-split-tour-dialog-message",
"twocolconflict-split-tour-dialog-btn-text",
"twocolconflict-split-tour-popup-btn-text",
"twocolconflict-split-tour-popup1-header",
"twocolconflict-split-tour-popup1-message",
"twocolconflict-split-tour-popup2-header",
"twocolconflict-split-tour-popup2-message",
"twocolconflict-split-tour-popup3-header",
- "twocolconflict-split-tour-popup3-message"
+ "twocolconflict-split-tour-popup3-message",
+ "twocolconflict-split-reset-warning",
+ "twocolconflict-split-reset-warning-cancel",
+ "twocolconflict-split-reset-warning-accept"
]
}
},
"EventLoggingSchemas": {
"TwoColConflictConflict": 18155295
},
"ResourceFileModulePaths": {
"localBasePath": "",
"remoteExtPath": "TwoColConflict"
},
"SpecialPages": {
"SimulateTwoColEditConflict": "TwoColConflict\\SpecialConflictTestPage\\SpecialConflictTestPage"
}
}
diff --git a/i18n/en.json b/i18n/en.json
index a9e0e14a..1038d81f 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -1,78 +1,82 @@
{
"@metadata": {
"authors": [
"WMDE"
]
},
"twocolconflict": "TwoColConflict",
"twocolconflict-desc": "Showing a side-by-side edit merge screen for edit conflict resolution",
"twocolconflict-beta-feature-message": "Two column edit conflict",
"twocolconflict-beta-feature-description": "Show the edit conflict view using a more advanced two column view.
Please note: The feature is currently undergoing [https://phabricator.wikimedia.org/T195711 some changes]. A new interface is planned for the second half of 2018.",
"twocolconflict-explainconflict": "Warning: Another user just edited and published this page. There is a conflict between your version and the current version. You will have to merge your changes into the current text version. Only the text in the editor field will be published when you click on \"$1\".",
"twocolconflict-changes-col-title": "Conflicting changes",
"twocolconflict-changes-col-desc-1": "Differences between",
"twocolconflict-changes-col-desc-2": "the currently published version",
"twocolconflict-changes-col-desc-3": "changed $1 {{PLURAL:$1|times}} ($2)",
"twocolconflict-changes-col-desc-4": "your text.",
"twocolconflict-history-link": "revision history",
"twocolconflict-editor-col-title": "Editor with version to be published",
"twocolconflict-editor-col-desc-1": "Initially, the editor's content is the currently published version.",
"twocolconflict-editor-col-desc-2": "Add your changes to the text in the editor and click on \"$1\".",
"twocolconflict-base-selection-desc-1": "1) Choose the base version in the popup below.",
"twocolconflict-base-selection-desc-2": "2) Adjust the text to combine both versions.",
"twocolconflict-base-selection-desc-3": "3) Click on \"$1\". Only what is in the editor will be published.",
"twocolconflict-base-selection-dialog-text": "What should initially be in the editor and serve as a basis for combining the conflict versions?",
"twocolconflict-base-selection-own-label": "My text",
"twocolconflict-base-selection-foreign-label": "The currently published version",
"twocolconflict-base-selection-submit-label": "OK",
"twocolconflict-diffchange-own-title": "in your version",
"twocolconflict-diffchange-foreign-title": "in $1's version",
"twocolconflict-diffchange-unchanged-title": "unchanged text",
"twocolconflict-label-show": "show",
"twocolconflict-label-hide": "hide",
"twocolconflict-label-unchanged": "unchanged text",
"twocolconflict-label-show-unchanged": "show unchanged text",
"twocolconflict-label-hide-unchanged": "hide unchanged text",
"twocolconflict-show-help-tooltip": "Show help text",
"twocolconflict-help-dialog-slide1": "This page helps you to resolve an edit conflict. There are two columns: The first shows the conflicting changes and the second is a text editor, whose content will be published.\n\n[//www.mediawiki.org/wiki/Help_talk:Two_Column_Edit_Conflict_View Feedback is very much appreciated here].",
"twocolconflict-help-dialog-slide2": "The first column shows the changes in your version and the changes in the currently published version. The differences between both versions are highlighted.",
"twocolconflict-help-dialog-slide3": "At the top of the first column you can click on \"{{int:twocolconflict-label-show}}\" to see unchanged text. This might help to understand the context of changes. By default, unchanged text is greyed out and collapsed.",
"twocolconflict-help-dialog-slide4": "The second column is an editor. When the page is opened, there is a selection box on top of the editor. It lets you decide which version should be in the editor. This is often the version where more changes were made.",
"twocolconflict-help-dialog-slide5": "Copy and paste the desired parts of the other version into the text in the editor. Only what is in the editor will be published, when you click the \"$1\" button.",
"twocolconflict-tutorial": "Edit conflict solving tutorial",
"twocolconflict-previous-dialog": "Previous",
"twocolconflict-next-dialog": "Next",
"twocolconflict-close-dialog": "Close",
"twocolconflict-test-needsbeta": "You must enable the 'Two column edit conflict' beta feature in your preferences to use this special page.",
"twocolconflict-test-page-title": "Edit Conflict: Simulation",
"twocolconflict-test-title-label": "Enter the title of a non-protected wiki page for which the edit conflict should be simulated:",
"twocolconflict-test-title-submit": "Show edit page",
"twocolconflict-test-title-not-existing": "There is no page with this title.",
"twocolconflict-test-no-direct-editing": "This page cannot be edited directly.",
"twocolconflict-test-text-submit": "Create conflict",
"twocolconflict-test-initial-hint": "On this page you can try out the new Two Column Edit Conflict interface without messing anything up.",
"twocolconflict-test-edit-hint": "Make some changes below. They won't be published. They will only be used to simulate an example edit conflict.",
"twocolconflict-test-conflict-hint": "This is the test conflict. Changes won't be published but can be previewed.",
"twocolconflict-test-preview-submit": "Simulate publish changes",
"twocolconflict-test-preview-hint": "Thanks for trying out the Two Column Edit Conflict interface! Help us make improvements by providing us with your feedback [//meta.wikimedia.org/wiki/Talk:WMDE_Technical_Wishes/Edit_Conflicts/Feedback_Round_Test_Page here].\n\nBelow are the results of your test edit conflict resolution.",
"twocolconflict-test-username": "ConflictTest User",
"twocolconflict-test-summary-text": "Conflict test edit summary",
"twocolconflict-split-conflict-hint": "Thank you for using this beta feature. You can help to improve it further, if you leave feedback [//www.mediawiki.org/wiki/Help_talk:Two_Column_Edit_Conflict_View on this page].",
"twocolconflict-split-your-version-header": "Your version",
"twocolconflict-split-current-version-header": "Conflicting version from $1 (currently live)",
"twocolconflict-split-not-saved-at": "not published $1, $2.",
"twocolconflict-split-saved-at": "published $1, $2.",
"twocolconflict-split-choose-version": "Please select a version",
"twocolconflict-split-tour-dialog-header": "Solve edit conflicts",
"twocolconflict-split-tour-dialog-message": "You happen to experience an edit conflict: During your edit another user also edited the page and saved it. Your version now does not include the latest edits. We are kindly asking you to merge your version with the now latest version of the other user.",
"twocolconflict-split-tour-dialog-btn-text": "Start merging",
"twocolconflict-split-tour-popup-btn-text": "Okay, got it.",
"twocolconflict-split-tour-popup1-header": "Diverging changes are shown line by line.",
"twocolconflict-split-tour-popup1-message": "When there's a difference between the other user's text and yours, the two versions are shown side by side: the other user's version in the yellow box on the left side and yours in the blue box on the right.
When there is no difference between the two versions, the lines are shown in grey boxes. These can be expanded or collapsed and edited if needed.",
"twocolconflict-split-tour-popup2-header": "Choose which changes you want to keep",
"twocolconflict-split-tour-popup2-message": "Select which text version you want to keep by clicking on one of the two buttons between each pair of lines. When you have selected a version, you can edit it by clicking on the pen icon. It’s also possible to copy text from the version you didn’t select by using the copy and paste function on your keyboard or with a right click.
You need to select one version for each changed line to save the merged text.",
"twocolconflict-split-tour-popup3-header": "Highlighted text",
"twocolconflict-split-tour-popup3-message": "The text that was changed in either version of a line is highlighted. After you edit the text, the highlighting will be gone.",
"twocolconflict-split-edit-tooltip": "Edit text",
- "twocolconflict-split-save-tooltip": "Save changes and leave editing mode."
+ "twocolconflict-split-save-tooltip": "Save changes and leave editing mode.",
+ "twocolconflict-split-reset-tooltip": "Reset text",
+ "twocolconflict-split-reset-warning": "Discard changes? Your text will be reset to what it was when the edit conflict occurred.",
+ "twocolconflict-split-reset-warning-cancel": "Cancel",
+ "twocolconflict-split-reset-warning-accept": "Discard"
}
diff --git a/i18n/qqq.json b/i18n/qqq.json
index 20633936..2487d954 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -1,85 +1,89 @@
{
"@metadata": {
"authors": [
"WMDE",
"Robby",
"Mormegil",
"Liuxinyu970226",
"Amire80",
"Mainframe98",
"Raymond",
"McDutchie"
]
},
"twocolconflict": "TwoColConflict",
"twocolconflict-desc": "{{desc|name=TwoColConflict|url=https://www.mediawiki.org/wiki/Extension:TwoColConflict}}",
"twocolconflict-beta-feature-message": "Label for the TwoColConflict Beta Feature.",
"twocolconflict-beta-feature-description": "Description for the TwoColConflict Beta Feature, describing the feature that will be enabled.",
"twocolconflict-explainconflict": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a person who edits pages.}}\nAppears at the top of a page when there is an edit conflict.\n\nParameters:\n$1 - Label of the save button. Either {{msg-mw|savechanges}} or {{msg-mw|publishchanges}}.\n\nSee also:\n* {{msg-mw|Explainconflict}}\n* {{msg-mw|Savearticle}}",
"twocolconflict-changes-col-title": "Header for the unified diff column with the changes.",
"twocolconflict-changes-col-desc-1": "First line of the description text for the unified diff column.",
"twocolconflict-changes-col-desc-2": "Second line of the description text for the unified diff column.",
"twocolconflict-changes-col-desc-3": "Third line of the description text for the unified diff column. Does only show if more then two revisions lie in between.\n\nParameters:\n* $1 - Number of changed revisions in between. Always greater then 1.\n* $2 - Link the the revision history see {{msg-mw|twocolconflict-history-link}}.",
"twocolconflict-changes-col-desc-4": "Fourth line of the description text for the unified diff column.",
"twocolconflict-history-link": "Text for the link the revision history of the article.",
"twocolconflict-editor-col-title": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a person who edits pages.}}\nHeader for the editor column.",
"twocolconflict-editor-col-desc-1": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a person who edits pages.}}\nFirst half of the description for the editor column.",
"twocolconflict-editor-col-desc-2": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a person who edits pages.}}\nSecond half of the description for the editor column.\n\nParameters:\n$1 - Label of the save button. Either {{msg-mw|savechanges}} or {{msg-mw|publishchanges}}.",
"twocolconflict-base-selection-desc-1": "The first point describing the steps to be taken in the base version selection for the editor.",
"twocolconflict-base-selection-desc-2": "The second point describing the steps to be taken after the base version was selected.",
"twocolconflict-base-selection-desc-3": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a person who edits pages.}}\nThe third point describing the steps to be taken after the base version was selected and the content was merged.\n\nParameters:\n$1 - Label of the save button. Either {{msg-mw|savechanges}} or {{msg-mw|publishchanges}}.",
"twocolconflict-base-selection-dialog-text": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a person who edits pages.}}\nThe text shown in the dialog when selecting a base version to solve a conflict.",
"twocolconflict-base-selection-own-label": "The label for the option in the base version selection dialog to select your own text as base.",
"twocolconflict-base-selection-foreign-label": "The label for the option in the base version selection dialog to select the foreign version as base.",
"twocolconflict-base-selection-submit-label": "The label on the submit button in the base version selection dialog.\n{{Identical|OK}}",
"twocolconflict-diffchange-own-title": "The title text in the unified diff view for changes by the user.",
"twocolconflict-diffchange-foreign-title": "The title text in the unified diff view for conflicting changes.\n\nParameters:\n$1 - Username of the user that edited the current revision of the page.",
"twocolconflict-diffchange-unchanged-title": "The label text in the unified diff view for unchanged text.",
"twocolconflict-label-show": "Label for the option showing elements in the diff view.\n{{Identical|Show}}",
"twocolconflict-label-hide": "Label for the option hiding elements in the diff view.\n{{Identical|Hide}}",
"twocolconflict-label-unchanged": "Label for the options showing and hiding unchanged text in the diff view.",
"twocolconflict-label-show-unchanged": "Label for the buttons in the diff view to show unchanged text.",
"twocolconflict-label-hide-unchanged": "Label for the buttons in the diff view to hide unchanged text.",
"twocolconflict-show-help-tooltip": "Text shown in a tooltip for the \"Show help\" button.",
"twocolconflict-help-dialog-slide1": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a person who edits pages.}}\nText shown on the first slide of the help dialog.",
"twocolconflict-help-dialog-slide2": "Text shown on the second slide of the help dialog.",
"twocolconflict-help-dialog-slide3": "Text shown on the third slide of the help dialog.\n\nSee also:\n{{msg-mw|twocolconflict-label-show}}.",
"twocolconflict-help-dialog-slide4": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a random user who edited some pages.}}\nText shown on the fourth slide of the help dialog.",
"twocolconflict-help-dialog-slide5": "{{doc-important|The \"editor\" here refers to the editor softwares/extensions/features such as Wikitext editor, VisualEditor, ... etc. Not a random user who edited some pages.}}\nText shown on the fifth slide of the help dialog.\n\nParameters:\n$1 - Label of the save button. Either {{msg-mw|savechanges}} or {{msg-mw|publishchanges}}.",
"twocolconflict-tutorial": "Text shown above the TwoColConflict tutorial. This should contain as few words as possible to avoid being truncated.",
"twocolconflict-previous-dialog": "Label of the button to go to the previous tutorial slide.\n{{Identical|Previous}}",
"twocolconflict-next-dialog": "Label of the button to go to the next tutorial slide.\n{{Identical|Next}}",
"twocolconflict-close-dialog": "Label of the button to close the two column edit conflict tutorial.\n{{Identical|Close}}",
"twocolconflict-test-needsbeta": "Error message show on the conflict test page if the beta feature is not enabled.",
"twocolconflict-test-page-title": "Page title when simulating edit conflicts on the conflict test pages.",
"twocolconflict-test-title-label": "Label for the conflict test page input box to load an article.",
"twocolconflict-test-title-submit": "Submit button on the conflict test page to load an article.",
"twocolconflict-test-title-not-existing": "Error message shown on the conflict test page when the submitted title does not exist.",
"twocolconflict-test-no-direct-editing": "Error message shown on the conflict test page when the submitted page's content model does not support direct editing (e. g. a Structured Discussions topic or a Wikibase item).",
"twocolconflict-test-text-submit": "Submit button on the conflict test page to submit changes creating a test conflict.",
"twocolconflict-test-initial-hint": "First hint shown on the conflict test page above the input field to load an article to experiment with.",
"twocolconflict-test-edit-hint": "Second hint shown on the conflict test page above the editor to make changes.",
"twocolconflict-test-conflict-hint": "Third hint shown on the conflict test page above the simulated edit conflict.",
"twocolconflict-test-preview-submit": "Label for the submit button to show the conflict result preview.\n\n{{doc-important|This should be translated as \"Simulate the publication of the changes\", and NOT as \"Simulate the changes of the publication\".}}",
"twocolconflict-test-preview-hint": "Last hint shown on the conflict test page above the preview of the resolved test conflict.",
"twocolconflict-test-username": "Username for the conflict test page's fictitious conflicting edit.",
"twocolconflict-test-summary-text": "Edit summary for the conflict test page's fictitious conflicting edit.",
"twocolconflict-split-conflict-hint": "General hint shown during an edit conflict.",
"twocolconflict-split-your-version-header": "Header for the diff column showing the users changes.",
"twocolconflict-split-current-version-header": "Header for the diff column showing the current conflicting changes.",
"twocolconflict-split-not-saved-at": "Header for the diff columns showing the time and date when the content was modified by the users.\n\nParameters:\n* $1 - date\n* $2 - time",
"twocolconflict-split-saved-at": "Header for the diff columns showing the time and date when the current conflicting content was modified.\n\nParameters:\n* $1 - date\n* $2 - time",
"twocolconflict-split-choose-version": "Label for the version selection on conflicting paragraphs.",
"twocolconflict-split-tour-dialog-header": "Text for the header on the first screen of the help dialog.",
"twocolconflict-split-tour-dialog-message": "Text for the message on the first screen of the help dialog.",
"twocolconflict-split-tour-dialog-btn-text": "Text for the close button on the first screen of the help dialog.",
"twocolconflict-split-tour-popup-btn-text": "Text for the close button on any popup in the help dialog.",
"twocolconflict-split-tour-popup1-header": "Text for the header of the popup explaining \"Conflicting versions\".",
"twocolconflict-split-tour-popup1-message": "Text for the message of the popup explaining \"Conflicting versions\".\n\nFor a right-to-left language, swap \"right\" and \"left\".",
"twocolconflict-split-tour-popup2-header": "Text for the header of the popup explaining \"Highlighted text\".",
"twocolconflict-split-tour-popup2-message": "Text for the message of the popup explaining \"Highlighted text\".",
"twocolconflict-split-tour-popup3-header": "Text for the header of the popup explaining \"Choose a base version\".",
"twocolconflict-split-tour-popup3-message": "Text for the message of the popup explaining \"Choose a base version\".",
"twocolconflict-split-edit-tooltip": "Label for the edit button shown on diff paragraphs.",
- "twocolconflict-split-save-tooltip": "Label for the save button shown on diff paragraphs to save changes in that paragraph."
+ "twocolconflict-split-save-tooltip": "Label for the save button shown on diff paragraphs to save changes in that paragraph.",
+ "twocolconflict-split-reset-tooltip": "Label for the reset button shown on diff paragraphs.",
+ "twocolconflict-split-reset-warning": "Message for the warning shown to the user when the reset button was pressed. This message confirms whether or not the user wants to discard their changes.",
+ "twocolconflict-split-reset-warning-cancel": "Label for the cancel button of the reset warning.",
+ "twocolconflict-split-reset-warning-accept": "Label for the accept button of the reset warning."
}
diff --git a/includes/SplitTwoColConflict/HtmlSplitConflictView.php b/includes/SplitTwoColConflict/HtmlSplitConflictView.php
index df79c45f..7a842fe2 100644
--- a/includes/SplitTwoColConflict/HtmlSplitConflictView.php
+++ b/includes/SplitTwoColConflict/HtmlSplitConflictView.php
@@ -1,241 +1,263 @@
*/
class HtmlSplitConflictView {
/**
* @var User
*/
private $user;
/**
* @var Language
*/
private $language;
/**
* @param User $user
* @param Language $language
*/
public function __construct( User $user, Language $language ) {
$this->user = $user;
$this->language = $language;
}
/**
* @param array[] $unifiedDiff
* @param string[] $yourLines
* @param string[] $storedLines
*
* @return string HTML
*/
public function getHtml( array $unifiedDiff, array $yourLines, array $storedLines ) {
$out = Html::openElement(
'div', [ 'class' => 'mw-twocolconflict-split-view' ]
);
$currRowNum = 0;
$isFirstNonCopyLine = true;
foreach ( $unifiedDiff as $key => $currentLine ) {
foreach ( $currentLine as $changeSet ) {
if ( $changeSet['action'] !== 'copy' && $isFirstNonCopyLine ) {
$out .= $this->buildSideSelectorLabel();
$isFirstNonCopyLine = false;
}
switch ( $changeSet['action'] ) {
case 'delete':
$out .= $this->startRow( $currRowNum );
$out .= $this->buildRemovedLine(
$changeSet['old'],
implode( "\n", array_slice( $storedLines, $changeSet['oldline'], $changeSet['count'] ) ),
$currRowNum
);
$out .= $this->buildSideSelector( $currRowNum );
if ( !$this->hasConflictInLine( $currentLine ) ) {
$out .= $this->buildAddedLine( "\u{00A0}", '', $currRowNum );
$out .= $this->endRow();
$currRowNum++;
}
break;
case 'add':
if ( !$this->hasConflictInLine( $currentLine ) ) {
$out .= $this->startRow( $currRowNum );
$out .= $this->buildRemovedLine( "\u{00A0}", '', $currRowNum );
$out .= $this->buildSideSelector( $currRowNum );
}
$out .= $this->buildAddedLine(
$changeSet['new'],
implode( "\n", array_slice( $yourLines, $changeSet['newline'], $changeSet['count'] ) ),
$currRowNum
);
$out .= $this->endRow();
$currRowNum++;
break;
case 'copy':
$out .= $this->startRow( $currRowNum );
$out .= $this->buildCopiedLine( $changeSet['copy'], $currRowNum );
$out .= $this->endRow();
$currRowNum++;
break;
}
}
}
$out .= Html::closeElement( 'div' );
return $out;
}
private function startRow( $rowNum ) {
return Html::openElement(
'div', [ 'class' => 'mw-twocolconflict-split-row', 'data-line-number' => $rowNum ]
);
}
private function endRow() {
return Html::closeElement( 'div' );
}
private function buildAddedLine( $text, $rawText, $rowNum ) {
return Html::rawElement(
'div',
[ 'class' => 'mw-twocolconflict-split-add mw-twocolconflict-split-column' ],
$this->buildEditableTextContainer( $text, $rawText, $rowNum, 'your' )
);
}
private function buildRemovedLine( $text, $rawText, $rowNum ) {
return Html::rawElement(
'div',
[ 'class' => 'mw-twocolconflict-split-delete mw-twocolconflict-split-column' ],
$this->buildEditableTextContainer( $text, $rawText, $rowNum, 'other' )
);
}
private function buildCopiedLine( $text, $rowNum ) {
return Html::rawElement(
'div',
[ 'class' => 'mw-twocolconflict-split-copy mw-twocolconflict-split-column' ],
$this->buildEditableTextContainer( $text, $text, $rowNum, 'copy' )
);
}
private function buildSideSelectorLabel() {
return Html::openElement(
'div', [ 'class' => 'mw-twocolconflict-split-selector-label' ]
) .
Html::element(
'span',
[],
wfMessage( 'twocolconflict-split-choose-version' )->text()
) .
Html::closeElement( 'div' );
}
private function buildEditableTextContainer( $text, $rawText, $rowNum, $changeType ) {
return Html::rawElement(
'div',
[ 'class' => 'mw-twocolconflict-split-editable' ],
Html::rawElement(
'span',
[ 'class' => 'mw-twocolconflict-split-difftext' ],
$text
) .
$this->buildEditButton() .
$this->buildSaveButton() .
+ $this->buildResetButton() .
+ $this->buildResetText( $text, $rawText ) .
$this->buildTextEditor( $rawText, $rowNum, $changeType )
);
}
+ private function buildResetText( $text, $rawText ) {
+ return Html::rawElement(
+ 'span', [ 'class' => 'mw-twocolconflict-split-reset-diff-text' ],
+ $rawText
+ ) . Html::rawElement(
+ 'span', [ 'class' => 'mw-twocolconflict-split-reset-editor-text' ],
+ $text
+ );
+ }
+
private function buildTextEditor( $text, $rowNum, $changeType ) {
$class = 'mw-editfont-' . $this->user->getOption( 'editfont' );
return Html::rawElement(
'textarea',
[
'class' => $class . ' mw-twocolconflict-split-editor',
'name' => 'mw-twocolconflict-split-content[' . $rowNum . '][' . $changeType . ']',
'lang' => $this->language->getHtmlCode(),
'dir' => $this->language->getDir(),
'rows' => '6',
'autocomplete' => 'off',
],
rtrim( $text, "\r\n" ) . "\n"
) .
Html::hidden(
"mw-twocolconflict-split-linefeeds[$rowNum][$changeType]",
$this->countExtraLineFeeds( $text )
);
}
private function buildEditButton() {
return new ButtonWidget( [
'infusable' => true,
'framed' => false,
'icon' => 'edit',
'title' => wfMessage( 'twocolconflict-split-edit-tooltip' )->text(),
'classes' => [ 'mw-twocolconflict-split-edit-button' ]
] );
}
private function buildSaveButton() {
return new ButtonWidget( [
'infusable' => true,
'framed' => false,
'icon' => 'check',
'title' => wfMessage( 'twocolconflict-split-save-tooltip' )->text(),
'classes' => [ 'mw-twocolconflict-split-save-button' ]
] );
}
+ private function buildResetButton() {
+ return new ButtonWidget( [
+ 'infusable' => true,
+ 'framed' => false,
+ 'icon' => 'undo',
+ 'title' => wfMessage( 'twocolconflict-split-reset-tooltip' )->text(),
+ 'classes' => [ 'mw-twocolconflict-split-reset-button' ]
+ ] );
+ }
+
/**
* @param string $text
*
* @return int
*/
private function countExtraLineFeeds( $text ) {
return substr_count( $text, "\n", strlen( rtrim( $text, "\r\n" ) ) );
}
private function buildSideSelector( $rowNum ) {
return Html::openElement( 'div', [ 'class' => 'mw-twocolconflict-split-selection' ] ) .
Html::rawElement( 'div', [], new RadioInputWidget( [
'name' => 'mw-twocolconflict-side-selector[' . $rowNum . ']',
'value' => 'other',
'autocomplete' => 'off',
'selected' => true,
] ) ) .
Html::rawElement( 'div', [], new RadioInputWidget( [
'name' => 'mw-twocolconflict-side-selector[' . $rowNum . ']',
'value' => 'your',
'autocomplete' => 'off',
] ) ) .
Html::closeElement( 'div' );
}
/**
* Check if a unified diff line contains an edit conflict.
*
* @param array[] $currentLine
*
* @return bool
*/
private function hasConflictInLine( array $currentLine ) {
return count( $currentLine ) > 1 &&
$currentLine[0]['action'] === 'delete' &&
$currentLine[1]['action'] === 'add';
}
}
diff --git a/modules/SplitTwoColConflict/ext.TwoColConflict.Split.editable.less b/modules/SplitTwoColConflict/ext.TwoColConflict.Split.editable.less
index 5c7281c7..105c2ba9 100644
--- a/modules/SplitTwoColConflict/ext.TwoColConflict.Split.editable.less
+++ b/modules/SplitTwoColConflict/ext.TwoColConflict.Split.editable.less
@@ -1,102 +1,106 @@
/* stylelint-disable no-descending-specificity */
.mw-twocolconflict-split-editable {
.mw-twocolconflict-split-editor {
display: none;
border: 0;
outline: 0;
resize: none;
overflow: hidden;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
background: transparent;
}
.mw-twocolconflict-split-editor:focus {
border: 0;
}
/* stylelint-disable-next-line selector-max-id */
#toolbar {
display: none;
}
}
.mw-twocolconflict-split-editing {
.mw-twocolconflict-split-selected,
.mw-twocolconflict-split-copy {
.mw-twocolconflict-split-editable {
.mw-twocolconflict-split-editor {
display: block;
}
.mw-twocolconflict-split-edit-button {
display: none;
}
.mw-twocolconflict-split-difftext {
display: none;
}
.mw-twocolconflict-split-save-button {
display: block;
}
+
+ .mw-twocolconflict-split-reset-button {
+ display: block;
+ }
}
}
.mw-twocolconflict-split-column {
display: block;
word-wrap: break-word;
overflow-wrap: break-word;
-moz-appearance: textfield-multiline;
-webkit-appearance: textarea;
-webkit-user-select: text;
font: medium '-moz-fixed';
font: '-webkit-small-control';
font-size: medium;
line-height: normal;
text-rendering: auto;
color: initial;
letter-spacing: normal;
word-spacing: normal;
text-transform: none;
text-indent: 0;
text-shadow: none;
text-align: start;
}
}
.client-nojs {
.mw-twocolconflict-split-editable {
.mw-twocolconflict-split-difftext {
display: none;
}
.mw-twocolconflict-split-editor {
display: block;
overflow: inherit;
}
}
.mw-twocolconflict-split-column {
display: block;
word-wrap: break-word;
overflow-wrap: break-word;
-moz-appearance: textfield-multiline;
-webkit-appearance: textarea;
-webkit-user-select: text;
font: medium '-moz-fixed';
font: '-webkit-small-control';
font-size: medium;
line-height: normal;
text-rendering: auto;
color: initial;
letter-spacing: normal;
word-spacing: normal;
text-transform: none;
text-indent: 0;
text-shadow: none;
text-align: start;
}
}
diff --git a/modules/SplitTwoColConflict/ext.TwoColConflict.Split.init.js b/modules/SplitTwoColConflict/ext.TwoColConflict.Split.init.js
index af6f4a45..ee1dbeaa 100644
--- a/modules/SplitTwoColConflict/ext.TwoColConflict.Split.init.js
+++ b/modules/SplitTwoColConflict/ext.TwoColConflict.Split.init.js
@@ -1,148 +1,200 @@
( function ( mw, $ ) {
'use strict';
/**
* @param {jQuery} $column
* @return {OO.ui.Element}
*/
function getColumnEditButton( $column ) {
return OO.ui.ButtonWidget.static.infuse(
$column.find( '.mw-twocolconflict-split-edit-button' )
);
}
/**
* @param {jQuery} $selectedColumn
* @param {jQuery} $unselectedColumn
*/
function setColumnEditButtonState( $selectedColumn, $unselectedColumn ) {
getColumnEditButton( $selectedColumn ).setDisabled( false );
getColumnEditButton( $unselectedColumn ).setDisabled( true );
}
/**
* @return {String}
*/
function getEditorFontClass() {
return $( '.mw-twocolconflict-split-editor' ).attr( 'class' )
.replace( 'mw-twocolconflict-split-editor', '' )
.trim();
}
/**
* @param {jQuery} $row
*/
function enableEditing( $row ) {
$row.addClass( 'mw-twocolconflict-split-editing' );
$row.find( '.mw-twocolconflict-split-editable' ).addClass( getEditorFontClass() );
}
/**
* @param {jQuery} $row
*/
function disableEditing( $row ) {
+ $row.removeClass( 'mw-twocolconflict-split-editing' );
+ $row.find( '.mw-twocolconflict-split-editable' ).removeClass( getEditorFontClass() );
+ }
+
+ /**
+ * @param {jQuery} $row
+ */
+ function saveEditing( $row ) {
var $selected = $row.find( '.mw-twocolconflict-split-selected, .mw-twocolconflict-split-copy' ),
$diffText = $selected.find( '.mw-twocolconflict-split-difftext' ),
$editor = $selected.find( '.mw-twocolconflict-split-editor' );
$diffText.text( $editor.val() );
+ disableEditing( $row );
+ }
- $row.removeClass( 'mw-twocolconflict-split-editing' );
- $row.find( '.mw-twocolconflict-split-editable' ).removeClass( getEditorFontClass() );
+ /**
+ * @param {jQuery} $row
+ */
+ function resetEditing( $row ) {
+ var $selected = $row.find( '.mw-twocolconflict-split-selected, .mw-twocolconflict-split-copy' ),
+ $diffText = $selected.find( '.mw-twocolconflict-split-difftext' ),
+ $editor = $selected.find( '.mw-twocolconflict-split-editor' ),
+ $resetDiffText = $selected.find( '.mw-twocolconflict-split-reset-diff-text' ),
+ $resetEditorText = $selected.find( '.mw-twocolconflict-split-reset-editor-text' );
+
+ $diffText.text( $resetDiffText.text() );
+ $editor.val( $resetEditorText.text() );
+ disableEditing( $row );
+ }
+
+ /**
+ * @param {jQuery} $row
+ */
+ function resetWarning( $row ) {
+ OO.ui.confirm(
+ mw.msg( 'twocolconflict-split-reset-warning' ), {
+ actions: [
+ {
+ label: mw.msg( 'twocolconflict-split-reset-warning-cancel' ),
+ action: 'cancel'
+ },
+ {
+ label: mw.msg( 'twocolconflict-split-reset-warning-accept' ),
+ action: 'accept'
+ }
+ ]
+ }
+ ).done( function ( confirmed ) {
+ if ( confirmed ) {
+ resetEditing( $row );
+ }
+ } );
}
function initButtonEvents() {
$( '.mw-twocolconflict-split-edit-button' ).each( function () {
var button = OO.ui.ButtonWidget.static.infuse( this );
button.on( 'click', function () {
enableEditing( button.$element.closest( '.mw-twocolconflict-split-row' ) );
} );
} );
$( '.mw-twocolconflict-split-save-button' ).each( function () {
var button = OO.ui.ButtonWidget.static.infuse( this );
button.on( 'click', function () {
- disableEditing( button.$element.closest( '.mw-twocolconflict-split-row' ) );
+ saveEditing( button.$element.closest( '.mw-twocolconflict-split-row' ) );
+ } );
+ } );
+
+ $( '.mw-twocolconflict-split-reset-button' ).each( function () {
+ var button = OO.ui.ButtonWidget.static.infuse( this );
+ button.on( 'click', function () {
+ resetWarning( button.$element.closest( '.mw-twocolconflict-split-row' ) );
} );
} );
}
function initColumnSelection() {
var $switches = $( '.mw-twocolconflict-split-selection' ),
$radioButtons = $switches.find( 'input' );
$radioButtons.on( 'change', function () {
var $switch = $( this ),
$row = $switch.closest( '.mw-twocolconflict-split-row' ),
$selectedColumn, $unselectedColumn;
if ( $switch.val() === 'your' ) {
$selectedColumn = $row.find( '.mw-twocolconflict-split-add' );
$unselectedColumn = $row.find( '.mw-twocolconflict-split-delete' );
setColumnEditButtonState( $selectedColumn, $unselectedColumn );
} else {
$selectedColumn = $row.find( '.mw-twocolconflict-split-delete' );
$unselectedColumn = $row.find( '.mw-twocolconflict-split-add' );
setColumnEditButtonState( $selectedColumn, $unselectedColumn );
}
$selectedColumn
.addClass( 'mw-twocolconflict-split-selected' )
.removeClass( 'mw-twocolconflict-split-unselected' );
$unselectedColumn
.removeClass( 'mw-twocolconflict-split-selected' )
.addClass( 'mw-twocolconflict-split-unselected' );
} );
$switches.find( 'input:checked' ).trigger( 'change' );
}
function initTour() {
var $body = $( 'body' ), $helpBtn, tour,
Tour = mw.libs.twoColConflict.split.Tour,
settings = new mw.libs.twoColConflict.Settings();
tour = Tour.init(
mw.msg( 'twocolconflict-split-tour-dialog-header' ),
'mw-twocolconflict-split-tour-slide-1',
mw.msg( 'twocolconflict-split-tour-dialog-message' )
);
tour.addTourPopup(
mw.msg( 'twocolconflict-split-tour-popup1-header' ),
mw.msg( 'twocolconflict-split-tour-popup1-message' ),
$body.find( '.mw-twocolconflict-split-your-version-header' )
);
tour.addTourPopup(
mw.msg( 'twocolconflict-split-tour-popup2-header' ),
mw.msg( 'twocolconflict-split-tour-popup2-message' ),
$body.find( '.mw-twocolconflict-split-selection' ).first()
);
tour.addTourPopup(
mw.msg( 'twocolconflict-split-tour-popup3-header' ),
mw.msg( 'twocolconflict-split-tour-popup3-message' ),
$body.find( '.mw-twocolconflict-diffchange' ).first()
);
$helpBtn = tour.getHelpButton();
$( '.mw-twocolconflict-split-flex-header' ).prepend( $helpBtn );
if ( !settings.shouldHideHelpDialogue() ) {
// Delay slightly so that the first tour dialog
// has the correct size when it opens
// Todo: Look into a better fix
setTimeout( function () {
tour.showTour();
settings.setHideHelpDialogue( true );
}, 250 );
}
}
$( function () {
initColumnSelection();
initButtonEvents();
initTour();
} );
}( mediaWiki, jQuery ) );
diff --git a/modules/SplitTwoColConflict/ext.TwoColConflict.Split.less b/modules/SplitTwoColConflict/ext.TwoColConflict.Split.less
index 7141fbdc..ab1c6d78 100644
--- a/modules/SplitTwoColConflict/ext.TwoColConflict.Split.less
+++ b/modules/SplitTwoColConflict/ext.TwoColConflict.Split.less
@@ -1,189 +1,201 @@
/* stylelint-disable no-descending-specificity */
.mw-twocolconflict-split-result {
display: none;
}
.mw-twocolconflict-split-header {
text-align: right;
}
.mw-twocolconflict-split-flex-header {
display: flex;
}
.mw-twocolconflict-split-warningbox {
display: block;
color: #705000;
border: 1px solid #fde29b;
background-color: #fdf1d1;
padding: 0.5em 1em;
margin-bottom: 1em;
}
.mw-twocolconflict-split-current-version-header,
.mw-twocolconflict-split-your-version-header {
flex: 1 0 50%;
text-align: center;
margin: 20px 0;
span {
padding: 0 5px;
}
}
.mw-twocolconflict-split-current-version-header span:first-child {
background-color: #ffe8a6;
}
.mw-twocolconflict-split-your-version-header span:first-child {
background-color: #add8ff;
}
.mw-twocolconflict-split-view {
display: flex;
flex-direction: column;
}
.mw-twocolconflict-split-row {
display: flex;
align-items: flex-start;
margin: 10px 0;
}
.mw-twocolconflict-split-column {
flex: 1;
background-color: #fff;
color: #000;
position: relative;
border-radius: 8px;
border-width: 3px 3px 3px 7px;
border-style: solid;
padding: 5px 40px 5px 20px;
white-space: pre-line;
/* Non standard for webkit */
word-break: break-word;
&.mw-twocolconflict-split-add {
border-color: #add8ff;
margin-left: 10px;
}
&.mw-twocolconflict-split-delete {
border-color: #ffe8a6;
margin-right: 10px;
}
&.mw-twocolconflict-split-copy {
border-color: #e9e9e9;
background-color: #fafafa;
}
ins.mw-twocolconflict-diffchange {
background-color: #add8ff;
}
del.mw-twocolconflict-diffchange {
background-color: #ffe8a6;
}
ins.mw-twocolconflict-diffchange,
del.mw-twocolconflict-diffchange {
text-decoration: none;
}
&.mw-twocolconflict-split-unselected {
color: #72777d;
&.mw-twocolconflict-split-add {
border-color: #eaf3ff;
}
&.mw-twocolconflict-split-delete {
border-color: #fef6e7;
}
ins.mw-twocolconflict-diffchange {
background-color: #eaf3ff;
}
del.mw-twocolconflict-diffchange {
background-color: #fef6e7;
}
}
.mw-twocolconflict-split-edit-button {
position: absolute;
top: 0;
right: 0;
}
.mw-twocolconflict-split-save-button {
display: none;
position: absolute;
top: 0;
right: 0;
}
+
+ .mw-twocolconflict-split-reset-button {
+ display: none;
+ position: absolute;
+ top: 30px;
+ right: 0;
+ }
+
+ .mw-twocolconflict-split-reset-diff-text,
+ .mw-twocolconflict-split-reset-editor-text {
+ display: none;
+ }
}
.mw-twocolconflict-split-selector-label {
margin-bottom: -15px;
text-align: center;
span {
display: inline-block;
line-height: 1.2em;
width: 110px;
}
}
.mw-twocolconflict-split-selection {
display: flex;
margin-top: 10px;
width: 66px;
div {
flex: 1;
}
div:nth-child( 1 ) {
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:checked + span,
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:active + span,
.oo-ui-radioInputWidget [ type='radio' ] + span {
border-color: #ac6700;
background: #fef7e7;
}
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:checked:focus + span:before,
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:checked:active + span:before {
border-color: #ac6700;
}
}
div:nth-child( 2 ) {
text-align: right;
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:checked + span,
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:active + span,
.oo-ui-radioInputWidget [ type='radio' ] + span {
border-color: #2c529d;
background: #ebf3fe;
}
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:checked:focus + span:before,
.oo-ui-radioInputWidget.oo-ui-widget-enabled [ type='radio' ]:checked:active + span:before {
border-color: #2c529d;
}
}
}
.client-nojs {
.mw-twocolconflict-split-current-version-header span,
.mw-twocolconflict-split-your-version-header span {
background-color: transparent;
}
.mw-twocolconflict-split-edit-button {
display: none;
}
}