1
0
mirror of https://github.com/tabler/tabler.git synced 2025-12-21 17:34:25 +04:00

Add SRI generation script (#2104)

This commit is contained in:
Paweł Kuna
2025-03-24 01:26:53 +01:00
committed by GitHub
parent 74e5d26c20
commit f94b153f7f
17 changed files with 190 additions and 40 deletions

View File

@@ -0,0 +1,5 @@
---
"preview": patch
---
Add SRI hashes to scripts and styles

View File

@@ -1,7 +1,7 @@
{ {
"bracketSpacing": true, "bracketSpacing": true,
"jsxSingleQuote": false, "jsxSingleQuote": false,
"printWidth": 240, "printWidth": 320,
"proseWrap": "always", "proseWrap": "always",
"semi": false, "semi": false,
"singleQuote": false, "singleQuote": false,

View File

@@ -10,10 +10,9 @@
"version": "changeset version", "version": "changeset version",
"publish": "changeset publish", "publish": "changeset publish",
"playwright": "pnpm run build && pnpm run vt", "playwright": "pnpm run build && pnpm run vt",
"vt": "playwright test tests",
"reformat-mdx": "node .build/reformat-mdx.mjs", "reformat-mdx": "node .build/reformat-mdx.mjs",
"start": "pnpm dev", "start": "pnpm dev",
"zip": "mkdir -p packages-zip && zip -qr9 packages-zip/tabler-$(node -p \"require('./core/package.json').version\").zip ./preview/dist/*" "zip": "mkdir -p packages-zip && zip -r packages-zip/tabler-$(node -p \"require('./package.json').version\").zip preview/dist/*"
}, },
"packageManager": "pnpm@10.6.4", "packageManager": "pnpm@10.6.4",
"devDependencies": { "devDependencies": {
@@ -41,6 +40,7 @@
"sass": "1.71.0", "sass": "1.71.0",
"shx": "^0.4.0", "shx": "^0.4.0",
"terser": "^5.39.0", "terser": "^5.39.0",
"turbo": "^2.4.4" "turbo": "^2.4.4",
"shelljs": "^0.9.2"
} }
} }

3
pnpm-lock.yaml generated
View File

@@ -74,6 +74,9 @@ importers:
sass: sass:
specifier: 1.71.0 specifier: 1.71.0
version: 1.71.0 version: 1.71.0
shelljs:
specifier: ^0.9.2
version: 0.9.2
shx: shx:
specifier: ^0.4.0 specifier: ^0.4.0
version: 0.4.0 version: 0.4.0

View File

