From 504d118539866a0698a87efe37f856dee4e75fd8 Mon Sep 17 00:00:00 2001 From: Jamil Date: Mon, 17 Jul 2023 15:48:35 -0700 Subject: [PATCH] Announce 1.0 early access (#1791) - Add 1.0 blogpost - Update font to `Public Sans` since it has all weights and offers better readability - Various layout/style fixes - Disable kotlin draft release job --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrew Dryga --- .github/workflows/kotlin-pass-checks.yml | 4 - .pre-commit-config.yaml | 3 + .prettierrc.json | 3 +- README.md | 4 +- website/package.json | 16 +- website/pnpm-lock.yaml | 949 +++++++++--------- website/public/images/firewall-block.svg | 27 + website/public/images/firezone-1.0.svg | 39 + .../public/images/logo-main-light-primary.svg | 5 + website/public/images/nostalgia-show-hn.png | Bin 0 -> 53933 bytes website/public/images/stateful-firewall.svg | 37 + website/public/images/wai-7-2-23.png | Bin 0 -> 57422 bytes website/src/app/blog/firezone-1-0/page.tsx | 23 + website/src/app/blog/firezone-1-0/readme.mdx | 245 +++++ website/src/app/blog/layout.tsx | 23 +- website/src/app/blog/page.tsx | 170 ++-- .../src/app/docs/administer/backup/readme.mdx | 11 +- .../app/docs/administer/debug-logs/readme.mdx | 9 +- .../app/docs/administer/regen-keys/readme.mdx | 34 +- .../app/docs/administer/uninstall/readme.mdx | 9 +- .../app/docs/administer/upgrade/readme.mdx | 13 +- .../docs/authenticate/local-auth/readme.mdx | 19 +- website/src/app/docs/authenticate/readme.mdx | 14 +- .../authenticate/saml/jumpcloud/readme.mdx | 19 +- .../docs/authenticate/saml/okta/readme.mdx | 19 +- .../authenticate/saml/onelogin/readme.mdx | 19 +- .../advanced/build-from-source/readme.mdx | 74 +- .../advanced/external-database/readme.mdx | 28 +- .../deploy/advanced/reverse-proxy/readme.mdx | 45 +- website/src/app/docs/deploy/docker/readme.mdx | 24 +- .../src/app/docs/deploy/omnibus/readme.mdx | 39 +- website/src/app/docs/deploy/readme.mdx | 13 +- .../deploy/security-considerations/readme.mdx | 13 +- website/src/app/docs/layout.tsx | 2 +- .../reference/configuration-file/readme.mdx | 11 +- .../app/docs/reference/rest-api/readme.mdx | 11 +- .../app/docs/reference/telemetry/readme.mdx | 17 +- .../client-instructions/readme.mdx | 44 +- .../use-cases/split-tunnel/readme.mdx | 23 +- website/src/app/not-found.tsx | 49 + website/src/app/page.tsx | 178 ++-- website/src/app/product/early-access/page.tsx | 83 +- website/src/app/product/newsletter/_page.tsx | 20 + website/src/app/product/newsletter/page.tsx | 28 +- website/src/app/product/roadmap/_page.tsx | 370 +++++++ website/src/app/product/roadmap/page.tsx | 365 +------ website/src/app/team/page.tsx | 22 +- website/src/components/ActionLink/index.tsx | 4 +- website/src/components/Banner/index.tsx | 8 +- website/src/components/Blog/Post/index.tsx | 18 +- .../src/components/Blog/SummaryCard/index.tsx | 55 + .../src/components/CommitMarquee/index.tsx | 2 +- website/src/components/DeployButton/index.tsx | 2 +- website/src/components/DocsAlert/index.tsx | 74 +- .../src/components/DocsSidebar/Collapse.tsx | 12 +- website/src/components/DocsSidebar/Item.tsx | 4 +- .../src/components/DocsSidebar/SearchForm.tsx | 2 +- website/src/components/DocsSidebar/index.tsx | 4 +- .../src/components/EarlyAccessForm/index.tsx | 19 +- website/src/components/Footer/index.tsx | 23 +- website/src/components/HubspotForm/index.tsx | 4 +- website/src/components/Icons/index.tsx | 6 +- .../src/components/JoinOurCommunity/index.tsx | 22 +- website/src/components/RootLayout/index.tsx | 20 +- .../components/RootNavbar/SidebarToggle.tsx | 2 +- website/src/components/RootNavbar/index.tsx | 25 +- .../src/components/SalesLeadForm/index.tsx | 18 +- website/src/pages/404.tsx | 28 - website/src/pages/500.tsx | 19 - website/src/pages/_error.tsx | 16 - website/tailwind.config.js | 4 +- 71 files changed, 2031 insertions(+), 1533 deletions(-) create mode 100644 website/public/images/firewall-block.svg create mode 100644 website/public/images/firezone-1.0.svg create mode 100644 website/public/images/logo-main-light-primary.svg create mode 100644 website/public/images/nostalgia-show-hn.png create mode 100644 website/public/images/stateful-firewall.svg create mode 100644 website/public/images/wai-7-2-23.png create mode 100644 website/src/app/blog/firezone-1-0/page.tsx create mode 100644 website/src/app/blog/firezone-1-0/readme.mdx create mode 100644 website/src/app/not-found.tsx create mode 100644 website/src/app/product/newsletter/_page.tsx create mode 100644 website/src/app/product/roadmap/_page.tsx create mode 100644 website/src/components/Blog/SummaryCard/index.tsx delete mode 100644 website/src/pages/404.tsx delete mode 100644 website/src/pages/500.tsx delete mode 100644 website/src/pages/_error.tsx 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 0000000000000000000000000000000000000000..8417153362bc6c843434d2cd45f77c543b3bffac GIT binary patch literal 53933 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

*=><9{klB3eiT7r3*ii8q)yA^ z0}l_%bb_AxyL~U(7;C@&dRTiC=G(~;>B<*Za3>A^n#KLN8~2WJce0=?pxr3&%KCFW z^{$GS-=Lon4HI(@oqQ3tP(F*;>-EmHE0=(IS2>1Gll^LfVqM8z-pG`Kzq1X&q$dYo=tX6BSYi2=f-tV3tX#&6x?}CMGIvw18 zn7#WFI9Bufi=N=X#)W!w7Nbp$^9vr?1@p zk<MY6EL3fLv;Arj$jBYQ=YGo^-|ZebmDNS`2DZ(35$VH_8ed$*DeX=QW;LHV z6e4whUv4-txIL_i6*`(JFgy84tod;wtx3>_Z+DDAfF)yoN10;2@->RPlV*+m6q{b_ zd&aIL^W)`~$X{dPwMq@hux~?ro*mOZA773CSg&mFdIS;{$z|N%IUo=HBMS-s4pBX? zvS(dmAO@tK(>*F%A4**>baIsnLL0{c%d-iv-gr|aMf_Y|3?^2n{v9SLIh!|B$71h)qXeNRk^7zderEl7zfVPJnR5R3^E%;Qlj&|VKA%=o**u07&d=A{ zHiG3%E!Kv*kA?_QP$Td;m@^QPIuH6o;gHi9wHiRDKbV#WvN&oJZy0IbP_eF3L^RO9oV!cO0=aQhF@nH};fOScW?3Do)kdKrXObajlVRa}RH>sNAZpWsYd}z3{scUxx!%1r(>WiJi zKdeFU5xrQo>~~D_Qr!U_cs@fcEHN3GPN#kGR`Z?7bP}|4;E(cy?Y__Y;Q7vSd&xAb zNP{^-c2tkDby^X0kkRyAaaEi5R>4qtCTGs;K|83R>(7dXGSGn9 z65+%&^N4&MbmM$=**78cI;p1XsmyA*1ft#Rb1+*;B`w+y?BddS!m2PGV0$$k26b4H-S=(hF^WczXZ zawd=Kd~#u!oZ%3msnrpsWnrR(MwB$~qh#Hvm_>LQ;~rh8Paz7vD z$qxh(azDd;!lFgj_2!eIzVGFWddp|f?QA!SS5?*_h*l;vPTL z1#J8RYV)}JSwqsut0eQ&$}{15#d-%AHwb)tBnydH6tM|ze>#}-|Ko2qv7bt^`PgTutoC1fcB(`v%cp) z+XG|65Ugr;p@z!Vm0Pa1Vc^=YjW@m*<@pD#QzYiXruGA9K*l z(&Bs=BB6YARO?yMJzALto{B*05^OCDk5KA-G9P1mNU)oCF5YhI@pNsRTKSr_*kGBo zakbf*92q2Ln|Ü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%0AXsIi!aT=RACBibV82Q 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 + + + + 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 0000000000000000000000000000000000000000..e1f2ef11ae7380b55ab17d01d3b7fdbbf0253c11 GIT binary patch literal 57422 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

F5glP?dKE;yfQK4E$J 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


0oGms(t1RBw6|g#bJniyAhPDtljPiHe7`!v&pS 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 Q#yp(G#L&W^LeC}YFS^s(oB#j- literal 0 HcmV?d00001 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 ( -
          +