// ==UserScript== // @name MLPForums Plus CELESTIA // @description Enhances MLPForums with extra features and UI improvements // @author Rikifive, tomatopotato // @version 1.5.1 // @match *://mlpforums.com/* // @icon https://mlpforums.com/favicon.ico // ==/UserScript== (function() { 'use strict'; /*==================================================== | * * * CELESTIA THEME INJECTION * * * ====================================================*/ const celestiaThemeCSS = ` :root { /* MAIN */ --plus-bg_image: url(https://mlpforums.com/uploads/monthly_2023_03/CelestiaTheme-IPSboxbg.jpg.3e33e08958eedace6f7b6e953a8d1636.jpg); --plus-body_bg: linear-gradient(rgba(255,255,235,0.5), rgba(230,250,255,0.5), rgba(255,235,255,0.5)), var(--plus-bg_image); --plus-box_bg: linear-gradient(rgba(255,255,185,0.3), rgba(240,255,255,0.3) 30%, rgba(230,255,255,0.3) 70%, rgba(250,210,255,0.4)), var(--plus-bg_image); --plus-menu_bg: linear-gradient(90deg, rgba(255,175,0,0.4), transparent, rgba(100,125,255,0.4)), url(https://mlpforums.com/uploads/monthly_2023_03/CelestiaTheme-Menubg.jpg.c002493918d15777187d231be877cbfa.jpg); --plus-submenu_bg: linear-gradient(0deg, #f4c08e, #fff6b9); --plus-submenu_border: #f80; --plus-dropmenu_border: #fa08; --plus-widgettitle_bg: #ffff0055; --plus-widgettitle_img: url(https://mlpforums.com/uploads/monthly_2023_03/CelestiaTheme-Sun.png.9d492bdfe381bab03bc1b175c65d9c32.png); --plus-widgettitle_txtcolor: #0a5; --plus-widgettitle_txtshadow: yellow; --plus-widgetcontrol_bg: #47f; --plus-area_border: linear-gradient(155deg, #8ae9, #e8f9) 1; --plus-mentionbg1: 255, 225, 155; --plus-mentionbg2: 255, 75, 205; --plus-mentiontxt: 120, 0, 100; --plus-bgflowspd: 15s; /* CKE */ --plus-cke_toolbar1: #fff6b9; --plus-cke_toolbar2: #f4c08e; --plus-cke_toolbar_icoinvert: 0; --plus-cke_toolbar_textcolor: black; --plus-cke_toolbar_textshadow: 0 1px 0 rgba(255,255,255,.5); --plus-cke_charcount_border: #f4c08e; --plus-cke_charcount_bg: #fff6b9; /* CKE Dialog */ --plus-ckedial_bgcover_img: url(https://mlpforums.com/uploads/monthly_2023_03/CelestiaTheme-bgcover.thumb.jpg.ceaa7fdc5045c37e2c5cd665376b7424.jpg); --plus-ckedial_bgcover_color: white; --plus-ckedial_border_color: #f82; --plus-ckedial_title_color1: #fff6b9; --plus-ckedial_title_color2: #f4c08e; --plus-ckedial_title_txt: #af6300; --plus-ckedial_title_shadow: 0px 0px 10px #ffb000; --plus-ckedial_closeinvert: 0; --plus-ckedial_contents_bg: #fdf7fc; --plus-ckedial_contents_color: black; --plus-ckedial_btn_border: #f82; --plus-ckedial_btn_topcolor: #fff6b9; --plus-ckedial_btn_botcolor: #f4c08e; --plus-ckedial_btnok_border: #af8; --plus-ckedial_btnok_topcolor: #9ae9b3; --plus-ckedial_btnok_botcolor: #5ec0d5; /* NAVBAR */ --plus-usernav_btn_bg_hover: #f4c08e; --plus-usernav_btn_color: #fdf7fc; --plus-usernav_btn_color_hover: #fff6b9; --plus-ranklevel_bg: #f7a; --plus-expbar_bg: linear-gradient(45deg, #b35685, #5a7faf); --plus-expbarfill_bg: linear-gradient(45deg, #f6a, white); --plus_expbarfill_shadow: white; /* POST LIST */ --plus-postnav_pagebg: linear-gradient(to bottom, #fff6b9 20%, #f4c08e); --plus-postnav_pagebg_hover: linear-gradient(to bottom, #fff6b9, #f77 80%); --plus-postnav_pagecolor: var(--theme-text_color); --plus-postnav_pageborder: #f70; --plus-postnav_inputbtn_bg: #f4c08e; --plus-postnav_inputbtn_bg_hover: #fff6b9; --plus-postnav_inputbtn_border: #f93; --plus-postnav_inputbtn_border_hover: #fd8; --plus-postnav_inputbtn_txtshadow: #f80; --plus-postnav_inputnum_bg: linear-gradient(135deg, rgba(255,255,0,0.2), transparent, rgba(255,20,255,0.2)); --plus-postnav_item_bg: linear-gradient(to right, #f6b 10%, #9ae9b3 25%, #fdf7fc 70%); --plus-postnav_item-border: #f4c08e; --plus-postnav_itemcur_border: white; --plus-postnav_itemmod_bg: linear-gradient(#f99, #f33); --plus-postnav_itemmod_border: #f22; --plus-postnav_itemmodcur_bg: linear-gradient(#fcc, #f77); --plus-postnav_itemsol_bg: linear-gradient(#af8, #484); --plus-postnav_itemsol_border: #2f2; --plus-postnav_itemsolcur_bg: linear-gradient(#7c7, #cfa); --plus-postnav_itemsel_bg: linear-gradient(#ffe699, #f4b06e); --plus-postnav_itemsel_border: #fc4; --plus-postnav_itemselcur: linear-gradient(#fff6b9, #f4a0ce); /* OTHER VISUAL CHANGES */ --plus-derpynotif_txt: #fffaad; --plus-scrollbar_track: #389; --plus-scrollbar_track2: #274; --plus-scrollbar_thumb: #fff6b9; --plus-scrollbar_thumb2: #f4c08e; --plus-scrollbar_thumb_hover: #fea; --plus-scrollbar_thumb_hover2: #f95; --plus-scrollbar_thumb_active: #fb1; --plus-scrollbar_thumb_active2: #f7e; --plus-scrollbar_buttonbg: #5ec0d5; --plus-scrollbar_buttonbg_hover: #9ae9b3; --plus-scrollbar_button_up: url('https://mlpforums.com/uploads/monthly_2023_03/arrowup.png.379f16e377dec536c4efe77c8f0ecaec.png'); --plus-scrollbar_button_down: url('https://mlpforums.com/uploads/monthly_2023_03/arrowdown.png.ad0eb9163f681b4099f902e8baea59bb.png'); --plus-scrollbar_button_left: url('https://mlpforums.com/uploads/monthly_2023_03/arrowleft.png.c2db73708457ee12df35a4b254884498.png'); --plus-scrollbar_button_right: url('https://mlpforums.com/uploads/monthly_2023_03/arrowright.png.9368f254a0abe4415e0b0328313836e1.png'); --plus-scrollbar_corner_bg: #aef; --plus-scrollbar_corner_img: url('https://mlpforums.com/uploads/monthly_2023_03/CelestiaTheme-cutiemark.png.8f5f282333ed7c6034c37cf02c529980.png'); /* IPS */ --box--backgroundColor: #ffe; --box--boxShadow: 0 1px 3px rgb(255 100 155), 0 1px 2px rgb(255 255 0) !important; --theme-active_input_border: 255, 165, 225; --theme-brand_primary: 71, 193, 172; --theme-item_status: 160, 80, 180; --positive-dark: #006e46; --positive-light: #a3ffd7; --intermediate-light: #ffd889; --theme-main_nav_tab_font: 10, 10, 10; --theme-text_color: 15, 0, 15; --theme-text_dark: 0, 55, 100; --theme-text_light: 90, 100, 160; --theme-widget_title_font: 240, 185, 130; --theme-link: 15, 80, 155; --theme-link_button: 255, 60, 150; --theme-link_hover: 255, 155, 155; --theme-selected: 255, 205, 125, 0.3; --theme-selected2: 245, 140, 70, 0.3; --theme-selected_border: 55, 155, 255; --theme-moderated_light: 255, 150, 150, 0.3; --theme-moderated_light2: 255, 50, 50, 0.3; --theme-moderated_text: 136, 14, 79; --theme-moderated_text_light: 164, 118, 143; --theme-solved: 180, 255, 180, 0.3; --theme-solved2: 100, 255, 125, 0.3; --theme-tab_background: 89, 190, 212; --theme-pagination_active: 255, 140, 200; --theme-primary_button: 51, 186, 169; --theme-primary_button_font: 255, 250, 245; --theme-light_button: 244, 192, 142; --theme-light_button_font: 121, 76, 14; --theme-very_light_button: 253, 247, 252; --theme-very_light_button_font: 20, 20, 0; --theme-important_button: 255, 110, 120; --theme-important_button_font: 255, 255, 255; --theme-area_background_reset: 255, 255, 255; --theme-area_background: 89, 190, 212; --theme-area_background_light: 235, 245, 255; --theme-button_bar: 89, 190, 212; --theme-mentions: 125, 175, 255; --theme-footer_text: 255, 255, 255; --theme-footer_text_shadow: 1px 1px 1px black; } /* MAIN */ @keyframes BackgroundFlow { 0% {background-position-y: 0px; } 100% {background-position-y: -272px; } } body { background-color: var(--box--backgroundColor) !important; } #ipsLayout_body { background: var(--plus-body_bg) !important; } .ipsBox, #ipsLayout_mainArea > .ipsForm[action$='do=edit'] > .ipsForm, html[dir="ltr"] .ipsStream_withTimeline .ipsStreamItem, #elSearch_main .ipsStreamItem_contentBlock:not( .ipsBox ), .ipsApp .cke_wysiwyg_frame, .ipsApp .cke_wysiwyg_div { background-image: var(--plus-box_bg); } .ipsWidget_title { background: linear-gradient(225deg, var(--plus-widgettitle_bg), transparent), var(--plus-widgettitle_img) no-repeat right center; text-shadow: 0px 0px 10px var(--plus-widgettitle_txtshadow); } #ipsLayout_header nav { background: var(--plus-menu_bg); animation-name: BackgroundFlow; animation-duration: var(--plus-bgflowspd); animation-timing-function: linear; animation-iteration-count: infinite; } #ipsLayout_header nav::after { background: var(--plus-submenu_bg); border-width: 1px 0; border-style: solid; border-color: var(--plus-submenu_border); } .ipsAreaBackground_light, .ipsAreaBackground { background: var(--plus-body_bg); border: 1px solid; border-image: var(--plus-area_border); } .ipsMenu { border: 1px solid var(--plus-dropmenu_border); } a[data-mentionid]:hover { color: rgb(var(--plus-mentiontxt)); background-image: linear-gradient(to bottom, rgb(var(--plus-mentionbg1)), rgb(var(--plus-mentionbg2))); } a[data-mentionid] { color: rgb(var(--plus-mentiontxt)); background-image: linear-gradient(to bottom, rgba(var(--plus-mentionbg1),.7), rgba(var(--plus-mentionbg2),.7)); } .ipsApp .ipsModerated:not(.ipsComment_selected):not(.ipsDataItem_selected) { background-image: linear-gradient(rgba(var(--theme-moderated_light)), rgba(var(--theme-moderated_light2))), var(--plus-bg_image); } .ipsComment.ipsComment_solved { background-image: linear-gradient(rgba(var(--theme-solved)), rgba(var(--theme-solved2))), var(--plus-bg_image); } .ipsComment.ipsComment_selected { background-image: linear-gradient(rgba(var(--theme-selected)), rgba(var(--theme-selected2))), var(--plus-bg_image) !important; } #ipsLayout_footer a, #ipsLayout_footer p { text-shadow: var(--theme-footer_text_shadow); } /* MINOR TWEAKS */ .ipsQuote, .ipsSpoiler, .ipsStyle_spoiler { border: 4px solid rgba( var(--theme-brand_primary),.85); } html[dir="ltr"] .ipsStream.ipsStream_withTimeline { border-left: 5px solid rgba( var(--theme-timeline_color), 0.8 ); } #elWidgetControls { background: var(--plus-widgetcontrol_bg); } /* CKEDITOR */ .ipsApp .cke_top { background: linear-gradient(var(--plus-cke_toolbar1), var(--plus-cke_toolbar2)); border-radius: 5px 5px 0 0; } .cke_toolbar .cke_button_icon { filter: invert(var(--plus-cke_toolbar_icoinvert)); } .cke_combo_text { color: var(--plus-cke_toolbar_textcolor) !important; text-shadow: var(--plus-cke_toolbar_textshadow) !important; } .content-counter { border-bottom: 2px solid var(--plus-cke_charcount_border); border-radius: 0 0 5px 5px; background: var(--plus-cke_charcount_bg) !important; } /* CKE DIALOGS */ .cke_dialog_background_cover { background-color: var(--plus-ckedial_bgcover_color) !important; background: var(--plus-ckedial_bgcover_img); background-repeat: no-repeat; background-position: calc(50% - 300px) 50%; } .cke_dialog_body { border-color: var(--plus-ckedial_border_color) !important; } .cke_dialog_title { background: linear-gradient(to bottom, var(--plus-ckedial_title_color1), var(--plus-ckedial_title_color2)) !important; color: var(--plus-ckedial_title_txt) !important; text-shadow: var(--plus-ckedial_title_shadow) !important; box-shadow: 0 1px 0 var(--plus-ckedial_border_color) inset !important; border-color: var(--plus-ckedial_border_color) !important; } a.cke_dialog_close_button { filter: invert(var(--plus-ckedial_closeinvert)); } .cke_dialog_contents { background: var(--plus-ckedial_contents_bg) !important; } .cke_dialog_contents * { color: var(--plus-ckedial_contents_color) !important; } a.cke_dialog_ui_button { background: var(--plus-ckedial_btn_botcolor) !important; background-image: linear-gradient(to bottom, var(--plus-ckedial_btn_topcolor), var(--plus-ckedial_btn_botcolor)) !important; border-color: var(--plus-ckedial_btn_border) !important; } a.cke_dialog_ui_button span { text-shadow: 0px 0px 5px #fff !important; } a.cke_dialog_ui_button_ok { border-color: var(--plus-ckedial_btnok_border) !important; background: #29f !important; background-image: linear-gradient(to bottom,var(--plus-ckedial_btnok_topcolor),var(--plus-ckedial_btnok_botcolor)) !important } .cke_dialog_footer { background-image: linear-gradient(135deg, var(--plus-ckedial_title_color1), var(--plus-ckedial_title_color2)) !important; box-shadow: 0 1px 0 var(--plus-ckedial_border_color) inset !important; outline-color: var(--plus-ckedial_border_color) !important; } /*======================================= // Sticky UserNav =======================================*/ @keyframes stickyNavFlash { 0% {top:-37px; filter:contrast(0); } 100% {top:0; filter:contrast(1); } } #elUserNavContainer { position: absolute; top: 15px; max-width: var(--container--width); left: 0; right: 0; margin: 0 auto; z-index: 2021; } @media (min-width: 980px) { #elUserNavContainer > #elUserNav { top: 0; } } #elUserNavContainer.sticky { position: fixed; top: 0; } #elUserNavContainer.sticky > #elUserNav { width: 100%; text-align: right; background: var(--plus-menu_bg); border-bottom: 1px solid #e7f; box-shadow: var(--box--boxShadow); animation-name: stickyNavFlash, BackgroundFlow; animation-duration: 0.8s, var(--plus-bgflowspd); animation-timing-function: ease-out, linear; animation-iteration-count: 1, infinite; } #elUserNavContainer.sticky > #elUserNav > li:last-child { margin-right: 15px; } #elUserNav .cExtraBtn { float: left; margin-right: 0; margin-left: 15px; } #elUserNav > .cExtraBtn > a:not(.ipsUserPhoto) { padding: 5px; border-radius: 10px; } #elUserNavContainer.sticky > #elUserNav > li > a { color: var(--plus-usernav_btn_color); } #elUserNavContainer > #elUserNav > .cExtraBtn > a:hover { background: var(--plus-usernav_btn_bg_hover); color: var(--plus-usernav_btn_color_hover); } #elUserNav > .cExtraBtn:not(.iconOnly) > a .fa { font-size: 14px; } #elUserNav > .iconOnly { margin-top: 4px; } #elUserNavContainer:not(.sticky) > #elUserNav > .lastExtraSep { margin-right: 15px; } #elUserNavContainer.sticky > #elUserNav > .lastExtraSep { visibility: hidden; } #elUserNavContainer:not(.sticky) > #elUserNav .stickyOnly { display: none; } #elUserNav > .rankBox > a > div { display: inline-flex; position: fixed; top: 8px; margin-left: -200px; } #rankImage { margin-bottom: 0; margin-top: -1px; } #rankImage > img { height: 24px; } #rankLevel { margin: 0; background: var(--plus-ranklevel_bg); border: 1px solid; border-radius: 0 0 8px 0; padding: 1px; height: 22px; line-height: 1; width: 30px; text-align: center; font-size: 18px; font-family: 'Trebuchet MS', sans-serif; } #rankExp { margin: 0; } #rankExpBar { width: 101px; background: var(--plus-expbar_bg); height: 10px; border-style: solid; border-width: 1px 1px 1px 0px; margin: 0; } #rankExpBarFill { background: var(--plus-expbarfill_bg); height: 8px; margin-top: -9px; margin-bottom: 0; box-shadow: 0px 0px 3px 1px var(--plus_expbarfill_shadow); } #rankExpBarValue { margin-top: 3px; height: 0; font-family: 'Trebuchet MS', sans-serif; } #elUserNav.cSignedOut { line-height: 36px; } #elUserNav.cSignedOut > li:not(.cExtraBtn) { vertical-align: top; } #elUserNav > .cAltUserLink .ipsUserPhoto { width: 26px; height: 26px; } .cUnreadTestBtn { float: right; font-size: 18px; border: 1px solid; border-radius: 4px; padding: 2px; background-color: var(--theme-area_background_light); margin-top: -5px; } .cUnreadTestBtn:hover { color: #ffc; background-color: #676; cursor: pointer; } .verified-follow { color: #0c0; font-weight: bold; background: #ff0; border: 2px solid #0c0; border-radius: 5px; padding: 0 5px; } .verified-follow::before { font: normal normal normal 14px/1 FontAwesome; content: "\f058"; margin-right: 3px; } /*======================================= // Post Nav =======================================*/ #postNav { position: fixed; right: 0; top: 50px; width: 340px; max-width: calc((100% - var(--container--width))/2); z-index: 1901; } #postNavPage { list-style-type: none; padding: 3px 10px; background: var(--plus-postnav_pagebg); width: max-content; white-space: nowrap; border: 1px solid var(--plus-postnav_pageborder); border-radius: 0 15px 0 0; margin: 0; cursor: pointer; user-select: none; -webkit-user-select: none; } #postNavPage:hover { background: var(--plus-postnav_pagebg_hover); } #postNavPage a { color: var(--plus-postnav_pagecolor); font-weight: bolder; padding: 3px 20px; margin: 0px -10px; } #postNavPageForm { margin-left: -90px; width: 220px; padding: 20px; } #postNavPageInputField { display: flex; justify-content: space-between; } #postNavPageInputField p { background: var(--plus-postnav_inputbtn_bg); border: 1px solid; border-color: var(--plus-postnav_inputbtn_border); width: 30px; height: 30px; line-height: 35px; margin: auto 0; text-align: center; border-radius: 5px; transition-duration: 0.2s; cursor: pointer; } #postNavPageInputField p:hover { background: var(--plus-postnav_inputbtn_bg_hover); border-color: var(--plus-postnav_inputbtn_border_hover); text-shadow: 0px 0px 10px var(--plus-postnav_inputbtn_txtshadow); } #postNavPageInputField i { font-size: 28px; } #postNavPageInputField input { width: 100px; text-align: center; background: var(--plus-postnav_inputnum_bg); } #postNavPageInputField input::-webkit-outer-spin-button, #postNavPageInputField input::-webkit-inner-spin-button { -webkit-appearance: none; } #postNavPageInputField input[type="number"] { -moz-appearance:textfield; } #postNavList { list-style-type: none; padding: 0; margin-top: 0; white-space: nowrap; } .postNavItem { background: var(--plus-postnav_item_bg); background-size: 200% 100%; background-position-x: 100%; width: fit-content; padding: 2px 8px; border: 1px solid var(--plus-postnav_item-border); border-radius: 0 5px 10px 0; transition-duration: 0.6s; cursor:pointer; user-select: none; -webkit-user-select: none; } .postNavItem > img { width: 20px; height: 20px; } .postNavItem > span { vertical-align: middle; } .postNavItem.current { border-color: var(--plus-postnav_itemcur_border); background-position-x: 0%; } .postNavItem.current::before { font: normal normal normal 14px/1 FontAwesome; content: "\f04b"; margin-right: 3px; vertical-align: middle; } .postNavModerated { background: var(--plus-postnav_itemmod_bg); border-color: var(--plus-postnav_itemmod_border); } .postNavModerated.current { background: var(--plus-postnav_itemmodcur_bg); } .postNavModerated::after { font: normal normal normal 14px/1 FontAwesome; content: " \f071"; vertical-align: middle; } .postNavSolution { background: var(--plus-postnav_itemsol_bg); border-color: var(--plus-postnav_itemsol_border); } .postNavSolution.current { background: var(--plus-postnav_itemsolcur_bg); } .postNavSolution::before { font: normal normal normal 14px/1 FontAwesome; content: "\f058 "; margin-right: 3px; vertical-align: middle; } .postNavSelected { background: var(--plus-postnav_itemsel_bg); border-color: var(--plus-postnav_itemsel_border); } .postNavSelected.current { background: var(--plus-postnav_itemselcur); } .postNavSelected::before { font: normal normal normal 14px/1 FontAwesome; content: "\f00c "; margin-right: 3px; vertical-align: middle; } @media (max-width: 1450px) { #postNav { width: unset; max-width: unset; } .postNavItem { padding: 2px 2px; border-width: 1px 5px; border-radius: 0; } .postNavItem span, .postNavItem.current::before, .postNavSelected::before, .postNavModerated::after, .postNavSolution::before { display: none; } } @media (max-width: 1620px) { #postNavPage, #postNavPageForm { display: none; } } /*======================================= // Visual/UI Modifications =======================================*/ /* SCROLLBAR */ ::-webkit-scrollbar { width: auto; } ::-webkit-scrollbar-track { background: linear-gradient(0deg, var(--plus-scrollbar_track2), var(--plus-scrollbar_track)); } ::-webkit-scrollbar-thumb { background: linear-gradient(45deg, var(--plus-scrollbar_thumb2), var(--plus-scrollbar_thumb)); } ::-webkit-scrollbar-thumb:hover { background: linear-gradient(45deg, var(--plus-scrollbar_thumb_hover2), var(--plus-scrollbar_thumb_hover)); } ::-webkit-scrollbar-thumb:active { background: linear-gradient(45deg, var(--plus-scrollbar_thumb_active2), var(--plus-scrollbar_thumb_active)); } ::-webkit-scrollbar-button { height: auto; background-color: var(--plus-scrollbar_buttonbg); } ::-webkit-scrollbar-button:hover { background-color: var(--plus-scrollbar_buttonbg_hover); } ::-webkit-scrollbar-button:vertical:start { background-image: var(--plus-scrollbar_button_up); } ::-webkit-scrollbar-button:vertical:end { background-image: var(--plus-scrollbar_button_down); } ::-webkit-scrollbar-button:horizontal:start { background-image: var(--plus-scrollbar_button_left); } ::-webkit-scrollbar-button:horizontal:end { background-image: var(--plus-scrollbar_button_right); } ::-webkit-scrollbar-corner { background: var(--plus-scrollbar_corner_img) center var(--plus-scrollbar_corner_bg); background-size: cover; } * { scrollbar-color: var(--plus-scrollbar_thumb) var(--plus-scrollbar_track); scrollbar-width: auto; } /* DERPY NOTIFICATION */ #elFlashMessage.ipsFlashMsg_bottom { background: url("https://buffy.mlpforums.com/monthly_2021_12/mail_bg_a0_08.png.bb2869aad73fe0e2d5f3a9c1ac27fab9.png"), linear-gradient(#553827, #261911); background-color: #222; border: 2px solid #fffaad; border-radius: 0 100px 100px 100px; } #elFlashMessage.ipsFlashMsg_bottom::before { content: url("https://buffy.mlpforums.com/monthly_2021_12/1615603097_derpynotif.png.73e690386e0fc9140a761cad0e42c15e.png")"NEW NOTIFICATION"; position: absolute; top: -72px; left: 0; color: #fffaad; font-weight: bold; text-shadow: 1px -1px 2px #573928; } #elFlashMessage.ipsFlashMsg_bottom > div { margin-top: -2px; } #elFlashMessage.ipsFlashMsg_bottom.ipsFlashMsg_dismissable [data-action='dismissFlashMessage'] { background: var(--plus-derpynotif_txt); } #elFlashMessage .ipsType_light { color: var(--plus-derpynotif_txt); } /* INBOX */ @keyframes MailBackground { to { background-position: 112px -94px; } } #elInboxContent { background: url("https://buffy.mlpforums.com/monthly_2021_12/mail_bg_a0_08.png.bb2869aad73fe0e2d5f3a9c1ac27fab9.png"); background-attachment: fixed; animation: MailBackground 10s linear infinite; } /* REACTIONS */ html[dir] .ipsReact.ipsReact_mini .ipsReact_unreact { position: absolute; left: -23px; top: 4px; } html[dir] .ipsReact.ipsReact_mini .ipsReact_unreact.ipsHide { display: none; } .ipsReact .ipsReact_button.ipsReact_reacted, body.ipsApp_noTouch .ipsReact_types:hover .ipsReact_button.ipsReact_reacted, body:not( .ipsApp_noTouch ) .ipsReact_types.ipsReact_types_active .ipsReact_button { border: 1px solid var(--positive-dark); background: var(--positive-light); } .ipsReact.ipsReact_mini .ipsReact_count { display: block; } .ipsReact.ipsReact_mini .ipsReact_count a { color: #999; } /* SHOW FULL STATUSES */ .ipsStreamItem_container .ipsStreamItem_snippet { height: initial !important; } .ipsStreamItem_container > .ipsTruncate_more { display: none !important; } /* LIVE MESSENGER PLUGIN COMPATIBILITY */ .liveMessenger_opened .liveMessenger_list { background: url("https://buffy.mlpforums.com/monthly_2021_12/mail_bg_a0_08.png.bb2869aad73fe0e2d5f3a9c1ac27fab9.png"); background-attachment: fixed; animation: MailBackground 10s linear infinite; background-color: rgb( var(--theme-area_background_reset) ); } .liveMessenger_opened { background-color: rgb( var(--theme-area_background_reset) ) !important; } .liveMessenger_chatHeader { background: rgb( var(--theme-area_background_reset) ) linear-gradient(225deg, var(--plus-widgettitle_bg), transparent) !important; } .liveMessenger_chatHeader h3 { background: none; }`; function injectCSS(css) { let style = document.createElement("style"); style.textContent = css; document.head.appendChild(style); } injectCSS(celestiaThemeCSS); console.log("MLPForums Plus: CELESTIA theme applied successfully!"); const FAVORITES = [ ["MLP:FiM Canon Discussion"], ["Season 1 Discussion","https://mlpforums.com/forum/11-season-1-discussion/"], ["Season 2 Discussion","https://mlpforums.com/forum/58-season-2-discussion/"], ["Season 3 Discussion","https://mlpforums.com/forum/59-season-3-discussion/"], ["Season 4 Discussion","https://mlpforums.com/forum/119-season-4-discussion/"], ["Season 5 Discussion","https://mlpforums.com/forum/167-season-5-discussion/"], ["Season 6 Discussion","https://mlpforums.com/forum/214-season-6-discussion/"], ["Season 7 Discussion","https://mlpforums.com/forum/259-season-7-discussion/"], ["My Little Pony: The Movie (2017)", "https://mlpforums.com/forum/219-my-little-pony-the-movie-2017/"], ["Season 8 Discussion","https://mlpforums.com/forum/270-season-8-discussion/"], ["Season 9 Discussion","https://mlpforums.com/forum/311-season-9-discussion/"], ["Specials and Shorts","https://mlpforums.com/forum/331-specials-and-shorts/"], ["Canterlot Gallery"], ["Visual Fan Art","https://mlpforums.com/forum/18-visual-fan-art/"], ["Fan Music","https://mlpforums.com/forum/30-fan-music/"], ["Science!"], ["Testing Forum", "https://mlpforums.com/forum/110-testing-forum/"] ]; // end of favorites // === FOLLOWED FORUMS === // Be notified about unread posts in the forums of your choice. // The notifications will appear on a new dedicated userbar button. //---------------------------------------------------- // *** Enable feature? (true/false) //---------------------------------------------------- const ENABLE_FOLLOWING_FORUMS = true; //---------------------------------------------------- // Specify forums you want to be notified about unread posts. // syntax: FOLLOWED_FORUMS = array[string]; // example: FOLLOWED_FORUMS = ["MLP:FiM Canon Discussion", "Visual Fan Art", "Throne Room"]; // // Note, that you can specify the entire section or only its subforums of your choice. // Caution: It is case-sensitive, so be sure to put names exactly like they are on the forums. //---------------------------------------------------- const FOLLOWED_FORUMS = ["Throne Room", "Support"]; //---------------------------------------------------- // Print console logs? (true/false) // (logs will appear in browser debug console if enabled) //---------------------------------------------------- const LOGS = false; /*==================================================== | * * * END OF CONFIGURATION * * * | /!\ Do NOT edit anything past this point unless you know what you are doing! ====================================================*/ /*======================================= // Console Logs =======================================*/ const CP = "color:#ff1; background-color:#f69; font-weight:bold"; const CN = "color:initial"; const CS = "color:#5f5"; const CW = "color:#f55; background-color:#300; font-weight:bold"; if (LOGS) { console.log("%c[MLPF+]%c --- Loading MLPForums Plus ---", CP, "color:#f8b"); } /*======================================= // Sticky UserNav =======================================*/ let nav, navContainer, headerContainer; document.addEventListener("DOMContentLoaded", function() { if (LOGS) { console.log("%c[MLPF+]%c Initializing Sticky UserNav...", CP, CN); } nav = document.getElementById("elUserNav"); if (!nav) { if (LOGS) { console.log("%c[MLPF+]%c ERROR: Failed to initialize UserNav", CP, CW); } return; } setupUserNav(); addNavBtns(); updateScroll(); window.addEventListener('scroll', updateScroll); if (LOGS) { console.log("%c[MLPF+]%c UserNav initialized successfully", CP, CS); } }) // Setup User Navbar function setupUserNav() { // Wrap UserNav in container and move to the body navContainer = document.createElement("div"); navContainer.id = "elUserNavContainer"; headerContainer = document.getElementById("elUserNav").parentNode; headerContainer.appendChild(navContainer); navContainer.appendChild(nav); // Mark Default UserNav Menus let mnu = document.querySelectorAll('#elUserNav > li > *[id$="_menu"]'); mnu.forEach(e => e.classList.add("userNavMenu")); } // Add Extra Buttons to the left function addNavBtns() { let count = 0; // Home & Status Updates let button = [ { title: "Return to Home Page", link: "https://mlpforums.com/", icon: "home", text: " Home" }, { title: "View All Status Updates", link: "https://mlpforums.com/discover/23/", icon: "newspaper-o", text: " Status Updates" } ] let i, li, a, ico; for (i = 0; i < button.length; i++) { nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn"); li.appendChild(a = document.createElement("a")); a.setAttribute("data-ipstooltip", ""); a.setAttribute("_title", button[i].title); a.href = button[i].link; a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-" + button[i].icon); a.appendChild(document.createTextNode(button[i].text)); } // Forums let section = [ ["All About Ponies"], ["Start Here!", "https://mlpforums.com/forum/211-start-here/"], ["My Little Pony", "https://mlpforums.com/forum/1-my-little-pony/"], ["Octavia's Hall", "https://mlpforums.com/forum/4-octavias-hall-fan-art-more/"], ["Roleplaying, Fun & Discussions"], ["Roleplay World", "https://mlpforums.com/forum/21-roleplay-world/"], ["Events", "https://mlpforums.com/forum/176-events/"], ["Beyond Equestria", "https://mlpforums.com/forum/5-beyond-equestria/"], ["MLP Forums Meta"], ["Canterlot", "https://mlpforums.com/forum/20-canterlot-mlp-forums-meta/"], ["More"], ["Poniverse", "https://mlpforums.com/forum/67-poniverse/"], ["Conventions", "https://mlpforums.com/forum/135-conventions/"] ] nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn", "cForumsList"); li.appendChild(a = document.createElement("a")); a.setAttribute("data-ipstooltip", ""); a.setAttribute("_title", "Browse Forums"); a.href = "#elForumsList_menu"; a.id = "elForumsList"; a.setAttribute("data-ipsmenu", ""); a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-navicon"); a.appendChild(document.createTextNode(" Forums ")); a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-caret-down"); let ul, opt; li.appendChild(ul = document.createElement("ul")); ul.id = "elForumsList_menu"; ul.classList.add("ipsMenu", "ipsMenu_normal", "ipsHide", "userNavMenu"); ul.setAttribute("style", "position: fixed; top: 32px; display: none;"); for (i = 0; i < section.length; i++) { ul.appendChild(opt = document.createElement("li")); if (section[i][1]) { opt.classList.add("ipsMenu_item"); opt.appendChild(a = document.createElement("a")); a.href = section[i][1]; a.appendChild(document.createTextNode(section[i][0])); } else { opt.classList.add("ipsMenu_title"); opt.appendChild(document.createTextNode(section[i][0])); } } // Favorites nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn", "cFavList"); li.appendChild(a = document.createElement("a")); a.setAttribute("data-ipstooltip", ""); a.setAttribute("_title", "Browse Favorite Places"); a.href = "#elFavList_menu"; a.id = "elFavList"; a.setAttribute("data-ipsmenu", ""); a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-star"); a.appendChild(document.createTextNode(" Favorites ")); a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-caret-down"); li.appendChild(ul = document.createElement("ul")); ul.id = "elFavList_menu"; ul.classList.add("ipsMenu", "ipsMenu_normal", "ipsHide", "userNavMenu"); ul.setAttribute("style", "position: fixed; top: 32px; display: none;"); for (i = 0; i < FAVORITES.length; i++) { ul.appendChild(opt = document.createElement("li")); if (FAVORITES[i][1]) { opt.classList.add("ipsMenu_item"); opt.appendChild(a = document.createElement("a")); a.href = FAVORITES[i][1]; a.appendChild(document.createTextNode(FAVORITES[i][0])); } else { opt.classList.add("ipsMenu_title"); opt.appendChild(document.createTextNode(FAVORITES[i][0])); } } // SEPARATOR nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn", "elUserNav_sep"); // FAQ nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn", "iconOnly", "cUserNav_icon"); li.appendChild(a = document.createElement("a")); a.setAttribute("data-ipstooltip", ""); a.setAttribute("_title", "Site FAQ"); a.href = "https://mlpforums.com/faq/"; a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-book"); // ROLEPLAY CHARACTERS nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn", "iconOnly", "cUserNav_icon"); li.appendChild(a = document.createElement("a")); a.setAttribute("data-ipstooltip", ""); a.setAttribute("_title", "My Roleplay Characters"); a.href = "https://mlpforums.com/characters/?filter=characters_mine"; a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-address-card"); // FOLLOWED FORUMS if (ENABLE_FOLLOWING_FORUMS && document.body.getAttribute("data-pagecontroller") == "index") { let unreadForums = []; let uForumsAll = document.querySelectorAll('.cForumList .ipsDataItem_unread .ipsDataItem_main .ipsDataItem_title a, .cForumList .ipsDataItem_main .ipsDataItem_subList .ipsDataItem_unread a'); let uForumName; for (i = 0; i < uForumsAll.length; i++) { uForumName = uForumsAll[i].innerText.trim(); if (FOLLOWED_FORUMS.includes(uForumName)) { unreadForums.push([uForumName, uForumsAll[i].href]); } } nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn", "iconOnly", "cUserNav_icon", "cUnreadForums"); li.appendChild(a = document.createElement("a")); a.setAttribute("data-ipstooltip", ""); a.setAttribute("_title", "Unread Forums"); a.href = "#elUnreadForums_menu"; a.id = "elUnreadForums"; a.setAttribute("data-ipsmenu", ""); a.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-comments"); if (unreadForums.length > 0) { let count; a.appendChild(count = document.createElement("span")); count.classList.add("ipsNotificationCount"); count.setAttribute("style", "right: -5px; top: -5px;"); count.innerText = unreadForums.length; } li.appendChild(ul = document.createElement("ul")); ul.id = "elUnreadForums_menu"; ul.classList.add("ipsMenu", "ipsMenu_normal", "ipsHide", "userNavMenu"); ul.setAttribute("style", "position: fixed; top: 32px; display: none;"); ul.appendChild(opt = document.createElement("li")); opt.classList.add("ipsMenu_title"); opt.appendChild(document.createTextNode("Unread Forums")); opt.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-gears", "cUnreadTestBtn"); ico.addEventListener("click", function() { let tForumsAll = document.querySelectorAll('.cForumList .ipsDataItem_main .ipsDataItem_title a, .cForumList .ipsDataItem_main .ipsDataItem_subList a'); let tForumName; for (i = 0; i < tForumsAll.length; i++) { tForumName = tForumsAll[i].innerText.trim(); if (FOLLOWED_FORUMS.includes(tForumName)) { tForumsAll[i].classList.add("verified-follow"); } } alert("Test Successful.\nCheck if the forums you follow are highlighed on the main page."); }); ico.setAttribute("data-ipstooltip", ""); ico.setAttribute("_title", "Test Followed Forums"); if (unreadForums.length == 0) { ul.appendChild(opt = document.createElement("li")); opt.classList.add("ipsMenu_item"); opt.setAttribute("style", "padding: 11px 20px;"); opt.appendChild(document.createTextNode("~ There's nothing here ~")); } else { for (i = 0; i < unreadForums.length; i++) { ul.appendChild(opt = document.createElement("li")); opt.classList.add("ipsMenu_item"); opt.appendChild(a = document.createElement("a")); a.href = unreadForums[i][1]; a.appendChild(document.createTextNode(unreadForums[i][0])); } } } // SEPARATOR nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("cExtraBtn", "elUserNav_sep", "lastExtraSep"); // RANK let expTable = [0,5,40,100,200,300,400,500,600,750,1000,1250,1500,1750,2000,2500,3000,4000,5000,6000,7000,8000,10000]; let rankObj = document.querySelector('#elUserLink_menu .elUserNav_achievements img'); if (rankObj) { let level = Number(rankObj.getAttribute("title").match(/\d+/)[0]); let rankImg = rankObj.getAttribute("src"); if (level < expTable.length) { var toNext = parseInt(document.querySelector("#elUserLink_menu div.ipsType_small").innerText); var totalExp = expTable[level] - toNext; var currExp = totalExp - expTable[level-1]; var reqExp = expTable[level] - expTable[level-1]; var expRate = currExp / reqExp * 100; } nav.insertBefore(li = document.createElement("li"), nav.childNodes[count++]); li.classList.add("rankBox", "stickyOnly"); a = li.appendChild(document.createElement("a")); a.href = "https://mlpforums.com/faq/site-problems/user-and-staff-ranks-r116/" a.setAttribute("data-ipsdialog", ""); let divLevel = a.appendChild(document.createElement("div")); divLevel.id = "divLevel"; divLevel.setAttribute("data-ipstooltip", ""); divLevel.setAttribute("_title", "Your Rank"); let rankImage = divLevel.appendChild(document.createElement("p")); rankImage.id = "rankImage" ico = rankImage.appendChild(document.createElement("img")); ico.src = rankImg; let rankLevel = divLevel.appendChild(document.createElement("p")); rankLevel.id = "rankLevel"; rankLevel.innerText = level; let rankExp = divLevel.appendChild(document.createElement("p")); rankExp.id = "rankExp"; let expBar = rankExp.appendChild(document.createElement("p")); expBar.id = "rankExpBar"; let expBarFill = rankExp.appendChild(document.createElement("p")); expBarFill.id = "rankExpBarFill"; if (level < expTable.length) { expBarFill.style.width = String(expRate) + "px"; } else { expBarFill.style.width = "100px"; } let expBarValue = rankExp.appendChild(document.createElement("p")); expBarValue.id = "rankExpBarValue"; if (level < expTable.length) { expBarValue.innerText=String(totalExp)+"/"+String(expTable[level]); } else { expBarValue.innerText = "Max Level"; expBarValue.style.color = "#fd9"; } } } function updateScroll() { if (LOGS) { console.log("%c[MLPF+]%c Updating UserNav...", CP, CN); } if (!navContainer) { return; } let menu = document.getElementsByClassName("userNavMenu"); let tip = document.getElementById("ipsTooltip"); let i; if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) { if (tip) { tip.style.position = "fixed"; tip.style.top = "32px"; } for (i=0; i < menu.length; i++) { if (!menu[i] || menu[i].style.display == "none") { continue; } menu[i].style.position = "fixed"; menu[i].style.top = "32px"; if (!navContainer.classList.contains("sticky")) { menu[i].style.display = "none"; } } if (!navContainer.classList.contains("sticky")) { document.body.appendChild(navContainer); navContainer.classList.add("sticky"); } } else { for (i=0; i < menu.length; i++) { if (!menu[i] || menu[i].style.display == "none") { continue; } if (navContainer.classList.contains("sticky")) { menu[i].style.display = "none"; } } if (navContainer.classList.contains("sticky")) { headerContainer.appendChild(navContainer); navContainer.classList.remove("sticky"); } } let rankBox = document.getElementById("divLevel"); if (rankBox) { let lastSep = document.querySelector(".lastExtraSep"); if(rankBox.getBoundingClientRect().left <= lastSep.getBoundingClientRect().right) { rankBox.style.visibility = "hidden"; } else { rankBox.style.visibility = ""; } } } /*======================================= // Post Nav =======================================*/ document.addEventListener("DOMContentLoaded", function() { setupPostNav(); }); function setupPostNav() { if (LOGS) { console.log("%c[MLPF+]%c Initializing Post List...", CP, CN); } if (document.body.getAttribute("data-pagecontroller") != "topic") { if (LOGS) { console.log("%c[MLPF+]%c Aborted Post List creation, the current page is not a topic", CP, CN); } return; } let postNav = document.querySelector("#postNav"); if (postNav == null) { postNav = document.createElement("div"); document.body.appendChild(postNav); postNav.id = "postNav"; } var ipsPagination = document.querySelector('.ipsPagination_pageJump'); if (ipsPagination) { let currPage = document.querySelector('.ipsPagination_page.ipsPagination_active').innerText; // Page Button let btn = postNav.appendChild(document.createElement("div")); btn.id = "postNavPage"; let a = btn.appendChild(document.createElement("a")); a.appendChild(document.createTextNode(ipsPagination.innerText)); let ico = a.appendChild(document.createElement("i")); ico.classList.add("fa", "fa-caret-down"); let box = postNav.appendChild(document.createElement("div")); box.id = "postNavPageForm"; box.classList.add("ipsMenu", "ipsMenu_normal", "ipsHide", "ipsMenu_bottomRight"); btn.onclick = function(){ box.classList.toggle("ipsHide") }; // Input Box let form = box.appendChild(document.querySelector('form[data-role="pageJump"]').cloneNode(true)); form.id = "postNavPageInput"; let pageInput = document.querySelector('#postNavPageInput ul li:first-of-type'); pageInput.id = "postNavPageInputField"; let inputContent = document.querySelector('#postNavPageInputField input'); inputContent.defaultValue = currPage; inputContent.onclick = function(){inputContent.value = ""}; // [-] pageInput.prepend(btn = document.createElement("p")); btn.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-caret-left"); btn.setAttribute("onclick", "this.nextElementSibling.stepDown()"); // [+] pageInput.append(btn = document.createElement("p")); btn.appendChild(ico = document.createElement("i")); ico.classList.add("fa", "fa-caret-right"); btn.setAttribute("onclick", "this.previousElementSibling.stepUp()"); } var postList = document.createElement("ul"); postNav.appendChild(postList); postList.id = "postNavList"; updatePostNav(); window.addEventListener('scroll', updatePostNav); if (LOGS) { console.log("%c[MLPF+]%c Post List initialized successfully", CP, CS); } } function updatePostNav() { if (LOGS) { console.log("%c[MLPF+]%c Updating Post List...", CP, CN); } var posts = document.querySelectorAll('.cPost'); var postNavItems = document.querySelectorAll('.postNavItem'); // Check For New Posts var postsCnt = posts.length; var itemsCnt = postNavItems.length; if (itemsCnt != postsCnt) { let diff = postsCnt - itemsCnt; if (LOGS) { console.log("%c[MLPF+]%c Posts on the list: "+itemsCnt+" / "+postsCnt, CP, CN); } if (LOGS) { console.log("%c[MLPF+]%c Fetching new "+diff+" posts to the list...", CP, CN); } let postList = document.querySelector('#postNavList'); let post, photo, name, eleName; for (let i=itemsCnt; diff>0; i++) { if (LOGS) { console.log("%c[MLPF+]%c Adding post #"+String(i+1), CP, CN); } posts[i].setAttribute("post-index", i); postList.appendChild(post = document.createElement("li")); post.classList.add("postNavItem"); post.setAttribute("index", i); post.addEventListener("click", function() { let post = document.querySelector('.cPost[post-index="' + String(i) + '"]'); let tgt = post.getBoundingClientRect().top - document.body.getBoundingClientRect().top - 100; window.scrollTo(0, tgt); }); if (posts[i].classList.contains("ipsComment_solved")) { post.classList.add("postNavSolution"); } // Draw User Photo post.appendChild(photo = document.createElement("img")); photo.src = posts[i].querySelector('.cAuthorPane_photo > .ipsUserPhoto > img').src; // Draw User Name post.appendChild(name = document.createElement("span")); eleName = posts[i].querySelector('.cAuthorPane_author a'); if (eleName == null) { eleName = posts[i].querySelector('.cAuthorPane_author'); } name.innerHTML = " " + eleName.innerHTML; diff--; } postNavItems = document.querySelectorAll('.postNavItem'); } postNavItems.forEach(function(item) { item.classList.remove("postNavModerated"); item.classList.remove("postNavSelected"); }); for (let i=0; i= ptop-100) && (wpos <= pbtm+50)) { postNavItems[i].classList.add("current"); done = true; } else { postNavItems[i].classList.remove("current"); } } // Check If The Page Changed if (posts[0].getAttribute("post-index") == null) { document.querySelector('#postNav').innerHTML = ""; setupPostNav(); } } /*======================================= // Other =======================================*/ document.addEventListener("DOMContentLoaded", function() { // Clickable Ranks document.querySelectorAll('[data-role="rank-image"]').forEach(function(item) { let img = item.innerHTML; item.innerHTML = '' + img + ''; }) // Footer Push let footer = document.getElementById("elCopyright"); if (footer) { footer.appendChild(document.createElement("br")); let pluginLink = footer.appendChild(document.createElement("a")); pluginLink.title = "MLPForums Plus Topic"; pluginLink.href = "https://mlpforums.com/topic/195950-mlpforums-plus/"; pluginLink.innerText = "Enhanced with MLPForums Plus plugin"; } if (LOGS) { console.log("%c[MLPF+]%c --- Finished loading MLPForums Plus ---", CP, "color:#f8b"); } }); })();