@@ -0,0 +1,107 @@
const crypto = require('node:crypto');
const fs = require('node:fs');
const path = require('node:path');
const sh = require('shelljs');
sh.config.fatal = true
const configFile = path.join(__dirname, '../eleventy.config.mjs')
const files = [
{
file: '../core/dist/css/tabler.min.css',
configPropertyName: 'css'
},
{
file: '../core/dist/css/tabler.rtl.min.css',
configPropertyName: 'css-rtl'
},
{
file: '../core/dist/css/tabler-flags.min.css',
configPropertyName: 'css-flags'
},
{
file: '../core/dist/css/tabler-flags.rtl.min.css',
configPropertyName: 'css-flags-rtl'
},
{
file: '../core/dist/css/tabler-marketing.min.css',
configPropertyName: 'css-marketing'
},
{
file: '../core/dist/css/tabler-marketing.rtl.min.css',
configPropertyName: 'css-marketing-rtl'
},
{
file: '../core/dist/css/tabler-payments.min.css',
configPropertyName: 'css-payments'
},
{
file: '../core/dist/css/tabler-payments.rtl.min.css',
configPropertyName: 'css-payments-rtl'
},
{
file: '../core/dist/css/tabler-props.min.css',
configPropertyName: 'css-props'
},
{
file: '../core/dist/css/tabler-props.rtl.min.css',
configPropertyName: 'css-props-rtl'
},
{
file: '../core/dist/css/tabler-themes.min.css',
configPropertyName: 'css-themes'
},
{
file: '../core/dist/css/tabler-themes.rtl.min.css',
configPropertyName: 'css-themes-rtl'
},
{
file: '../core/dist/css/tabler-socials.min.css',
configPropertyName: 'css-socials'
},
{
file: '../core/dist/css/tabler-socials.rtl.min.css',
configPropertyName: 'css-socials-rtl'
},
{
file: '../core/dist/css/tabler-vendors.min.css',
configPropertyName: 'css-vendors'
},
{
file: '../core/dist/css/tabler-vendors.rtl.min.css',
configPropertyName: 'css-vendors-rtl'
},
{
file: '../core/dist/js/tabler.min.js',
configPropertyName: 'js'
},
{
file: '../core/dist/js/tabler.min.js',
configPropertyName: 'js-theme'
},
{
file: 'dist/preview/css/demo.min.css',
configPropertyName: 'demo-css'
},
{
file: 'dist/preview/js/demo.min.js',
configPropertyName: 'demo-js'
},
]
for (const { file, configPropertyName } of files) {
fs.readFile(path.join(__dirname, '..', file), 'utf8', (error, data) => {
if (error) {
throw error
}
const algorithm = 'sha384'
const hash = crypto.createHash(algorithm).update(data, 'utf8').digest('base64')
const integrity = `${algorithm}-${hash}`
console.log(`${configPropertyName}: ${integrity}`)
sh.sed('-i', new RegExp(`^(\\s+"${configPropertyName}":\\s+["'])\\S*(["'])`), `$1${integrity}$2`, configFile)
})
}

View File

