English

🇬🇧 English articles and tutorials.

  • Quick and Dirty Start

    As a quick and dirty start you can copy either the theme.json file or one of the additional styles in the ./styles folder of the theme in Twenty Twenty Four. Save your file as ./styles/myFile.json. The styles are:

    • ember.json
    • fossil.json
    • ice.json
    • maelstrom.json
    • mint.json
    • onyx.json
    • rust.json

    Since these files are more simple than theme.json in the root directory of the theme, they are good starting points for developing your personalized theme styles.

    Choose a style that is somewhat close to the endresult you want to acheive. Then you’ll have a good starting point for your design.

    Give your style a title

    First you have to add the title to the file. As soon as the json file is present in ./styles you will be able to activate it in the Dashboard / Appearance / Styles.

    {
    	"$schema": "https://schemas.wp.org/trunk/theme.json",
    	"version": 2,
    	"title": "My new style",
    	"settings": { 
             ... etc ...

    If you work in a copy of the theme.json file, remember to add the “title” : “My Way” key pair. The original theme json is more elaborate than the sample styles, since all blocks are controlled by the file. If you want to create your own theme this may be a good way to work.

    If you’re like me it may be more easy to edit the file in your favorite editor, and upload the file to WP. Now you should be able to see your style in Appearance / Editor / Styles:

    In the WP theme directory ./styles you’ll find the *.json files that will style your theme. They are similar the theme.json file. In my experience the colors are easy to work with. However, fonts can be a challenge.

    If you tamper with the theme.json file problems may arise if you update the theme. Your best option is to add a style in the ./styles directory. Here your code is safe – so in many ways this modus operandi is similar to the child themes that were used before we had the block based themes.

    Below are some notes on how to style with fonts and colors – and other CSS features.

    Fonts

    The best way to add custom fonts is to download the font from either Google Fonts or another font provider and then use the files after this model:

    • First you add the fontface with the filenames.
    • Then you can instantiate the font by the triad
    • fontfamily, name and slug.

    The slug will create CSS-variables. You can use these variables when the block elements are styled. More about this later.

    Font File Format: .woff2

    According to Carolina Nymark you should use font files in the woff2 format:

    “If you choose a font family on https://fonts.google.com/ and then select the “Download family” option, you will only receive a zip file with .ttf files. To get the .woff2 files, you can use a font converter script or an online converter.”

    “I recommend using this time saving tool called Google webfonts helper to download the files.”

    (Carolina Nymark)

    Actually I’ve had strange font problems, perhaps Nymark’s solution is the solution. Sometimes the fonts do not appear no matter what you try. However, now I see that the fonts that gave me problems were actually ttf and odt files. I’ll test this solution and try to use woff2 exclusively.

    /** Model: font via a file */
    
    {
        "fontFace": [
            {
                "fontFamily": "Jost",
                "fontStyle": "normal",
                "fontWeight": "100 900",
                "src": ["file:./assets/fonts/jost/Jost-VariableFont_wght.woff2"]
            }
        ],
        "fontFamily": "\"Jost\", sans-serif",
        "name": "Jost",
        "slug": "body"
    }
    
    /** Model: standard browser fonts */
    
    /* Sans Serif */
    {
        "fontFamily": "-apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif",
        "name": "System Sans-serif",
        "slug": "system-sans-serif"
    }
    
    /* Serif */
    {
        "fontFamily": "Iowan Old Style, Apple Garamond, Baskerville, Times New Roman, Droid Serif, Times, Source Serif Pro, serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol",
        "name": "System Serif",
        "slug": "system-serif"
    }
    
    

    Using the Fonts

    Mostly the font will not show up after install, which is quite frustrating. Do thus:

    1. Quit the styles editor
    2. Purge the browser cache
    3. Purge the WP cache
    4. See the webpage frontend – if the font is now visible everything is ok.
    5. Return to the editor.
    6. Now you can see the font.

    It’s quite cumbersome, and may take a lot of experiments.

    Perhaps a good idea is to use an incognito browser window in order to avoid browser cache issues.

    How to Add Standard Browser Fonts

    Standard fonts are more easy to add. Here is the model for serif and sans serif fonts with the most common fallbacks:

    /* Sans Serif */
    {
        "fontFamily": "-apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif",
        "name": "System Sans-serif",
        "slug": "system-sans-serif"
    }
    
    /* Serif */
    {
        "fontFamily": "Iowan Old Style, Apple Garamond, Baskerville, Times New Roman, Droid Serif, Times, Source Serif Pro, serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol",
        "name": "System Serif",
        "slug": "system-serif"
    }

    Colours

    The colours are straightforeward. Add the colours as an array:

    "color": {
        "palette": [
            {
                "color": "#548DBF",
                "name": "Base",
                "slug": "base"
            },
            {
                "color": "#0367A6",
                "name": "Base / Two",
                "slug": "base-2"
            }
        ]

    How to Style the Blocks

    In the JSON file we can style the elements (aka. Blocks) in the elements section.

    How do we implement the fonts and styles in the blocks? Here is a typical sample: styling the button block. Other blocks are styled in a similar manner.

    WordPress will create CSS-variables from your JSON-file after this model:

    var( –wp–preset–CSSSLUG )

    for example:

    var(–wp–preset–font-family–heading)

    Below you see the styling of a button by JSON. The example below will define the:

    • Border
    • Color
    • Spacing (whitespace: padding etc.)
    • Typography (fontfamily, fontsize, etc.)
    • :hover (that’s the way to use pseudo classes

    In Practise: Styling the Buttons

    Now a button is a fairly typical block. If you can style a button, you know how to style any block.

    "elements": {
        "button": {
            "border": {
                "radius": "6px"
            },
            "color": {
                "background": "var(--wp--preset--color--contrast)",
                "text": "var(--wp--preset--color--base-2)"
            },
            "spacing": {
                "padding": {
                    "bottom": "0.98rem",
                    "left": "1.6rem",
                    "right": "1.6rem",
                    "top": "0.8rem"
                }
            },
            "typography": {
                "fontFamily": "var(--wp--preset--font-family--heading)",
                "fontSize": "var(--wp--preset--font-size--small)",
                "fontStyle": "normal"
            },
            ":hover": {
                "color": {
                    "background": "var(--wp--preset--color--contrast)"
                }
            }
        }

    Let’s break down this code a little bit. I have cut out the samples from the code above.

    Give the Button Colours

    Here is the :hover pseudo style for our button. A color is defined when the mouse pointer hover over the button. The same principle will work for :link, :active, :hover and so on. In this case the color that will be used is contrast:

    ":hover": {
        "color": {
            "background": "var(--wp--preset--color--contrast)"
        }
    }

    How to add a font

    We can add fonts after a similar manner. The CSS wee need is font-family. So we use –wp–preset–font-family. To the variable we’ll have to add the slug of the selected font which is heading. Now we have constructed the variable:

    var(–wp–preset–font-family–heading)

    Here is a sample for the site-title block:

    "core/site-title": {
        "typography": {
            "fontFamily": "var(--wp--preset--font-family--heading)"
        }
    }

    Blocks in TT4

    Now we have seen how to style one block. Here is a list of styled blocks in the theme.json of TT4, so if you want a deeper study have a look at them, since this article only mentioned “core/button”:

    “core/avatar”: {
    “core/button”: {
    “core/buttons”: {
    “core/calendar”: {
    “core/categories”: {
    “core/code”: {
    “core/comment-author-name”: {
    “core/comment-content”: {
    “core/comment-date”: {
    “core/comment-edit-link”: {
    “core/comment-reply-link”: {
    “core/post-comments-form”: {
    “core/comments-pagination”: {
    “core/comments-pagination-next”: {
    “core/comments-pagination-numbers”: {
    “core/comments-pagination-previous”: {
    “core/footnotes”: {
    “core/gallery”: {
    “core/image”: {
    “core/list”: {
    “core/loginout”: {
    “core/navigation”: {
    “core/post-author”: {
    “core/post-author-name”: {
    “core/post-date”: {
    “core/post-excerpt”: {
    “core/post-featured-image”: {
    “core/post-terms”: {
    “core/post-title”: {
    “core/pullquote”: {
    “core/query-title”: {
    “core/query-no-results”: {
    “core/quote”: {
    “core/search”: {
    “core/separator”: {
    “core/site-tagline”: {
    “core/site-title”: {

    The list above was made via a simple Bash command in a terminal window on a Mac or Linux system, that will filter out any string that contains core/:

    # grep “core/” theme.json

    With this information we should be able to style most of the Gutenberg blocks. Here is an even more extensive list of the Gutenberg blocks: click here.

  • (this article is work in progress …)

    I often wondered whether you could create your own styles for OpenStreetMap by some CSS and avoid commercial solutions like Mapbox.

    Here are the links to resources about OpenStreetMap and how to style the maps on web pages.

    Leaflet Styles

    Leaflet is a cool JavaScript / CSS library for adding markers, popups and similar to OpenStreetMap maps. Since the library has a CSS library, you could tweak the setings by additional CSS after the link to the Leaflet CSS. E.g.:

    <link 
            rel="stylesheet" 
            href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
            integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
            crossorigin=""/>
    <style>
      /** tweak something here ... see below */
    </style>

    Here are the typical Leaflet Styles: see it here.

    If we look into these styles an alternative CSS could be added, eg.:

    /* visual tweaks */
    .leaflet-container {
    	background: #ddd;
    	outline-offset: 1px;
    	}

    In the we should be able to tweak a map and change the background color hex to somethig different here.

    Since Leaflet has tweaks to font styles you could change the look and feel of things here.

  • The Makey Makey is a credit card sized mini keyboard. You can create all sorts of buttons or keyboards and use anything that can conduct electricity.

    In this video you will learn to fire off a JavaScript function whenever a button is pushed.

  • In this thread on Stackoverflow you’ll find an easy method to pull new/updated code from an original repository to your local fork:

    # Add this in a terminal in the relevant directory:
    git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
    git fetch upstream
    
    # then: (like "git pull" which is fetch + merge)
    git merge upstream/master master
    
    # or, better, replay your local work on top of the fetched branch
    # like a "git pull --rebase"
    git rebase upstream/master

    After adding the upstream you only have to run the merge or rebase command now and then – whenever you know or suppose that the code was updated.

  • Tutorial: Woocommerce REST API.

    Woocommerce REST API

    Here is a short introduction to the Woocommerce REST API. In the tutorial you will learn how to present a product list from the REST API on any HTML page. If you want to create your own markup that does not depend on the limited Woocommerce blocks in the editor the REST API will open endless possibilities.

    Sample Code on Github

    The code from the tutorial is available on Github:

    Questions and Comments

    If you have comments or suggestions for new videos about the subject please let me know in the comments below.

  • Hvordan du kan udvikle en Figma-prototype ved at undersøge mulighederne i WP.

    Blokke i Woocommerce

    Der findes et meget stort antal blocks i Woocommerce. Denne artikel viser de fleste. Der findes desuden mange plugins og patterns, der giver yderligere muligheder.

    Når du skal udvikle et design i WP, så kan “reversed engineering” være en rigtig god ide. Før du designer noget, så må du vide, hvordan de enkelte blocks ser ud og hvilke indstillingsmuligheder der er i dit theme – herunder hvor custom HTML / CSS kan blive nødvendig.

    Øvelse

    Lav en side, der simpelt hen lister de enkelte blocks, sådan som de ser ud i dit theme.

    1. Lav en side med samtlige blocks, som du får brug for i dit design.
    2. Inddel dine designs i groups.
    3. Gem disse groups som genbrugelige patterns.

    Dette er ikke en layout-opgave; men derimod en opgave, der handler om at finde ud, hvordan de enkelte blocks ser ud, således at du kan genskabe dem i Figma.

    Reversed engineering handler om at arbejde ud fra det som er kendt. Det er lidt som at designe med Lego-klodser, der jo har en forud defineret form.

    Eksempel

    Herunder er et eksempel på en liste, der kan bruges til Figma reversed engineering.


    Søgning

    Håndplukkede varer

    Minikurv

    Blokgrupper fra Woocommerce

    Pladsholderbillede der skal repræsentere en vare, der bliver vist i en hero-sektion. 1 ud af 2.

    The Fall Collection

    With high-quality materials and expert craftsmanship, our products are built to last and exceed your expectations.

    Quality Materials

    We use only the highest-quality materials in our products, ensuring that they look great and last for years to come.

    Expert Craftsmanship

    Our products are made with expert craftsmanship and attention to detail, ensuring that every stitch and seam is perfect.

    Unique Design

    From bold prints and colors to intricate details and textures, our products are a perfect combination of style and function.

    Customer Satisfaction

    Our top priority is customer satisfaction, and we stand behind our products 100%.

    Pladsholderbillede der skal repræsentere en vare, der bliver vist i en hero-sektion. 2 ud af 2.

    Dine blokgrupper

    Du kunne måske være interesseret i…

    Din kurv er lige nu tom!

    Gennemse webshop


    Ny i webshop

    Etc. etc.

    Fortsæt ind til du har et passende antal varer. Se evt. hvordan templates, som shop / butik opgygger groups og patterns, når varer præsenteres.

  • Is your website is blocked in the browser because it’s “not safe”? In that case you have to install the HTTPS protocol. On Simply.com this operation is relatively simple:

    Enable HTTPS

    1. In the Dashboard go to HTTPS settings.
    2. Enable HTTP
    3. Optional: force HTTPS.

    How about SubDomains?

    The HHTS settings will not work on the subdomains. Here you have to enable HTTPS again on each subdomain.

    HTTPS and WordPress

    If you have WordPress install the plugin “Really Simple SSL” and activate it.

  • The Full Site Editor is not in Beta any more. There are attempts at improvements. But will the new user understand the complex features?

    This morning I saw that the FSE editor is out of the somewhat chaotic beta state. That’s great news.

    The first impression is positive because the interface is more logical now. You don’t have to search for the styles in weird places any more. All design options are presented in the FSE editor environment.

    • At last we have an easy to find navigation menu.
    • The styles have a menu handle.
    • The template and template parts are also available.

    Navigation

    The navigation was very hard to find in the Beta state. However, it’s still somewhat unclear what to do when you click the different menus.

    They’ll send you to the page/post or template/template part, where the menu appears. There you’ll have to edit things.

    Promising, but still a bit puzzling.

    Styles

    The styles will give access to the different style variations. That’s cool. Now they are more easy to find.

    When you click edit you’ll get the actual styles of your site. That’s ok.

    Templates and Template Parts

    The template and template parts are listed as in the Beta version. At the + you can add another template.

    For person beginning to use WP the template-concept is utterly confusing. At least I often meet users that don’t know the difference between content and a template.

    FSE (full site editing) is of course cool, but we still need a very good introduction to questions like:

    • What is the difference between a template and a page?
    • What is the connection between a page and a template?
    • What is the best time to edit a template or should I add my content in a page or post?
    • Why do we need so many templates, and what are their functions in e.g. TT3?

    Of course such questions show, that the person beginning to use WP does not know the basic concepts, like:

    • What is a Page (static content)?
    • What is a Post (blog, news rooll)?
    • What is a template (Design the looks of pages and posts, categories etc.)?

    Will this Confusion End?

    For the experienced WP user questions like the ones above are trivial. However, the strength of WP was alway it’s unserfriendly approach.

    The learning curve in CMS systems like Joomla, Drupal or Typ03 is very steep. When I made Joomla solutions, often the users had to have tutorials.

    Personally I fear, that WordPress has become extremely complex. But the new additions to the FSE editor is indeed a positive development.

    When I began to use WP the strength was it’s ease of use. You installed WP. Began to write blog posts or create pages. End of story.

    The modern user of WP will have to come to terms with very abstract concepts. The relation between content and template can be very hard to explain to new WP users.

    For WP teachers and consultants the future is bright. New users will need an introduction course.

    And that’s a challenge for WordPress.

  • Research Notes for a e-Commerce Class. How to set up WooCommerce with sample data, fake payment and block based editors.

    The Sample data for WooCommerce is located in sample-products.csv or sample-products.xml, which are located in the WooCommerce plugin folder in woocommerce/sample-data/

    Check this article.

    An alternative is this file.

    Video

    How to Add Woocommerce Product Sample Data in WooCommerce with Product Images. By: Gomahamaya
    How To Add Fake Sample Data To WordPress & WooCommerce. By: WPCrafter.

    FakerPress is used in the video above

    FakePay for WooCommerce

    How to create crafted WooCommerce pages in e.g. Gutenberg and Kadence blocks.

    The video has an interesting feature: a functions.php hack that will enable Gutenberg (and other page builders) in WooCommerce. However, the authors tell, that this way of doing things may become deprecated soon.

    Edit Products in Gutenberg

    Enable Gutenberg

    Note: this code could be deprecated soon.

    Add this to functions.php:

    // enable gutenberg for woocommerce
    function activate_gutenberg_product( $can_edit, $post_type ) {
     if ( $post_type == 'product' ) {
            $can_edit = true;
        }
        return $can_edit;
    }
    add_filter( 'use_block_editor_for_post_type', 'activate_gutenberg_product', 10, 2 );
    
    // enable taxonomy fields for woocommerce with gutenberg on
    function enable_taxonomy_rest( $args ) {
        $args['show_in_rest'] = true;
        return $args;
    }
    add_filter( 'woocommerce_taxonomy_args_product_cat', 'enable_taxonomy_rest' );
    add_filter( 'woocommerce_taxonomy_args_product_tag', 'enable_taxonomy_rest' );

    WooCoomerce 2023 tutorial

    (3 hours tutorial) “… from start to finish how to create a webshop using WordPress and WooCommerce. This eCommerce tutorial is both for people that want to create a fully functional webshop from scratch and for people that want to extend their WordPress website with a webshop.”
  • On the contrary. It’s desk research – plain and simple! In order to get a good result you must be able to write a high quality prompt. However, if you use Chat GPT state your source as you would with any source.

    Wizard at a laptop, created by Stable Diffusion AI.

    Chat GPT: cheat or …?

    I just had to try. Is ChatGPT able to program a simlpe gallery in jQuery? Since I need a sample like that for a programming class the anwer could come in handy.

    I asked for a gallery of five images. At first each image got a <div> with an image tag inside.

    Then I rephrased the prompt, and asked for an array of five images, and got a far better result. The improved prompt was:

    create a jquery script that will create a gallery on a web page from an array with five image names

    A few seconds later the answer was ready. Here is a proof of concept. I copied the code to jsFiddle, however I’ve reduced them number of images to four for aestetic reasons:

    Chat GPT seems like a fine resource for programmers. After the code there is a fine explanation, how the thing works. Which is fine if you want to understand the details.

    In this example, we’re using jQuery to create a gallery from an array of image names. We first set up the HTML and CSS to create a container for the gallery.

    Then, in the jQuery script, we create an array of image names. We also create the overlay container and an image element to show the full-size image when the user clicks on an image. We append these elements to the body of the document.

    We then use the jQuery each() function to loop through the array of image names. For each image, we create a new image container element and set its src attribute to the corresponding image name. We also add a click event handler to each image container element to show the overlay with the full-size image when the user clicks on it.

    Finally, we attach a click event handler to the overlay container. When the user clicks on the overlay container, we remove the active class to hide it again.

    By adjusting the CSS, you can customize the appearance of the gallery to your liking.” [Code explained by Chat GPT, prompt op.cit.]

    The images were added from my experiments with the image AI Stable Diffusion.

    Chat GPT and studies

    It’s hardly a secret that Chat GPT is a debated subject among teachers and students. According to some journalists you could even pass an exam in Law via Chat GPT.

    How does Chat GPT see it’s role in the classroom? I asked and the answer was surprisingly usefull:

    “As an AI language model, my purpose is to assist users in generating human-like responses to their inquiries or prompts. However, using me to write essays or school reports without understanding the topic or doing the necessary research may be considered cheating, as it does not reflect the student’s own effort or understanding of the subject matter.

    It is essential to keep in mind that while I can provide useful information and suggestions, students should use the information provided by me as a tool to aid them in their research, writing, and learning process. It is always best to use your own words and ideas to showcase your understanding of the subject and demonstrate your skills and knowledge.

    Therefore, the use of ChatGPT should be considered as a supplementary tool and not a replacement for personal learning and research.

    To use Chat GPT as a research tool or as a starting point makes sense. Today noone would hardly care if Duckduckgo or Google were used during a desk research phase. On the contrary: it’s expected. For programmers Google is a very useful tool.

    If you find a good source by search engines they are used as sources and added to the source list, in footnotes and so on. According to academic method Chat GPT is a source among sources. If it’s used for research and inspiration you should mention it in a footnote, e.g. if you’re inspired by the Harward Mehtod in the sources list you could add the source along these lines, [Chat GPY, prompt: “is the use of chat gpt considered cheating for studies or school reports”, 2023 February 25th]

    Now the prompt is important, since that’s what give you the answer from Chat GPT. As a coder you should know, that the answer’s quality depend on a combination of your ability to pose the correct question. There is also an element of randomness. If you ask the same question again you will not always get the same answer.

    The case with my code for a jQuery above is a good sample. Since I know how to code the first result was not good. However, when my question was rephrased – the answer became more usefull. The quality of the answer depends on the quality of what’s in the prompt.

    A clever student will get better answers.

    In the future I believe that different AI services will compete. Probably the writing of good prompts will be an essential skill for anyone who works with code or academic research. After all you need to be critical towards anything returned by the Chat GPT prompt. You have to compare and choose the best results. And that’s good old Desk Research …

  • In order to use jQuery you must get the library. Here we’ll use a CDN. You can import the jQuery CDN in a custom HTML block, like this:

    <script
      src="https://code.jquery.com/jquery-3.6.3.min.js"
      integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU="
      crossorigin="anonymous"></script>

    That’s it. Now you can use jQuery.

    Just for the Hell of it, let’s try and create a button that will hide/show all <p> tags. Select the button, and give it an id. You can do this in advanced settings. Here the id is removeP.

    Here is the code that should remove the <p>-elements. Add the script tag to a custom HTML block:

    <script>
    $('#removeP').click(function(){
       $('p').toggle(777);
    })
    </script>
    

    The code above will detect a click event on the button. We gave the button the id removeP. When a click is detected a new selector will mark all <p> elements and toggle them. A toggle is a bit like a normal on/off switch on the wall. If the elements are visible they will hide away. Or vice versa. The number in the parethesis (777) is the number of microseconds that the toggle animation will last.

    Now try to click the button. Does it work as intended?

  • JavaScript libraries can add cool animations or parallax effects to a traditional webpage in HTML, CSS and JavaScript. Here you can learn how to do the same thing in the WordPress editor.

    Case: Animate on Scroll (AOS)

    Animate on Scroll is a populer animation library. In order to use the library on a single WP page or post you’ll have to load the CSS and JavaScript. Do this in a custom HTML block looking somewhat like this in the <head> section – or at least before the blocks you want to animate:

    <link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />

    This will load the CSS. At the bottom of your page/post you’ll have to load the script in a custom HTML-block:

    <script src="https://unpkg.com/aos@next/dist/aos.js"></script>
      <script>
        AOS.init();
      </script>

    Now you can add the custom code, that will animate for instance an image. Let’s try this with my logo:

    Now select the block in the List View. Click the kebab menu, and select “Edit as HTML“.

    Now you can see the WP “markup”, and add whatever code you fancy. For instance if you want to flip the image you’ll need code around these lines:

    In the HTML block add data-aos=”flip-up” to the image tag:

    <figure class="wp-block-image size-full">
    
    <img data-aos="flip-up" src="https://multimusen.dk/wp-content/uploads/cropped-cropped-multimusen-150-150-1.png" alt="" class="wp-image-9017"/>
    
    </figure>

    Now test the page. With a little luck the image will flip.

    More Libraries

    Now you should be able to integrate all kinds of JavaScript libraries to your pages and posts. Just remember to load the code in the correct position:

    • Load CSS before the blocks you want to manipulate.
    • Load the JavaScript as close to the bottom of your page as possible.

    By your own research try to add effects to your pages and posts, such as:

    • Parallax
    • Animation
    • even jQuery might work
    • Bootstrap
    • etc.
    • et
    • cetera


Enable Notifications OK No thanks

We use cookies - more information

Multimusen.dk will set a few cookies from Doubleclick, Google and the Social Media plugins they ay set some cookies. Some of my pages use APIs - such as YouTube, LinkedIn, Google Fonts, Google Maps, Mapbox, Spotify, Jetpack, Twitter, Facebook &c.. Such plugins may set the odd cookie.

Close