diff --git a/.github/workflows/kotlin-pass-checks.yml b/.github/workflows/kotlin-pass-checks.yml index f923fbe47..ebcb4339a 100644 --- a/.github/workflows/kotlin-pass-checks.yml +++ b/.github/workflows/kotlin-pass-checks.yml @@ -13,10 +13,6 @@ on: workflow_dispatch: jobs: - kotlin_draft-release: - runs-on: ubuntu-latest - steps: - - run: 'echo "no build required"' kotlin_build: runs-on: ubuntu-latest steps: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b959101dd..7d9e5d29c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,10 +14,13 @@ repos: - id: mixed-line-ending args: ["--fix=lf"] description: Forces to replace line ending by the UNIX 'lf' character. + exclude: ^website/public/images/ - id: check-yaml - id: check-merge-conflict - id: end-of-file-fixer + exclude: ^website/public/images/ - id: trailing-whitespace + exclude: ^website/public/images/ - id: check-merge-conflict - id: no-commit-to-branch args: diff --git a/.prettierrc.json b/.prettierrc.json index f0eb61e0f..c76d07d40 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,5 +2,6 @@ "trailingComma": "es5", "tabWidth": 2, "semi": true, - "singleQuote": false + "singleQuote": false, + "proseWrap": "always" } diff --git a/README.md b/README.md index 19fde7831..bcf17fb61 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ See the [`legacy` branch](https://github.com/firezone/firezone/tree/legacy) for the branch tracking the latest 0.7 release. - +

firezone logo diff --git a/website/package.json b/website/package.json index a9be5c9a7..9a425f664 100644 --- a/website/package.json +++ b/website/package.json @@ -10,31 +10,31 @@ "lint": "next lint" }, "dependencies": { - "@docsearch/react": "3", - "@heroicons/react": "^2.0.18", + "@docsearch/react": "^3.5.1", "@mdx-js/loader": "^2.3.0", "@mdx-js/react": "^2.3.0", - "@next/mdx": "^13.4.4", + "@next/mdx": "^13.4.10", "@types/mdx": "^2.0.5", "@types/node": "20.2.3", "@types/react": "18.2.6", "@types/react-dom": "18.2.4", "@types/react-syntax-highlighter": "^15.5.7", - "asciinema-player": "^3.4.0", + "asciinema-player": "^3.5.0", "autoprefixer": "10.4.14", "fast-xml-parser": "^4.2.5", - "flowbite": "^1.6.5", - "flowbite-react": "^0.4.4", + "flowbite": "^1.7.0", + "flowbite-react": "^0.4.11", "highlight.js": "^11.8.0", "md5": "^2.3.0", "next": "13.4.4", "next-hubspot": "^1.1.6", - "next-sitemap": "^4.1.3", + "next-sitemap": "^4.1.8", "postcss": "8.4.23", - "posthog-js": "^1.67.1", + "posthog-js": "^1.71.0", "react": "18.2.0", "react-dom": "18.2.0", "react-fast-marquee": "^1.6.0", + "react-icons": "^4.10.1", "react-markdown": "^8.0.7", "react-syntax-highlighter": "^15.5.0", "rehype-autolink-headings": "^6.1.1", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index f1700ea06..ff7116d7c 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -6,20 +6,17 @@ settings: dependencies: '@docsearch/react': - specifier: '3' - version: 3.5.1(@algolia/client-search@4.17.2)(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.6.0) - '@heroicons/react': - specifier: ^2.0.18 - version: 2.0.18(react@18.2.0) + specifier: ^3.5.1 + version: 3.5.1(@algolia/client-search@4.18.0)(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.7.0) '@mdx-js/loader': specifier: ^2.3.0 - version: 2.3.0(webpack@5.85.0) + version: 2.3.0(webpack@5.88.1) '@mdx-js/react': specifier: ^2.3.0 version: 2.3.0(react@18.2.0) '@next/mdx': - specifier: ^13.4.4 - version: 13.4.4(@mdx-js/loader@2.3.0)(@mdx-js/react@2.3.0) + specifier: ^13.4.10 + version: 13.4.10(@mdx-js/loader@2.3.0)(@mdx-js/react@2.3.0) '@types/mdx': specifier: ^2.0.5 version: 2.0.5 @@ -36,8 +33,8 @@ dependencies: specifier: ^15.5.7 version: 15.5.7 asciinema-player: - specifier: ^3.4.0 - version: 3.4.0 + specifier: ^3.5.0 + version: 3.5.0 autoprefixer: specifier: 10.4.14 version: 10.4.14(postcss@8.4.23) @@ -45,11 +42,11 @@ dependencies: specifier: ^4.2.5 version: 4.2.5 flowbite: - specifier: ^1.6.5 - version: 1.6.5 + specifier: ^1.7.0 + version: 1.7.0 flowbite-react: - specifier: ^0.4.4 - version: 0.4.4(flowbite@1.6.5)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.2) + specifier: ^0.4.11 + version: 0.4.11(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.2) highlight.js: specifier: ^11.8.0 version: 11.8.0 @@ -63,14 +60,14 @@ dependencies: specifier: ^1.1.6 version: 1.1.6(next@13.4.4)(react@18.2.0) next-sitemap: - specifier: ^4.1.3 - version: 4.1.3(@next/env@13.4.4)(next@13.4.4) + specifier: ^4.1.8 + version: 4.1.8(next@13.4.4) postcss: specifier: 8.4.23 version: 8.4.23 posthog-js: - specifier: ^1.67.1 - version: 1.67.1 + specifier: ^1.71.0 + version: 1.71.0 react: specifier: 18.2.0 version: 18.2.0 @@ -80,6 +77,9 @@ dependencies: react-fast-marquee: specifier: ^1.6.0 version: 1.6.0(react-dom@18.2.0)(react@18.2.0) + react-icons: + specifier: ^4.10.1 + version: 4.10.1(react@18.2.0) react-markdown: specifier: ^8.0.7 version: 8.0.7(@types/react@18.2.6)(react@18.2.0) @@ -124,146 +124,146 @@ devDependencies: packages: - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2)(search-insights@2.6.0): + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.7.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2)(search-insights@2.6.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.7.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights dev: false - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2)(search-insights@2.6.0): + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.7.0): resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2) - search-insights: 2.6.0 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) + search-insights: 2.7.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch dev: false - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2): + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0): resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2) - '@algolia/client-search': 4.17.2 - algoliasearch: 4.17.2 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) + '@algolia/client-search': 4.18.0 + algoliasearch: 4.18.0 dev: false - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2): + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0): resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/client-search': 4.17.2 - algoliasearch: 4.17.2 + '@algolia/client-search': 4.18.0 + algoliasearch: 4.18.0 dev: false - /@algolia/cache-browser-local-storage@4.17.2: - resolution: {integrity: sha512-ZkVN7K/JE+qMQbpR6h3gQOGR6yCJpmucSBCmH5YDxnrYbp2CbrVCu0Nr+FGVoWzMJNznj1waShkfQ9awERulLw==} + /@algolia/cache-browser-local-storage@4.18.0: + resolution: {integrity: sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw==} dependencies: - '@algolia/cache-common': 4.17.2 + '@algolia/cache-common': 4.18.0 dev: false - /@algolia/cache-common@4.17.2: - resolution: {integrity: sha512-fojbhYIS8ovfYs6hwZpy1O4mBfVRxNgAaZRqsdVQd54hU4MxYDYFCxagYX28lOBz7btcDHld6BMoWXvjzkx6iQ==} + /@algolia/cache-common@4.18.0: + resolution: {integrity: sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg==} dev: false - /@algolia/cache-in-memory@4.17.2: - resolution: {integrity: sha512-UYQcMzPurNi+cPYkuPemTZkjKAjdgAS1hagC5irujKbrYnN4yscK4TkOI5tX+O8/KegtJt3kOK07OIrJ2QDAAw==} + /@algolia/cache-in-memory@4.18.0: + resolution: {integrity: sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw==} dependencies: - '@algolia/cache-common': 4.17.2 + '@algolia/cache-common': 4.18.0 dev: false - /@algolia/client-account@4.17.2: - resolution: {integrity: sha512-doSk89pBPDpDyKJSHFADIGa2XSGrBCj3QwPvqtRJXDADpN+OjW+eTR8r4hEs/7X4GGfjfAOAES8JgDx+fZntYw==} + /@algolia/client-account@4.18.0: + resolution: {integrity: sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew==} dependencies: - '@algolia/client-common': 4.17.2 - '@algolia/client-search': 4.17.2 - '@algolia/transporter': 4.17.2 + '@algolia/client-common': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/transporter': 4.18.0 dev: false - /@algolia/client-analytics@4.17.2: - resolution: {integrity: sha512-V+DcXbOtD/hKwAR3qGQrtlrJ3q2f9OKfx843q744o4m3xHv5ueCAvGXB1znPsdaUrVDNAImcgEgqwI9x7EJbDw==} + /@algolia/client-analytics@4.18.0: + resolution: {integrity: sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ==} dependencies: - '@algolia/client-common': 4.17.2 - '@algolia/client-search': 4.17.2 - '@algolia/requester-common': 4.17.2 - '@algolia/transporter': 4.17.2 + '@algolia/client-common': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 dev: false - /@algolia/client-common@4.17.2: - resolution: {integrity: sha512-gKBUnjxi0ukJYIJxVREYGt1Dmj1B3RBYbfGWi0dIPp1BC1VvQm+BOuNwsIwmq/x3MPO+sGuK978eKiP3tZDvag==} + /@algolia/client-common@4.18.0: + resolution: {integrity: sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg==} dependencies: - '@algolia/requester-common': 4.17.2 - '@algolia/transporter': 4.17.2 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 dev: false - /@algolia/client-personalization@4.17.2: - resolution: {integrity: sha512-wc4UgOWxSYWz5wpuelNmlt895jA9twjZWM2ms17Ws8qCvBHF7OVGdMGgbysPB8790YnfvvDnSsWOv3CEj26Eow==} + /@algolia/client-personalization@4.18.0: + resolution: {integrity: sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A==} dependencies: - '@algolia/client-common': 4.17.2 - '@algolia/requester-common': 4.17.2 - '@algolia/transporter': 4.17.2 + '@algolia/client-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 dev: false - /@algolia/client-search@4.17.2: - resolution: {integrity: sha512-FUjIs+gRe0upJC++uVs4sdxMw15JxfkT86Gr/kqVwi9kcqaZhXntSbW/Fw959bIYXczjmeVQsilYvBWW4YvSZA==} + /@algolia/client-search@4.18.0: + resolution: {integrity: sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g==} dependencies: - '@algolia/client-common': 4.17.2 - '@algolia/requester-common': 4.17.2 - '@algolia/transporter': 4.17.2 + '@algolia/client-common': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/transporter': 4.18.0 dev: false - /@algolia/logger-common@4.17.2: - resolution: {integrity: sha512-EfXuweUE+1HiSMsQidaDWA5Lv4NnStYIlh7PO5pLkI+sdhbMX0e5AO5nUAMIFM1VkEANes70RA8fzhP6OqCqQQ==} + /@algolia/logger-common@4.18.0: + resolution: {integrity: sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg==} dev: false - /@algolia/logger-console@4.17.2: - resolution: {integrity: sha512-JuG8HGVlJ+l/UEDK4h2Y8q/IEmRjQz1J0aS9tf6GPNbGYiSvMr1DDdZ+hqV3bb1XE6wU8Ypex56HisWMSpnG0A==} + /@algolia/logger-console@4.18.0: + resolution: {integrity: sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g==} dependencies: - '@algolia/logger-common': 4.17.2 + '@algolia/logger-common': 4.18.0 dev: false - /@algolia/requester-browser-xhr@4.17.2: - resolution: {integrity: sha512-FKI2lYWwksALfRt2OETFmGb5+P7WVc4py2Ai3H7k8FSfTLwVvs9WVVmtlx6oANQ8RFEK4B85h8DQJTJ29TDfmA==} + /@algolia/requester-browser-xhr@4.18.0: + resolution: {integrity: sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ==} dependencies: - '@algolia/requester-common': 4.17.2 + '@algolia/requester-common': 4.18.0 dev: false - /@algolia/requester-common@4.17.2: - resolution: {integrity: sha512-Rfim23ztAhYpE9qm+KCfCRo+YLJCjiiTG+IpDdzUjMpYPhUtirQT0A35YEd/gKn86YNyydxS9w8iRSjwKh+L0A==} + /@algolia/requester-common@4.18.0: + resolution: {integrity: sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA==} dev: false - /@algolia/requester-node-http@4.17.2: - resolution: {integrity: sha512-E0b0kyCDMvUIhQmDNd/mH4fsKJdEEX6PkMKrYJjzm6moo+rP22tqpq4Rfe7DZD8OB6/LsDD3zs3Kvd+L+M5wwQ==} + /@algolia/requester-node-http@4.18.0: + resolution: {integrity: sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ==} dependencies: - '@algolia/requester-common': 4.17.2 + '@algolia/requester-common': 4.18.0 dev: false - /@algolia/transporter@4.17.2: - resolution: {integrity: sha512-m8pXlz5OnNzjD1rcw+duCN4jG4yEzkJBsvKYMoN22Oq6rQwy1AY5muZ+IQUs4dL+A364CYkRMLRWhvXpCZ1x+g==} + /@algolia/transporter@4.18.0: + resolution: {integrity: sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw==} dependencies: - '@algolia/cache-common': 4.17.2 - '@algolia/logger-common': 4.17.2 - '@algolia/requester-common': 4.17.2 + '@algolia/cache-common': 4.18.0 + '@algolia/logger-common': 4.18.0 + '@algolia/requester-common': 4.18.0 dev: false /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - /@babel/runtime@7.22.5: - resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 @@ -277,7 +277,7 @@ packages: resolution: {integrity: sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==} dev: false - /@docsearch/react@3.5.1(@algolia/client-search@4.17.2)(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.6.0): + /@docsearch/react@3.5.1(@algolia/client-search@4.18.0)(@types/react@18.2.6)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.7.0): resolution: {integrity: sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -291,11 +291,11 @@ packages: react-dom: optional: true dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2)(search-insights@2.6.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.17.2)(algoliasearch@4.17.2) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0)(search-insights@2.7.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.18.0)(algoliasearch@4.18.0) '@docsearch/css': 3.5.1 '@types/react': 18.2.6 - algoliasearch: 4.17.2 + algoliasearch: 4.18.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -303,46 +303,38 @@ packages: - search-insights dev: false - /@floating-ui/core@1.2.6: - resolution: {integrity: sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==} + /@floating-ui/core@1.3.1: + resolution: {integrity: sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==} dev: false - /@floating-ui/dom@1.2.8: - resolution: {integrity: sha512-XLwhYV90MxiHDq6S0rzFZj00fnDM+A1R9jhSioZoMsa7G0Q0i+Q4x40ajR8FHSdYDE1bgjG45mIWe6jtv9UPmg==} + /@floating-ui/dom@1.4.5: + resolution: {integrity: sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==} dependencies: - '@floating-ui/core': 1.2.6 + '@floating-ui/core': 1.3.1 dev: false - /@floating-ui/react-dom@1.3.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==} + /@floating-ui/react-dom@2.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rZtAmSht4Lry6gdhAJDrCp/6rKN7++JnL1/Anbr/DdeyYXQPxvg/ivrbYvJulbRf4vL8b212suwMM2lxbv+RQA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.2.8 + '@floating-ui/dom': 1.4.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@floating-ui/react@0.20.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-JHTHJ+/YsIxNFH8uJDFa5OyI6dSUZcle6wAFe0zRTjgWD+rkACfBBoJtx2itTtn7C4a7xAz4jgxdEQcMel194g==} + /@floating-ui/react@0.24.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-AuYeDoaR8jtUlUXtZ1IJ/6jtBkGnSpJXbGNzokBL87VDJ8opMq1Bgrc0szhK482ReQY6KZsMoZCVSb4xwalkBA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/react-dom': 1.3.0(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.0.1(react-dom@18.2.0)(react@18.2.0) aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tabbable: 6.1.2 - dev: false - - /@heroicons/react@2.0.18(react@18.2.0): - resolution: {integrity: sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==} - peerDependencies: - react: '>= 16' - dependencies: - react: 18.2.0 + tabbable: 6.2.0 dev: false /@jridgewell/gen-mapping@0.3.3: @@ -361,8 +353,8 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.3: - resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 @@ -380,14 +372,14 @@ packages: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 - /@mdx-js/loader@2.3.0(webpack@5.85.0): + /@mdx-js/loader@2.3.0(webpack@5.88.1): resolution: {integrity: sha512-IqsscXh7Q3Rzb+f5DXYk0HU71PK+WuFsEhf+mSV3fOhpLcEpgsHvTQ2h0T6TlZ5gHOaBeFjkXwB52by7ypMyNg==} peerDependencies: webpack: '>=4' dependencies: '@mdx-js/mdx': 2.3.0 source-map: 0.7.4 - webpack: 5.85.0 + webpack: 5.88.1 transitivePeerDependencies: - supports-color dev: false @@ -426,12 +418,16 @@ packages: react: 18.2.0 dev: false + /@next/env@13.4.10: + resolution: {integrity: sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==} + dev: false + /@next/env@13.4.4: resolution: {integrity: sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==} dev: false - /@next/mdx@13.4.4(@mdx-js/loader@2.3.0)(@mdx-js/react@2.3.0): - resolution: {integrity: sha512-MtaZs0i1sE4lYEhOi0Ttha4EWjA3FwOIQSnhmn8jgAho4yjtVfQYjJjVcQ9wJkMxrzmjHeOz1LsDhDp0bO3Z9Q==} + /@next/mdx@13.4.10(@mdx-js/loader@2.3.0)(@mdx-js/react@2.3.0): + resolution: {integrity: sha512-0ZbUIr3yuFFfkaYth2kNFAT0fbyylJTMqZy5zTdb7YGqvYjKFD8n75L3UYAX0g5mibGp3iETJ0I7730sW13PKQ==} peerDependencies: '@mdx-js/loader': '>=0.15.0' '@mdx-js/react': '>=0.15.0' @@ -441,7 +437,7 @@ packages: '@mdx-js/react': optional: true dependencies: - '@mdx-js/loader': 2.3.0(webpack@5.85.0) + '@mdx-js/loader': 2.3.0(webpack@5.88.1) '@mdx-js/react': 2.3.0(react@18.2.0) source-map: 0.7.4 dev: false @@ -545,14 +541,14 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@popperjs/core@2.11.7: - resolution: {integrity: sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==} + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: - tslib: 2.5.2 + tslib: 2.6.0 dev: false /@types/acorn@4.0.6: @@ -570,12 +566,12 @@ packages: /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.40.0 + '@types/eslint': 8.44.0 '@types/estree': 1.0.1 dev: false - /@types/eslint@8.40.0: - resolution: {integrity: sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==} + /@types/eslint@8.44.0: + resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==} dependencies: '@types/estree': 1.0.1 '@types/json-schema': 7.0.12 @@ -591,19 +587,19 @@ packages: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} dev: false - /@types/hast@2.3.4: - resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + /@types/hast@2.3.5: + resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: false - /@types/mdast@3.0.11: - resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: false /@types/mdx@2.0.5: @@ -650,8 +646,8 @@ packages: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} dev: false - /@types/unist@2.0.6: - resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + /@types/unist@2.0.7: + resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} @@ -767,24 +763,24 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: false - /acorn-import-assertions@1.9.0(acorn@8.8.2): + /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.2 + acorn: 8.10.0 dev: false - /acorn-jsx@5.3.2(acorn@8.8.2): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.10.0 dev: false - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true dev: false @@ -806,23 +802,23 @@ packages: uri-js: 4.4.1 dev: false - /algoliasearch@4.17.2: - resolution: {integrity: sha512-VFu43JJNYIW74awp7oeQcQsPcxOhd8psqBDTfyNO2Zt6L1NqnNMTVnaIdQ+8dtKqUDBqQZp0szPxECvX8CK2Fg==} + /algoliasearch@4.18.0: + resolution: {integrity: sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA==} dependencies: - '@algolia/cache-browser-local-storage': 4.17.2 - '@algolia/cache-common': 4.17.2 - '@algolia/cache-in-memory': 4.17.2 - '@algolia/client-account': 4.17.2 - '@algolia/client-analytics': 4.17.2 - '@algolia/client-common': 4.17.2 - '@algolia/client-personalization': 4.17.2 - '@algolia/client-search': 4.17.2 - '@algolia/logger-common': 4.17.2 - '@algolia/logger-console': 4.17.2 - '@algolia/requester-browser-xhr': 4.17.2 - '@algolia/requester-common': 4.17.2 - '@algolia/requester-node-http': 4.17.2 - '@algolia/transporter': 4.17.2 + '@algolia/cache-browser-local-storage': 4.18.0 + '@algolia/cache-common': 4.18.0 + '@algolia/cache-in-memory': 4.18.0 + '@algolia/client-account': 4.18.0 + '@algolia/client-analytics': 4.18.0 + '@algolia/client-common': 4.18.0 + '@algolia/client-personalization': 4.18.0 + '@algolia/client-search': 4.18.0 + '@algolia/logger-common': 4.18.0 + '@algolia/logger-console': 4.18.0 + '@algolia/requester-browser-xhr': 4.18.0 + '@algolia/requester-common': 4.18.0 + '@algolia/requester-node-http': 4.18.0 + '@algolia/transporter': 4.18.0 dev: false /any-promise@1.3.0: @@ -842,14 +838,14 @@ packages: resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} engines: {node: '>=10'} dependencies: - tslib: 2.5.2 + tslib: 2.6.0 dev: false - /asciinema-player@3.4.0: - resolution: {integrity: sha512-dX6jt5S3K6daItsVWzyY9mRDK+ivC2QgqCxFkdSiNslo0vY/ZqA4upcTzqIKZqBtxppovOZk44ltg9VnHG9QVg==} + /asciinema-player@3.5.0: + resolution: {integrity: sha512-o4B2AscBuCZo4+JB9TBGrfZ7GQL99wsbm08WwmuNJTPd1lyLQJq8wgacnBsdvb2sC0K875ScYr8T5XmfeH/6dg==} dependencies: - '@babel/runtime': 7.22.5 - solid-js: 1.7.6 + '@babel/runtime': 7.22.6 + solid-js: 1.7.8 dev: false /astring@1.8.6: @@ -864,8 +860,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001489 + browserslist: 4.21.9 + caniuse-lite: 1.0.30001516 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -896,15 +892,15 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001489 - electron-to-chromium: 1.4.408 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.5) + caniuse-lite: 1.0.30001516 + electron-to-chromium: 1.4.461 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.9) dev: false /buffer-from@1.1.2: @@ -922,8 +918,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - /caniuse-lite@1.0.30001489: - resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} + /caniuse-lite@1.0.30001516: + resolution: {integrity: sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==} dev: false /ccount@2.0.1: @@ -1062,20 +1058,20 @@ packages: resolution: {integrity: sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A==} dev: false - /electron-to-chromium@1.4.408: - resolution: {integrity: sha512-vjeaj0u/UYnzA/CIdGXzzcxRLCqRwREYc9YfaWInjIEr7/XPttZ6ShpyqapchEy0S2r6LpLjDBTnNj7ZxnxJKg==} + /electron-to-chromium@1.4.461: + resolution: {integrity: sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==} dev: false - /enhanced-resolve@5.14.1: - resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 dev: false - /es-module-lexer@1.2.1: - resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} dev: false /escalade@3.1.1: @@ -1143,7 +1139,7 @@ packages: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: false /estree-walker@3.0.3: @@ -1165,8 +1161,8 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: false - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1213,21 +1209,20 @@ packages: dependencies: to-regex-range: 5.0.1 - /flowbite-react@0.4.4(flowbite@1.6.5)(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.2): - resolution: {integrity: sha512-cDGtzRp8Ca6rOooNUlDzI7NwAQqzRFYENQ5tI5kRlgobUITxzCgPSv+S1laBlSyrHzlvaneBy4kkX3HrMtEn0A==} + /flowbite-react@0.4.11(react-dom@18.2.0)(react@18.2.0)(tailwindcss@3.3.2): + resolution: {integrity: sha512-QB0PWB/kiogL0YQlT+X1x4Ue0D3cpd+WaiCbGsMqo2LCYySRsctHxEciRQji3JELGuc6O1OaBtK9ZUSErQkJEg==} peerDependencies: - flowbite: ^1 react: ^18 react-dom: ^18 tailwindcss: ^3 dependencies: - '@floating-ui/react': 0.20.1(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 - flowbite: 1.6.5 + '@floating-ui/react': 0.24.8(react-dom@18.2.0)(react@18.2.0) + flowbite: 1.7.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-icons: 4.8.0(react@18.2.0) + react-icons: 4.10.1(react@18.2.0) react-indiana-drag-scroll: 2.2.0(react-dom@18.2.0)(react@18.2.0) + tailwind-merge: 1.13.2 tailwindcss: 3.3.2 dev: false @@ -1242,10 +1237,10 @@ packages: tailwindcss: 3.3.2 dev: true - /flowbite@1.6.5: - resolution: {integrity: sha512-eI4h3pIRI9d7grlYq14r0A01KUtw7189sPLLx/O2i7JyPEWpbleScfYuEc48XTeNjk1xxm/JHgZkD9kjyOWAlA==} + /flowbite@1.7.0: + resolution: {integrity: sha512-OTTmnhRgv85Rs+mcMaVU7zB6EvRQs7BaQziyMUsZLRjW9aUpeQyqKjLmxsVMMCdr8isYPCLd6UL7X1IaSVI0WQ==} dependencies: - '@popperjs/core': 2.11.7 + '@popperjs/core': 2.11.8 mini-svg-data-uri: 1.4.4 dev: false @@ -1319,8 +1314,8 @@ packages: /hast-util-from-parse5@7.1.2: resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 hastscript: 7.2.0 property-information: 6.2.0 vfile: 5.3.7 @@ -1335,14 +1330,14 @@ packages: /hast-util-heading-rank@2.1.1: resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 dev: false /hast-util-is-element@2.1.3: resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 dev: false /hast-util-parse-selector@2.2.5: @@ -1352,12 +1347,12 @@ packages: /hast-util-parse-selector@3.1.1: resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 /hast-util-raw@7.2.3: resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 '@types/parse5': 6.0.3 hast-util-from-parse5: 7.1.2 hast-util-to-parse5: 7.1.0 @@ -1375,8 +1370,8 @@ packages: dependencies: '@types/estree': 1.0.1 '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 comma-separated-tokens: 2.0.3 estree-util-attach-comments: 2.1.1 estree-util-is-identifier-name: 2.1.0 @@ -1395,8 +1390,8 @@ packages: /hast-util-to-html@8.0.4: resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 ccount: 2.0.1 comma-separated-tokens: 2.0.3 hast-util-raw: 7.2.3 @@ -1411,7 +1406,7 @@ packages: /hast-util-to-parse5@7.1.0: resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 comma-separated-tokens: 2.0.3 property-information: 6.2.0 space-separated-tokens: 2.0.2 @@ -1422,14 +1417,14 @@ packages: /hast-util-to-string@2.0.0: resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 dev: false /hast-util-to-text@3.1.2: resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} dependencies: - '@types/hast': 2.3.4 - '@types/unist': 2.0.6 + '@types/hast': 2.3.5 + '@types/unist': 2.0.7 hast-util-is-element: 2.1.3 unist-util-find-after: 4.0.1 dev: false @@ -1441,7 +1436,7 @@ packages: /hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 comma-separated-tokens: 1.0.8 hast-util-parse-selector: 2.2.5 property-information: 5.6.0 @@ -1451,7 +1446,7 @@ packages: /hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 3.1.1 property-information: 6.2.0 @@ -1575,8 +1570,8 @@ packages: supports-color: 8.1.1 dev: false - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + /jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} hasBin: true /js-tokens@4.0.0: @@ -1641,7 +1636,7 @@ packages: /lowlight@2.9.0: resolution: {integrity: sha512-OpcaUTCLmHuVuBcyNckKfH5B0oA4JUavb/M/8n9iAvanJYNQkrVm4pvyX0SUaqkBG4dnWHKt7p50B3ngAG2Rfw==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 fault: 2.0.1 highlight.js: 11.8.0 dev: false @@ -1666,33 +1661,33 @@ packages: /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: - '@types/mdast': 3.0.11 - '@types/unist': 2.0.6 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 unist-util-visit: 4.1.2 dev: false /mdast-util-find-and-replace@2.2.2: resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 dev: false - /mdast-util-from-markdown@1.3.0: - resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: - '@types/mdast': 3.0.11 - '@types/unist': 2.0.6 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 - micromark: 3.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-decode-string: 1.0.2 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 unist-util-stringify-position: 3.0.3 uvu: 0.5.6 transitivePeerDependencies: @@ -1702,33 +1697,33 @@ packages: /mdast-util-gfm-autolink-literal@1.0.3: resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.1.0 + micromark-util-character: 1.2.0 dev: false /mdast-util-gfm-footnote@1.0.2: resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.0.0 + micromark-util-normalize-identifier: 1.1.0 dev: false /mdast-util-gfm-strikethrough@1.0.3: resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 mdast-util-to-markdown: 1.5.0 dev: false /mdast-util-gfm-table@1.0.7: resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.0 + mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color @@ -1737,14 +1732,14 @@ packages: /mdast-util-gfm-task-list-item@1.0.2: resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 mdast-util-to-markdown: 1.5.0 dev: false /mdast-util-gfm@2.0.2: resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} dependencies: - mdast-util-from-markdown: 1.3.0 + mdast-util-from-markdown: 1.3.1 mdast-util-gfm-autolink-literal: 1.0.3 mdast-util-gfm-footnote: 1.0.2 mdast-util-gfm-strikethrough: 1.0.3 @@ -1759,9 +1754,9 @@ packages: resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 - mdast-util-from-markdown: 1.3.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color @@ -1771,11 +1766,11 @@ packages: resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 - '@types/unist': 2.0.6 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 ccount: 2.0.1 - mdast-util-from-markdown: 1.3.0 + mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 parse-entities: 4.0.1 stringify-entities: 4.0.3 @@ -1789,7 +1784,7 @@ packages: /mdast-util-mdx@2.0.1: resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} dependencies: - mdast-util-from-markdown: 1.3.0 + mdast-util-from-markdown: 1.3.1 mdast-util-mdx-expression: 1.3.2 mdast-util-mdx-jsx: 2.1.4 mdast-util-mdxjs-esm: 1.3.1 @@ -1802,9 +1797,9 @@ packages: resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: '@types/estree-jsx': 1.0.0 - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 - mdast-util-from-markdown: 1.3.0 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color @@ -1813,17 +1808,17 @@ packages: /mdast-util-phrasing@3.0.1: resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 unist-util-is: 5.2.1 dev: false /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 trim-lines: 3.0.1 unist-util-generated: 2.0.1 unist-util-position: 4.0.4 @@ -1833,12 +1828,12 @@ packages: /mdast-util-to-markdown@1.5.0: resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: - '@types/mdast': 3.0.11 - '@types/unist': 2.0.6 + '@types/mdast': 3.0.12 + '@types/unist': 2.0.7 longest-streak: 3.1.0 mdast-util-phrasing: 3.0.1 mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.0.2 + micromark-util-decode-string: 1.1.0 unist-util-visit: 4.1.2 zwitch: 2.0.4 dev: false @@ -1846,7 +1841,7 @@ packages: /mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 dev: false /merge-stream@2.0.0: @@ -1857,83 +1852,83 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /micromark-core-commonmark@1.0.6: - resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.0.0 - micromark-factory-label: 1.0.2 - micromark-factory-space: 1.0.0 - micromark-factory-title: 1.0.2 - micromark-factory-whitespace: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-html-tag-name: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false /micromark-extension-gfm-autolink-literal@1.0.5: resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: false /micromark-extension-gfm-footnote@1.1.2: resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} dependencies: - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false /micromark-extension-gfm-strikethrough@1.0.7: resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-classify-character: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false /micromark-extension-gfm-table@1.0.7: resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false /micromark-extension-gfm-tagfilter@1.0.2: resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} dependencies: - micromark-util-types: 1.0.2 + micromark-util-types: 1.1.0 dev: false /micromark-extension-gfm-task-list-item@1.0.5: resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false @@ -1946,8 +1941,8 @@ packages: micromark-extension-gfm-table: 1.0.7 micromark-extension-gfm-tagfilter: 1.0.2 micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 dev: false /micromark-extension-mdx-expression@1.0.8: @@ -1955,11 +1950,11 @@ packages: dependencies: '@types/estree': 1.0.1 micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false @@ -1970,10 +1965,10 @@ packages: '@types/estree': 1.0.1 estree-util-is-identifier-name: 2.1.0 micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 vfile-message: 3.1.4 dev: false @@ -1981,18 +1976,18 @@ packages: /micromark-extension-mdx-md@1.0.1: resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} dependencies: - micromark-util-types: 1.0.2 + micromark-util-types: 1.1.0 dev: false /micromark-extension-mdxjs-esm@1.0.5: resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} dependencies: '@types/estree': 1.0.1 - micromark-core-commonmark: 1.0.6 - micromark-util-character: 1.1.0 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 unist-util-position-from-estree: 1.1.2 uvu: 0.5.6 vfile-message: 3.1.4 @@ -2001,30 +1996,30 @@ packages: /micromark-extension-mdxjs@1.0.1: resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 micromark-extension-mdxjs-esm: 1.0.5 - micromark-util-combine-extensions: 1.0.0 - micromark-util-types: 1.0.2 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-factory-destination@1.0.0: - resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-factory-label@1.0.2: - resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false @@ -2032,86 +2027,85 @@ packages: resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} dependencies: '@types/estree': 1.0.1 - micromark-util-character: 1.1.0 + micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 unist-util-position-from-estree: 1.1.2 uvu: 0.5.6 vfile-message: 3.1.4 dev: false - /micromark-factory-space@1.0.0: - resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 dev: false - /micromark-factory-title@1.0.2: - resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 - uvu: 0.5.6 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-factory-whitespace@1.0.0: - resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-util-character@1.1.0: - resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-util-chunked@1.0.0: - resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: - micromark-util-symbol: 1.0.1 + micromark-util-symbol: 1.1.0 dev: false - /micromark-util-classify-character@1.0.0: - resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-util-combine-extensions@1.0.0: - resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-types: 1.0.2 + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-util-decode-numeric-character-reference@1.0.0: - resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: - micromark-util-symbol: 1.0.1 + micromark-util-symbol: 1.1.0 dev: false - /micromark-util-decode-string@1.0.2: - resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-symbol: 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 dev: false - /micromark-util-encode@1.0.1: - resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} dev: false /micromark-util-events-to-acorn@1.2.3: @@ -2119,74 +2113,74 @@ packages: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.1 - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 estree-util-visit: 1.2.1 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 vfile-message: 3.1.4 dev: false - /micromark-util-html-tag-name@1.1.0: - resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} dev: false - /micromark-util-normalize-identifier@1.0.0: - resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: - micromark-util-symbol: 1.0.1 + micromark-util-symbol: 1.1.0 dev: false - /micromark-util-resolve-all@1.0.0: - resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: - micromark-util-types: 1.0.2 + micromark-util-types: 1.1.0 dev: false - /micromark-util-sanitize-uri@1.1.0: - resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: - micromark-util-character: 1.1.0 - micromark-util-encode: 1.0.1 - micromark-util-symbol: 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 dev: false - /micromark-util-subtokenize@1.0.2: - resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: - micromark-util-chunked: 1.0.0 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 dev: false - /micromark-util-symbol@1.0.1: - resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} dev: false - /micromark-util-types@1.0.2: - resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} dev: false - /micromark@3.1.0: - resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.8 debug: 4.3.4 decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.0.6 - micromark-factory-space: 1.0.0 - micromark-util-character: 1.1.0 - micromark-util-chunked: 1.0.0 - micromark-util-combine-extensions: 1.0.0 - micromark-util-decode-numeric-character-reference: 1.0.0 - micromark-util-encode: 1.0.1 - micromark-util-normalize-identifier: 1.0.0 - micromark-util-resolve-all: 1.0.0 - micromark-util-sanitize-uri: 1.1.0 - micromark-util-subtokenize: 1.0.2 - micromark-util-symbol: 1.0.1 - micromark-util-types: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 uvu: 0.5.6 transitivePeerDependencies: - supports-color @@ -2261,17 +2255,16 @@ packages: react: 18.2.0 dev: false - /next-sitemap@4.1.3(@next/env@13.4.4)(next@13.4.4): - resolution: {integrity: sha512-eCvbXMCqbD/rYx912y4FzGOqPCbWOIBL4UkgVY5R15eCXygKFKWzEVZGPNVBDu2KVpRCeG943NibOchfyQGDhQ==} + /next-sitemap@4.1.8(next@13.4.4): + resolution: {integrity: sha512-XAXpBHX4o89JfMgvrm0zimlZwpu2iBPXHpimJMUrqOZSc4C2oB1Lv89mxuVON9IE8HOezaM+w4GjJxcYCuGPTQ==} engines: {node: '>=14.18'} hasBin: true peerDependencies: - '@next/env': '*' next: '*' dependencies: '@corex/deepmerge': 4.0.43 - '@next/env': 13.4.4 - fast-glob: 3.2.12 + '@next/env': 13.4.10 + fast-glob: 3.3.0 minimist: 1.2.8 next: 13.4.4(react-dom@18.2.0)(react@18.2.0) dev: false @@ -2297,7 +2290,7 @@ packages: '@next/env': 13.4.4 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001489 + caniuse-lite: 1.0.30001516 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2318,8 +2311,8 @@ packages: - babel-plugin-macros dev: false - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: false /normalize-path@3.0.0: @@ -2358,7 +2351,7 @@ packages: /parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 @@ -2398,8 +2391,8 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} /postcss-import@15.1.0(postcss@8.4.23): @@ -2474,8 +2467,8 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /posthog-js@1.67.1: - resolution: {integrity: sha512-gvdCVrrxoRYbtNTCUt2/YdZ+tfSfzcl72ym/dtRVCYJpwlCUIKnNJ3E2g7Bbw1+Ki6CvGxdu9r7jHIWnvJAMuw==} + /posthog-js@1.71.0: + resolution: {integrity: sha512-Qs7lIBivj993apV17x8krEy46SKzSYCwMq4hihkNJ01U6ZltrIx0piYfKCC2pmiBgCaJG7Hjn0iTLy5evntdEw==} dependencies: fflate: 0.4.8 dev: false @@ -2541,8 +2534,8 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /react-icons@4.8.0(react@18.2.0): - resolution: {integrity: sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==} + /react-icons@4.10.1(react@18.2.0): + resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} peerDependencies: react: '*' dependencies: @@ -2577,10 +2570,10 @@ packages: '@types/react': '>=16' react: '>=16' dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 '@types/prop-types': 15.7.5 '@types/react': 18.2.6 - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 prop-types: 15.8.1 @@ -2603,7 +2596,7 @@ packages: peerDependencies: react: '>= 0.14.0' dependencies: - '@babel/runtime': 7.22.5 + '@babel/runtime': 7.22.6 highlight.js: 10.7.3 lowlight: 1.20.0 prismjs: 1.29.0 @@ -2644,7 +2637,7 @@ packages: /rehype-autolink-headings@6.1.1: resolution: {integrity: sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 extend: 3.0.2 hast-util-has-property: 2.0.1 hast-util-heading-rank: 2.1.1 @@ -2656,7 +2649,7 @@ packages: /rehype-highlight@6.0.0: resolution: {integrity: sha512-q7UtlFicLhetp7K48ZgZiJgchYscMma7XjzX7t23bqEJF8m6/s+viXQEe4oHjrATTIZpX7RG8CKD7BlNZoh9gw==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 hast-util-to-text: 3.1.2 lowlight: 2.9.0 unified: 10.1.2 @@ -2666,7 +2659,7 @@ packages: /rehype-slug@5.1.0: resolution: {integrity: sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 github-slugger: 2.0.0 hast-util-has-property: 2.0.1 hast-util-heading-rank: 2.1.1 @@ -2678,7 +2671,7 @@ packages: /rehype-stringify@9.0.3: resolution: {integrity: sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==} dependencies: - '@types/hast': 2.3.4 + '@types/hast': 2.3.5 hast-util-to-html: 8.0.4 unified: 10.1.2 dev: false @@ -2686,7 +2679,7 @@ packages: /remark-gfm@3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: - '@types/mdast': 3.0.11 + '@types/mdast': 3.0.12 mdast-util-gfm: 2.0.2 micromark-extension-gfm: 2.0.3 unified: 10.1.2 @@ -2706,8 +2699,8 @@ packages: /remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: - '@types/mdast': 3.0.11 - mdast-util-from-markdown: 1.3.0 + '@types/mdast': 3.0.12 + mdast-util-from-markdown: 1.3.1 unified: 10.1.2 transitivePeerDependencies: - supports-color @@ -2716,8 +2709,8 @@ packages: /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - '@types/hast': 2.3.4 - '@types/mdast': 3.0.11 + '@types/hast': 2.3.5 + '@types/mdast': 3.0.12 mdast-util-to-hast: 12.3.0 unified: 10.1.2 dev: false @@ -2756,8 +2749,8 @@ packages: loose-envify: 1.4.0 dev: false - /schema-utils@3.1.2: - resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==} + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.12 @@ -2765,8 +2758,8 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: false - /search-insights@2.6.0: - resolution: {integrity: sha512-vU2/fJ+h/Mkm/DJOe+EaM5cafJv/1rRTZpGJTuFPf/Q5LjzgMDsqPdSaZsAe+GAWHHsfsu+rQSAn6c8IGtBEVw==} + /search-insights@2.7.0: + resolution: {integrity: sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==} engines: {node: '>=8.16.0'} dev: false @@ -2781,8 +2774,8 @@ packages: engines: {node: '>=10'} dev: false - /solid-js@1.7.6: - resolution: {integrity: sha512-DXVOTjUh/bIAhE0fIqu3ezGLyQaez7v8EOw3uPLIi87DmLjg+hsuCAgKyNIZ+o4jUetOk3ZORccvJmE1yZUk8g==} + /solid-js@1.7.8: + resolution: {integrity: sha512-XHBWk1FvFd0JMKljko7FfhefJMTSgYEuVKcQ2a8hzRXfiuSJAGsrPPafqEo+f6l+e8Oe3cROSpIL6kbzjC1fjQ==} dependencies: csstype: 3.1.2 seroval: 0.5.1 @@ -2855,8 +2848,8 @@ packages: react: 18.2.0 dev: false - /sucrase@3.32.0: - resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} + /sucrase@3.33.0: + resolution: {integrity: sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A==} engines: {node: '>=8'} hasBin: true dependencies: @@ -2865,7 +2858,7 @@ packages: glob: 7.1.6 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.5 + pirates: 4.0.6 ts-interface-checker: 0.1.13 /supports-color@8.1.1: @@ -2879,8 +2872,12 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /tabbable@6.1.2: - resolution: {integrity: sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ==} + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: false + + /tailwind-merge@1.13.2: + resolution: {integrity: sha512-R2/nULkdg1VR/EL4RXg4dEohdoxNUJGLMnWIQnPKL+O9Twu7Cn3Rxi4dlXkDzZrEGtR+G+psSXFouWlpTyLhCQ==} dev: false /tailwindcss@3.3.2: @@ -2893,10 +2890,10 @@ packages: chokidar: 3.5.3 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.3.0 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.18.2 + jiti: 1.19.1 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -2910,7 +2907,7 @@ packages: postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 resolve: 1.22.2 - sucrase: 3.32.0 + sucrase: 3.33.0 transitivePeerDependencies: - ts-node @@ -2919,7 +2916,7 @@ packages: engines: {node: '>=6'} dev: false - /terser-webpack-plugin@5.3.9(webpack@5.85.0): + /terser-webpack-plugin@5.3.9(webpack@5.88.1): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -2937,19 +2934,19 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.18 jest-worker: 27.5.1 - schema-utils: 3.1.2 + schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.17.7 - webpack: 5.85.0 + terser: 5.19.0 + webpack: 5.88.1 dev: false - /terser@5.17.7: - resolution: {integrity: sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==} + /terser@5.19.0: + resolution: {integrity: sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.3 - acorn: 8.8.2 + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 dev: false @@ -2982,8 +2979,8 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: false /typescript@5.0.4: @@ -2995,7 +2992,7 @@ packages: /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 bail: 2.0.2 extend: 3.0.2 is-buffer: 2.0.5 @@ -3007,7 +3004,7 @@ packages: /unist-util-find-after@4.0.1: resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 unist-util-is: 5.2.1 dev: false @@ -3018,56 +3015,56 @@ packages: /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: false /unist-util-position-from-estree@1.1.2: resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: false /unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: false /unist-util-remove-position@4.0.2: resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 unist-util-visit: 4.1.2 dev: false /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 dev: false /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 unist-util-is: 5.2.1 dev: false /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 dev: false - /update-browserslist-db@1.0.11(browserslist@4.21.5): + /update-browserslist-db@1.0.11(browserslist@4.21.9): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.5 + browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 dev: false @@ -3095,21 +3092,21 @@ packages: /vfile-location@4.1.0: resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 vfile: 5.3.7 dev: false /vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 unist-util-stringify-position: 3.0.3 dev: false /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 2.0.7 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 @@ -3132,8 +3129,8 @@ packages: engines: {node: '>=10.13.0'} dev: false - /webpack@5.85.0: - resolution: {integrity: sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==} + /webpack@5.88.1: + resolution: {integrity: sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -3147,12 +3144,12 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.8.2 - acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.21.5 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.9 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.14.1 - es-module-lexer: 1.2.1 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -3161,9 +3158,9 @@ packages: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.1.2 + schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.85.0) + terser-webpack-plugin: 5.3.9(webpack@5.88.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/website/public/images/firewall-block.svg b/website/public/images/firewall-block.svg new file mode 100644 index 000000000..d5303110a --- /dev/null +++ b/website/public/images/firewall-block.svg @@ -0,0 +1,27 @@ + + + +you + + + +trusted + +entity + +untrusted + +entity + + + +firewall + + + + + diff --git a/website/public/images/firezone-1.0.svg b/website/public/images/firezone-1.0.svg new file mode 100644 index 000000000..d23587c25 --- /dev/null +++ b/website/public/images/firezone-1.0.svg @@ -0,0 +1,39 @@ + + + +protected + +entity + + + +untrusted + +entity + + + +trusted + +entity + + + +access + +broker + + + +stateful + +firewall + + + + + diff --git a/website/public/images/logo-main-light-primary.svg b/website/public/images/logo-main-light-primary.svg new file mode 100644 index 000000000..fa32c180a --- /dev/null +++ b/website/public/images/logo-main-light-primary.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/website/public/images/nostalgia-show-hn.png b/website/public/images/nostalgia-show-hn.png new file mode 100644 index 000000000..841715336 Binary files /dev/null and b/website/public/images/nostalgia-show-hn.png differ diff --git a/website/public/images/stateful-firewall.svg b/website/public/images/stateful-firewall.svg new file mode 100644 index 000000000..23fc2a0a2 --- /dev/null +++ b/website/public/images/stateful-firewall.svg @@ -0,0 +1,37 @@ + + + +you + + + +untrusted + +entity + + + +trusted + +entity + + + +untrusted + +entity + + + +stateful + +firewall + + + + + diff --git a/website/public/images/wai-7-2-23.png b/website/public/images/wai-7-2-23.png new file mode 100644 index 000000000..e1f2ef11a Binary files /dev/null and b/website/public/images/wai-7-2-23.png differ diff --git a/website/src/app/blog/firezone-1-0/page.tsx b/website/src/app/blog/firezone-1-0/page.tsx new file mode 100644 index 000000000..f5946a11a --- /dev/null +++ b/website/src/app/blog/firezone-1-0/page.tsx @@ -0,0 +1,23 @@ +import Image from "next/image"; +import Post from "@/components/Blog/Post"; +import Content from "./readme.mdx"; +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Firezone 1.0 • Firezone Blog", + description: "Announcing the 1.0 early access program", +}; + +export default function Page() { + return ( + + + + ); +} diff --git a/website/src/app/blog/firezone-1-0/readme.mdx b/website/src/app/blog/firezone-1-0/readme.mdx new file mode 100644 index 000000000..b533540b1 --- /dev/null +++ b/website/src/app/blog/firezone-1-0/readme.mdx @@ -0,0 +1,245 @@ +import Image from "next/image"; + +Firezone comes from humble roots. + +It was born out of necessity -- as an engineer at Cisco I found myself in need +of an easy way to deploy and manage a VPN server for security automation. I had +used OpenVPN in the past and loathed it, so this time I decided to try a fast, +new contender called [WireGuard](https://www.wireguard.com). + +While WireGuard itself is a marvelous feat of engineering, it provides only +basic building blocks. Users wishing to deploy WireGuard as a replacement for +their existing remote access VPN will find themselves building automation to +distribute keys, manage users, configure routing tables, and so on. + +And I found myself doing just that. It wasn't particularly difficult automation +to build, but it was tedious and error-prone. Although the benefits of WireGuard +were worth the price of admission, colleagues and I agreed -- _wouldn't it be +great if a tool existed to do this for us?_ + +So after one particularly grueling refactoring project involving a major +dependency in an ancient codebase that had become "suddenly" deprecated, I +decided it was time for something new. I resigned, picked up a book on +Elixir/Phoenix, and, rejoicing at the opportunity to learn some new tech, +started building what became the first version of Firezone. + +Show HN + +When we [launched on Hacker News](https://news.ycombinator.com/item?id=28683231) +nearly two years ago, we never envisioned Firezone to be more than a simple tool +deploying your own WireGuard-based VPN server. + +Fast-forward +[4,500 GitHub stars](https://github.com/firezone/firezone/stargazers), a +[Y Combinator backed funding round](https://techcrunch.com/2022/03/30/ycombinator-open-source-startups-winter-22-demo-day/), +and [130 releases](https://github.com/firezone/firezone/releases) later -- +Firezone has now grown into something more than just a self-hosted tool to +manage your WireGuard configurations. + +We now count over 3,000 Firezone instances running in the wild +(possibly much more -- we allow users to +[disable telemetry](/docs/reference/telemetry)) securing private networks for +hobbyists, schools, non-profits, and businesses with hundreds of employees. + +weekly active instances + +To be clear, Firezone is successful in large part because WireGuard itself is +successful. In an industry brimming with enterprise security bloatware and +endless acronyms, WireGuard's a breath of fresh air. Every issue I've thought I +had with it turned out to be user error. How we ever got by without it is a +mystery to me. + +But I could go on and on about WireGuard's strengths. Let's back up for a minute +-- what is a VPN, and why is one needed at all? To answer that we'll need to go +back to the formation of the Internet itself. + +#### The purpose of a VPN + +You see, the early Internet had only a handful of entities connected to it -- +connecting to the Internet was expensive, after all. Typically only banks, +universities, and other large institutions could justify the cost. + +So when you connected your organization to the Internet and began receiving +packets, it was clear which entity it was from based on its allocated IPv4 +address range. Since there were so few entities connected, it was clear who you +communicated with. It was clear who to contact (and blame) in case any issues +arose. + +But, as access to the Internet became cheaper, more types of entities could +afford to connect. As more entities connected, the number of resources on the +Internet grew, and its +[value increased quadratically](https://en.wikipedia.org/wiki/Metcalfe%27s_law). +Soon, all types of entities wanted to connect -- local governments, schools, +small businesses. Internet Service Providers began offering connections to mere +individuals. Eventually there were so many entities on the Internet that +identifying who you were communicating with was no longer trivial. Since you +couldn't easily know who you were talking to, you couldn't always trust them to +behave. + +And thus, firewalls were born. Firewalls keep packets of information out from +entities you don't wish to communicate with and let packets in from those you +do. + + + firewall animation + + +And this worked well for some time. However, as the Internet grew even larger, a +problem arose: firewalls required you to know _in advance_ who you'd like to +communicate with, adding them to your configuration, and likewise removing the +ones you didn't. As you might imagine, it quickly became unwieldy to keep these +configurations up to date. + +So a clever solution was developed: what if you could dynamically add and remove +entities to the firewall configuration on the fly? + +And thus, stateful firewalls were born. I should pause here and clarify that +stateful firewalls are sometimes confused with +[Network Address Translation (NAT)](https://en.wikipedia.org/wiki/Network_address_translation), +since they're often found on the same device. But there's an important +distinction: A stateful firewall _remembers_ stuff it's seen in order to to +update its configuration dynamically, whereas NAT can behave statically. + +Stateful firewalls exist in nearly every consumer router and datacenter gateway +connected to the Internet today. There's a very high likelihood the Internet +connection you're reading this from is behind one or several of them. They've +been largely successful at serving their intended purpose. + + + firewall animation + + +However, this post wouldn't be very interesting if we stopped there. + +You see, there's still one fundamental problem with stateful firewalls, +particularly as it relates to remote access. For two-way communication to occur, +one entity (namely the one "behind" the firewall) must always initiate. This +means that entities outside the firewall can never communicate to those inside, +_even if the outside entities are trusted_. To do that, you'd have to add a +configuration rule to expect an outside entity to talk in, which means we're +back to managing firewall configurations again. + +This is where VPNs come in. A VPN _disguises_ an outside entity as an inside +one, thereby allowing communication by default. + +After the firewall authenticates the outside entity, they both agree to package +up the information packets between each other so that the Internet routers in +between forward them properly. This creates a kind of network within a network: +the original packets with their network attributes are packaged into another +packet with more network attributes, thus giving this technology its name: +Virtual Private Network. + +So a VPN is just a technology that authenticates an outside, untrusted entity to +a protected network. And WireGuard is the best VPN technology we have so far. As +far as VPNs go, there's nothing faster, more secure, or more robust. + +#### The challenge with trust + +But there's a security risk with this arrangement: once the outsider is +authenticated, all of the entities inside the firewall perimeter now trust its +packets completely. What if an untrusted entity managed to obtain a VPN +connection? One misconfiguration, stolen credential, or hijacked connection +would result in a perimeter breach. Not good. + +The solution to this problem is aptly named +[Zero Trust Architecture (ZTA)](https://en.wikipedia.org/wiki/Zero_trust_security_model). +The idea with ZTA is to do away with using network zone (or perceived network +zone in the case of a VPN) for determining whether to trust communication. All +network zones are considered _untrusted_ by default. Suddenly the network +perimeter we had before vanishes -- inside and outside entities are equally +untrusted. + +Then how does an entity come to be trusted? We still authenticate them as usual, +but there's a key difference: with ZTA, we authenticate entities each time the +communication is requested, on the fly. Not once at the perimeter. And since the +perimeter is gone, the protected entity itself (or a proxy) authenticates the +untrusted entity. But wait, what happened to the firewall? + +This presents a dilemma. If we use a firewall to protect entities, they're +shielded outside the perimeter, but left unprotected inside the perimeter. And +if we choose ZTA, we only trust entities we've authenticated directly, but must +expose ourselves to _all_ outside entities in order to do so. + +#### The solution + +Firezone solves this problem with a third entity, called an access broker, which +works as follows: + + + firewall animation + + +1. The protected entity is deployed behind a stateful firewall. +1. The protected entity then initiates and maintains a bi-directional control + channel to the broker. +1. Whenever an untrusted entity wants access to the protected resource, it + notifies the broker. +1. If the broker determines access is granted, it notifies the protected entity + that the now-trusted entity is allowed in. +1. The protected entity then initiates communication to the now-trusted entity + _directly_. The stateful firewall's configuration is dynamically updated, + allowing communication to happen from the now-trusted entity to the protected + entity. + +So we're able to both authenticate the untrusted entity at the time of request, +yet also keep our protected entity behind a firewall to keep it invisible to the +public Internet. In fast, _both_ entities can live behind a stateful firewall +and the technique would still work -- the principles are the same. + +As it turns out, this approach is nothing new. It's how web browsers and VoIP +systems have established peer to peer connections for low-latency audio and +video chat for decades. + +Firezone 1.0 makes this process transparent, but also goes one step further by +exposing granular controls to allow or deny access based on attributes like +which group a user is a member of and so on. + +Of course if you wanted to use Firezone 1.0 like a traditional perimeter-based +VPN and then transition to finer-grined access controls over time, you can do +that as well. We understand the realities of legacy processes and systems, so we +designed 1.0 to be flexible enough to suit the needs of both. + +And while we were at it, we decided to build a slew of new features for 1.0 as +well, most notably a cloud-managed admin portal and native clients. Check our +[product roadmap](/product/roadmap) for more details on what's coming in 1.0. + +#### Next steps + +To help ensure a bug-free experience for our users, we'll be rolling out 1.0 in +phases, starting with an early access preview aiming to launch mid-Q3 of this +year. If you're interesting in joining the early access program, +[head here to fill out the form](/product/early-access) and we'll be in touch. + +Until then, feel free to [follow our roadmap](/product/roadmap) or +[watch our GitHub repository](https://www.github.com/firezone/firezone) for +updates. Comments welcome! diff --git a/website/src/app/blog/layout.tsx b/website/src/app/blog/layout.tsx index 6451e997f..6fe3d33e9 100644 --- a/website/src/app/blog/layout.tsx +++ b/website/src/app/blog/layout.tsx @@ -4,18 +4,27 @@ import Image from "next/image"; export default function Layout({ children }: { children: React.ReactNode }) { return (

-
+
Firezone logo
{children} -
- +
+
+

+ Firezone Newsletter +

+

+ Sign up with your email to receive roadmap updates, how-tos, and + product announcements from the Firezone team. +

+ +
); diff --git a/website/src/app/blog/page.tsx b/website/src/app/blog/page.tsx index a7fcd2d19..1cf3801c6 100644 --- a/website/src/app/blog/page.tsx +++ b/website/src/app/blog/page.tsx @@ -1,131 +1,73 @@ +import { Metadata } from "next"; import gravatar from "@/lib/gravatar"; import Link from "next/link"; import Image from "next/image"; -import { ArrowRightIcon } from "@heroicons/react/20/solid"; import NewsletterSignup from "@/components/NewsletterSignup"; +import SummaryCard from "@/components/Blog/SummaryCard"; + +export const metadata: Metadata = { + title: "Blog • Firezone", + description: "Announcements, tutorials, and more from the Firezone team.", +}; export default function Page() { return ( -
-
+
+
-

- Firezone Blog +

+ Blog

-

+

Announcements, tutorials, and more from the Firezone team.

-
-
-
- - - - - - Announcement - - October 17, 2022 -
-

- Release 0.6.0 -

-

- Today, I'm excited to announce we've closed the{" "} - - first public issue{" "} - - on our GitHub repository, more than a year after it was originally - opened: Containerization support! We're also releasing preliminary - support for SAML 2.0 identity providers like Okta and OneLogin. +

+ +

+ Firezone comes from humble roots.

-
-
- Jamil Bou Kheir avatar - - Jamil Bou Kheir - -
- - Read more - - -
-
-
-
- - - - - - Announcement - - July 25, 2022 -
-

- Release 0.5.0 -

-

- As the first post on our new blog, we thought it'd be fitting to - kick things off with a release announcement. So without further - ado, we're excited to announce: Firezone{" "} - - 0.5.0 is here - - ! It's packed with new features, bug fixes, and other improvements - — more on that below. +

+ When we launched on Hacker News nearly two years ago, we never + envisioned Firezone to be more than a simple tool for managing + your WireGuard configurations.

-
-
- Jamil Bou Kheir avatar - - Jamil Bou Kheir - -
- - Read more - - -
-
+ + + Today, I'm excited to announce we've closed the first public issue + on our GitHub repository, more than a year after it was originally + opened: Containerization support! We're also releasing preliminary + support for SAML 2.0 identity providers like Okta and OneLogin. + +
+ + As the first post on our new blog, we thought it'd be fitting to + kick things off with a release announcement. So without further ado, + we're excited to announce: Firezone 0.5.0 is here! It's packed with + new features, bug fixes, and other improvements — more on that + below. +
diff --git a/website/src/app/docs/administer/backup/readme.mdx b/website/src/app/docs/administer/backup/readme.mdx index 9a627ac10..9b87c32e9 100644 --- a/website/src/app/docs/administer/backup/readme.mdx +++ b/website/src/app/docs/administer/backup/readme.mdx @@ -7,10 +7,13 @@ import SupportOptions from "@/components/SupportOptions"; Firezone can be safely backed up and restored in a couple of minutes under most circumstances. - - This guide is written for Firezone deployments using **Docker Engine** on - **Linux** only. - +Docker Engine +on Linux only. +`} +/> Unless your hosting provider supports taking live VM snapshots, you'll need to stop Firezone before backing it up. This ensures the Postgres data directory is diff --git a/website/src/app/docs/administer/debug-logs/readme.mdx b/website/src/app/docs/administer/debug-logs/readme.mdx index 15c6a0a0f..157e9255b 100644 --- a/website/src/app/docs/administer/debug-logs/readme.mdx +++ b/website/src/app/docs/administer/debug-logs/readme.mdx @@ -2,9 +2,12 @@ import Alert from "@/components/DocsAlert"; # Debug Logs - - This article is written for Docker based deployments of Firezone. - + Docker deployments of Firezone consist of 3 running containers: diff --git a/website/src/app/docs/administer/regen-keys/readme.mdx b/website/src/app/docs/administer/regen-keys/readme.mdx index 94bc752f8..cbf1b50e6 100644 --- a/website/src/app/docs/administer/regen-keys/readme.mdx +++ b/website/src/app/docs/administer/regen-keys/readme.mdx @@ -11,17 +11,24 @@ do so using the same bootstrap scripts that were used when installing Firezone. ## Regenerate secrets - - Replacing the `DATABASE_ENCRYPTION_KEY` will render all encrypted data in the - database useless. This **will** break your Firezone install unless you are - starting with an empty database. You have been warned. - +DATABASE_ENCRYPTION_KEY will render all encrypted data in the +database useless. This will break your Firezone install unless you are +starting with an empty database. You have been warned. +`} +/> - - Replacing `GUARDIAN_SECRET_KEY`, `SECRET_KEY_BASE`, `LIVE_VIEW_SIGNING_SALT`, - `COOKIE_SIGNING_SALT`, and `COOKIE_ENCRYPTION_SALT` will reset all browser - sessions and REST API tokens. - +GUARDIAN_SECRET_KEY, SECRET_KEY_BASE, +LIVE_VIEW_SIGNING_SALT, +COOKIE_SIGNING_SALT, and COOKIE_ENCRYPTION_SALT +will reset all browser sessions and REST API tokens. +`} +/> Use the procedure below to regenerate secrets: @@ -51,11 +58,14 @@ sudo firezone-ctl reconfigure ## Regenerate WireGuard private key - + +`} +/> To regenerate WireGuard private key, simply move or rename the private key file. Firezone will generate a new one on next start. diff --git a/website/src/app/docs/administer/uninstall/readme.mdx b/website/src/app/docs/administer/uninstall/readme.mdx index 3052bc6fb..d0cde3307 100644 --- a/website/src/app/docs/administer/uninstall/readme.mdx +++ b/website/src/app/docs/administer/uninstall/readme.mdx @@ -5,9 +5,12 @@ import Alert from "@/components/DocsAlert"; Firezone can be uninstalled using the steps below. - - This will irreversibly destroy ALL Firezone data and can't be undone. - + diff --git a/website/src/app/docs/administer/upgrade/readme.mdx b/website/src/app/docs/administer/upgrade/readme.mdx index 3923f44bd..f32947b76 100644 --- a/website/src/app/docs/administer/upgrade/readme.mdx +++ b/website/src/app/docs/administer/upgrade/readme.mdx @@ -7,11 +7,14 @@ import Image from "next/image"; Upgrading Firezone will pause all VPN sessions and temporarily bring down the web UI. - - Automatic rollbacks are still under development. We recommend backing up - relevant [files and folders](/docs/reference/file-and-directory-locations) - before upgrading in case anything goes wrong. - +files and folders +before upgrading in case anything goes wrong. +`} +/> Follow the steps below to upgrade Firezone: diff --git a/website/src/app/docs/authenticate/local-auth/readme.mdx b/website/src/app/docs/authenticate/local-auth/readme.mdx index dd72f6211..5e51565db 100644 --- a/website/src/app/docs/authenticate/local-auth/readme.mdx +++ b/website/src/app/docs/authenticate/local-auth/readme.mdx @@ -7,14 +7,17 @@ the Firezone portal. Administrators can add users and assign their passwords on the `/users` page. See [Add users](/docs/user-guides/add-users) for more details. - - Although local authentication is quick and easy to get started with, you can - limit attack surface by [disabling local - authentication](#disabling-local-authentication) altogether. See our - [OIDC](/docs/authenticate/oidc) or [SAML](/docs/authenticate/saml) guides for - details. For production deployments it's usually a good idea to **disable - local authentication** and enforce MFA through your identity provider. - +disabling local +authentication altogether. See our +OIDC or SAML + guides for details. For production deployments it's usually a good idea to disable +local authentication and enforce MFA through your identity provider. +`} +/> If you choose to keep Local authentication enabled, we recommend [enabling TOTP-based MFA ](/docs/authenticate/multi-factor) for any accounts diff --git a/website/src/app/docs/authenticate/readme.mdx b/website/src/app/docs/authenticate/readme.mdx index d932d06c4..278fab04f 100644 --- a/website/src/app/docs/authenticate/readme.mdx +++ b/website/src/app/docs/authenticate/readme.mdx @@ -10,10 +10,13 @@ Firezone supports the following authentication methods: 1. [SSO authentication via OpenID Connect](/docs/authenticate/oidc) 1. [SSO authentication via SAML 2.0](/docs/authenticate/saml) - - If your Identity Provider doesn't work with the methods listed above, [contact - us](/contact/sales) about a custom integration. - +contact us about a custom integration. +`} +/> ## Integrate an SSO provider @@ -47,7 +50,8 @@ Config ID for that particular provider. For example, the OIDC config below:
- config-oidc - This guide assumes you have completed the prerequisite steps (e.g. generate - self-signed X.509 certificates) outlined - [here](/docs/authenticate/saml#prerequisites). - +here. +`} +/> Firezone supports Single Sign-On (SSO) using JumpCloud through the generic SAML 2.0 connector. This guide will walk you through how to configure the @@ -37,7 +40,8 @@ the bottom-right. Your JumpCloud configuration should now resemble the following: -jumpcloud saml - This guide assumes you have completed the prerequisite steps (e.g. generate - self-signed X.509 certificates) outlined - [here](/docs/authenticate/saml#prerequisites). - +here. +`} +/> Firezone supports Single Sign-On (SSO) using Okta through the generic SAML 2.0 connector. This guide will walk you through how to configure the integration. @@ -31,7 +34,8 @@ values during setup: [Okta's documentation](https://help.okta.com/oie/en-us/Content/Topics/Apps/Apps_App_Integration_Wizard_SAML.htm) contains additional details on the purpose of each configuration setting. -firezone saml - This guide assumes you have completed the prerequisite steps (e.g. generate - self-signed X.509 certificates) outlined - [here](/docs/authenticate/saml#prerequisites). - +here. +`} +/> Firezone supports Single Sign-On (SSO) using OneLogin through the generic SAML 2.0 connector. This guide will walk you through how to configure the @@ -35,7 +38,8 @@ The following fields should be filled out on this page: [OneLogin's docs](https://onelogin.service-now.com/support?id=kb_article&sys_id=912bb23edbde7810fe39dde7489619de&kb_category=93e869b0db185340d5505eea4b961934) provide a good overview of each field's purpose. -onelogin configs -You're entering unsupported territory. This is not for the faint of -heart and will require being able to figure out snags you may hit on your own. + -If you're very comfortable with your environment of choice, then read on to -learn how to build Firezone from source. - - - - -You will need to setup your own service management for Firezone (eg. -`runit`, `systemd`, shell scripts). You will also need to install and configure -your own database (eg. `postgres`) and reverse proxy (eg. `caddy`, `nginx`). - -Info about database configuration is -[here](/docs/deploy/advanced/external-database/#configure-firezone-to-connect), +here, and info about configuring a reverse proxy is -[here](/docs/deploy/advanced/reverse-proxy/#proxy-requirements). - - +here. +`} +/> ## Prerequisites - - Check the `.tool-versions` file - [here](https://github.com/firezone/firezone/blob/legacy/.tool-versions) for - the versions we use for Erlang, Elixir, and Node. If your system supports it, - you can install these using - [asdf-vm](https://asdf-vm.com/guide/getting-started.html) using a similar - `.tool-versions` of your own to match versions. Your system's package manager - may have them as well. - +.tool-versions file +here for +the versions we use for Erlang, Elixir, and Node. If your system supports it, +you can install these using +asdf-vm using a similar +.tool-versions of your own to match versions. Your system's package manager +may have them as well. +`} +/> **These must be available in the user's path that runs Firezone.** @@ -90,9 +95,12 @@ up. Once that's done, you can use `firezone start` to start Firezone and run it to log into Firezone from a web browser to start setting up your brand new custom instance that you built by hand with a little bit of elbow grease :) - - As mentioned at the top, it's recommended to use some sort of service - management to start and stop Firezone easily without having to manually do it - using the `firezone` binary directly. But the choice is yours, since you're in - control! - +firezone binary directly. But the choice is yours, since +you're in control! +`} +/> diff --git a/website/src/app/docs/deploy/advanced/external-database/readme.mdx b/website/src/app/docs/deploy/advanced/external-database/readme.mdx index 8436c29d4..9f17e83da 100644 --- a/website/src/app/docs/deploy/advanced/external-database/readme.mdx +++ b/website/src/app/docs/deploy/advanced/external-database/readme.mdx @@ -17,12 +17,15 @@ database services like Amazon RDS. See the [configuration ](#configure-firezone-to-connect) section below for more information configuring Firezone with an external DB. - - Configuring Firezone to use an external database can be complicated and - error-prone. We recommend using the bundled Postgres for Omnibus-based - deployments or the official Postgres Docker image for Docker-based deployments - if possible. - + ## Configure Firezone to Connect @@ -48,11 +51,14 @@ the DB (fields in bold required): For more information, see the [environment variable reference ](/docs/reference/env-vars). - - The official `postgres` docker image can be configured by setting environment - variables for the container. See the Postgres image - [documentation](https://hub.docker.com/_/postgres) for more details. - +postgres docker image can be configured by setting environment +variables for the container. See the Postgres image +documentation for more details. +`} +/> diff --git a/website/src/app/docs/deploy/advanced/reverse-proxy/readme.mdx b/website/src/app/docs/deploy/advanced/reverse-proxy/readme.mdx index 290ebd2f3..45d3b6b4c 100644 --- a/website/src/app/docs/deploy/advanced/reverse-proxy/readme.mdx +++ b/website/src/app/docs/deploy/advanced/reverse-proxy/readme.mdx @@ -2,13 +2,16 @@ import Alert from "@/components/DocsAlert"; # Custom Reverse Proxy - - Using a custom reverse proxy is an advanced configuration. The default bundled - Nginx proxy (Omnibus-based deployments) and Caddy (Docker-based deployments) - is suitable for the vast majority of use cases and is recommended for most - users. There are important security risks if the reverse proxy is not set up - correctly. - + ## Introduction @@ -33,24 +36,24 @@ reverse proxy. [X-Forwarded-For header works](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For), this is needed to parse the actual client's IP address to prevent IP spoofing. - -The `external_trusted_proxies` list automatically implicitly includes the +external_trusted_proxies list automatically implicitly includes the following private CIDR ranges, even if they're not specified in the configuration file: - -- `127.0.0.0/8` -- `10.0.0.0/8` -- `172.16.0.0/12` -- `192.168.0.0/16` -- `::1/128` -- `fc00::/7` +
    +
  • 127.0.0.0/8
  • +
  • 10.0.0.0/8
  • +
  • 172.16.0.0/12
  • +
  • 192.168.0.0/16
  • +
  • ::1/128
  • +
  • fc00::/7
  • +
This means any web requests originating from these IPs are automatically ignored -from the `X-Forwarded-For` headers. If you're accessing Firezone from any IPs in -this range (as seen by the Firezone web app), be sure to add them to the -`default['firezone']['phoenix']['clients']` configuration option instead. - -
+from the X-Forwarded-For headers. If you're accessing Firezone from +any IPs in this range (as seen by the Firezone web app), be sure to add them to +the default['firezone']['phoenix']['clients'] configuration option +instead. `} /> Read more about the configuration options [here](/docs/reference/configuration-file). diff --git a/website/src/app/docs/deploy/docker/readme.mdx b/website/src/app/docs/deploy/docker/readme.mdx index 72516be56..b7542bcdb 100644 --- a/website/src/app/docs/deploy/docker/readme.mdx +++ b/website/src/app/docs/deploy/docker/readme.mdx @@ -32,11 +32,14 @@ Docker offers a number of benefits over the old - `443/tcp`: To access the web UI. - `51820/udp`: VPN traffic listen port. - - Before deploying Firezone in **production**, you'll need a valid DNS record - pointing to this instance. See [Prepare to - Deploy](/docs/deploy/#prepare-to-deploy) if you haven't done this already. - +production, you'll need a valid DNS record +pointing to this instance. See Prepare to +Deploy if you haven't done this already. +`} +/> ## Step 2: Install server @@ -155,10 +158,13 @@ on start. ## Step 5: Install client apps - - Firezone currently uses WireGuard's [open-source client - apps](https://www.wireguard.com/install). - + +open-source client apps. +`} +/> Once successfully deployed, users and devices can be added to connect to the VPN server: diff --git a/website/src/app/docs/deploy/omnibus/readme.mdx b/website/src/app/docs/deploy/omnibus/readme.mdx index 675ada405..5429ed8e6 100644 --- a/website/src/app/docs/deploy/omnibus/readme.mdx +++ b/website/src/app/docs/deploy/omnibus/readme.mdx @@ -4,14 +4,15 @@ import SupportOptions from "@/components/SupportOptions"; # Install Firezone with Omnibus - +Docker deployment guide to get started. Read below to continue with an Omnibus-based deployment. - - +`} +/> Firezone can be deployed on a server running a supported [Linux distribution ](/docs/deploy/omnibus/supported-platforms) in a few minutes @@ -29,18 +30,24 @@ to get started. - `443/tcp`: To access the web UI. - `51820/udp`: VPN traffic listen port. - - Before deploying Firezone in **production**, you'll need a valid DNS record - pointing to this instance. See [Prepare to - Deploy](/docs/deploy/#prepare-to-deploy) if you haven't done this already. - +production, you'll need a valid DNS +record pointing to this instance. See +Prepare to Deploy if you haven't done this already. +`} +/> - - Firezone modifies the kernel netfilter and routing tables. Other programs that - modify the Linux routing table or firewall may interfere with Firezone’s - operation. For help troubleshooting connectivity issues, see the - [troubleshooting guide](/docs/administer/troubleshoot). - +troubleshooting guide. +`} +/> ## Step 2: Install server diff --git a/website/src/app/docs/deploy/readme.mdx b/website/src/app/docs/deploy/readme.mdx index 9c1f1074a..908657407 100644 --- a/website/src/app/docs/deploy/readme.mdx +++ b/website/src/app/docs/deploy/readme.mdx @@ -94,12 +94,13 @@ You have two options for deploying Firezone: Docker is the easiest way to install, manage, and upgrade Firezone and is the preferred method of deployment. - - +scheduled for End-of-Life in 2024. As such, support for Omnibus-based deployments will be removed starting with Firezone 0.8. To transition to Docker from Omnibus today, follow our -[migration guide](/docs/administer/migrate). - - +migration guide. +`} +/> diff --git a/website/src/app/docs/deploy/security-considerations/readme.mdx b/website/src/app/docs/deploy/security-considerations/readme.mdx index 6724a7e01..53da23881 100644 --- a/website/src/app/docs/deploy/security-considerations/readme.mdx +++ b/website/src/app/docs/deploy/security-considerations/readme.mdx @@ -46,11 +46,14 @@ authentication altogether by setting deployments). Local authentication can also be disabled on the `/settings/security` page. - - Ensure you've set up a working [OIDC](/docs/authenticate/oidc) or - [SAML](/docs/authenticate/saml)-based authentication provider before disabling - the local authentication method. - +OIDC +or SAML-based authentication provider before disabling +the local authentication method. +`} +/> ## Reporting security issues diff --git a/website/src/app/docs/layout.tsx b/website/src/app/docs/layout.tsx index 6d46dff9f..c936c10d2 100644 --- a/website/src/app/docs/layout.tsx +++ b/website/src/app/docs/layout.tsx @@ -6,7 +6,7 @@ export default function Layout({ children }: { children: React.ReactNode }) {
-
+
{children}
diff --git a/website/src/app/docs/reference/configuration-file/readme.mdx b/website/src/app/docs/reference/configuration-file/readme.mdx index 8384980f5..3dc444c97 100644 --- a/website/src/app/docs/reference/configuration-file/readme.mdx +++ b/website/src/app/docs/reference/configuration-file/readme.mdx @@ -2,11 +2,14 @@ import Alert from "@/components/DocsAlert"; # Omnibus configuration options - + + Docker-based deployments visit the + Environment Variables page. + `} +/> To configure Omnibus-based deployments of Firezone: diff --git a/website/src/app/docs/reference/rest-api/readme.mdx b/website/src/app/docs/reference/rest-api/readme.mdx index 00f71373f..e6ee2df3c 100644 --- a/website/src/app/docs/reference/rest-api/readme.mdx +++ b/website/src/app/docs/reference/rest-api/readme.mdx @@ -20,7 +20,10 @@ its output to a file instead: docker compose -f $HOME/.firezone/docker-compose.yml exec firezone bin/create-api-token > fz_token ``` - - API tokens generated from the CLI are owned by the primary administrator - specified by the `DEFAULT_ADMIN_EMAIL` environment variable. - +DEFAULT_ADMIN_EMAIL environment variable. +`} +/> diff --git a/website/src/app/docs/reference/telemetry/readme.mdx b/website/src/app/docs/reference/telemetry/readme.mdx index bc760df55..28c8ffba0 100644 --- a/website/src/app/docs/reference/telemetry/readme.mdx +++ b/website/src/app/docs/reference/telemetry/readme.mdx @@ -70,13 +70,16 @@ instance of Firezone to our telemetry server: ## How to disable telemetry - - We _rely_ on product analytics to make Firezone better for everyone. Leaving - telemetry enabled is the **single most valuable contribution** you can make to - Firezone’s development. That said, we understand some users have higher - privacy or security requirements and would prefer to disable telemetry - altogether. If that’s you, keep reading. - +rely on product analytics to make Firezone better for everyone. Leaving +telemetry enabled is the single most valuable contribution you can make to +Firezone’s development. That said, we understand some users have higher +privacy or security requirements and would prefer to disable telemetry +altogether. If that’s you, keep reading. +`} +/> Telemetry is enabled by default. To completely disable product telemetry: diff --git a/website/src/app/docs/user-guides/client-instructions/readme.mdx b/website/src/app/docs/user-guides/client-instructions/readme.mdx index 403aa2b41..0ef339987 100644 --- a/website/src/app/docs/user-guides/client-instructions/readme.mdx +++ b/website/src/app/docs/user-guides/client-instructions/readme.mdx @@ -32,7 +32,8 @@ To self generate a device config file, visit the domain provided by your Firezone administrator. This URL will be specific to your company (in this example it is `https://firezone.example.com`) -firezone okta sso login + ipv6.method: method "auto" is not supported for WireGuard -``` - - + +`} +/> ### Step 1: Install the WireGuard tools @@ -142,7 +148,8 @@ To self generate a device config file, visit the domain provided by your Firezone administrator. This URL will be specific to your company (in this example it is `https://firezone.example.com`) -firezone okta sso login + nmcli connection modify [old name] connection.id [new name] -``` - - + +`} +/> ### Step 4: Connect/disconnect diff --git a/website/src/app/docs/user-guides/use-cases/split-tunnel/readme.mdx b/website/src/app/docs/user-guides/use-cases/split-tunnel/readme.mdx index e3a62c1dc..8a265ccba 100644 --- a/website/src/app/docs/user-guides/use-cases/split-tunnel/readme.mdx +++ b/website/src/app/docs/user-guides/use-cases/split-tunnel/readme.mdx @@ -16,7 +16,8 @@ AllowedIPs can be set globally on the `/settings/default` page or individually for each device during creation. Changes will only apply to new WireGuard tunnel configurations generated by Firezone. -set split tunneling defaults - When deciding where to route a packet, Firezone chooses the egress interface - corresponding to the most specific route first. - + ## Step 2 (optional): Set the DNS server(s) @@ -46,10 +50,13 @@ the `/settings/default` page to override this value. For split tunneling, this may be desired if you run a DNS server that resolves internal hosts to private IPs reachable via Firezone. - + + (recommended), ensure the DNS IPs are included in AllowedIPs. + `} +/> ## Step 3: Regenerate the device configurations diff --git a/website/src/app/not-found.tsx b/website/src/app/not-found.tsx new file mode 100644 index 000000000..ea417d4bd --- /dev/null +++ b/website/src/app/not-found.tsx @@ -0,0 +1,49 @@ +import Link from "next/link"; + +export default function NotFound() { + return ( +
+
+
+

+ Page not found. +

+

+ Sorry, but the page you were looking for cannot be found. +

+

+ You can go{" "} + + back to the home page + + , the{" "} + + blog home + + , the{" "} + + docs home + + , or{" "} + + contact us + {" "} + if you're still having trouble. +

+
+
+
+ ); +} diff --git a/website/src/app/page.tsx b/website/src/app/page.tsx index d78e36058..44a678958 100644 --- a/website/src/app/page.tsx +++ b/website/src/app/page.tsx @@ -4,13 +4,13 @@ import Link from "next/link"; import Image from "next/image"; import ActionLink from "@/components/ActionLink"; import { - ArrowLongRightIcon, - CheckIcon, - HomeIcon, - RocketLaunchIcon, - WrenchScrewdriverIcon, - GlobeAltIcon, -} from "@heroicons/react/24/solid"; + HiArrowLongRight, + HiCheck, + HiHome, + HiRocketLaunch, + HiWrenchScrewdriver, + HiGlobeAlt, +} from "react-icons/hi2"; import JoinOurCommunity from "@/components/JoinOurCommunity"; export const metadata: Metadata = { @@ -21,16 +21,16 @@ export const metadata: Metadata = { export default function Page() { return ( <> -
-
-

+
+
+

Fast, effortless secure access.

-

+

Firezone is an open-source remote access platform built on WireGuard®, a modern VPN protocol that's 4-6x faster than OpenVPN. Deploy on your infrastructure and start onboarding users in minutes. -

+

@@ -58,11 +58,11 @@ export default function Page() {
-

+

Trusted by organizations like

-
+
bunq logo
-

+

A modern alternative to legacy VPNs

@@ -114,7 +114,7 @@ export default function Page() { {/* Feature section 1 */}
-

+

SIMPLE TO MANAGE

@@ -129,20 +129,20 @@ export default function Page() {

  • - - + + Integrate any identity provider to enforce 2FA / MFA
  • - - + + Define user-scoped access rules
  • - - + + Manage access with a snappy admin dashboard
  • @@ -157,8 +157,8 @@ export default function Page() {

{/* Feature section 2 */} -
-
+
+
Performance comparison of VPN solutions (Osswald et al.)
-

+

FAST AND LIGHTWEIGHT

@@ -188,8 +188,8 @@ export default function Page() {

  • - - + +
  • - - + + Auditable and{" "}
  • - - + +
    -

    +

    RUN ANYWHERE

    @@ -242,20 +242,20 @@ export default function Page() {

    • - - + + VPC, data center, or on-prem
    • - - + + Auto-renewing SSL certs from Let's Encrypt via ACME
    • - - + + Flexible and configurable
    • @@ -279,17 +279,17 @@ export default function Page() {
      -

      +

      Integrate your identity provider to enforce 2FA / MFA

      -

      +

      Only allow connections from authenticated users and automatically disable access for employees who have left. Firezone integrates with any OIDC and SAML 2.0 compatible identity provider for single sign-on (SSO).

      -
      +
      -

      +

      Who can benefit using Firezone?

      -

      +

      Easy to deploy and manage for individuals and organizations alike. Only allow connections from authenticated users and automatically disable access for employees who have left. Firezone integrates with @@ -357,8 +357,8 @@ export default function Page() {

      - -

      + +

      Individuals and homelab users

      @@ -368,26 +368,26 @@ export default function Page() {

      • - - + + Effortless to deploy on any infrastructure
      • - - + + Community plan supports unlimited devices
      • - - + + Lightweight with minimal resource usage
      • - - + + Open-source and self-hosted
      • @@ -401,8 +401,8 @@ export default function Page() {
      - -

      + +

      Growing businesses

      @@ -412,26 +412,26 @@ export default function Page() {

      • - - + + Integrate your identity provider
      • - - + + Quickly onboard/offboard employees{" "}
      • - - + + Segment access for contractors
      • - - + + High performance, reduce bottlenecks
      • @@ -445,8 +445,8 @@ export default function Page() {
      - -

      + +

      Remote organizations

      @@ -456,26 +456,26 @@ export default function Page() {

      • - - + + Require periodic re-authentication
      • - - + + Enforce MFA / 2FA
      • - - + + Self-serve user portal
      • - - + + Export logs to your observability platform
      • @@ -489,8 +489,8 @@ export default function Page() {
      - -

      + +

      Technical IT teams

      @@ -500,26 +500,26 @@ export default function Page() {

      • - - + + Built on WireGuard®
      • - - + + No vendor lock-in
      • - - + + Supports OIDC and SAML 2.0
      • - - + + Flexible and configurable
      • @@ -538,10 +538,10 @@ export default function Page() {
        -

        +

        Ready to get started?

        -

        +

        Set up secure access and start onboarding users in minutes.
        Copy and paste the command below on any Docker-supported host. @@ -552,7 +552,7 @@ export default function Page() { codeString="bash <(curl -fsSL https://github.com/firezone/firezone/raw/legacy/scripts/install.sh)" />

        -

        +

        OR

        @@ -561,7 +561,7 @@ export default function Page() { className="inline-flex shadow-lg justify-center items-center py-3 px-5 text-base font-bold text-center text-white rounded-md bg-gradient-to-br from-primary-500 to-primary-450 hover:scale-105 duration-0 transform transition" > Contact sales - +
      diff --git a/website/src/app/product/early-access/page.tsx b/website/src/app/product/early-access/page.tsx index 7afad388b..999a9a994 100644 --- a/website/src/app/product/early-access/page.tsx +++ b/website/src/app/product/early-access/page.tsx @@ -1,39 +1,40 @@ -import EarlyAccessForm from "@/components/EarlyAccessForm" -import Link from "next/link" -import Image from "next/image" -import { Metadata } from "next" -import { CheckCircleIcon } from "@heroicons/react/24/solid" -import ActionLink from "@/components/ActionLink" +import EarlyAccessForm from "@/components/EarlyAccessForm"; +import Link from "next/link"; +import Image from "next/image"; +import { Metadata } from "next"; +import { HiCheckCircle } from "react-icons/hi2"; +import ActionLink from "@/components/ActionLink"; export const metadata: Metadata = { - title: "1.0 Early Access • Firezone", - description: "Get early access to Firezone 1.0.", -} + title: "Early Access • Firezone", + description: + "Register for early access to try new Firezone features before they're released.", +}; export default function EarlyAccess() { return ( -
      +
      -
      -
      -
      -

      +
      +
      +
      +

      Request early access

      -

      - Firezone 1.0 is coming! - Sign up below to get early access. -

      - {/* FIXME: Remove when announced -

      +

      + Firezone 1.0 is coming! + + Sign up below to get early access. + +

      +

      Read the announcement

      - */}
      @@ -61,25 +62,25 @@ export default function EarlyAccess() {
      -

      +

      1.0 Timeline

      1. -
        +
        1
        -
        +
        -

        +

        Announcement

        -
      2. -
        +
        2
        -
        +
        -

        +

        Beta Testing

        -
      3. -
        +
        3
        -
        +
        -

        +

        Public Release

        -
        @@ -126,7 +127,7 @@ export default function EarlyAccess() {
      -

      +

      Join our early access program

      @@ -134,5 +135,5 @@ export default function EarlyAccess() {
      - ) + ); } diff --git a/website/src/app/product/newsletter/_page.tsx b/website/src/app/product/newsletter/_page.tsx new file mode 100644 index 000000000..1fa1decb1 --- /dev/null +++ b/website/src/app/product/newsletter/_page.tsx @@ -0,0 +1,20 @@ +import NewsletterSignup from "@/components/NewsletterSignup"; + +export default function Page() { + return ( +
      +
      +
      +

      + Firezone Newsletter +

      +

      + Sign up with your email to receive roadmap updates, how-to guides, + and product announcements from the Firezone team. +

      +
      + +
      +
      + ); +} diff --git a/website/src/app/product/newsletter/page.tsx b/website/src/app/product/newsletter/page.tsx index 7d7e1062b..189622358 100644 --- a/website/src/app/product/newsletter/page.tsx +++ b/website/src/app/product/newsletter/page.tsx @@ -1,20 +1,10 @@ -import NewsletterSignup from "@/components/NewsletterSignup"; +import { Metadata } from "next"; +import Page from "./_page"; -export default function Page() { - return ( -
      -
      -
      -

      - Firezone Newsletter -

      -

      - Sign up with your email to receive roadmap updates, how-tos, and - product announcements from the Firezone team. -

      -
      - -
      -
      - ); -} +export const metadata: Metadata = { + title: "Newsletter Signup • Firezone", + description: + "Sign up to receive roadmap updates, how-to guides, and product announcements from the Firezone team.", +}; + +export default Page; diff --git a/website/src/app/product/roadmap/_page.tsx b/website/src/app/product/roadmap/_page.tsx new file mode 100644 index 000000000..52a619a1d --- /dev/null +++ b/website/src/app/product/roadmap/_page.tsx @@ -0,0 +1,370 @@ +"use client"; + +import { Metadata } from "next"; +import Link from "next/link"; +import CommitMarquee from "@/components/CommitMarquee"; +import ActionLink from "@/components/ActionLink"; +import JoinOurCommunity from "@/components/JoinOurCommunity"; +import { HiMegaphone, HiBeaker } from "react-icons/hi2"; +import { XMLParser } from "fast-xml-parser"; +import { useState, useEffect } from "react"; +import GitHubHtml from "@/components/GitHubHtml"; + +export const metadata: Metadata = { + title: "Product Roadmap • Firezone", + description: "Recently shipped, in progress, and future updates to Firezone.", +}; + +function RoadmapItem({ + title, + href, + type, + date, + entryId, + children, +}: { + href: string; + title: string; + type: string; + date?: string; + entryId?: string; + children: React.ReactNode; +}) { + function badge(type: string) { + switch (type) { + case "release": + return ( + + {type} + + ); + case "1.0": + case "feature": + return ( + + {type} + + ); + case "refactor": + case "website": + return ( + + {type} + + ); + case "docs": + return ( + + {type} + + ); + } + } + return ( +
    • +
      + + {title} + +
      +
      {children}
      +
      + {date ? ( + + {new Date(date!).toDateString()} + + ) : ( + + )} + {badge(type)} +
      +
    • + ); +} + +export default function Page() { + const parser = new XMLParser({ ignoreAttributes: false }); + const [xml, setXml] = useState({ feed: { entry: [] } }); + + useEffect(() => { + fetch("/api/github/firezone/firezone/releases.atom") + .then((response) => response.text()) + .then((str) => parser.parse(str)) + .then((data) => { + setXml(data); + }) + .catch((error) => console.error(error)); + }, []); + + return ( +
      +
      +
      +

      + Product Roadmap +

      +

      + Take a peek below to learn what we're working on and how you can get + involved. +

      +
      + +
      +
      +

      + Shipped +

      +

      + Updates we've recently shipped. +

      +
      +

      + Recent Releases +

      +
        + {xml.feed.entry.slice(0, 3).map((entry: any) => { + return ( + + + + ); + })} +
      +
      + {/* TODO: Consider automating this with the GitHub API */} +
      +

      + Website / Docs +

      +
        + + We've added a new{" "} + + early access page + {" "} + to allow users to sign up to test new Firezone features and + releases. + + + A new{" "} + + team page + {" "} + has been added to showcase the team behind Firezone. + + + Our website now sports a new color palette, font, and spacing + consistent with the Firezone product. + +
      +
      +
      +
      +

      + In progress +

      +

      + Things we're actively working on and plan to ship in the next + release or two. +

      +
      +
      + + + Sign up for early access + {" "} + to test new Firezone features and releases. +
      +

      + Firezone 1.0 +

      +
        + + Automated user and group provisioning via just-in-time (JIT) + provisioning or SCIM 2.0. + + + More robust support for SAML 2.0, OIDC, and magic link + authentication methods. + + + Control access to protected Resources on a per-group basis. + + + Native Firezone client for macOS and iOS. + + + Automatic holepunching and STUN/TURN discovery for Clients and + Gateways. + + + Resolve DNS queries for protected Resources using Firezone's + built-in DNS while forwarding other queries to a configurable + upstream DNS server. + + + Native Firezone client for Android. + + + Support for High availability (HA) deployments of the Firezone + Gateway. + +
      +
      +
      +
      +

      + Under consideration +

      +

      + Things we're still investigating, architecting, or in the process + of prioritizing.{" "} + (feedback welcome!) +

      +
        + + Native Firezone client for Windows. + + + Support for service accounts to allow automated access to + protected Resources. Requires headless clients for + Linux/Windows. + + + Native Firezone client for Linux. + + + Log admin portal configuration changes and end-user access to + protected Resources to achieve compliance with regulatory + requirements. + +
      +
      +
      +
      +
      +
      +
      + + Want to stay updated on our progress? +
      +
      + + Subscribe to our newsletter. + +
      +
      +
      +
      +

      + We're building Firezone{" "} + in the open. +

      +

      + We're open source because we believe better transparency leads + to better security. After all, how can you trust what you can't + see? +

      +

      + + See what we're working on + + . +

      + +
      + + +
      + ); +} diff --git a/website/src/app/product/roadmap/page.tsx b/website/src/app/product/roadmap/page.tsx index ed3cdcb0b..950b199fb 100644 --- a/website/src/app/product/roadmap/page.tsx +++ b/website/src/app/product/roadmap/page.tsx @@ -1,360 +1,9 @@ -"use client"; +import { Metadata } from "next"; +import Page from "./_page"; -import Link from "next/link"; -import CommitMarquee from "@/components/CommitMarquee"; -import ActionLink from "@/components/ActionLink"; -import JoinOurCommunity from "@/components/JoinOurCommunity"; -import { MegaphoneIcon, BeakerIcon } from "@heroicons/react/24/solid"; -import { XMLParser } from "fast-xml-parser"; -import { useState, useEffect } from "react"; -import GitHubHtml from "@/components/GitHubHtml"; +export const metadata: Metadata = { + title: "Product Roadmap • Firezone", + description: "See what we're working on and what's coming next.", +}; -function RoadmapItem({ - title, - href, - type, - date, - entryId, - children, -}: { - href: string; - title: string; - type: string; - date?: string; - entryId?: string; - children: React.ReactNode; -}) { - function badge(type: string) { - switch (type) { - case "release": - return ( - - {type} - - ); - case "1.0": - case "feature": - return ( - - {type} - - ); - case "refactor": - case "website": - return ( - - {type} - - ); - case "docs": - return ( - - {type} - - ); - } - } - return ( -
    • -
      - - {title} - -
      -
      {children}
      -
      - {date ? ( - - {new Date(date!).toDateString()} - - ) : ( - - )} - {badge(type)} -
      -
    • - ); -} - -export default function Page() { - const parser = new XMLParser({ ignoreAttributes: false }); - const [xml, setXml] = useState({ feed: { entry: [] } }); - - useEffect(() => { - fetch("/api/github/firezone/firezone/releases.atom") - .then((response) => response.text()) - .then((str) => parser.parse(str)) - .then((data) => { - setXml(data); - }) - .catch((error) => console.error(error)); - }, []); - - return ( -
      -
      -
      -

      - Product Roadmap -

      -

      - Take a peek below to learn what we're working on and how you can get - involved. -

      -
      - -
      -
      -

      - Shipped -

      -

      - Updates we've recently shipped. -

      -
      -

      - Recent Releases -

      -
        - {xml.feed.entry.slice(0, 3).map((entry: any) => { - return ( - - - - ); - })} -
      -
      - {/* TODO: Consider automating this with the GitHub API */} -
      -

      - Website / Docs -

      -
        - - We've added a new{" "} - - early access page - {" "} - to allow users to sign up to test new Firezone features and - releases. - - - A new{" "} - - team page - {" "} - has been added to showcase the team behind Firezone. - - - Our website now sports a new color palette, font, and spacing - consistent with the Firezone product. - -
      -
      -
      -
      -

      - In progress -

      -

      - Things we're actively working on and plan to ship in the next - release or two. -

      -
      -
      - - - Sign up for early access - {" "} - to test new Firezone features and releases. -
      -

      - Firezone 1.0 -

      -
        - - Automated user and group provisioning via just-in-time (JIT) - provisioning or SCIM 2.0. - - - More robust support for SAML 2.0, OIDC, and magic link - authentication methods. - - - Control access to protected Resources on a per-group basis. - - - Native Firezone client for macOS and iOS. - - - Automatic holepunching and STUN/TURN discovery for Clients and - Gateways. - - - Resolve DNS queries for protected Resources using Firezone's - built-in DNS while forwarding other queries to a configurable - upstream DNS server. - - - Native Firezone client for Android. - - - Support for High availability (HA) deployments of the Firezone - Gateway. - -
      -
      -
      -
      -

      - Under consideration -

      -

      - Things we're still investigating, architecting, or in the process - of prioritizing.{" "} - (feedback welcome!) -

      -
        - - Native Firezone client for Windows. - - - Support for service accounts to allow automated access to - protected Resources. Requires headless clients for - Linux/Windows. - - - Native Firezone client for Linux. - - - Log admin portal configuration changes and end-user access to - protected Resources to achieve compliance with regulatory - requirements. - -
      -
      -
      -
      -
      - - Want to stay updated on our progress? - - - Subscribe to our newsletter. - - -
      -
      -

      - We're building Firezone{" "} - in the open. -

      -

      - We're open source because we believe better transparency leads - to better security. After all, how can you trust what you can't - see? -

      -

      - - See what we're working on - - . -

      - -
      - - -
      - ); -} +export default Page; diff --git a/website/src/app/team/page.tsx b/website/src/app/team/page.tsx index 8307b98ed..f1e374e7d 100644 --- a/website/src/app/team/page.tsx +++ b/website/src/app/team/page.tsx @@ -28,10 +28,10 @@ function renderTeamMember({ alt={`{name} Avatar`} />
      -

      +

      {name}

      - {title} + {title}
        {twitterUrl && (
      • @@ -122,10 +122,10 @@ export default function Page() { ]; return ( -
        +
        -
        -

        +
        +

        People are everything.

        @@ -135,22 +135,22 @@ export default function Page() { tools they need to succeed.

        -
        -

        +
        +

        CORE TEAM

        -
        +
        {coreTeam.map((person) => { return renderTeamMember(person); })}
        -
        -

        +
        +

        ADVISORS & CONSULTANTS

        -
        +
        {advisors.map((person) => { return renderTeamMember(person); })} diff --git a/website/src/components/ActionLink/index.tsx b/website/src/components/ActionLink/index.tsx index 952b899b0..891765875 100644 --- a/website/src/components/ActionLink/index.tsx +++ b/website/src/components/ActionLink/index.tsx @@ -1,5 +1,5 @@ import Link from "next/link"; -import { ArrowLongRightIcon } from "@heroicons/react/24/solid"; +import { HiArrowLongRight } from "react-icons/hi2"; export default function ActionLink({ children, @@ -13,7 +13,7 @@ export default function ActionLink({ return ( {children} - + ); } diff --git a/website/src/components/Banner/index.tsx b/website/src/components/Banner/index.tsx index 16a1db1eb..3fbd81596 100644 --- a/website/src/components/Banner/index.tsx +++ b/website/src/components/Banner/index.tsx @@ -1,5 +1,5 @@ "use client"; -import { XMarkIcon } from "@heroicons/react/20/solid"; +import { HiXMark } from "react-icons/hi2"; import { useEffect } from "react"; import { initFlowbite } from "flowbite"; @@ -26,16 +26,16 @@ export default function Banner({ tabIndex={-1} className={ position + - " flex top-14 z-30 gap-8 justify-between items-start py-2 px-4 w-full bg-primary-450 shadow-lg sm:items-center dark:border-neutral-700 dark:bg-neutral-800" + " flex top-14 z-30 gap-8 justify-between items-start py-2 px-4 w-full bg-primary-450 shadow-lg sm:items-center " } > {children}
        ); diff --git a/website/src/components/Blog/Post/index.tsx b/website/src/components/Blog/Post/index.tsx index 9eafd32f5..157929e7a 100644 --- a/website/src/components/Blog/Post/index.tsx +++ b/website/src/components/Blog/Post/index.tsx @@ -17,12 +17,12 @@ export default function Post({ children: React.ReactNode; }) { return ( -
        +
        -
        +
        -
        +
        {authorName} -

        - {authorTitle} -

        -

        +

        {authorTitle}

        +

        @@ -49,11 +47,11 @@ export default function Post({

        -

        +

        {title}

        - {children} +
        {children}
        diff --git a/website/src/components/Blog/SummaryCard/index.tsx b/website/src/components/Blog/SummaryCard/index.tsx new file mode 100644 index 000000000..60254bb87 --- /dev/null +++ b/website/src/components/Blog/SummaryCard/index.tsx @@ -0,0 +1,55 @@ +import ActionLink from "@/components/ActionLink"; +import Link from "next/link"; + +import Image from "next/image"; + +export default function SummaryCard({ + children, + date, + href, + title, + authorName, + authorAvatarSrc, + type, +}: { + children: React.ReactNode; + date: string; + href: string; + title: string; + authorName: string; + authorAvatarSrc: string; + type: string; +}) { + return ( +
        +
        + + {type.toUpperCase()} + + {date} +
        +

        + {title} +

        +
        {children}
        +
        +
        + {authorName + {authorName} +
        + + Read more + +
        +
        + ); +} diff --git a/website/src/components/CommitMarquee/index.tsx b/website/src/components/CommitMarquee/index.tsx index d4fa19400..d8bf2d1b6 100644 --- a/website/src/components/CommitMarquee/index.tsx +++ b/website/src/components/CommitMarquee/index.tsx @@ -36,7 +36,7 @@ export default function CommitMarquee({ xmlFeed }: { xmlFeed: string }) { key={entry.id} className="text-center w-64 h-full items-top mx-2 py-2 px-2" > -

        +

        diff --git a/website/src/components/DocsAlert/index.tsx b/website/src/components/DocsAlert/index.tsx index 8e5794eee..be8a06cb6 100644 --- a/website/src/components/DocsAlert/index.tsx +++ b/website/src/components/DocsAlert/index.tsx @@ -1,54 +1,50 @@ "use client"; -import { Alert as FlowbiteAlert } from "flowbite-react"; import { - InformationCircleIcon, - ExclamationCircleIcon, - ExclamationTriangleIcon, -} from "@heroicons/react/24/outline"; + HiOutlineInformationCircle, + HiOutlineExclamationCircle, + HiOutlineExclamationTriangle, +} from "react-icons/hi2"; -function icon(color: string) { +export default function Alert({ + html, + color, +}: { + html: string; + color: string; +}) { switch (color) { case "info": return ( - - - INFO - +
        + + {/* ReactMarkdown wraps this in a

        tag if we wrap {children} as ReactNode, so we need to use string here instead. */} + +

        ); case "warning": return ( - - - WARNING - +
        + + {/* ReactMarkdown wraps this in a

        tag if we wrap {children} as ReactNode, so we need to use string here instead. */} + +

        ); case "danger": return ( - - - DANGER - +
        + + {/* ReactMarkdown wraps this in a

        tag if we wrap {children} as ReactNode, so we need to use string here instead. */} + +

        ); - default: - return null; } } - -export default function Alert({ - children, - color, -}: { - children: React.ReactNode; - color: string; -}) { - return ( -
        - - - {icon(color)} - {children} - - -
        - ); -} diff --git a/website/src/components/DocsSidebar/Collapse.tsx b/website/src/components/DocsSidebar/Collapse.tsx index 7b9882fd9..eeed96e5a 100644 --- a/website/src/components/DocsSidebar/Collapse.tsx +++ b/website/src/components/DocsSidebar/Collapse.tsx @@ -1,4 +1,4 @@ -import { ChevronRightIcon, ChevronDownIcon } from "@heroicons/react/20/solid"; +import { HiChevronRight, HiChevronDown } from "react-icons/hi2"; import { useState } from "react"; export default function Collapse({ @@ -13,9 +13,7 @@ export default function Collapse({ const ctl = label.toLowerCase().replace(" ", "-") + "-dropdown"; const indent = "ml-3"; const hidden = expanded ? "" : "hidden"; - const text = expanded - ? "bg-neutral-100 dark:bg-neutral-700" - : "text-neutral-900 dark:text-white"; + const text = expanded ? "bg-neutral-100 " : "text-neutral-900 "; const [expandedState, setExpandedState] = useState(expanded); return ( @@ -24,7 +22,7 @@ export default function Collapse({ type="button" className={ text + - " flex items-center w-full transition duration-75 rounded-lg group hover:bg-neutral-100 dark:hover:bg-neutral-700" + " flex items-center w-full transition duration-75 rounded-lg group hover:bg-neutral-100 " } aria-controls={ctl} data-collapse-toggle={ctl} @@ -37,9 +35,9 @@ export default function Collapse({ {label} {expandedState ? ( - + ) : ( - + )}
          diff --git a/website/src/components/DocsSidebar/Item.tsx b/website/src/components/DocsSidebar/Item.tsx index 84cf7cd11..9332ba39d 100644 --- a/website/src/components/DocsSidebar/Item.tsx +++ b/website/src/components/DocsSidebar/Item.tsx @@ -5,7 +5,7 @@ export default function Item({ href, label }: { href: string; label: string }) { const p = usePathname(); function active(path: string) { - return p == path ? "bg-neutral-100 dark:bg-neutral-700 " : ""; + return p == path ? "bg-neutral-100 " : ""; } return ( @@ -13,7 +13,7 @@ export default function Item({ href, label }: { href: string; label: string }) { href={href} className={[ active(href), - "flex items-center text-left rounded-lg text-base font-normal text-neutral-900 hover:bg-neutral-100 dark:text-white dark:hover:bg-neutral-700", + "flex items-center text-left rounded-lg text-base font-normal text-neutral-900 hover:bg-neutral-100 ", ].join(" ")} > {label} diff --git a/website/src/components/DocsSidebar/SearchForm.tsx b/website/src/components/DocsSidebar/SearchForm.tsx index 251a9ab30..9655e7b00 100644 --- a/website/src/components/DocsSidebar/SearchForm.tsx +++ b/website/src/components/DocsSidebar/SearchForm.tsx @@ -3,7 +3,7 @@ import "@docsearch/css"; export default function SearchForm() { return ( -
          +