@@ -114,12 +114,12 @@ export default function (eleventyConfig) {
npmPackage: "@tabler/core", npmPackage: "@tabler/core",
tablerCssPlugins: [ tablerCssPlugins: [
"tabler-flags", { name: "tabler-flags", sri: "css-flags" },
"tabler-socials", { name: "tabler-socials", sri: "css-socials" },
"tabler-payments", { name: "tabler-payments", sri: "css-payments" },
"tabler-vendors", { name: "tabler-vendors", sri: "css-vendors" },
"tabler-marketing", { name: "tabler-marketing", sri: "css-marketing" },
"tabler-themes", { name: "tabler-themes", sri: "css-themes" },
], ],
icons: { icons: {
@@ -411,6 +411,29 @@ export default function (eleventyConfig) {
] ]
}); });
eleventyConfig.addGlobalData("sri", {
"css": "sha384-+ysCwUILnDsnHwK+rITa6QNp8mGFdEXZMfZ/WBpY13iTiCwas5Ah0GIagDbU8Ocy",
"css-rtl": "sha384-kQMcoyzrq1HEu2/rW78iuKRreSYzdUb1KQhPweqwUyH8Gnydy+vaMP4MpFx2+z07",
"css-flags": "sha384-J4S9gTOgB6a60d8OIMRu7vveDJCqxLAcDfzDN24CQxXmfi1iIFoU3uelSShCMfAD",
"css-flags-rtl": "sha384-Rh33piKJ6K8C1b07vnxSLBK5RJSnp4UhH37XTfJxWlnVUl3FqH3mW14kOy6nU1Bd",
"css-marketing": "sha384-RFTn6c3X2MHvEcQwCc/w1n8IBV4B/GeFHms5KPCiMkSc+tCDtZe5F6aJ+dJYu7mI",
"css-marketing-rtl": "sha384-HZqaZjtszSlyS975Oe9Z9U9gVmMxvTBU1XziOLE3R4N/pKTmWiznOzHszVqoSufe",
"css-payments": "sha384-YnhOMEPyU5QfErzSK9sD18FMXdRCn/HB4a+88mFXbd45fFRNWKWeARptNw1k16+/",
"css-payments-rtl": "sha384-v6XNJfLEVre0G8WOfEeFRSDFItjdOvNGFZTlS6HpoKkkxYe/vbkJBfzhOnePD2dY",
"css-socials": "sha384-M/p2rVRhhVGWQaE5KAPB4+/uWqFtmb6ag3/NXG8E3SL2MAROPCfB5YJvDHmS5Rms",
"css-socials-rtl": "sha384-5h8LiZ8sjd3+w3/waxyu3/vTW2kdx90LLYaik7pugCUOR7YRQXbyP13dhp1mUrcW",
"css-props": "sha384-D9/OSlhkMpd/Nf7168lDKk/Tg/slS3Zu8+alAFMMKXmFkoPazXHR7kiSMKKgu5D6",
"css-props-rtl": "sha384-4v5rbYBY7WUjemTcFeoBDmH+qZUndtmwamnzHdqcUpAdopNjpVsG/+1IQOpKHNly",
"css-themes": "sha384-Bj8pP2O3iJP6JH/ZdDBnxIH/3XOJF8DSyYUUHs8wTxb0PRUe5DU01llAmog5ybpg",
"css-themes-rtl": "sha384-+bJhK3cbUPk0SGCLUskjOBARViddapb+MJA1CbWjerZ46uyZbm6L1Gar3Ggs4c8h",
"css-vendors-rtl": "sha384-bO98lLX+Ldg6g5nwEiyrECPhkSytviXXblROAGrjND8u+AM4zbk8gjQsCDK7zifX",
"css-vendors": "sha384-oxt7C0fn5FehJqUxTGaDMUo+IiNNM7wVIqvuv7aHn4hnfLyc0TxI2xXo6bMK1pyb",
"js": "sha384-uSpys8fjyVTPrXxPMi+NhnEMIp1YSGFZSCDrRHjYIUVdInIvlHft8JHLm6Oiw3vA",
"js-theme": "sha384-uSpys8fjyVTPrXxPMi+NhnEMIp1YSGFZSCDrRHjYIUVdInIvlHft8JHLm6Oiw3vA",
"demo-css": "sha384-BUDq2P684xwRBf0GDlySvob+KJg4ko8y2K7njgvYBscmEuqoVVqJ75zcTDozwkFA",
"demo-js": "sha384-UcTgbM9IZSOPHHuFa0R9H4TegQWoZkJKpeTjLV5hjem2k0CZ67Q4/bW2rT/Edf4Z",
});
/** /**
* Filters * Filters
*/ */

View File

