diff --git a/config.yml b/config.yml index bb71b8d0c..43d966b15 100644 --- a/config.yml +++ b/config.yml @@ -4,6 +4,11 @@ baseURL: "https://getbootstrap.com" security: enableInlineShortcodes: true + exec: + allow: + - '^npx$' + - '^postcss$' + - '^babel$' funcs: getenv: - ^HUGO_ diff --git a/package-lock.json b/package-lock.json index 1fb0cca84..3fb478fb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,9 +18,16 @@ } ], "license": "MIT", + "dependencies": { + "@docsearch/css": "^3.1.1", + "@docsearch/js": "^3.1.1", + "@stackblitz/sdk": "^1.8.0", + "clipboard": "^2.0.11" + }, "devDependencies": { "@babel/cli": "^7.18.9", "@babel/core": "^7.18.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/preset-env": "^7.18.9", "@popperjs/core": "^2.11.5", "@rollup/plugin-babel": "^5.3.1", @@ -70,6 +77,146 @@ "@popperjs/core": "^2.11.5" } }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz", + "integrity": "sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.7.1" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz", + "integrity": "sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.7.1" + }, + "peerDependencies": { + "@algolia/client-search": "^4.9.1", + "algoliasearch": "^4.9.1" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz", + "integrity": "sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.1.tgz", + "integrity": "sha512-BBdibsPn3hLBajc/NRAtHEeoXsw+ziSGR/3bqRNB5puUuwKPQZSE2MaMVWSADnlc3KV3bEj4xsfKOVLJyfJSPQ==", + "dependencies": { + "@algolia/cache-common": "4.14.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.1.tgz", + "integrity": "sha512-XhAzm0Sm3D3DuOWUyDoVSXZ/RjYMvI1rbki+QH4ODAVaHDWVhMhg3IJPv3gIbBQnEQdtPdBhsf2hyPxAu28E5w==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.1.tgz", + "integrity": "sha512-fVUu7N1hYb/zZYfV9Krlij70NwS+8bQm5vmDJyfp0+9FjSjz2V7wj1CUxvaY8ZcgoBPj9ehQ8sRuqSM2m5OPww==", + "dependencies": { + "@algolia/cache-common": "4.14.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.1.tgz", + "integrity": "sha512-Zm4+PN3bsBPhv1dKKwzBaRGzf0G1JcjjSTpE231L7Z7LsEDcFDW4E6L5ctwMz3SliSBeL/j1ghmaunJrZlkRIg==", + "dependencies": { + "@algolia/client-common": "4.14.1", + "@algolia/client-search": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.1.tgz", + "integrity": "sha512-EhZLR0ezBZx7ZGkwzj7OTvnI8j2Alyv1ByC0Mx48qh3KqRhVwMFm/Uf34zAv4Dum2PTFin41Y4smAvAypth9nQ==", + "dependencies": { + "@algolia/client-common": "4.14.1", + "@algolia/client-search": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.1.tgz", + "integrity": "sha512-WDwziD7Rt1yCRDfONmeLOfh1Lt8uOy6Vn7dma171KOH9NN3q8yDQpOhPqdFOCz1j3GC1FfIZxaC0YEOIobZ2lg==", + "dependencies": { + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.1.tgz", + "integrity": "sha512-D4eeW7bTi769PWcEYZO+QiKuUXFOC5zK5Iy83Ey6FHqS7m5TXws5MP1rmETE018lTXeYq2NSHWp/F07fRRg0RA==", + "dependencies": { + "@algolia/client-common": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.1.tgz", + "integrity": "sha512-K6XrdIIQq8a3o+kCedj5slUVzA1aKttae4mLzwnY0bS7tYduv1IQggi9Sz8gOG6/MMyKMB4IwYqr47t/0z4Vxw==", + "dependencies": { + "@algolia/client-common": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.1.tgz", + "integrity": "sha512-58CK87wTjUWI1QNXc3nFDQ7EXBi28NoLufXE9sMjng2fAL1wPdyO+KFD8KTBoXOZnJWflPj5F7p6jLyGAfgvcQ==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.1.tgz", + "integrity": "sha512-not+VwH1Dx2B/BaN+4+4+YnGRBJ9lduNz2qbMCTxZ4yFHb+84j4ewHRPBTtEmibn7caVCPybdTKfHLQhimSBLQ==", + "dependencies": { + "@algolia/logger-common": "4.14.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.1.tgz", + "integrity": "sha512-mpH6QsFBbXjTy9+iU86Rcdt9LxS7GA/tWhGMr0+Ap8+4Za5+ELToz0PC7euVeVOcclgGGi7gbjOAmf6k8b10iA==", + "dependencies": { + "@algolia/requester-common": "4.14.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.1.tgz", + "integrity": "sha512-EbXBKrfYcX5/JJfaw7IZxhWlbUtjd5Chs+Alrfc4tutgRQn4dmImWS07n3iffwJcYdOWY1eRrnfBK5BwopuN5A==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.1.tgz", + "integrity": "sha512-/sbRqL9P8aVuYUG50BgpCbdJyyCS7fia+sQIx9d1DiGPO7hunwLaEyR4H7JDHc/PLKdVEPygJx3rnbJWix4Btg==", + "dependencies": { + "@algolia/requester-common": "4.14.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.1.tgz", + "integrity": "sha512-xbmoIqszFDOCCZqizBQ2TNHcGtjZX7EkJCzABsrokA0WqtfZzClFmtc+tZYgtEiyAfIF70alTegG19poQGdkvg==", + "dependencies": { + "@algolia/cache-common": "4.14.1", + "@algolia/logger-common": "4.14.1", + "@algolia/requester-common": "4.14.1" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -1715,6 +1862,36 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@docsearch/css": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.1.tgz", + "integrity": "sha512-utLgg7E1agqQeqCJn05DWC7XXMk4tMUUnL7MZupcknRu2OzGN13qwey2qA/0NAKkVBGugiWtON0+rlU0QIPojg==" + }, + "node_modules/@docsearch/js": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.1.1.tgz", + "integrity": "sha512-bt7l2aKRoSnLUuX+s4LVQ1a7AF2c9myiZNv5uvQCePG5tpvVGpwrnMwqVXOUJn9q6FwVVhOrQMO/t+QmnnAEUw==", + "dependencies": { + "@docsearch/react": "3.1.1", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.1.tgz", + "integrity": "sha512-cfoql4qvtsVRqBMYxhlGNpvyy/KlCoPqjIsJSZYqYf9AplZncKjLBTcwBu6RXFMVCe30cIFljniI4OjqAU67pQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.7.1", + "@algolia/autocomplete-preset-algolia": "1.7.1", + "@docsearch/css": "3.1.1", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -2023,6 +2200,11 @@ "node": ">=4" } }, + "node_modules/@stackblitz/sdk": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.8.0.tgz", + "integrity": "sha512-hbS4CpQVF3bxJ+ZD8qu8lAjTZVLTPToLbMtgxbxUmp1AIgqm7i0gMFM1POBA8BqY84CT1A3z74gdCd1bsro7qA==" + }, "node_modules/@types/component-emitter": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", @@ -2086,6 +2268,23 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "peer": true + }, + "node_modules/@types/react": { + "version": "18.0.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", + "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -2095,6 +2294,12 @@ "@types/node": "*" } }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "peer": true + }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", @@ -2204,6 +2409,27 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/algoliasearch": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.1.tgz", + "integrity": "sha512-ZWqnbsGUgU03/IyG995pMCc+EmNVDA/4c9ntr8B0dWQwFqazOQ4ErvKZxarbgSNmyPo/eZcVsTb0bNplJMttGQ==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.14.1", + "@algolia/cache-common": "4.14.1", + "@algolia/cache-in-memory": "4.14.1", + "@algolia/client-account": "4.14.1", + "@algolia/client-analytics": "4.14.1", + "@algolia/client-common": "4.14.1", + "@algolia/client-personalization": "4.14.1", + "@algolia/client-search": "4.14.1", + "@algolia/logger-common": "4.14.1", + "@algolia/logger-console": "4.14.1", + "@algolia/requester-browser-xhr": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/requester-node-http": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3247,6 +3473,16 @@ "node": ">=4" } }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3543,6 +3779,12 @@ "node": ">=4" } }, + "node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "peer": true + }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -3830,6 +4072,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -5364,6 +5611,14 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, "node_modules/got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -6352,8 +6607,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -6755,6 +7009,18 @@ "node": ">=8.0" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -8092,6 +8358,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/preact": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.10.0.tgz", + "integrity": "sha512-fszkg1iJJjq68I4lI8ZsmBiaoQiQHbxf1lNq+72EmC/mZOsFF5zn3k1yv9QGoFgIXzgsdSKtYymLJsrJPoamjQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8263,6 +8538,31 @@ "node": ">= 0.8" } }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -8911,6 +9211,15 @@ "node": ">=12.0.0" } }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -8930,6 +9239,11 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -9839,6 +10153,11 @@ "node": ">=0.10.0" } }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -10471,6 +10790,142 @@ } }, "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz", + "integrity": "sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==", + "requires": { + "@algolia/autocomplete-shared": "1.7.1" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz", + "integrity": "sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==", + "requires": { + "@algolia/autocomplete-shared": "1.7.1" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz", + "integrity": "sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.1.tgz", + "integrity": "sha512-BBdibsPn3hLBajc/NRAtHEeoXsw+ziSGR/3bqRNB5puUuwKPQZSE2MaMVWSADnlc3KV3bEj4xsfKOVLJyfJSPQ==", + "requires": { + "@algolia/cache-common": "4.14.1" + } + }, + "@algolia/cache-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.1.tgz", + "integrity": "sha512-XhAzm0Sm3D3DuOWUyDoVSXZ/RjYMvI1rbki+QH4ODAVaHDWVhMhg3IJPv3gIbBQnEQdtPdBhsf2hyPxAu28E5w==" + }, + "@algolia/cache-in-memory": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.1.tgz", + "integrity": "sha512-fVUu7N1hYb/zZYfV9Krlij70NwS+8bQm5vmDJyfp0+9FjSjz2V7wj1CUxvaY8ZcgoBPj9ehQ8sRuqSM2m5OPww==", + "requires": { + "@algolia/cache-common": "4.14.1" + } + }, + "@algolia/client-account": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.1.tgz", + "integrity": "sha512-Zm4+PN3bsBPhv1dKKwzBaRGzf0G1JcjjSTpE231L7Z7LsEDcFDW4E6L5ctwMz3SliSBeL/j1ghmaunJrZlkRIg==", + "requires": { + "@algolia/client-common": "4.14.1", + "@algolia/client-search": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "@algolia/client-analytics": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.1.tgz", + "integrity": "sha512-EhZLR0ezBZx7ZGkwzj7OTvnI8j2Alyv1ByC0Mx48qh3KqRhVwMFm/Uf34zAv4Dum2PTFin41Y4smAvAypth9nQ==", + "requires": { + "@algolia/client-common": "4.14.1", + "@algolia/client-search": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "@algolia/client-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.1.tgz", + "integrity": "sha512-WDwziD7Rt1yCRDfONmeLOfh1Lt8uOy6Vn7dma171KOH9NN3q8yDQpOhPqdFOCz1j3GC1FfIZxaC0YEOIobZ2lg==", + "requires": { + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "@algolia/client-personalization": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.1.tgz", + "integrity": "sha512-D4eeW7bTi769PWcEYZO+QiKuUXFOC5zK5Iy83Ey6FHqS7m5TXws5MP1rmETE018lTXeYq2NSHWp/F07fRRg0RA==", + "requires": { + "@algolia/client-common": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "@algolia/client-search": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.1.tgz", + "integrity": "sha512-K6XrdIIQq8a3o+kCedj5slUVzA1aKttae4mLzwnY0bS7tYduv1IQggi9Sz8gOG6/MMyKMB4IwYqr47t/0z4Vxw==", + "requires": { + "@algolia/client-common": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, + "@algolia/logger-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.1.tgz", + "integrity": "sha512-58CK87wTjUWI1QNXc3nFDQ7EXBi28NoLufXE9sMjng2fAL1wPdyO+KFD8KTBoXOZnJWflPj5F7p6jLyGAfgvcQ==" + }, + "@algolia/logger-console": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.1.tgz", + "integrity": "sha512-not+VwH1Dx2B/BaN+4+4+YnGRBJ9lduNz2qbMCTxZ4yFHb+84j4ewHRPBTtEmibn7caVCPybdTKfHLQhimSBLQ==", + "requires": { + "@algolia/logger-common": "4.14.1" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.1.tgz", + "integrity": "sha512-mpH6QsFBbXjTy9+iU86Rcdt9LxS7GA/tWhGMr0+Ap8+4Za5+ELToz0PC7euVeVOcclgGGi7gbjOAmf6k8b10iA==", + "requires": { + "@algolia/requester-common": "4.14.1" + } + }, + "@algolia/requester-common": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.1.tgz", + "integrity": "sha512-EbXBKrfYcX5/JJfaw7IZxhWlbUtjd5Chs+Alrfc4tutgRQn4dmImWS07n3iffwJcYdOWY1eRrnfBK5BwopuN5A==" + }, + "@algolia/requester-node-http": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.1.tgz", + "integrity": "sha512-/sbRqL9P8aVuYUG50BgpCbdJyyCS7fia+sQIx9d1DiGPO7hunwLaEyR4H7JDHc/PLKdVEPygJx3rnbJWix4Btg==", + "requires": { + "@algolia/requester-common": "4.14.1" + } + }, + "@algolia/transporter": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.1.tgz", + "integrity": "sha512-xbmoIqszFDOCCZqizBQ2TNHcGtjZX7EkJCzABsrokA0WqtfZzClFmtc+tZYgtEiyAfIF70alTegG19poQGdkvg==", + "requires": { + "@algolia/cache-common": "4.14.1", + "@algolia/logger-common": "4.14.1", + "@algolia/requester-common": "4.14.1" + } + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -11606,6 +12061,31 @@ "dev": true, "requires": {} }, + "@docsearch/css": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.1.tgz", + "integrity": "sha512-utLgg7E1agqQeqCJn05DWC7XXMk4tMUUnL7MZupcknRu2OzGN13qwey2qA/0NAKkVBGugiWtON0+rlU0QIPojg==" + }, + "@docsearch/js": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.1.1.tgz", + "integrity": "sha512-bt7l2aKRoSnLUuX+s4LVQ1a7AF2c9myiZNv5uvQCePG5tpvVGpwrnMwqVXOUJn9q6FwVVhOrQMO/t+QmnnAEUw==", + "requires": { + "@docsearch/react": "3.1.1", + "preact": "^10.0.0" + } + }, + "@docsearch/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.1.tgz", + "integrity": "sha512-cfoql4qvtsVRqBMYxhlGNpvyy/KlCoPqjIsJSZYqYf9AplZncKjLBTcwBu6RXFMVCe30cIFljniI4OjqAU67pQ==", + "requires": { + "@algolia/autocomplete-core": "1.7.1", + "@algolia/autocomplete-preset-algolia": "1.7.1", + "@docsearch/css": "3.1.1", + "algoliasearch": "^4.0.0" + } + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -11837,6 +12317,11 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, + "@stackblitz/sdk": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.8.0.tgz", + "integrity": "sha512-hbS4CpQVF3bxJ+ZD8qu8lAjTZVLTPToLbMtgxbxUmp1AIgqm7i0gMFM1POBA8BqY84CT1A3z74gdCd1bsro7qA==" + }, "@types/component-emitter": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", @@ -11900,6 +12385,23 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "peer": true + }, + "@types/react": { + "version": "18.0.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", + "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "peer": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -11909,6 +12411,12 @@ "@types/node": "*" } }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "peer": true + }, "@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", @@ -11996,6 +12504,27 @@ "uri-js": "^4.2.2" } }, + "algoliasearch": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.1.tgz", + "integrity": "sha512-ZWqnbsGUgU03/IyG995pMCc+EmNVDA/4c9ntr8B0dWQwFqazOQ4ErvKZxarbgSNmyPo/eZcVsTb0bNplJMttGQ==", + "requires": { + "@algolia/cache-browser-local-storage": "4.14.1", + "@algolia/cache-common": "4.14.1", + "@algolia/cache-in-memory": "4.14.1", + "@algolia/client-account": "4.14.1", + "@algolia/client-analytics": "4.14.1", + "@algolia/client-common": "4.14.1", + "@algolia/client-personalization": "4.14.1", + "@algolia/client-search": "4.14.1", + "@algolia/logger-common": "4.14.1", + "@algolia/logger-console": "4.14.1", + "@algolia/requester-browser-xhr": "4.14.1", + "@algolia/requester-common": "4.14.1", + "@algolia/requester-node-http": "4.14.1", + "@algolia/transporter": "4.14.1" + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -12747,6 +13276,16 @@ "escape-string-regexp": "^1.0.5" } }, + "clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -12983,6 +13522,12 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "peer": true + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -13207,6 +13752,11 @@ "object-keys": "^1.1.1" } }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -14402,6 +14952,14 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "requires": { + "delegate": "^3.1.2" + } + }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -15120,8 +15678,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.1.0", @@ -15446,6 +16003,15 @@ "streamroller": "^3.1.1" } }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -16384,6 +16950,11 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "preact": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.10.0.tgz", + "integrity": "sha512-fszkg1iJJjq68I4lI8ZsmBiaoQiQHbxf1lNq+72EmC/mZOsFF5zn3k1yv9QGoFgIXzgsdSKtYymLJsrJPoamjQ==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16504,6 +17075,25 @@ "unpipe": "1.0.0" } }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -16986,6 +17576,15 @@ "source-map-js": ">=0.6.2 <2.0.0" } }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, "seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -17003,6 +17602,11 @@ } } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -17723,6 +18327,11 @@ "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", diff --git a/package.json b/package.json index 3d0f59b92..fc7b51a49 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "js-test-jquery": "cross-env JQUERY=true npm run js-test-karma", "lint": "npm-run-all --aggregate-output --continue-on-error --parallel js-lint css-lint lockfile-lint", "docs": "npm-run-all docs-build docs-lint", - "docs-build": "hugo --cleanDestinationDir", + "docs-build": "hugo --cleanDestinationDir --minify", "docs-compile": "npm run docs-build", "docs-vnu": "node build/vnu-jar.js", "docs-lint": "npm run docs-vnu", @@ -106,6 +106,7 @@ "devDependencies": { "@babel/cli": "^7.18.9", "@babel/core": "^7.18.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/preset-env": "^7.18.9", "@popperjs/core": "^2.11.5", "@rollup/plugin-babel": "^5.3.1", @@ -176,5 +177,10 @@ "peerDependencies": { "@popperjs/core": "^2.11.5" } + }, + "dependencies": { + "@docsearch/js": "^3.1.1", + "@stackblitz/sdk": "^1.8.0", + "clipboard": "^2.0.11" } } diff --git a/site/assets/.eslintrc.json b/site/assets/.eslintrc.json new file mode 100644 index 000000000..17e2ea1ed --- /dev/null +++ b/site/assets/.eslintrc.json @@ -0,0 +1,45 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "plugins": [ + "markdown" + ], + "overrides": [ + { + // In v2, configuration for fenced code blocks is separate from the + // containing Markdown file. Each code block has a virtual filename + // appended to the Markdown file's path. + "files": [ + "./**/*.js" + ], + // Configuration for fenced code blocks goes with the override for + // the code block's virtual filename, for example: + "parserOptions": { + "ecmaFeatures": { + "impliedStrict": true + } + }, + "rules": { + "no-array-for-each": "off", + "unicorn/no-array-for-each": "off", + "unicorn/numeric-separators-style": "off", + "no-unused-expressions": "off", + "no-unused-labels": "off", + "no-labels": "off" + } + } + ], + "parserOptions": { + "sourceType": "module" + }, + "extends": "../.eslintrc.json", + "rules": { + "no-new": "off", + "prefer-template": "error", + "strict": "error", + "unicorn/no-array-for-each": "off", + "unicorn/numeric-separators-style": "off" + } +} diff --git a/site/assets/js/_application.js b/site/assets/js/_application.js new file mode 100644 index 000000000..e37f65e59 --- /dev/null +++ b/site/assets/js/_application.js @@ -0,0 +1,28 @@ +// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT +// IT'S ALL JUST JUNK FOR OUR DOCS! +// ++++++++++++++++++++++++++++++++++++++++++ + +/*! + * JavaScript for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under the Creative Commons Attribution 3.0 Unported License. + * For details, see https://creativecommons.org/licenses/by/3.0/. + */ + + +// Scroll the active sidebar link into view +const sidenav = document.querySelector('.bd-sidebar') +if (sidenav) { + const sidenavHeight = sidenav.clientHeight + const sidenavActiveLink = document.querySelector('.bd-links-nav .active') + const sidenavActiveLinkTop = sidenavActiveLink.offsetTop + const sidenavActiveLinkHeight = sidenavActiveLink.clientHeight + const viewportTop = sidenavActiveLinkTop + const viewportBottom = viewportTop - sidenavHeight + sidenavActiveLinkHeight + + if (sidenav.scrollTop > viewportTop || sidenav.scrollTop < viewportBottom) { + sidenav.scrollTop = viewportTop - (sidenavHeight / 2) + (sidenavActiveLinkHeight / 2) + } +} + diff --git a/site/assets/js/_code-examples.js b/site/assets/js/_code-examples.js new file mode 100644 index 000000000..94ca5491b --- /dev/null +++ b/site/assets/js/_code-examples.js @@ -0,0 +1,88 @@ +// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT +// IT'S ALL JUST JUNK FOR OUR DOCS! +// ++++++++++++++++++++++++++++++++++++++++++ + +/*! + * JavaScript for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors + * Copyright 2011-2022 Twitter, Inc. + * Licensed under the Creative Commons Attribution 3.0 Unported License. + * For details, see https://creativecommons.org/licenses/by/3.0/. + */ + +import ClipboardJS from 'clipboard' +// import { Tooltip } from '../../../dist/js/bootstrap.esm.min.js' +/* global bootstrap: false */ + +// Insert copy to clipboard button before .highlight +const btnTitle = 'Copy to clipboard' +const btnEdit = 'Edit on StackBlitz' + +const btnHtml = [ + '
', + '
', + ' ', + '
', + '
' +].join('') + +// wrap programmatically code blocks and add copy btn. +document.querySelectorAll('.highlight') + .forEach(element => { + if (!element.closest('.bd-example-snippet')) { // Ignore examples made be shortcode + element.insertAdjacentHTML('beforebegin', btnHtml) + element.previousElementSibling.append(element) + } + }) + +/** + * + * @param {string} selector + * @param {string} title + */ +function snippetButtonTooltip(selector, title) { + document.querySelectorAll(selector).forEach(btn => { + bootstrap.Tooltip.getOrCreateInstance(btn, { title }) + }) +} + +snippetButtonTooltip('.btn-clipboard', btnTitle) +snippetButtonTooltip('.btn-edit', btnEdit) + +const clipboard = new ClipboardJS('.btn-clipboard', { + target: trigger => trigger.closest('.bd-code-snippet').querySelector('.highlight') +}) + +clipboard.on('success', event => { + const iconFirstChild = event.trigger.querySelector('.bi').firstChild + const tooltipBtn = bootstrap.Tooltip.getInstance(event.trigger) + const namespace = 'http://www.w3.org/1999/xlink' + const originalXhref = iconFirstChild.getAttributeNS(namespace, 'href') + const originalTitle = event.trigger.title + + tooltipBtn.setContent({ '.tooltip-inner': 'Copied!' }) + event.trigger.addEventListener('hidden.bs.tooltip', () => { + tooltipBtn.setContent({ '.tooltip-inner': btnTitle }) + }, { once: true }) + event.clearSelection() + iconFirstChild.setAttributeNS(namespace, 'href', originalXhref.replace('clipboard', 'check2')) + + setTimeout(() => { + iconFirstChild.setAttributeNS(namespace, 'href', originalXhref) + event.trigger.title = originalTitle + }, 2000) +}) + +clipboard.on('error', event => { + const modifierKey = /mac/i.test(navigator.userAgent) ? '\u2318' : 'Ctrl-' + const fallbackMsg = `Press ${modifierKey}C to copy` + const tooltipBtn = bootstrap.Tooltip.getInstance(event.trigger) + + tooltipBtn.setContent({ '.tooltip-inner': fallbackMsg }) + event.trigger.addEventListener('hidden.bs.tooltip', () => { + tooltipBtn.setContent({ '.tooltip-inner': btnTitle }) + }, { once: true }) +}) + diff --git a/site/assets/js/search.js b/site/assets/js/_search.js similarity index 90% rename from site/assets/js/search.js rename to site/assets/js/_search.js index 9bad2749f..26560762a 100644 --- a/site/assets/js/search.js +++ b/site/assets/js/_search.js @@ -2,18 +2,18 @@ // IT'S ALL JUST JUNK FOR OUR DOCS! // ++++++++++++++++++++++++++++++++++++++++++ +import docsearch from '@docsearch/js' +// const docsearch = await import('@docsearch/js'); (() => { - 'use strict' - const searchElement = document.getElementById('docsearch') - if (!window.docsearch || !searchElement) { + if (!searchElement) { return } const siteDocsVersion = searchElement.getAttribute('data-bd-docs-version') - window.docsearch({ + docsearch({ apiKey: '3151f502c7b9e9dafd5e6372b691a24e', indexName: 'bootstrap', appId: 'AK7KMZKZHQ', diff --git a/site/assets/js/_stackblitz.js b/site/assets/js/_stackblitz.js new file mode 100644 index 000000000..028a59d38 --- /dev/null +++ b/site/assets/js/_stackblitz.js @@ -0,0 +1,17 @@ +import * as StackBlitzSDK from '@stackblitz/sdk/bundles/sdk' +/* global openBootstrapSnippet: false */ + +// Open in StackBlitz logic +document.querySelectorAll('.btn-edit').forEach(btn => { + btn.addEventListener('click', event => { + const htmlSnippet = event.target.closest('.bd-code-snippet').querySelector('.bd-example').innerHTML + + // Get extra classes for this example + const classes = Array.from(event.target.closest('.bd-code-snippet').querySelector('.bd-example').classList).join(' ') + + const jsSnippet = event.target.closest('.bd-code-snippet').querySelector('.btn-edit').getAttribute('data-sb-js-snippet') + + StackBlitzSDK.openProject(openBootstrapSnippet(htmlSnippet, jsSnippet, classes), { openFile: 'index.html' }) + }) +}) + diff --git a/site/assets/js/application.js b/site/assets/js/application.js deleted file mode 100644 index dec23635d..000000000 --- a/site/assets/js/application.js +++ /dev/null @@ -1,30 +0,0 @@ -// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT -// IT'S ALL JUST JUNK FOR OUR DOCS! -// ++++++++++++++++++++++++++++++++++++++++++ - -/*! - * JavaScript for Bootstrap's docs (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. - * Licensed under the Creative Commons Attribution 3.0 Unported License. - * For details, see https://creativecommons.org/licenses/by/3.0/. - */ - -(() => { - 'use strict' - - // Scroll the active sidebar link into view - const sidenav = document.querySelector('.bd-sidebar') - if (sidenav) { - const sidenavHeight = sidenav.clientHeight - const sidenavActiveLink = document.querySelector('.bd-links-nav .active') - const sidenavActiveLinkTop = sidenavActiveLink.offsetTop - const sidenavActiveLinkHeight = sidenavActiveLink.clientHeight - const viewportTop = sidenavActiveLinkTop - const viewportBottom = viewportTop - sidenavHeight + sidenavActiveLinkHeight - - if (sidenav.scrollTop > viewportTop || sidenav.scrollTop < viewportBottom) { - sidenav.scrollTop = viewportTop - (sidenavHeight / 2) + (sidenavActiveLinkHeight / 2) - } - } -})() diff --git a/site/assets/js/code-examples.js b/site/assets/js/code-examples.js deleted file mode 100644 index 25486c2fe..000000000 --- a/site/assets/js/code-examples.js +++ /dev/null @@ -1,88 +0,0 @@ -// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT -// IT'S ALL JUST JUNK FOR OUR DOCS! -// ++++++++++++++++++++++++++++++++++++++++++ - -/*! - * JavaScript for Bootstrap's docs (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. - * Licensed under the Creative Commons Attribution 3.0 Unported License. - * For details, see https://creativecommons.org/licenses/by/3.0/. - */ - -/* global ClipboardJS: false, bootstrap: false */ - -(() => { - 'use strict' - // Insert copy to clipboard button before .highlight - const btnTitle = 'Copy to clipboard' - const btnEdit = 'Edit on StackBlitz' - - const btnHtml = [ - '
', - '
', - ' ', - '
', - '
' - ].join('') - - // wrap programmatically code blocks and add copy btn. - document.querySelectorAll('.highlight') - .forEach(element => { - if (!element.closest('.bd-example-snippet')) { // Ignore examples made be shortcode - element.insertAdjacentHTML('beforebegin', btnHtml) - element.previousElementSibling.append(element) - } - }) - - /** - * - * @param {string} selector - * @param {string} title - */ - function snippetButtonTooltip(selector, title) { - document.querySelectorAll(selector).forEach(btn => { - bootstrap.Tooltip.getOrCreateInstance(btn, { title }) - }) - } - - snippetButtonTooltip('.btn-clipboard', btnTitle) - snippetButtonTooltip('.btn-edit', btnEdit) - - const clipboard = new ClipboardJS('.btn-clipboard', { - target: trigger => trigger.closest('.bd-code-snippet').querySelector('.highlight') - }) - - clipboard.on('success', event => { - const iconFirstChild = event.trigger.querySelector('.bi').firstChild - const tooltipBtn = bootstrap.Tooltip.getInstance(event.trigger) - const namespace = 'http://www.w3.org/1999/xlink' - const originalXhref = iconFirstChild.getAttributeNS(namespace, 'href') - const originalTitle = event.trigger.title - - tooltipBtn.setContent({ '.tooltip-inner': 'Copied!' }) - event.trigger.addEventListener('hidden.bs.tooltip', () => { - tooltipBtn.setContent({ '.tooltip-inner': btnTitle }) - }, { once: true }) - event.clearSelection() - iconFirstChild.setAttributeNS(namespace, 'href', originalXhref.replace('clipboard', 'check2')) - - setTimeout(() => { - iconFirstChild.setAttributeNS(namespace, 'href', originalXhref) - event.trigger.title = originalTitle - }, 2000) - }) - - clipboard.on('error', event => { - const modifierKey = /mac/i.test(navigator.userAgent) ? '\u2318' : 'Ctrl-' - const fallbackMsg = `Press ${modifierKey}C to copy` - const tooltipBtn = bootstrap.Tooltip.getInstance(event.trigger) - - tooltipBtn.setContent({ '.tooltip-inner': fallbackMsg }) - event.trigger.addEventListener('hidden.bs.tooltip', () => { - tooltipBtn.setContent({ '.tooltip-inner': btnTitle }) - }, { once: true }) - }) -})() diff --git a/site/assets/js/main.js b/site/assets/js/main.js new file mode 100644 index 000000000..508b8365f --- /dev/null +++ b/site/assets/js/main.js @@ -0,0 +1,8 @@ + +// import('./../../../dist/js/bootstrap.esm.min') +import('./_application.js') +import('./_search.js') +import('./snippets.js') +import('./_code-examples.js') +import('./_stackblitz.js') + diff --git a/site/assets/js/snippets.js b/site/assets/js/snippets.js index 53f8a786e..8252d9055 100644 --- a/site/assets/js/snippets.js +++ b/site/assets/js/snippets.js @@ -15,8 +15,6 @@ /* global bootstrap: false */ (() => { - 'use strict' - // -------- // Tooltips // -------- diff --git a/site/assets/js/vendor/clipboard.min.js b/site/assets/js/vendor/clipboard.min.js deleted file mode 100644 index 1103f811e..000000000 --- a/site/assets/js/vendor/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 {{- end }} -{{ if eq .Page.Layout "docs" -}} - - -{{- end }} +{{- $docsJs := resources.Get "js/main.js" -}} -{{- $vendor := resources.Match "js/vendor/*.js" -}} -{{- $js := resources.Match "js/*.js" -}} -{{- $targetDocsJSPath := path.Join "/docs" .Site.Params.docs_version "assets/js/docs.js" -}} -{{- $docsJs := append $js $vendor | resources.Concat $targetDocsJSPath -}} +{{ if eq hugo.Environment "development" -}} +{{ $docsJs = $docsJs | js.Build (dict "format" "esm" "sourceMap" "inline") -}} +{{ else -}} +{{ $docsJs = $docsJs | js.Build (dict "format" "esm" "minify" true) | fingerprint -}} +{{ end -}} -{{- if eq hugo.Environment "production" -}} - {{- $docsJs = $docsJs | resources.Minify -}} -{{- end }} - + + {{ if eq .Page.Layout "docs" -}} {{- end }} diff --git a/site/layouts/partials/stylesheet.html b/site/layouts/partials/stylesheet.html index 1aa329699..2d498ed51 100644 --- a/site/layouts/partials/stylesheet.html +++ b/site/layouts/partials/stylesheet.html @@ -21,7 +21,7 @@ {{- $sassOptions = merge $sassOptions (dict "outputStyle" "compressed") -}} {{- end -}} -{{- $style := resources.Get "scss/docs.scss" | toCSS $sassOptions | postCSS $postcssOptions }} +{{- $style := resources.Get "scss/docs.scss" | resources.ToCSS $sassOptions | postCSS $postcssOptions }} {{- end }}