# Installation You can include **Harmonia** in your project in two ways: - **Using a ` ``` ### From npm package ```bash npm install @codbex/harmonia ``` ### From WebJar ::: code-group ```xml [Maven] org.webjars.npm codbex__harmonia __H_VER__ ``` ```[SBT / Play 2] "org.webjars.npm" % "codbex__harmonia" % "__H_VER__" ``` ```xml [Ivy] ``` ```[Grape] @Grapes( @Grab(group='org.webjars.npm', module='codbex__harmonia', version='webJarVersion.val()') ) ``` ```[Gradle] runtimeOnly("org.webjars.npm:codbex__harmonia:__H_VER__") ``` ```[Buildr] 'org.webjars.npm:codbex__harmonia:jar:1.4.2' ``` ```[Leiningen] org.webjars.npm/codbex__harmonia "1.4.2" ``` ::: ### Eclipse Dirigible Harmonia is included by default in the low-code [Eclipse Dirigble](https://www.dirigible.io/) development platform as a WebJar. ## Include from a script tag ::: code-group ```html [NPM] ``` ```html [WebJar / Dirigible] ``` ::: ## Include as a module ### Configure the importmap ::: code-group ```html [NPM] ``` ```html [WebJar / Dirigible] ``` ::: ### Include base styles ::: code-group ```html [NPM] ``` ```html [WebJar / Dirigible] ``` ::: ### Initialize component(s) ::: code-group ```js [Automatic] import Alpine from 'alpinejs'; import registerComponents from '@codbex/harmonia'; registerComponents(Alpine.plugin); Alpine.start(); ``` ```js [Manual] import Alpine from 'alpinejs'; import { Card, Button, ... } from '@codbex/harmonia'; Alpine.plugin(Card); Alpine.plugin(Button); ... Alpine.start(); ``` ::: ## Configure fonts By default, Harmonia uses the **Open Sans** font, but no fonts are included in the package itself. This gives you full flexibility to choose the fonts that match your brand. ### Eclipse Dirigible There is a default font configuration included in Dirigible: ```html ``` ### Other/Custom To use Open Sans, or any custom font, you will need to provide your own `fonts.css` file that links to your font installation or CDN. You can also configure this font in your theme for a consistent look across all components. Here is an example `fonts.css` file: ::: code-group ```css [NPM] /* open-sans-latin-300-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 300; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-300-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-400-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 400; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-400-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-500-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 500; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-500-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-600-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 600; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-600-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-700-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 700; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-700-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-800-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 800; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-800-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-cyrillic-300-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 300; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-300-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-400-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 400; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-400-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-500-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 500; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-500-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-600-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 600; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-600-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-700-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 700; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-700-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-800-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 800; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-800-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-latin-300-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 300; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-300-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-400-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 400; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-400-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-500-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 500; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-500-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-600-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 600; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-600-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-700-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 700; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-700-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-800-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 800; src: url(///node_modules/@fontsource/open-sans/files/open-sans-latin-800-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-cyrillic-300-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 300; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-300-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-400-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 400; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-400-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-500-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 500; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-500-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-600-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 600; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-600-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-700-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 700; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-700-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-800-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 800; src: url(///node_modules/@fontsource/open-sans/files/open-sans-cyrillic-800-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } ``` ```css [WebJar] /* open-sans-latin-300-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 300; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-300-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-400-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 400; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-400-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-500-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 500; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-500-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-600-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 600; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-600-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-700-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 700; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-700-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-800-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 800; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-800-normal.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-cyrillic-300-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 300; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-300-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-400-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 400; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-400-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-500-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 500; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-500-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-600-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 600; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-600-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-700-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 700; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-700-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-800-normal */ @font-face { font-family: 'Open Sans'; font-style: normal; font-display: swap; font-weight: 800; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-800-normal.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-latin-300-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 300; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-300-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-400-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 400; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-400-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-500-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 500; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-500-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-600-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 600; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-600-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-700-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 700; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-700-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-latin-800-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 800; src: url(/webjars/fontsource__open-sans/files/open-sans-latin-800-italic.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* open-sans-cyrillic-300-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 300; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-300-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-400-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 400; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-400-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-500-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 500; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-500-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-600-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 600; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-600-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-700-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 700; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-700-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* open-sans-cyrillic-800-italic */ @font-face { font-family: 'Open Sans'; font-style: italic; font-display: swap; font-weight: 800; src: url(/webjars/fontsource__open-sans/files/open-sans-cyrillic-800-italic.woff2) format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } ``` ::: In the theme file: ::: warning Only do this if you're using a font other than Open Sans, since these values are already set by default in Harmonia. ::: ```css --font-sans: 'Open Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; ``` ## Full example ::: code-group ```html [NPM] ``` ```html [WebJar] ``` ::: ## Full example (as a module) ::: code-group ```html [NPM] ``` ```html [WebJar] ``` ::: ## Full example (Eclipse Dirigible) ```html ```