Skip to content

Custom badges

Solved Customisation
103 4 25.6k 2
  • @phenomlab yes I can see it very well:

    Screen Shot 2023-05-30 at 11.48.30.png

    since your code has “/font-awesome/6.4.0/” in it, I assumed you are using pro version.

    @crazycells No, it’s the free version

    https://cdnjs.com/libraries/font-awesome

    You only need the check mark itself 🙂

  • @crazycells No, it’s the free version

    https://cdnjs.com/libraries/font-awesome

    You only need the check mark itself 🙂

    @phenomlab great then, are you planning to implement it on this forum?

    I need to tailor the code for my forum…

  • @phenomlab great then, are you planning to implement it on this forum?

    I need to tailor the code for my forum…

    @crazycells Yes, I think I probably will.

  • @phenomlab great then, are you planning to implement it on this forum?

    I need to tailor the code for my forum…

    @crazycells Ok, so, I found some time to look at this properly today.

    Here’s the result

    d735ea48-7d38-444f-9e8b-822196b3c877-image.png

    Notice the “Twitter-esque” verified badge?

    I found this

    https://commons.wikimedia.org/wiki/File:Twitter_Verified_Badge.svg and downloaded it, then uploaded it to /assets/public/images

    Then, I used the below CSS code

        li[component="post"] a[href*="/groups/verified"] {
            position: absolute !important;
            left: 2px;
            z-index: 2;
            margin-top: 1px;
            border-radius: 999px !important;
            line-height: 14px;
            display: block;
            height: auto;
            margin-left: 0px !important;
            background: transparent !important;
            width: auto;
        }
    
        li[component=post] a[href*="/groups/verified"]:before {
            background: url(https://sudonix.org/assets/images/Twitter_Verified_Badge.svg) !important;
            content: "";
            height: 22px;
            width: 22px;
            display: block;
        }
        li[component=post] a[href*="/groups/verified"]:after {
            background: #ffffff !important;
            height: 9px;
            width: 9px;
            content: "";
            display: block;
            top: 10px;
            position: absolute;
            z-index: -1;
            left: 12px;
        }
    

    Some points to consider

    • The CSS code extensively uses :before and :after pseudo elements. Essentially, :before adds the SVG icon and positions it, and :after adds a smaller “white square” which is conveniently positioned behind the :before element using z:-index: -1;

    The purpose of the “white square” is to provide a dirty way to fill in the transparency which is present in the SVG so it looks right.

    This is pretty tough to display on mobile viewports, so it’s best to hide it completely using this code

    @media (max-width: 767px) {
        li[component="post"] a[href*="/groups/verified"].badge, .account a[href*="/groups/verified"].badge {
                display: none !important;
            }
    

    EDIT: Just realised that this icon (being a group) is also displayed on the user’s profile page, so we’ll need CSS to make that look good too…

    7744fb9d-2994-4159-9732-d4a717511af0-image.png
    I’ve absolutely no idea who this guy is… 🙂

    Here it is

        .account a[href*="/groups/verified"] {
            position: absolute !important;
            z-index: 2;
            background: transparent !important;
            margin-left: -10px;
        }
        .account a[href*="/groups/verified"]:after {
            background: #ffffff !important;
            height: 9px;
            width: 10px;
            content: "";
            display: block;
            top: 10px;
            position: absolute;
            z-index: -1;
            left: 12px;
        }
        .account a[href*="/groups/verified"]:before {
            background: url(https://sudonix.org/assets/images/Twitter_Verified_Badge.svg) !important;
            content: "";
            height: 22px;
            width: 22px;
            display: block;
        }
    

    Enjoy.

  • hello @phenomlab

    I am trying to apply your code for the “all” group which all my members are part of.

    43c6f309-bbfe-41ae-891b-b52a28d04fdd-image.png

    I downlaod the image of the twitter badge in full resolution and upload in the same place and I access it correctly.

    On the other hand it would seem that the badge is displayed badly (cut on the right for the first on the screen) then transparent for the second and on the 3rd it is not displayed aps.

    An idea ?

    image.png

  • hello @phenomlab

    I am trying to apply your code for the “all” group which all my members are part of.

    43c6f309-bbfe-41ae-891b-b52a28d04fdd-image.png

    I downlaod the image of the twitter badge in full resolution and upload in the same place and I access it correctly.

    On the other hand it would seem that the badge is displayed badly (cut on the right for the first on the screen) then transparent for the second and on the 3rd it is not displayed aps.

    An idea ?

    image.png

    @DownPW it’s really hard to see that image. I’ll need to look at your dev server directly to see what’s happening here.

  • I just found some answers @phenomlab

    It is absolutely necessary that the user is displaying the badge of the group in his profile:

    18ac2ada-5234-4848-a00b-59e6d3ef1116-image.png

    That the question, How to force put the user in a group ?
    For the rest of the display bugs, I have not yet found.

  • I just found some answers @phenomlab

    It is absolutely necessary that the user is displaying the badge of the group in his profile:

    18ac2ada-5234-4848-a00b-59e6d3ef1116-image.png

    That the question, How to force put the user in a group ?
    For the rest of the display bugs, I have not yet found.

    @DownPW said in Custom badges:

    It is absolutely necessary that the user is displaying the badge of the group in his profile:

    Yes, it won’t display without that. I don’t know of a way to force it either.

  • If I apply light themes we see better.
    In fact, ther badge is cut on the right and we have the dexcription badge below :

    image.png

  • If I apply light themes we see better.
    In fact, ther badge is cut on the right and we have the dexcription badge below :

    image.png

    @DownPW yes, that’s just going to be positioning. Remember we are using position: absolute; and your CSS is likely to differ so you may need to tweak the positioning slightly to suit.

  • @crazycells Ok, so, I found some time to look at this properly today.

    Here’s the result

    d735ea48-7d38-444f-9e8b-822196b3c877-image.png

    Notice the “Twitter-esque” verified badge?

    I found this

    https://commons.wikimedia.org/wiki/File:Twitter_Verified_Badge.svg and downloaded it, then uploaded it to /assets/public/images

    Then, I used the below CSS code

        li[component="post"] a[href*="/groups/verified"] {
            position: absolute !important;
            left: 2px;
            z-index: 2;
            margin-top: 1px;
            border-radius: 999px !important;
            line-height: 14px;
            display: block;
            height: auto;
            margin-left: 0px !important;
            background: transparent !important;
            width: auto;
        }
    
        li[component=post] a[href*="/groups/verified"]:before {
            background: url(https://sudonix.org/assets/images/Twitter_Verified_Badge.svg) !important;
            content: "";
            height: 22px;
            width: 22px;
            display: block;
        }
        li[component=post] a[href*="/groups/verified"]:after {
            background: #ffffff !important;
            height: 9px;
            width: 9px;
            content: "";
            display: block;
            top: 10px;
            position: absolute;
            z-index: -1;
            left: 12px;
        }
    

    Some points to consider

    • The CSS code extensively uses :before and :after pseudo elements. Essentially, :before adds the SVG icon and positions it, and :after adds a smaller “white square” which is conveniently positioned behind the :before element using z:-index: -1;

    The purpose of the “white square” is to provide a dirty way to fill in the transparency which is present in the SVG so it looks right.

    This is pretty tough to display on mobile viewports, so it’s best to hide it completely using this code

    @media (max-width: 767px) {
        li[component="post"] a[href*="/groups/verified"].badge, .account a[href*="/groups/verified"].badge {
                display: none !important;
            }
    

    EDIT: Just realised that this icon (being a group) is also displayed on the user’s profile page, so we’ll need CSS to make that look good too…

    7744fb9d-2994-4159-9732-d4a717511af0-image.png
    I’ve absolutely no idea who this guy is… 🙂

    Here it is

        .account a[href*="/groups/verified"] {
            position: absolute !important;
            z-index: 2;
            background: transparent !important;
            margin-left: -10px;
        }
        .account a[href*="/groups/verified"]:after {
            background: #ffffff !important;
            height: 9px;
            width: 10px;
            content: "";
            display: block;
            top: 10px;
            position: absolute;
            z-index: -1;
            left: 12px;
        }
        .account a[href*="/groups/verified"]:before {
            background: url(https://sudonix.org/assets/images/Twitter_Verified_Badge.svg) !important;
            content: "";
            height: 22px;
            width: 22px;
            display: block;
        }
    

    Enjoy.

    hi @phenomlab, we should be able to download this…

    https://commons.wikimedia.org/wiki/File:Twitter_Verified_Badge.svg

    …and recolor it accordingly and upload it to the forum the same way, right? These colors are reminding everyone “twitter” , I believe it would be nicer if it is changed according to the personality of the forum, so it will look more original while maintaining “meaning”…

    I think here on this forum, “sudonix orange” color would look cooler than “twitter blue”

  • additionally, these pages need some adjustments: https://sudonix.org/user/phenomlab

    Screen Shot 2023-07-13 at 14.55.20.png

  • additionally, these pages need some adjustments: https://sudonix.org/user/phenomlab

    Screen Shot 2023-07-13 at 14.55.20.png

    @crazycells that’s odd. Shouldn’t look like that (at least, it doesn’t on my device). What device are you using?

  • hi @phenomlab, we should be able to download this…

    https://commons.wikimedia.org/wiki/File:Twitter_Verified_Badge.svg

    …and recolor it accordingly and upload it to the forum the same way, right? These colors are reminding everyone “twitter” , I believe it would be nicer if it is changed according to the personality of the forum, so it will look more original while maintaining “meaning”…

    I think here on this forum, “sudonix orange” color would look cooler than “twitter blue”

    @crazycells hmm. That’s a good idea. Let me have a look at that.

  • I had already reported this little problem to you @phenomlab

    The problem only occurs on the profile of other users and not on his own profile. (of memories)

    For my part, I solved this bug with the following code (to be adapted)

    /*----------------------------------------------------------------------------*/
    /*-------------------      USER PROFILE ANIMATION     ------------------------*/
    /*----------------------------------------------------------------------------*/
    
    /*[component="profile/change/picture"] img {
        z-index: 300 !important;
    }*/
    
    
    .avatar-wrapper:before {
        animation-iteration-count: infinite;
        animation: pulsate 4s ease-out infinite;
        border-radius: 50%;
        border: 15px solid var(--bs-link-color);
        content: "";
        height: 180px;
        left: -19px;
        top: -19px;
        opacity: 0;
        position: absolute;
        width: 180px;
        z-index: -1;
    }
    
    /* Change z-index Cover img profile for animation effect */
    .cover, .cover>.container {
        z-index: -2;
    }
    
    /* Avatar on user profile page */
    .account .avatar-wrapper {
        /* border: 4px solid var(--bs-link-color); */
        margin-right: 20px;
    }
    
  • I had already reported this little problem to you @phenomlab

    The problem only occurs on the profile of other users and not on his own profile. (of memories)

    For my part, I solved this bug with the following code (to be adapted)

    /*----------------------------------------------------------------------------*/
    /*-------------------      USER PROFILE ANIMATION     ------------------------*/
    /*----------------------------------------------------------------------------*/
    
    /*[component="profile/change/picture"] img {
        z-index: 300 !important;
    }*/
    
    
    .avatar-wrapper:before {
        animation-iteration-count: infinite;
        animation: pulsate 4s ease-out infinite;
        border-radius: 50%;
        border: 15px solid var(--bs-link-color);
        content: "";
        height: 180px;
        left: -19px;
        top: -19px;
        opacity: 0;
        position: absolute;
        width: 180px;
        z-index: -1;
    }
    
    /* Change z-index Cover img profile for animation effect */
    .cover, .cover>.container {
        z-index: -2;
    }
    
    /* Avatar on user profile page */
    .account .avatar-wrapper {
        /* border: 4px solid var(--bs-link-color); */
        margin-right: 20px;
    }
    

    @DownPW yes, I remember, but anything that uses absolute positioning will always be problematic when it comes to dynamically placing elements when the browser window is resized.

    I have another idea which I’m going to try. If that doesn’t work, I’ll likely remove this altogether.

  • I had already reported this little problem to you @phenomlab

    The problem only occurs on the profile of other users and not on his own profile. (of memories)

    For my part, I solved this bug with the following code (to be adapted)

    /*----------------------------------------------------------------------------*/
    /*-------------------      USER PROFILE ANIMATION     ------------------------*/
    /*----------------------------------------------------------------------------*/
    
    /*[component="profile/change/picture"] img {
        z-index: 300 !important;
    }*/
    
    
    .avatar-wrapper:before {
        animation-iteration-count: infinite;
        animation: pulsate 4s ease-out infinite;
        border-radius: 50%;
        border: 15px solid var(--bs-link-color);
        content: "";
        height: 180px;
        left: -19px;
        top: -19px;
        opacity: 0;
        position: absolute;
        width: 180px;
        z-index: -1;
    }
    
    /* Change z-index Cover img profile for animation effect */
    .cover, .cover>.container {
        z-index: -2;
    }
    
    /* Avatar on user profile page */
    .account .avatar-wrapper {
        /* border: 4px solid var(--bs-link-color); */
        margin-right: 20px;
    }
    

    @DownPW yeap, you are absolutely right. I have just checked, it is not on my profile, but anyone else…

  • hi @phenomlab, we should be able to download this…

    https://commons.wikimedia.org/wiki/File:Twitter_Verified_Badge.svg

    …and recolor it accordingly and upload it to the forum the same way, right? These colors are reminding everyone “twitter” , I believe it would be nicer if it is changed according to the personality of the forum, so it will look more original while maintaining “meaning”…

    I think here on this forum, “sudonix orange” color would look cooler than “twitter blue”

    @crazycells This proved to be much harder than I anticipated. The issue here is that the background is already transparent, so if you make the rosette itself transparent, you can no longer use the :after element as it’s designed to fill in the check mark - not the remainder of the image.

    The only real way this would be possible and without losing yourself in overlapping CSS code would be to edit the image with Illustrator, or InkScape (Open Source) and change the rosette and border colour according to taste.

    Ultimately, it’s not possible to change this on the fly using CSS without significant work. As a result of this, plus your idea yesterday, I have elected to use a Font Awesome icon (Shield with Check Mark) and have made it “Sudonix Orange”.

  • I had already reported this little problem to you @phenomlab

    The problem only occurs on the profile of other users and not on his own profile. (of memories)

    For my part, I solved this bug with the following code (to be adapted)

    /*----------------------------------------------------------------------------*/
    /*-------------------      USER PROFILE ANIMATION     ------------------------*/
    /*----------------------------------------------------------------------------*/
    
    /*[component="profile/change/picture"] img {
        z-index: 300 !important;
    }*/
    
    
    .avatar-wrapper:before {
        animation-iteration-count: infinite;
        animation: pulsate 4s ease-out infinite;
        border-radius: 50%;
        border: 15px solid var(--bs-link-color);
        content: "";
        height: 180px;
        left: -19px;
        top: -19px;
        opacity: 0;
        position: absolute;
        width: 180px;
        z-index: -1;
    }
    
    /* Change z-index Cover img profile for animation effect */
    .cover, .cover>.container {
        z-index: -2;
    }
    
    /* Avatar on user profile page */
    .account .avatar-wrapper {
        /* border: 4px solid var(--bs-link-color); */
        margin-right: 20px;
    }
    

    @DownPW so me a favor, and let me know if the CSS you provided works as expected when browsing users as a guest? I’m not using the same CSS, but a slightly modified version.

    Interested to get other experiences.

  • @crazycells This proved to be much harder than I anticipated. The issue here is that the background is already transparent, so if you make the rosette itself transparent, you can no longer use the :after element as it’s designed to fill in the check mark - not the remainder of the image.

    The only real way this would be possible and without losing yourself in overlapping CSS code would be to edit the image with Illustrator, or InkScape (Open Source) and change the rosette and border colour according to taste.

    Ultimately, it’s not possible to change this on the fly using CSS without significant work. As a result of this, plus your idea yesterday, I have elected to use a Font Awesome icon (Shield with Check Mark) and have made it “Sudonix Orange”.

    @phenomlab thanks for the explanation. I assumed it would not be easy, and additionally, if it is easy for you, it was going to be harder for me… since it is already hard for you, I give up 😄

    by the way, I was referring to the orange color in your logo, but I see that the stars are “sudonix orange” and the checkmark is changing depending on the theme you are in…

    But in any case, I believe these more “coherent” colors definitely look better than the previous version… 👍


Did this solution help you?
Did you find the suggested solution useful? Support 💗 Sudonix with a coffee
If your organisation needs deeper expertise around infrastructure, security, or technology leadership, learn more about Phenomlab Ltd. Many of the deeper technical guides behind Sudonix are published there.

Related Topics
  • nodebb-plugin-custom-pages

    Solved Customisation plugin custom-pages
    5
    2
    3 Votes
    5 Posts
    3k Views
    @DownPW it’s possible, yes, but you may inadvertently end up targeting other elements using the same class which of course isn’t desired. Can you provide a link in DM for me to review?
  • restarting nodebb on boot

    Unsolved Configure nodebb
    3
    1 Votes
    3 Posts
    1k Views
    @eeeee said in restarting nodebb on boot: can I just run nodebb under nodemon for auto restarts? It’s a better method. Nodemon just looks for file system changes and would effectively die if the server was rebooted meaning you’d have to start it again anyway. Systemd is the defacto standard which is how the operating system interacts in terms of services, scheduled tasks etc.
  • Q&A Plugin Changes NodeBB

    Solved Customisation nodebb q&a plugin
    25
    1
    6 Votes
    25 Posts
    5k Views
    @phenomlab said in Q&A Plugin Changes NodeBB: float: right; left: 10px; } worked thank you
  • How to fix header side as boxed

    Solved Customisation header boxed sudonix nodebb
    10
    1
    6 Votes
    10 Posts
    2k Views
    @phenomlab yes it caused a problem for mobile users. thank you for helping …
  • Title on homepage of nodebb forum

    Solved Customisation nodebb
    2
    1 Votes
    2 Posts
    1k Views
    @eveh Welcome board The code you are referring to is custom written as no such functionality exists under NodeBB. However, adding the functionality is relatively trivial. Below are the required steps Navigate to /admin/appearance/customise#custom-header Add the below code to your header, and save once completed <ol id="mainbanner" class="breadcrumb"><li id="addtext">Your Title Goes Here</li></ol> Navigate to /admin/appearance/customise#custom-js and add the below code, then save $(document).ready(function() { $(window).on('action:ajaxify.end', function(data) { // Initialise mainbanner ID, but hide it from view $('#mainbanner').hide(); var pathname = window.location.pathname; if (pathname === "/") { $("#addtext").text("Your Title"); $('#mainbanner').show(); } else {} // If we want to add a title to a sub page, uncomment the below and adjust accordingly //if (pathname === "/yourpath") { //$("#addtext").text("Your Title"); //$('#mainbanner').show(); //} }); }); Navigate to /admin/appearance/customise#custom-css and add the below CSS block .breadcrumb { right: 0; margin-right: auto; text-align: center; background: #0086c4; color: #ffffff; width: 100vw; position: relative; margin-left: -50vw; left: 50%; top: 50px; position: fixed; z-index: 1020; } Note, that you will need to adjust your CSS code to suit your own site / requirements.
  • [NODEBB] Help for my custom CSS

    Solved Customisation nodebb css bugfix
    237
    49 Votes
    237 Posts
    80k Views
    @baris said: You should change your selectors so it doesn’t look at the entire document. You probably only want to apply fancybox to stuff inside the #content element which is what changes when the user navigates around the page. So use $('#content a').... for your selectors then the forum logo in the header won’t be selected. I modified the JS Fancybox code now and this code and it seem better // --------------------------------------------- // Fancybox Media Reader (Without Website Logo) // --------------------------------------------- if (top.location.pathname !== '/login') { $(window).on('action:posts.loaded', function(data) { console.log("Polling DOM for lazyLoaded images to apply Fancybox"); $(document).ready(function() { $('#content a').not('.forum-logo').not(".avatar").not(".emoji").not(".bmac-noanimate").each(function() { $('#content a[href*=".jpg"], #content a[href*=".jpeg"], #content a[href*=".png"], #content a[href*=".gif"], #content a[href*=".webp"]').addClass("noanimate"); }); }); }); } if (top.location.pathname !== '/login') { $(document).ready(function() { $(window).on('action:ajaxify.end', function(data) { $('#content a').not('.logo').not(".avatar").not(".emoji").not(".bmac-noanimate").each(function() { $('#content a[href*=".jpg"], #content a[href*=".jpeg"], #content a[href*=".png"], #content a[href*=".gif"], #content a[href*=".webp"]').addClass("noanimate"); data.preventDefault() // Strip out the images contained inside blockquotes as this looks nasty :) $('#content blockquote img').remove(); }); Fancybox.bind( '#content a[href*=".jpg"], #content a[href*=".jpeg"], #content a[href*=".png"], #content a[href*=".gif"], #content a[href*=".webp"]', { groupAll: true, } ); }); }); } // Chat fancybox - fires when chat module loaded and AJAX calls new chat $(document).ready(function() { $(window).on('action:chat.loaded', function(data) { // >>> Se limiter au contenu principal uniquement <<< $('#content img').not('.forum-logo').not(".avatar").not(".emoji").not(".bmac-noanimate").each(function() { var newHref = $(this).attr("src"); $(this).wrap("<a class='fancybox' href='" + newHref + "'/>"); $('#content a[href*=".jpg"], #content a[href*=".jpeg"], #content a[href*=".png"], #content a[href*=".gif"], #content a[href*=".webp"]').addClass("noanimate"); data.preventDefault(); // Strip out the images contained inside blockquotes as this looks nasty :) $('#content blockquote img').remove(); }); Fancybox.bind( '#content a[href*=".jpg"], #content a[href*=".jpeg"], #content a[href*=".png"], #content a[href*=".gif"], #content a[href*=".webp"]', { groupAll: true, } ); }); }); For the logo, I must use overflow: visible !important; on [component="brand/logo"] /* --- Logo --- */ [component="brand/logo"] { max-height: 50px; width: auto; height: auto; max-width: 100%; display: block; object-fit: contain; object-position: left center; overflow: visible !important; } Better result !!
  • [NodeBB] First post customization

    Solved Customisation nodebb
    5
    4 Votes
    5 Posts
    1k Views
    @phenomlab thanks
  • [NodeBB] custom Gravatar image not showing

    Solved Customisation
    6
    1 Votes
    6 Posts
    2k Views
    @jac said in [NodeBB] custom Gravatar image not showing: @phenomlab said in [NodeBB] custom Gravatar image not showing: @jac are you using Custom ? Sure am mate Confirmed Fixed