@@ -2,7 +2,7 @@
"name": "preview", "name": "preview",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run html", "build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run generate-sri && pnpm run html",
"dev": "pnpm run clean && pnpm run watch", "dev": "pnpm run clean && pnpm run watch",
"watch": "concurrently \"pnpm run watch-html\" \"pnpm run watch-css\" \"pnpm run watch-js\"", "watch": "concurrently \"pnpm run watch-html\" \"pnpm run watch-css\" \"pnpm run watch-js\"",
"watch-html": "cross-env NODE_ENV=development eleventy --serve --port=3000 --incremental", "watch-html": "cross-env NODE_ENV=development eleventy --serve --port=3000 --incremental",
@@ -10,10 +10,10 @@
"watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css\"", "watch-css": "nodemon --watch scss/ --ext scss --exec \"pnpm run css\"",
"css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-minify", "css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-minify",
"css-compile": "sass scss/:dist/preview/css/ --no-source-map --load-path=node_modules", "css-compile": "sass scss/:dist/preview/css/ --no-source-map --load-path=node_modules",
"css-prefix": "postcss --config build/postcss.config.mjs --replace \"dist/preview/css/*.css\" \"!dist/preview/css/*.rtl*.css\" \"!dist/preview/css/*.min.css\"", "css-prefix": "postcss --config .build/postcss.config.mjs --replace \"dist/preview/css/*.css\" \"!dist/preview/css/*.rtl*.css\" \"!dist/preview/css/*.min.css\"",
"css-minify": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/preview/css/ --batch --batch-suffix \".min\" \"dist/preview/css/*.css\" \"!dist/preview/css/*.min.css\" \"!dist/preview/css/*rtl*.css\"", "css-minify": "cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/preview/css/ --batch --batch-suffix \".min\" \"dist/preview/css/*.css\" \"!dist/preview/css/*.min.css\" \"!dist/preview/css/*rtl*.css\"",
"js": "pnpm run js-compile && pnpm run js-minify", "js": "pnpm run js-compile && pnpm run js-minify",
"js-compile": "rollup --config build/rollup.config.mjs --sourcemap", "js-compile": "rollup --config .build/rollup.config.mjs --sourcemap",
"js-minify": "pnpm run js-minify-demo", "js-minify": "pnpm run js-minify-demo",
"js-minify-demo": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/preview/js/demo.js.map,includeSources,url=demo.min.js.map\" --output dist/preview/js/demo.min.js dist/preview/js/demo.js", "js-minify-demo": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/preview/js/demo.js.map,includeSources,url=demo.min.js.map\" --output dist/preview/js/demo.min.js dist/preview/js/demo.js",
"clean": "shx rm -rf dist demo", "clean": "shx rm -rf dist demo",
@@ -21,12 +21,13 @@
"html-build": "eleventy", "html-build": "eleventy",
"html-prettify": "prettier --write \"dist/**/*.html\"", "html-prettify": "prettier --write \"dist/**/*.html\"",
"svg-optimize": "svgo -f svg/brand --pretty", "svg-optimize": "svgo -f svg/brand --pretty",
"unused-files": "node build/unused-files.mjs", "unused-files": "node .build/unused-files.mjs",
"download-images": "node build/download-images.mjs", "download-images": "node .build/download-images.mjs",
"optimize-images": "for i in ./src/static/photos/*.jpg; do convert \"$i\" -quality 80% \"${i%.jpg}.jpg\"; done", "optimize-images": "for i in ./src/static/photos/*.jpg; do convert \"$i\" -quality 80% \"${i%.jpg}.jpg\"; done",
"svg-icons": "node build/import-icons.mjs", "svg-icons": "node .build/import-icons.mjs",
"import-illustrations": "node build/import-illustrations.mjs", "import-illustrations": "node .build/import-illustrations.mjs",
"import-icons": "git checkout dev && BRANCH_NAME=\"dev-tabler-icons-`pnpm info @tabler/icons version`\" && git branch $BRANCH_NAME && git checkout $BRANCH_NAME && ncu -u @tabler/icons && pnpm install && pnpm run svg-icons && git add . && git commit -am \"update icons to v`pnpm info @tabler/icons version`\" && git push origin $BRANCH_NAME && git checkout dev", "import-icons": "git checkout dev && BRANCH_NAME=\"dev-tabler-icons-`pnpm info @tabler/icons version`\" && git branch $BRANCH_NAME && git checkout $BRANCH_NAME && ncu -u @tabler/icons && pnpm install && pnpm run svg-icons && git add . && git commit -am \"update icons to v`pnpm info @tabler/icons version`\" && git push origin $BRANCH_NAME && git checkout dev",
"generate-sri": "node .build/generate-sri.js",
"zip": "mkdir -p packages-zip && zip -r packages-zip/tabler-$(node -p \"require('./package.json').version\").zip demo/*" "zip": "mkdir -p packages-zip && zip -r packages-zip/tabler-$(node -p \"require('./package.json').version\").zip demo/*"
}, },
"dependencies": { "dependencies": {

View File

@@ -1,32 +1,39 @@
{% if site.useIconfont %} {% if site.useIconfont -%}
<!-- BEGIN ICONFONT STYLES --> <!-- BEGIN ICONFONT STYLES -->
<link href="https://www.unpkg.com/@tabler/icons-webfont@latest/dist/tabler-icons.min.css" rel="stylesheet" /> <link href="https://www.unpkg.com/@tabler/icons-webfont@latest/dist/tabler-icons.min.css" rel="stylesheet" />
<!-- END ICON FONT STYLES --> <!-- END ICON FONT STYLES -->
{% endif %} {% endif -%}
{% if page-libs -%}
{% if page-libs %}
<!-- BEGIN PAGE LEVEL STYLES --> <!-- BEGIN PAGE LEVEL STYLES -->
{% for lib in libs.css %} {% for lib in libs.css -%}
{% if page-libs contains lib[0] %} {% if page-libs contains lib[0] -%}
{% for file in lib[1] %} {% for file in lib[1] -%}
<link href="{% if file contains 'http://' or file contains 'https://' %}{{ file }}{% else %}{{ page | relative }}/libs/{% if environment != 'development' %}{{ file | replace: '@', '' }}{% else %}{{ file }}{% endif %}{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}{% endif %}" rel="stylesheet"/> <link href="{% if file contains 'http://' or file contains 'https://' %}{{ file }}{% else %}{{ page | relative }}/libs/{% if environment != 'development' %}{{ file | replace: '@', '' }}{% else %}{{ file }}{% endif %}{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}{% endif %}" rel="stylesheet"/>
{% endfor %} {% endfor -%}
{% endif %} {% endif -%}
{% endfor %} {% endfor -%}
<!-- END PAGE LEVEL STYLES --> <!-- END PAGE LEVEL STYLES -->
{% endif %} {% endif %}
<!-- BEGIN GLOBAL MANDATORY STYLES --> <!-- BEGIN GLOBAL MANDATORY STYLES -->
<link href="{{ page | relative }}/dist/css/tabler{% if layout-rtl %}.rtl{% endif %}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/> {% if layout-rtl -%}
<link href="{{ page | relative }}/dist/css/tabler-rtl{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"{% if environment != 'development' %} integrity="{{ sri.css-rtl }}"{% endif %} />
{% else -%}
<link href="{{ page | relative }}/dist/css/tabler{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"{% if environment != 'development' %} integrity="{{ sri.css }}"{% endif %} />
{% endif -%}
<!-- END GLOBAL MANDATORY STYLES --> <!-- END GLOBAL MANDATORY STYLES -->
<!-- BEGIN PLUGINS STYLES --> <!-- BEGIN PLUGINS STYLES -->
{% for plugin in site.tablerCssPlugins %} {% for plugin in site.tablerCssPlugins -%}
<link href="{{ page | relative }}/dist/css/{{ plugin }}{% if layout-rtl %}.rtl{% endif %}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/> {% if layout-rtl -%}
{% endfor %} <link href="{{ page | relative }}/dist/css/{{ plugin.name }}.rtl{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"{% if environment != 'development' %} integrity="{{ sri[`${plugin.sri}-rtl`] }}"{% endif %}/>
{% else -%}
<link href="{{ page | relative }}/dist/css/{{ plugin.name }}{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"{% if environment != 'development' %} integrity="{{ sri[plugin.sri] }}"{% endif %}/>
{% endif -%}
{% endfor -%}
<!-- END PLUGINS STYLES --> <!-- END PLUGINS STYLES -->
<!-- BEGIN DEMO STYLES --> <!-- BEGIN DEMO STYLES -->
<link href="{{ page | relative }}/preview/css/demo{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"/> <link href="{{ page | relative }}/preview/css/demo{% if environment != 'development' %}.min{% endif %}.css{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" rel="stylesheet"{% if environment != 'development' %} integrity="{{ sri.demo-css }}"{% endif %}/>
<!-- END DEMO STYLES --> <!-- END DEMO STYLES -->

View File

@@ -1,13 +1,18 @@
{% if page-libs -%} {% if page-libs -%}
<!-- BEGIN PAGE LIBRARIES --> {% capture libs-code -%}
{% for lib in include.libs -%} {% for lib in include.libs -%}
{% if page-libs contains lib[0] -%} {% if page-libs contains lib[0] -%}
{% for file in lib[1] -%} {% for file in lib[1] -%}
<script <script src="{% if file contains 'http://' or file contains 'https://' %}{{ file | replace: 'GOOGLE_MAPS_KEY', google-maps-key }}{% else %}{{ page | relative }}/libs/{% if environment != 'development' %}{{ file | replace: '@', '' }}{% else %}{{ file }}{% endif %}{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}{% endif %}" defer></script>
src="{% if file contains 'http://' or file contains 'https://' %}{{ file | replace: 'GOOGLE_MAPS_KEY', google-maps-key }}{% else %}{{ page | relative }}/libs/{% if environment != 'development' %}{{ file | replace: '@', '' }}{% else %}{{ file }}{% endif %}{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}{% endif %}"
defer></script>
{% endfor -%} {% endfor -%}
{% endif -%} {% endif -%}
{% endfor -%} {% endfor -%}
{% endcapture -%}
{% assign libs-code = libs-code | strip -%}
{% if libs-code != "" -%}
<!-- BEGIN PAGE LIBRARIES -->
{{ libs-code }}
<!-- END PAGE LIBRARIES --> <!-- END PAGE LIBRARIES -->
{% endif -%} {% endif -%}
{% endif -%}

View File

@@ -6,11 +6,10 @@
{% include "layout/js-libs.html" libs=libs.js %} {% include "layout/js-libs.html" libs=libs.js %}
<!-- BEGIN GLOBAL MANDATORY SCRIPTS --> <!-- BEGIN GLOBAL MANDATORY SCRIPTS -->
<script src="{{ page | relative }}/dist/js/tabler{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" defer></script> <script src="{{ page | relative }}/dist/js/tabler{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" defer{% if environment != 'development' %} integrity="{{ sri.js }}"{% endif %}></script>
<!-- END GLOBAL MANDATORY SCRIPTS --> <!-- END GLOBAL MANDATORY SCRIPTS -->
<!-- BEGIN DEMO SCRIPTS --> <!-- BEGIN DEMO SCRIPTS -->
<script src="{{ page | relative }}/preview/js/demo{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" defer></script> <script src="{{ page | relative }}/preview/js/demo{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}" defer{% if environment != 'development' %} integrity="{{ sri.demo-js }}"{% endif %}></script>
<!-- END DEMO SCRIPTS --> <!-- END DEMO SCRIPTS -->
{% scripts %} {% scripts %}

View File

@@ -43,7 +43,7 @@
{% assign layout-dark = layout-dark | default: site.layoutDark %} {% assign layout-dark = layout-dark | default: site.layoutDark %}
<body{% if layout.body-class or body-class %} class="{% if layout.body-class %} {{ layout.body-class }}{% endif %}{% if body-class %} {{ body-class }}{% endif %}"{% endif %}> <body{% if layout.body-class or body-class %} class="{% if layout.body-class %} {{ layout.body-class }}{% endif %}{% if body-class %} {{ body-class }}{% endif %}"{% endif %}>
<!-- BEGIN GLOBAL THEME SCRIPT --> <!-- BEGIN GLOBAL THEME SCRIPT -->
<script src="{{ page | relative }}/dist/js/tabler-theme{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}"></script> <script src="{{ page | relative }}/dist/js/tabler-theme{% if environment != 'development' %}.min{% endif %}.js{% if environment != 'development' %}?{{ 'now' | date: '%s' }}{% endif %}"{% if environment != 'development' %} integrity="{{ sri.js-theme }}"{% endif %}></script>
<!-- END GLOBAL THEME SCRIPT --> <!-- END GLOBAL THEME SCRIPT -->
{{ content }} {{ content }}