diff --git a/docs/oel/getting-started/index.mdx b/docs/oel/getting-started/index.mdx index 13531e04f..8b4056f63 100644 --- a/docs/oel/getting-started/index.mdx +++ b/docs/oel/getting-started/index.mdx @@ -64,4 +64,4 @@ All Ory Enterprise builds share common advantages over their open-source counter The Ory Enterprise License is leveraged by organizations requiring robust and scalable identity infrastructure. For instance, OpenAI utilizes the Ory Enterprise License with Ory Hydra Enterprise to manage authentication for its 400 million weekly active users, ensuring reliability, massive scale, and uninterrupted service. Read more about -[OpenAI's use of Ory](https://www.ory.com/case-studies/openai). \ No newline at end of file +[OpenAI's use of Ory](https://www.ory.com/case-studies/openai). diff --git a/docs/oss/index.md b/docs/oss/index.md index 702b26be3..ad78d74cc 100644 --- a/docs/oss/index.md +++ b/docs/oss/index.md @@ -1,4 +1,4 @@ --- title: Ory Open Source hide_title: true ---- \ No newline at end of file +--- diff --git a/docs/oss/telemetry.mdx b/docs/oss/telemetry.mdx index a2965ed7f..bf0da68d2 100644 --- a/docs/oss/telemetry.mdx +++ b/docs/oss/telemetry.mdx @@ -3,8 +3,8 @@ id: telemetry title: Product telemetry and privacy --- -To continuously improve reliability and performance, Ory collects a limited set of fully anonymized product telemetry. This -page documents the data collected, its purpose, and the privacy protections applied. +To continuously improve reliability and performance, Ory collects a limited set of fully anonymized product telemetry. This page +documents the data collected, its purpose, and the privacy protections applied. Our goal is to provide you with the fastest and most reliable open source services. To achieve this goal, we collect metrics on endpoint performance and send a **fully anonymized** telemetry report ("anonymous usage statistics") to our servers. This data diff --git a/docs/products/overview.mdx b/docs/products/overview.mdx index fafb25574..fe306a4bd 100644 --- a/docs/products/overview.mdx +++ b/docs/products/overview.mdx @@ -22,53 +22,59 @@ import * as welcomeContent from "@site/src/pages/_assets/welcome-content" ## Authentication -Kratos — fully standalone. Handles the complete identity lifecycle (registration, login, recovery, MFA, profile management) without dependencies. +Kratos — fully standalone. Handles the complete identity lifecycle (registration, login, recovery, MFA, profile management) +without dependencies. ## Authorization -Hydra — needs an identity provider. It's deliberately "headless"—it issues OAuth tokens but doesn't manage users. It asks "who is this user?" and needs Kratos (or another IdP) to answer. +Hydra — needs an identity provider. It's deliberately "headless"—it issues OAuth tokens but doesn't manage users. It asks "who is +this user?" and needs Kratos (or another IdP) to answer. -Keto — needs an identity provider. It answers "can this subject do this action?" but needs something upstream to authenticate who the subject is. +Keto — needs an identity provider. It answers "can this subject do this action?" but needs something upstream to authenticate who +the subject is. ## Authentication & Authorization -Kratos + Keto — when you need authentication and fine-grained permissions within your own application(s). Users log in via Kratos, and Keto controls what they can access internally. +Kratos + Keto — when you need authentication and fine-grained permissions within your own application(s). Users log in via Kratos, +and Keto controls what they can access internally. -Kratos + Hydra — when you need authentication plus OAuth 2.0/OIDC capabilities: SSO across multiple apps, third-party integrations, or federating identity to external services. +Kratos + Hydra — when you need authentication plus OAuth 2.0/OIDC capabilities: SSO across multiple apps, third-party +integrations, or federating identity to external services. Kratos + Hydra + Keto — when you need all three: user login, token issuance/SSO, and fine-grained permissions. The choice depends on whether you're solving for internal permissions vs. external/delegated access. -```mermaid +````mermaid flowchart TD Start([What are you building?]) --> Q1{Need to manage
user identities?} - + Q1 -->|Yes| Kratos[✓ Kratos] Q1 -->|No, using existing IdP| ExternalIdP[Use your existing IdP] - + Kratos --> Q2{Need B2B features?
Organizations, teams,
org-level SSO?} ExternalIdP --> Q3 - + Q2 -->|Yes| Polis[✓ Add Polis] Q2 -->|No| Q3 Polis --> Q3 - + Q3{Need SSO across apps
or third-party integrations?} - + Q3 -->|Yes| Hydra[✓ Add Hydra] Q3 -->|No| Q4 Hydra --> Q4 - + Q4{Need fine-grained
permissions?
e.g. can user X edit doc Y} - + Q4 -->|Yes| Keto[✓ Add Keto] Q4 -->|No| Q5 Keto --> Q5 - + Q5{Microservices or
zero-trust architecture?} - + Q5 -->|Yes| Oathkeeper[✓ Add Oathkeeper] Q5 -->|No| Done([Your stack is ready]) Oathkeeper --> Done ``` +```` diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 29452a7a5..42689ad39 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -93,7 +93,7 @@ const config: Config = { copyright: `Copyright © ${new Date().getFullYear()} Ory Corp`, links: [ { - label: "Need Support?", + label: "Support?", href: "https://www.ory.com/support", }, { diff --git a/sidebars-network.ts b/sidebars-network.ts index a06104a4c..065be70a1 100644 --- a/sidebars-network.ts +++ b/sidebars-network.ts @@ -42,9 +42,7 @@ const networkSidebar = [ link: { type: "generated-index", }, - items: [ - "identities/get-started/setup", - ], + items: ["identities/get-started/setup"], }, { type: "category", @@ -228,7 +226,7 @@ const networkSidebar = [ "actions/integrations/hubspot", "actions/integrations/mailchimp", "actions/integrations/segment", - ], + ], }, ], }, @@ -700,4 +698,4 @@ const networkSidebar = [ }, ] -export default networkSidebar \ No newline at end of file +export default networkSidebar diff --git a/sidebars-oel.ts b/sidebars-oel.ts index 2dafac34f..c3dad3302 100644 --- a/sidebars-oel.ts +++ b/sidebars-oel.ts @@ -18,7 +18,8 @@ const oelSidebar = [ collapsible: false, link: { type: "doc", - id: "oel/getting-started/index"}, + id: "oel/getting-started/index", + }, items: [ "oel/getting-started/index", { @@ -30,93 +31,15 @@ const oelSidebar = [ "self-hosted/oel/quickstart", "self-hosted/oel/monitoring/monitoring", "self-hosted/oel/high-performance-pooling", - ] - }, - { - type: "category", - label: "Ory Kratos Identities", - items: [ - "self-hosted/oel/kratos/upgrade", - "self-hosted/oel/kratos/changelog", - "self-hosted/oel/kratos/configuration", - "kratos/install", - "kratos/quickstart", - { - type: "category", - label: "Configuration", - items: [ - "kratos/configuring", - "kratos/guides/configuring-cookies", - "kratos/guides/multi-domain-cookies", - "self-hosted/kratos/configuration/password", - "kratos/self-hosted/mfa", - "kratos/guides/setting-up-cors", - "self-hosted/kratos/configuration/oidc", - "kratos/guides/setting-up-password-hashing-parameters", - "kratos/guides/select-cipher-algorithm", - "kratos/self-hosted/email-http", - "kratos/reference/configuration-editor", - ], - }, - { - type: "category", - label: "Guides", - items: [ - "kratos/guides/docker", - "kratos/guides/deploy-kratos-example", - "kratos/guides/upgrade", - "kratos/guides/production", - "kratos/guides/multi-tenancy-multitenant", - "self-hosted/operations/scalability", - "kratos/self-hosted/mail-courier-templates", - "kratos/guides/tracing", - "kratos/guides/zero-trust-iap-proxy-identity-access-proxy", - "kratos/guides/https-tls", - "kratos/guides/hosting-own-have-i-been-pwned-api", - "kratos/guides/secret-key-rotation", - { - type: "category", - label: "Troubleshooting", - items: [ - { - type: "autogenerated", - dirName: "kratos/debug", - }, - ], - }, ], }, { type: "category", - label: "Reference", - items: [ - "kratos/reference/api", - { - "Command Line Interface (CLI)": [ - { - type: "autogenerated", - dirName: "kratos/cli", - }, - ], - }, - { - SDK: ["kratos/sdk/overview", "kratos/self-hosted/go"], - }, - "kratos/reference/configuration", - "kratos/reference/json-schema-json-paths", - "kratos/reference/html-forms", - ], - }, - { - type: "category", - label: "Self-Hosted", - collapsed: false, - collapsible: false, - link: { - type: "doc", - id: "kratos/quickstart", - }, + label: "Ory Kratos Identities", items: [ + "self-hosted/oel/kratos/upgrade", + "self-hosted/oel/kratos/changelog", + "self-hosted/oel/kratos/configuration", "kratos/install", "kratos/quickstart", { @@ -185,219 +108,316 @@ const oelSidebar = [ "kratos/reference/html-forms", ], }, - ], - }, - ], - }, - { - type: "category", - label: "Ory Hydra OAuth2", - items: [ - "self-hosted/oel/oauth2/migrate", - "self-hosted/oel/oauth2/upgrade", - "self-hosted/oel/oauth2/changelog", - "self-hosted/oel/oauth2/token-prefix", - "self-hosted/oel/oauth2/stateless-jwt", - "self-hosted/oel/oauth2/migrate-postgresql-ttl", - "self-hosted/oel/oauth2/revert-database-migrations", - "self-hosted/oel/oauth2/configuration", - { - type: "category", - label: "Self-Hosted", - collapsed: false, - collapsible: false, - items: ["hydra/self-hosted/install", "hydra/self-hosted/quickstart"], - }, - { - type: "category", - label: "Configuration", - collapsed: false, - collapsible: false, - items: [ - "hydra/reference/configuration", - "hydra/reference/configuration-editor", - "hydra/self-hosted/configure-deploy", - "hydra/self-hosted/dependencies-environment", - "hydra/self-hosted/production", - "hydra/self-hosted/hsm-support", - "self-hosted/operations/scalability", - "hydra/self-hosted/merge-multiple-db-secrets", - "hydra/self-hosted/gitlab", - "hydra/self-hosted/secrets-key-rotation", - "hydra/self-hosted/kubernetes-helm-chart", - "hydra/self-hosted/ssl-https-tls", - "self-hosted/operations/tracing", - "hydra/guides/cookies", - "hydra/guides/cors", - "self-hosted/hydra/debug/csrf", - ], - }, - { - type: "category", - label: "Guides", - items: [ - "hydra/self-hosted/deploy-hydra-example", - "hydra/self-hosted/upgrade", - ], - }, - { - type: "category", - label: "Reference", - items: [ - "hydra/reference/api", { - "Command Line Interface (CLI)": [ + type: "category", + label: "Self-Hosted", + collapsed: false, + collapsible: false, + link: { + type: "doc", + id: "kratos/quickstart", + }, + items: [ + "kratos/install", + "kratos/quickstart", { - type: "autogenerated", - dirName: "hydra/cli", + type: "category", + label: "Configuration", + items: [ + "kratos/configuring", + "kratos/guides/configuring-cookies", + "kratos/guides/multi-domain-cookies", + "self-hosted/kratos/configuration/password", + "kratos/self-hosted/mfa", + "kratos/guides/setting-up-cors", + "self-hosted/kratos/configuration/oidc", + "kratos/guides/setting-up-password-hashing-parameters", + "kratos/guides/select-cipher-algorithm", + "kratos/self-hosted/email-http", + "kratos/reference/configuration-editor", + ], + }, + { + type: "category", + label: "Guides", + items: [ + "kratos/guides/docker", + "kratos/guides/deploy-kratos-example", + "kratos/guides/upgrade", + "kratos/guides/production", + "kratos/guides/multi-tenancy-multitenant", + "self-hosted/operations/scalability", + "kratos/self-hosted/mail-courier-templates", + "kratos/guides/tracing", + "kratos/guides/zero-trust-iap-proxy-identity-access-proxy", + "kratos/guides/https-tls", + "kratos/guides/hosting-own-have-i-been-pwned-api", + "kratos/guides/secret-key-rotation", + { + type: "category", + label: "Troubleshooting", + items: [ + { + type: "autogenerated", + dirName: "kratos/debug", + }, + ], + }, + ], + }, + { + type: "category", + label: "Reference", + items: [ + "kratos/reference/api", + { + "Command Line Interface (CLI)": [ + { + type: "autogenerated", + dirName: "kratos/cli", + }, + ], + }, + { + SDK: ["kratos/sdk/overview", "kratos/self-hosted/go"], + }, + "kratos/reference/configuration", + "kratos/reference/json-schema-json-paths", + "kratos/reference/html-forms", + ], }, - ], - }, - { - SDK: [ - "hydra/sdk/overview", - "hydra/self-hosted/go", - "hydra/self-hosted/js", ], }, ], }, - ], - }, - { - type: "category", - label: "Ory Keto Permissions", - items: [ - "self-hosted/oel/keto/changelog", - "self-hosted/oel/keto/configuration", { type: "category", - label: "Self-Hosted", - collapsed: false, - collapsible: false, + label: "Ory Hydra OAuth2", items: [ - "keto/install", - "keto/quickstart", + "self-hosted/oel/oauth2/migrate", + "self-hosted/oel/oauth2/upgrade", + "self-hosted/oel/oauth2/changelog", + "self-hosted/oel/oauth2/token-prefix", + "self-hosted/oel/oauth2/stateless-jwt", + "self-hosted/oel/oauth2/migrate-postgresql-ttl", + "self-hosted/oel/oauth2/revert-database-migrations", + "self-hosted/oel/oauth2/configuration", + { + type: "category", + label: "Self-Hosted", + collapsed: false, + collapsible: false, + items: [ + "hydra/self-hosted/install", + "hydra/self-hosted/quickstart", + ], + }, { type: "category", label: "Configuration", + collapsed: false, + collapsible: false, items: [ - "keto/reference/configuration", - "keto/reference/configuration-editor", + "hydra/reference/configuration", + "hydra/reference/configuration-editor", + "hydra/self-hosted/configure-deploy", + "hydra/self-hosted/dependencies-environment", + "hydra/self-hosted/production", + "hydra/self-hosted/hsm-support", + "self-hosted/operations/scalability", + "hydra/self-hosted/merge-multiple-db-secrets", + "hydra/self-hosted/gitlab", + "hydra/self-hosted/secrets-key-rotation", + "hydra/self-hosted/kubernetes-helm-chart", + "hydra/self-hosted/ssl-https-tls", + "self-hosted/operations/tracing", + "hydra/guides/cookies", + "hydra/guides/cors", + "self-hosted/hydra/debug/csrf", ], }, { type: "category", label: "Guides", items: [ - "keto/guides/production", - "keto/guides/v0.7-migration", - "keto/guides/migrating-legacy-policies", - "keto/guides/upgrade", + "hydra/self-hosted/deploy-hydra-example", + "hydra/self-hosted/upgrade", ], }, { - Reference: [ - "keto/reference/rest-api", - "keto/reference/proto-api", + type: "category", + label: "Reference", + items: [ + "hydra/reference/api", { "Command Line Interface (CLI)": [ { type: "autogenerated", - dirName: "keto/cli", + dirName: "hydra/cli", }, ], }, { - SDK: ["keto/sdk/overview", "keto/self-hosted/go"], + SDK: [ + "hydra/sdk/overview", + "hydra/self-hosted/go", + "hydra/self-hosted/js", + ], }, ], }, ], }, - ], - }, - { - type: "category", - label: "Ory Polis", - items: [ - "self-hosted/oel/polis/changelog", { type: "category", - label: "Ory Polis", - collapsed: true, - collapsible: true, + label: "Ory Keto Permissions", items: [ - "polis/index", - "polis/install", - "polis/quickstart", - "polis/reference/api", + "self-hosted/oel/keto/changelog", + "self-hosted/oel/keto/configuration", { type: "category", - label: "Enterprise SSO", + label: "Self-Hosted", collapsed: false, collapsible: false, - link: { - type: "doc", - id: "polis/saml-federation/index", - }, items: [ + "keto/install", + "keto/quickstart", { type: "category", - label: "Concepts", - link: { - type: "doc", - id: "polis/sso-flow/index", - }, + label: "Configuration", items: [ - "polis/sso-flow/index", - "polis/sso-flow/example-flow", - "polis/security", + "keto/reference/configuration", + "keto/reference/configuration-editor", ], }, { type: "category", - label: "Configuration", + label: "Guides", items: [ - "polis/deploy/env-variables", - "polis/guides/configuring-saml-sso", - "polis/guides/login-with-saml-sso", - "polis/deploy/pre-loaded-connections", + "keto/guides/production", + "keto/guides/v0.7-migration", + "keto/guides/migrating-legacy-policies", + "keto/guides/upgrade", ], }, + { + Reference: [ + "keto/reference/rest-api", + "keto/reference/proto-api", + { + "Command Line Interface (CLI)": [ + { + type: "autogenerated", + dirName: "keto/cli", + }, + ], + }, + { + SDK: ["keto/sdk/overview", "keto/self-hosted/go"], + }, + ], + }, + ], + }, + ], + }, + { + type: "category", + label: "Ory Polis", + items: [ + "self-hosted/oel/polis/changelog", + { + type: "category", + label: "Ory Polis", + collapsed: true, + collapsible: true, + items: [ + "polis/index", + "polis/install", + "polis/quickstart", + "polis/reference/api", { type: "category", - label: "Guides", + label: "Enterprise SSO", + collapsed: false, + collapsible: false, link: { type: "doc", - id: "polis/guides/service", + id: "polis/saml-federation/index", }, items: [ - "polis/guides/service", - "polis/guides/npm-library", - "polis/upgrade", - "polis/guides/examples", - "polis/sbom", - "polis/container-signing", - "polis/events", - "polis/observability", { type: "category", - label: "Frameworks", + label: "Concepts", + link: { + type: "doc", + id: "polis/sso-flow/index", + }, items: [ + "polis/sso-flow/index", + "polis/sso-flow/example-flow", + "polis/security", + ], + }, + { + type: "category", + label: "Configuration", + items: [ + "polis/deploy/env-variables", + "polis/guides/configuring-saml-sso", + "polis/guides/login-with-saml-sso", + "polis/deploy/pre-loaded-connections", + ], + }, + { + type: "category", + label: "Guides", + link: { + type: "doc", + id: "polis/guides/service", + }, + items: [ + "polis/guides/service", + "polis/guides/npm-library", + "polis/upgrade", + "polis/guides/examples", + "polis/sbom", + "polis/container-signing", + "polis/events", + "polis/observability", { - type: "autogenerated", - dirName: "polis/guides/frameworks", + type: "category", + label: "Frameworks", + items: [ + { + type: "autogenerated", + dirName: "polis/guides/frameworks", + }, + ], + }, + { + type: "category", + label: "Deployment", + items: [ + { + type: "autogenerated", + dirName: "polis/guides/deployment", + }, + ], }, ], }, { type: "category", - label: "Deployment", + label: "SAML SSO Providers", + link: { + type: "doc", + id: "polis/sso-providers/index", + }, items: [ { type: "autogenerated", - dirName: "polis/guides/deployment", + dirName: "polis/sso-providers", }, ], }, @@ -405,173 +425,157 @@ const oelSidebar = [ }, { type: "category", - label: "SAML SSO Providers", + label: "Directory Sync", + collapsed: false, + collapsible: false, link: { type: "doc", - id: "polis/sso-providers/index", + id: "polis/directory-sync/index", }, items: [ + "polis/directory-sync/quickstart", + "polis/directory-sync/api-reference", { - type: "autogenerated", - dirName: "polis/sso-providers", + type: "category", + label: "Guides", + collapsed: true, + link: { + type: "generated-index", + // slug: "polis/directory-sync/guides", + }, + items: [ + "polis/directory-sync/webhooks", + "polis/directory-sync/events", + "polis/directory-sync/observability", + "polis/directory-sync/examples", + "polis/directory-sync/faq", + // { + // type: "category", + // label: "Directory providers", + // link: { + // type: "generated-index", + // slug: "polis/directory-sync/providers", + // }, + // items: [ + // { + // type: "autogenerated", + // dirName: "polis/directory-sync/providers", + // }, + //], + // }, + // { + // type: "category", + // label: "Frameworks", + // items: [ + // { + // type: "autogenerated", + // dirName: "polis/directory-sync/guides", + // }, + //], + // }, + ], }, ], }, - ], - }, - { - type: "category", - label: "Directory Sync", - collapsed: false, - collapsible: false, - link: { - type: "doc", - id: "polis/directory-sync/index", - }, - items: [ - "polis/directory-sync/quickstart", - "polis/directory-sync/api-reference", { type: "category", - label: "Guides", - collapsed: true, + label: "Admin Portal", + collapsed: false, + collapsible: false, link: { - type: "generated-index", - // slug: "polis/directory-sync/guides", + type: "doc", + id: "polis/admin-portal/index", }, items: [ - "polis/directory-sync/webhooks", - "polis/directory-sync/events", - "polis/directory-sync/observability", - "polis/directory-sync/examples", - "polis/directory-sync/faq", - // { - // type: "category", - // label: "Directory providers", - // link: { - // type: "generated-index", - // slug: "polis/directory-sync/providers", - // }, - // items: [ - // { - // type: "autogenerated", - // dirName: "polis/directory-sync/providers", - // }, - //], - // }, - // { - // type: "category", - // label: "Frameworks", - // items: [ - // { - // type: "autogenerated", - // dirName: "polis/directory-sync/guides", - // }, - //], - // }, + { + type: "category", + label: "Guides", + collapsed: true, + link: { + type: "generated-index", + //slug: "polis/admin-portal/guides", + }, + items: [ + "polis/admin-portal/enterprise-sso", + "polis/admin-portal/setup-links-enterprise-sso", + "polis/admin-portal/directory-sync", + "polis/admin-portal/setup-links-directory-sync", + ], + }, ], }, ], }, + ], + }, + { + type: "category", + label: "Ory Oathkeeper Zero Trust Proxy", + collapsed: true, + collapsible: true, + items: [ + "self-hosted/oel/oathkeeper/upgrade-oathkeeper", + "self-hosted/oel/oathkeeper/changelog", + "self-hosted/oel/oathkeeper/configuration", + "oathkeeper/index", + "oathkeeper/install", + "oathkeeper/reference/api", { type: "category", - label: "Admin Portal", + label: "Concepts", collapsed: false, collapsible: false, - link: { - type: "doc", - id: "polis/admin-portal/index", - }, items: [ + "oathkeeper/api-access-rules", { type: "category", - label: "Guides", - collapsed: true, - link: { - type: "generated-index", - //slug: "polis/admin-portal/guides", - }, + label: "Handlers", items: [ - "polis/admin-portal/enterprise-sso", - "polis/admin-portal/setup-links-enterprise-sso", - "polis/admin-portal/directory-sync", - "polis/admin-portal/setup-links-directory-sync", + "oathkeeper/pipeline", + "oathkeeper/pipeline/authn", + "oathkeeper/pipeline/authz", + "oathkeeper/pipeline/mutator", + "oathkeeper/pipeline/error", ], }, + "oathkeeper/grpc-middleware", ], }, - ], - }, - ], - }, - { - type: "category", - label: "Ory Oathkeeper Zero Trust Proxy", - collapsed: true, - collapsible: true, - items: [ - "self-hosted/oel/oathkeeper/upgrade-oathkeeper", - "self-hosted/oel/oathkeeper/changelog", - "self-hosted/oel/oathkeeper/configuration", - "oathkeeper/index", - "oathkeeper/install", - "oathkeeper/reference/api", - { - type: "category", - label: "Concepts", - collapsed: false, - collapsible: false, - items: [ - "oathkeeper/api-access-rules", { type: "category", - label: "Handlers", + label: "Guides", + collapsed: false, + collapsible: false, items: [ - "oathkeeper/pipeline", - "oathkeeper/pipeline/authn", - "oathkeeper/pipeline/authz", - "oathkeeper/pipeline/mutator", - "oathkeeper/pipeline/error", + "oathkeeper/configure-deploy", + "oathkeeper/guides/proxy-websockets", + "oathkeeper/guides/traefik-proxy-integration", + "oathkeeper/guides/upgrade", ], }, - "oathkeeper/grpc-middleware", - ], - }, - { - type: "category", - label: "Guides", - collapsed: false, - collapsible: false, - items: [ - "oathkeeper/configure-deploy", - "oathkeeper/guides/proxy-websockets", - "oathkeeper/guides/traefik-proxy-integration", - "oathkeeper/guides/upgrade", - ], - }, - { - type: "category", - label: "Reference", - collapsed: false, - collapsible: false, - items: [ - "oathkeeper/reference/configuration", - "oathkeeper/reference/configuration-editor", { - "Command Line Interface (CLI)": [ + type: "category", + label: "Reference", + collapsed: false, + collapsible: false, + items: [ + "oathkeeper/reference/configuration", + "oathkeeper/reference/configuration-editor", { - type: "autogenerated", - dirName: "oathkeeper/cli", + "Command Line Interface (CLI)": [ + { + type: "autogenerated", + dirName: "oathkeeper/cli", + }, + ], }, + "oathkeeper/sdk", ], }, - "oathkeeper/sdk", ], }, ], }, -], - }, - ] +] export default oelSidebar diff --git a/sidebars-oss.ts b/sidebars-oss.ts index 473d37ed1..de7bdce42 100644 --- a/sidebars-oss.ts +++ b/sidebars-oss.ts @@ -21,20 +21,20 @@ const ossSidebar = [ id: "oss/getting-started/index", }, items: [ - "oss/getting-started/index", - { - type: "category", - label: "Open Source", - collapsed: true, - collapsible: true, - items: [ - "oss/open-source", - "oss/community", - "oss/contributing", - "oss/commitment", - "oss/software-architecture-philosophy", - ], - }, + "oss/getting-started/index", + { + type: "category", + label: "Open Source", + collapsed: true, + collapsible: true, + items: [ + "oss/open-source", + "oss/community", + "oss/contributing", + "oss/commitment", + "oss/software-architecture-philosophy", + ], + }, { type: "category", label: "Getting started", @@ -88,6 +88,6 @@ const ossSidebar = [ }, ], }, -] +] -export default ossSidebar \ No newline at end of file +export default ossSidebar diff --git a/sidebars-quickstarts.ts b/sidebars-quickstarts.ts index 3628030f6..df97103bc 100644 --- a/sidebars-quickstarts.ts +++ b/sidebars-quickstarts.ts @@ -28,33 +28,25 @@ const quickstartsSidebar = [ type: "category", label: "Delegated Scope-based AuthZ & Federated AuthN", className: "sidebar-icon sidebar-icon-hydra", - items: [ - "oauth2-oidc/index", - "getting-started/ory-network-oauth2", - ], + items: ["oauth2-oidc/index", "getting-started/ory-network-oauth2"], }, { type: "category", label: "Fine-grained AuthZ & Permissions", className: "sidebar-icon sidebar-icon-keto", - items: [ - "keto/index", - ], + items: ["keto/index"], }, - { + { type: "category", label: "Enterprise SSO AuthZ", className: "sidebar-icon sidebar-icon-polis", - items: [ - "polis/index", - ], - }, { + items: ["polis/index"], + }, + { type: "category", label: "Proxy-based Access Control", className: "sidebar-icon sidebar-icon-oathkeeper", - items: [ - "oathkeeper/index", - ], + items: ["oathkeeper/index"], }, ], }, @@ -63,14 +55,15 @@ const quickstartsSidebar = [ label: "Ory Enterprise License", collapsed: false, collapsible: false, - items: [, + items: [ + , { type: "category", label: "Ory Kratos", collapsed: true, collapsible: true, items: [ - "identities/index", + "identities/index", "kratos/quickstart", "kratos/manage-identities/overview", "kratos/mfa/overview", @@ -81,40 +74,28 @@ const quickstartsSidebar = [ label: "Ory Hydra", collapsed: true, collapsible: true, - items: [ - "oauth2-oidc/index", - "hydra/self-hosted/quickstart", - ], + items: ["oauth2-oidc/index", "hydra/self-hosted/quickstart"], }, { type: "category", label: "Ory Keto", collapsed: true, collapsible: true, - items: [ - "keto/index", - "keto/quickstart", - ], + items: ["keto/index", "keto/quickstart"], }, { type: "category", label: "Ory Polis", collapsed: true, collapsible: true, - items: [ - "polis/index", - "polis/quickstart", - ], + items: ["polis/index", "polis/quickstart"], }, { type: "category", label: "Ory Oathkeeper", collapsed: true, collapsible: true, - items: [ - "oathkeeper/index", - "oathkeeper/configure-deploy", - ], + items: ["oathkeeper/index", "oathkeeper/configure-deploy"], }, ], }, @@ -130,7 +111,7 @@ const quickstartsSidebar = [ collapsed: true, collapsible: true, items: [ - "identities/index", + "identities/index", "kratos/quickstart", "kratos/manage-identities/overview", "kratos/mfa/overview", @@ -141,43 +122,31 @@ const quickstartsSidebar = [ label: "Ory Hydra", collapsed: true, collapsible: true, - items: [ - "oauth2-oidc/index", - "hydra/self-hosted/quickstart", - ], + items: ["oauth2-oidc/index", "hydra/self-hosted/quickstart"], }, { type: "category", label: "Ory Keto", collapsed: true, collapsible: true, - items: [ - "keto/index", - "keto/quickstart", - ], + items: ["keto/index", "keto/quickstart"], }, { type: "category", label: "Ory Polis", collapsed: true, collapsible: true, - items: [ - "polis/index", - "polis/quickstart", - ], + items: ["polis/index", "polis/quickstart"], }, { type: "category", label: "Ory Oathkeeper", collapsed: true, collapsible: true, - items: [ - "oathkeeper/index", - "oathkeeper/configure-deploy", - ], + items: ["oathkeeper/index", "oathkeeper/configure-deploy"], }, ], }, ] -export default quickstartsSidebar \ No newline at end of file +export default quickstartsSidebar diff --git a/src/components/OryHeroDemo.jsx b/src/components/OryHeroDemo.jsx index c42c861b1..4cbe1acb1 100644 --- a/src/components/OryHeroDemo.jsx +++ b/src/components/OryHeroDemo.jsx @@ -1,7 +1,14 @@ import React, { useState, useEffect, useRef } from "react" const OryHeroDemo = () => { - const [lines, setLines] = useState([]) + const [lines, setLines] = useState([ + { + type: "line", + number: 1, + text: "From zero to registered user in minutes!", + }, + { type: "line", number: 2, text: "Click 'Run'." }, + ]) const [isRunning, setIsRunning] = useState(false) const [hasRun, setHasRun] = useState(false) const terminalRef = useRef(null) @@ -67,7 +74,7 @@ const OryHeroDemo = () => { type: "link", text: "Create your free project via Ory Console →", url: "https://console.ory.sh/", - delay: 300, + delay: 400, }, ] @@ -87,7 +94,14 @@ const OryHeroDemo = () => { } const reset = () => { - setLines([]) + setLines([ + { + type: "line", + number: 1, + text: "From zero to registered user in minutes!", + }, + { type: "line", number: 2, text: "Click 'Run'." }, + ]) setHasRun(false) } @@ -99,25 +113,28 @@ const OryHeroDemo = () => { const styles = { wrapper: { - width: "80%", - maxWidth: "500px", + width: "416px", margin: "0 auto", - maxHeight: "500px", }, terminal: { + width: "416px", + height: "280px", borderRadius: "8px", overflow: "hidden", - boxShadow: "0 12px 30px rgba(0,0,0,0.25)", - background: "#1a1033", - border: "1px solid #3d2a6d", + boxShadow: + "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)", + background: "#ffffff", + border: "1px solid #e2e8f0", + display: "flex", + flexDirection: "column", }, header: { display: "flex", alignItems: "center", gap: "8px", padding: "12px 16px", - background: "#241845", - borderBottom: "1px solid #3d2a6d", + background: "#f8fafc", + borderBottom: "1px solid #e2e8f0", }, trafficLights: { display: "flex", @@ -130,47 +147,59 @@ const OryHeroDemo = () => { background: color, }), headerText: { - color: "#888", + color: "#64748b", fontSize: "13px", - fontFamily: "monospace", - marginLeft: "8px", + fontFamily: "Inter, sans-serif", + fontWeight: "400", }, body: { padding: "16px", - fontFamily: "monospace", + fontFamily: "JetBrains Mono, monospace", fontSize: "13px", - height: "200px", + flex: "1", overflowY: "auto", + background: "#ffffff", + color: "#0f172a", + lineHeight: "1.6", + }, + lineNumber: { + color: "#94a3b8", + marginRight: "12px", + fontFamily: "JetBrains Mono, monospace", + fontSize: "13px", }, comment: { - color: "#d2a8ff", + color: "#64748b", marginTop: "12px", }, note: { - color: "#d2a8ff", + color: "#64748b", fontSize: "11px", marginTop: "4px", marginBottom: "8px", paddingLeft: "16px", }, command: { - color: "#ffffff", + color: "#0f172a", + display: "flex", + alignItems: "flex-start", }, commandCont: { - color: "#ffffff", + color: "#0f172a", paddingLeft: "16px", }, prompt: { - color: "#67e8f9", + color: "#64748b", + marginRight: "8px", }, output: { - color: "#a5d6ff", + color: "#334155", paddingLeft: "8px", }, success: { - color: "#ff7b72", + color: "#334155", paddingLeft: "8px", - fontWeight: "600", + fontWeight: "400", }, linkWrapper: { paddingLeft: "8px", @@ -180,7 +209,7 @@ const OryHeroDemo = () => { display: "inline-flex", alignItems: "center", padding: "6px 12px", - background: "#0e639c", + background: "#383bca", color: "#fff", fontSize: "13px", fontWeight: "500", @@ -191,45 +220,61 @@ const OryHeroDemo = () => { display: "inline-block", width: "8px", height: "16px", - background: "#d4d4d4", + background: "#0f172a", animation: "blink 1s infinite", }, controls: { display: "flex", + justifyContent: "space-between", + alignItems: "center", gap: "8px", padding: "12px 16px", - background: "#241845", - borderTop: "1px solid #3d2a6d", + background: "#f1f5f9", + borderTop: "1px solid #e2e8f0", + }, + controlsText: { + color: "#94a3b8", + fontSize: "13px", + fontFamily: "Inter, sans-serif", + fontWeight: "400", }, button: { - padding: "6px 16px", + padding: "8px 16px", fontSize: "13px", - fontWeight: "500", - borderRadius: "4px", + fontWeight: "600", + borderRadius: "0", border: "none", cursor: "pointer", + display: "inline-flex", + alignItems: "center", + gap: "6px", }, runButton: { - background: "#0e639c", - color: "#fff", + background: "#6366f1", + color: "#ffffff", }, runButtonDisabled: { - background: "#555", - color: "#999", + background: "#e2e8f0", + color: "#94a3b8", cursor: "not-allowed", }, resetButton: { - background: "#3c3c3c", - color: "#d4d4d4", + background: "#e2e8f0", + color: "#334155", + }, + buttonIcon: { + fontSize: "14px", + lineHeight: "1", + fontWeight: "400", }, caption: { textAlign: "center", - color: "#888", + color: "#64748b", fontSize: "14px", marginTop: "16px", }, placeholder: { - color: "#6a9955", + color: "#94a3b8", }, } @@ -247,22 +292,30 @@ const OryHeroDemo = () => {
- terminal + Terminal
{/* Terminal body */}
- {/* Initial prompt when empty */} - {lines.length === 0 && !isRunning && ( -
- $ From zero to registered user - in minutes! Click 'Run'. -
- )} - {/* Script output */} {lines.map((line, i) => ( -
+
+ {line.type === "line" && ( + <> + {line.number} + $ + + {line.text} + + + )} {line.type === "comment" && (
{ {/* Controls */}
+ + From zero to registered user in minutes + - {hasRun && !isRunning && ( - - )}
- - {/* Caption */} -

From zero to registered user in minutes.

) } diff --git a/src/components/QuickStarts/constants.ts b/src/components/QuickStarts/constants.ts index f652c92e3..897d840c8 100644 --- a/src/components/QuickStarts/constants.ts +++ b/src/components/QuickStarts/constants.ts @@ -21,11 +21,10 @@ export const CATEGORIES: QuickstartCategory[] = [ { label: "Get started with identity management", to: "/docs/kratos/manage-identities/overview", - description: - "Identity management and authentication.", + description: "Identity management and authentication.", deploymentModes: ["network", "oel", "oss"], }, - { + { label: "Get started with authentication", to: "/docs/guides/authentication", description: @@ -35,8 +34,7 @@ export const CATEGORIES: QuickstartCategory[] = [ { label: "Get started with multi-factor authentication", to: "/docs/kratos/mfa/overview", - description: - "Multi-factor authentication.", + description: "Multi-factor authentication.", deploymentModes: ["network", "oel", "oss"], }, ], @@ -48,23 +46,21 @@ export const CATEGORIES: QuickstartCategory[] = [ { label: "Introduction to Ory Hydra", to: "/docs/oauth2-oidc", - description: - "OAuth2 & OpenID Connect social sign-in concepts.", - deploymentModes: ["network", "oel", "oss"], + description: "OAuth2 & OpenID Connect social sign-in concepts.", + deploymentModes: ["network", "oel", "oss"], }, { label: "Get started with Ory Hydra", to: "/docs/getting-started/ory-network-oauth2", - description: - "Client credential and authorization code grant.", - deploymentModes: ["network"], + description: "Client credential and authorization code grant.", + deploymentModes: ["network"], }, { label: "Get started with Ory Hydra", to: "/docs/hydra/self-hosted/quickstart", description: "Run Ory Hydra locally and try the most important OAuth2 flows.", - deploymentModes: ["oel", "oss"], + deploymentModes: ["oel", "oss"], }, ], }, @@ -83,7 +79,7 @@ export const CATEGORIES: QuickstartCategory[] = [ to: "/docs/keto/quickstart", description: "Quickstart for understanding relationships and permission checks.", - deploymentModes: ["oel", "oss"], + deploymentModes: ["oel", "oss"], }, ], }, @@ -112,7 +108,8 @@ export const CATEGORIES: QuickstartCategory[] = [ { label: "Introduction to Ory Polis", to: "/docs/polis", - description: "Enterprise SSO for SAML and OIDC identity providers and SCIM provising.", + description: + "Enterprise SSO for SAML and OIDC identity providers and SCIM provising.", deploymentModes: ["network", "oel", "oss"], }, { @@ -120,7 +117,7 @@ export const CATEGORIES: QuickstartCategory[] = [ to: "/docs/polis/quickstart", description: "Quickstart for Enterprise SSO authentication and SCIM provisioning.", - deploymentModes: ["oel", "oss"], + deploymentModes: ["oel", "oss"], }, ], }, diff --git a/src/components/welcomePage/DeploymentAndFrameworkSection.tsx b/src/components/welcomePage/DeploymentAndFrameworkSection.tsx new file mode 100644 index 000000000..c04d1ad94 --- /dev/null +++ b/src/components/welcomePage/DeploymentAndFrameworkSection.tsx @@ -0,0 +1,812 @@ +import React, { useState } from "react" +import Link from "@docusaurus/Link" +import Mermaid from "@theme/Mermaid" +import IconTerminal from "@site/src/static/img/icons/terminal.svg" +import IconTypescript from "@site/src/static/img/icons/typescript.svg" +import IconNextjs from "@site/src/static/img/icons/nextjs.svg" +import IconVue from "@site/src/static/img/icons/vue.svg" +import IconGo from "@site/src/static/img/icons/go.svg" +import IconCopy from "@site/src/static/img/icons/copy.svg" +import { StepBadge } from "./StepBadge" +import { colors, radius, spacing, typography } from "./tokens" + +const MermaidAny = Mermaid as any + +export function DeploymentAndFrameworkSection() { + type FrameworkValue = "typescript" | "nextjs" | "vue" | "go" + const [selectedFramework, setSelectedFramework] = + useState("nextjs") + + const cards = [ + { + label: "Ory Network", + description: + "Managed identity, OAuth2/OIDC, and permissions. Best choice for new projects.", + to: "/network/getting-started", + tags: ["Cloud", "Multi-region", "Production ready"], + }, + { + label: "Ory Enterprise License", + description: + "Self-host Ory with enterprise support, SLAs, and advanced compliance options.", + to: "/oel/getting-started", + tags: ["Self-hosted", "Enterprise"], + }, + { + label: "Open Source", + description: + "Use the individual Ory projects directly and run everything yourself.", + to: "/oss/getting-started", + tags: ["Open Source", "Multi-region"], + }, + ] + + const langs: Array<{ + value: FrameworkValue + label: string + Icon: React.ComponentType> + snippet: string + }> = [ + { + value: "typescript", + label: "Typescript", + Icon: IconTypescript as React.ComponentType< + React.SVGProps + >, + snippet: `npm install @ory/elements-react @ory/nextjs`, + }, + { + value: "nextjs", + label: "Next.js", + Icon: IconNextjs as React.ComponentType>, + snippet: `npm install @ory/elements-react @ory/nextjs`, + }, + { + value: "vue", + label: "Vue", + Icon: IconVue as React.ComponentType>, + snippet: `npm install @ory/elements-react @ory/nextjs`, + }, + { + value: "go", + label: "Go", + Icon: IconGo as React.ComponentType>, + snippet: `npm install @ory/elements-react @ory/nextjs`, + }, + ] + + const selectedLang = + langs.find((l) => l.value === selectedFramework) ?? langs[1] + const selectedSnippet = selectedLang.snippet + const snippetPrefix = selectedSnippet.startsWith("npm install ") + ? "npm install " + : "" + const snippetRest = snippetPrefix + ? selectedSnippet.slice(snippetPrefix.length) + : selectedSnippet + + return ( +
+
+
+ {/* Choose a deployment option */} +
+
+ +

+ Choose a deployment option +

+

+ Choose the deployment option that fits your organization and + build secure IAM into your apps. You can switch later — the core + concepts stay the same. +

+
+ +
+ {cards.map((card) => ( +
+
+
+

+ {card.label} +

+

+ {card.description} +

+
+
+ {card.tags.map((tag) => { + const isCloud = tag === "Cloud" + const isEnterprise = tag === "Enterprise" + return ( + + {tag} + + ) + })} +
+ + Learn more + + → + + +
+
+ ))} +
+
+ + {/* Design your Ory solution */} +
+
+ +

+ Design your Ory solution +

+

+ Answer a few questions about your IAM requirements. We'll match + you with the right Ory products. +

+
+ +
+
+
+
+ API Endpoint 2" } + +User --> Devices +Devices --> Oathkeeper +Oathkeeper -->|protects| API +Oathkeeper -->|authenticates credentials with| Hydra +User -->|Registers, log in,
manages profile via API| Kratos +User -->|Registers, logs in,
manages profile via prebuilt UI| Elements +Elements --> Kratos +Elements --> Hydra +Oathkeeper -->|checks session with| Kratos +Oathkeeper -->|checks permissions with| Keto +Devices --> API +API -->|OAuth2| Hydra +API -->|Checks session with| Kratos +API -->|Checks permissions with| Keto +Kratos -->|OIDC| Polis + +style Kratos fill:transparent,stroke:none +style Hydra fill:transparent,stroke:none +style Keto fill:transparent,stroke:none +style Polis fill:transparent,stroke:none +style Oathkeeper fill:transparent,stroke:none +style Elements fill:transparent,stroke:none`} + /> + + +
+
+
+ +
+
+ + Step 1 out of 6 + +
+ +
+
+

+ Do you need identity management (user registration, + profile management)? +

+
+ +
+
+ {[ + { + value: "yes", + label: "Yes, I need an identity system", + key: "1", + }, + { + value: "no", + label: "No, I have an existing identity system", + key: "2", + }, + { value: "idk", label: "I don’t know", key: "3" }, + ].map((option) => ( + + ))} +
+
+
+
+ +
+ + Create a architecture diagram based on your requirements + + +
+
+
+ + {/* Select your framework or language */} +
+
+ +

+ Select your framework or language +

+

+ Drop Ory into an existing app. Pick your stack and follow the + step-by-step integration guides. +

+
+ +
+
+
+ +
+ +
+ {langs.map((lang) => { + const active = lang.value === selectedFramework + const LangIcon = lang.Icon + const iconStroke = active + ? colors.brandOnTertiary + : colors.textPrimary + return ( + + ) + })} +
+ + +
+ +
+ + 1 + + + {snippetPrefix ? ( + <> + + {snippetPrefix} + + + {snippetRest} + + + ) : ( + + {selectedSnippet} + + )} + +
+
+
+
+
+
+ ) +} diff --git a/src/components/welcomePage/HowToUseSection.tsx b/src/components/welcomePage/HowToUseSection.tsx new file mode 100644 index 000000000..dea8a388a --- /dev/null +++ b/src/components/welcomePage/HowToUseSection.tsx @@ -0,0 +1,163 @@ +import React from "react" +import Link from "@docusaurus/Link" +import { colors, spacing, typography } from "./tokens" +import styles from "@site/src/pages/welcome.module.css" + +export function HowToUseSection() { + const guides = [ + { + title: "Want to learn more about a specific product suite", + description: "Go directly to product specific information.", + link: { label: "Products", to: "/products/products-overview" }, + }, + { + title: "Want to learn more about a specific solution suite", + description: "Go directly to solution specific information.", + link: { label: "Solutions", to: "/solutions/solutions-overview" }, + }, + { + title: "Start coding with an example", + description: + "Take a look in the Quickstarts to find the framework and language you want to use.", + link: { label: "Quickstarts", to: "/getting-started/overview" }, + }, + { + title: "Find the right API to use", + description: "Go directly to the REST API, SDKs, or CLI references.", + link: { label: "API reference", to: "/reference/reference-overview" }, + }, + ] + + return ( +
+
+
+

+ How to use the Ory Developer Portal +

+

+ Not sure where to start? Follow our guided paths—structured journeys + that walk you through Ory's products and solutions so you can learn + and build faster. +

+
+ + {/* Horizontal separator */} +
+ +
+ {guides.map((guide, index) => ( +
+

+ {guide.title} +

+

+ {guide.description} +

+ + {guide.link.label} + + → + + +
+ ))} +
+
+
+ ) +} diff --git a/src/components/welcomePage/OtherGuides.tsx b/src/components/welcomePage/OtherGuides.tsx new file mode 100644 index 000000000..ed781a6e4 --- /dev/null +++ b/src/components/welcomePage/OtherGuides.tsx @@ -0,0 +1,220 @@ +import React from "react" +import Link from "@docusaurus/Link" +import { colors, radius, spacing, typography } from "./tokens" + +export function OtherGuides() { + const guides = [ + { + label: "Installl from green-field", + to: "/getting-started/overview", + description: "What Ory Identities (Kratos) is and when to use it", + }, + { + label: "Migrate to Ory", + to: "/kratos/self-service/flows/user-login-user-registration", + description: "Day 1 essentials for browser-based authentication", + }, + { + label: "Ory Architecture", + to: "/kratos/self-service/flows/user-login-user-registration", + description: "What Ory Identities (Kratos) is and when to use it", + tags: ["Ory / Kratos", "Tutorial"], + }, + ] + + return ( +
+
+
+

+ Other guides +

+

+ Opinionated, end-to-end walkthroughs to help you ship real features, + not just hello-world demos. +

+
+ +
+
+ {guides.slice(0, 2).map((guide) => ( +
+
+
+

+ + {guide.label} + +

+

+ {guide.description} +

+
+
+ ))} +
+
+ {guides.slice(2).map((guide) => ( +
+
+
+
+

+ + {guide.label} + +

+ {guide.tags?.map((tag) => ( + + {tag} + + ))} +
+

+ {guide.description} +

+
+
+ ))} +
+
+
+
+ ) +} diff --git a/src/components/welcomePage/StartHeading.tsx b/src/components/welcomePage/StartHeading.tsx new file mode 100644 index 000000000..fe6d151fb --- /dev/null +++ b/src/components/welcomePage/StartHeading.tsx @@ -0,0 +1,43 @@ +import React from "react" +import useBaseUrl from "@docusaurus/useBaseUrl" +import OryHeroDemo from "@site/src/components/OryHeroDemo" +import { colors, spacing } from "./tokens" +import styles from "@site/src/pages/welcome.module.css" + +export function StartHeading() { + const backgroundPattern = useBaseUrl("/img/home-bg-grid.svg") + + return ( +
+
+
+
+

Welcome to the Ory Developer Portal

+

+ Ory gives you authentication, authorization, and user management + APIs designed for modern applications. +
+
+ Start fast, scale to millions, and keep security best practices + baked in. +

+
+
+ +
+
+
+
+ ) +} diff --git a/src/components/welcomePage/StepBadge.tsx b/src/components/welcomePage/StepBadge.tsx new file mode 100644 index 000000000..af0298bfe --- /dev/null +++ b/src/components/welcomePage/StepBadge.tsx @@ -0,0 +1,34 @@ +import React from "react" +import { colors, radius, typography } from "./tokens" + +export function StepBadge({ step }: { step: number }) { + return ( +
+ + {step} + +
+ ) +} diff --git a/src/components/welcomePage/tokens.ts b/src/components/welcomePage/tokens.ts new file mode 100644 index 000000000..8b8922641 --- /dev/null +++ b/src/components/welcomePage/tokens.ts @@ -0,0 +1,69 @@ +// Shared tokens for `src/pages/welcome.tsx` sections + +export const colors = { + textPrimary: "#0f172a", + textSecondary: "#334155", + textTertiary: "#64748b", + textTertiaryAlt: "#94a3b8", + brandPrimary: "#383bca", + brandPrimaryAlt: "#6366f1", + brandOnPrimary: "#eef", + brandOnTertiary: "#2e3081", + backgroundPrimary: "#ffffff", + backgroundSecondary: "#f8fafc", + backgroundSecondaryHover: "#e2e8f0", + backgroundTertiary: "#e2e8f0", + backgroundDark: "#0f172a", + backgroundDarkSecondary: "#1e293b", + backgroundBrandTertiary: "#e0e1ff", + borderPrimary: "#cbd5e1", + borderDark: "#334155", + borderBrandTertiary: "#6366f1", + borderInfoTertiary: "#0ea5e9", + infoPrimary: "#0ea5e9", + infoSecondary: "#bae6fd", + infoTertiary: "#e0f2fe", + infoOnTertiary: "#0c4a6e", + disabled: "#e2e8f0", + disabledBorder: "#cbd5e1", + disabledText: "#94a3b8", +} as const + +export const spacing = { + size0: "0px", + size0_5: "2px", + size1: "4px", + size1_5: "6px", + size2: "8px", + size2_5: "10px", + size3: "12px", + size4: "16px", + size5: "20px", + size6: "24px", + size8: "32px", + size12: "48px", + size16: "64px", +} as const + +export const typography = { + fontFamily: "Inter, sans-serif", + fontFamilyMono: "JetBrains Mono, monospace", + fontSizeXs: "12px", + fontSizeSm: "14px", + fontSizeBase: "16px", + fontSizeLg: "20px", + fontSizeXl: "24px", + fontSize2xl: "40px", + lineHeightTight: "1.25", + lineHeightNormal: "1.5", + lineHeightRelaxed: "1.65", + fontWeightNormal: "400", + fontWeightMedium: "500", +} as const + +export const radius = { + badge: "6px", + keyboard: "6px", + buttons: "4px", + general: "4px", +} as const diff --git a/src/css/theme.css b/src/css/theme.css index 50373f1cd..d270e73c1 100644 --- a/src/css/theme.css +++ b/src/css/theme.css @@ -358,6 +358,346 @@ "calt" 1; /* fix for Chrome */ } +/* ---------------------------- + Navbar (Figma node 5046:5330) + Exact styling from Figma design +----------------------------- */ +:root { + --ory-navbar-height: 64px; + --ory-navbar-bg: #ffffff; + --ory-navbar-border: #cbd5e1; + --ory-navbar-text: #0f172a; + --ory-navbar-link: #0f172a; + --ory-navbar-link-hover: #383bca; + --ory-navbar-font-size: 14px; + --ory-navbar-gap: 8px; + --ory-navbar-left-width: 80px; + --ory-navbar-left-padding-x: 16px; + --ory-navbar-content-padding-left: 32px; + --ory-navbar-right-width: auto; + --ory-navbar-right-gap: 8px; + --ory-search-width: 200px; + /* Button hover effect variables */ + --button-button-height: 32px; + --size-25: 10px; + --size-05: 2px; + --radius-buttons: 4px; + --border-transparent-transparent: rgba(255, 255, 255, 0); + --background-transparent-primary-hover: rgba(0, 0, 0, 0.02); +} + +.navbar { + height: 64px !important; + min-height: 64px !important; + max-height: 64px !important; + background: var(--ory-navbar-bg); + border-bottom: 1px solid var(--ory-navbar-border); + box-shadow: none; + padding: 0; +} + +.navbar__inner { + height: 100%; + max-width: 1920px; + margin: 0 auto; + display: flex; + gap: 0; + align-items: center; + padding: 0 8px; +} + +/* Left logo section - 312px with borders */ +.navbar__brand { + width: var(--ory-navbar-left-width); + max-width: var(--ory-navbar-left-width); + border-left: 1px solid var(--ory-navbar-border); + border-right: 1px solid var(--ory-navbar-border); + padding: 0 var(--ory-navbar-left-padding-x); + height: 100%; + display: flex; + align-items: center; + flex-shrink: 0; + position: relative; +} + +.navbar__logo { + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + height: 24px; + width: 100%; + padding: 4px; +} + +.navbar__logo img { + height: 16px; + width: auto; + display: block; + flex-shrink: 0; +} + +.navbar__logo::before, +.navbar__logo::after { + display: none; +} + +/* Middle nav links */ +.navbar__items { + flex: 1 0 0; + gap: var(--ory-navbar-gap); + font-size: var(--ory-navbar-font-size); + font-weight: 400; + line-height: 1; + color: var(--ory-navbar-text); + padding-left: var(--ory-navbar-content-padding-left); + display: flex; + align-items: center; +} + +.navbar__link { + color: var(--ory-navbar-link); + font-weight: 400; + font-size: 14px; + line-height: 1; + white-space: nowrap; + display: flex; + height: var(--button-button-height, 32px); + padding: 0 var(--size-25, 10px); + justify-content: center; + align-items: center; + gap: var(--size-05, 2px); + border-radius: var(--radius-buttons, 4px); + border: 1px solid + var(--border-transparent-transparent, rgba(255, 255, 255, 0)); + transition: background-color 0.2s ease; +} + +.navbar__link:hover, +.navbar__link--active { + color: var(--ory-navbar-link-hover); + background: var(--background-transparent-primary-hover, rgba(0, 0, 0, 0.02)); +} + +/* Style dropdown chevrons in top navbar only (nav/Button/right) */ +.navbar .dropdown > .navbar__link::after { + border: none; + content: ""; + display: inline-block; + width: 16px; + height: 16px; + background: url("../static/img/icons/nav-dropdown-chevron.svg") no-repeat + center; + background-size: contain; + margin-left: 2px; + position: static; + top: auto; + transform: none; + vertical-align: middle; +} + +/* Ensure all navbar items have consistent width */ +.navbar__item { + flex-shrink: 0; + min-width: fit-content; + margin: 0 !important; +} + +/* Ensure dropdown items have same spacing as direct links */ +.navbar__item.dropdown { + margin: 0 !important; + padding: 0; +} + +/* Ensure dropdown links have same styling as direct links */ +.navbar__item.dropdown > .navbar__link { + margin: 0; +} + +/* Right section - Links and Search */ +.navbar__items--right { + gap: var(--ory-navbar-right-gap); + display: flex; + align-items: center; + flex-shrink: 0; +} + +/* Search input styling from Figma node 5211:5845 */ +.navbar .DocSearch-Button, +.navbar__items--right .DocSearch-Button, +.DocSearch-Button { + width: var(--ory-search-width) !important; + max-width: var(--ory-search-width) !important; + height: auto !important; + min-height: 32px !important; + border: 1px solid var(--ory-navbar-border) !important; + background: #fff !important; + border-radius: 0 !important; + box-shadow: none !important; + color: var(--ory-navbar-text) !important; + font-size: 16px !important; + font-family: Inter, sans-serif !important; + font-weight: 400 !important; + line-height: 1.25 !important; + padding: 0 !important; + padding-left: 4px !important; + padding-right: 12px !important; + display: flex !important; + align-items: center !important; + gap: 0 !important; + flex-shrink: 0 !important; + margin: 0 !important; +} + +.navbar .DocSearch-Button-Placeholder, +.navbar__items--right .DocSearch-Button-Placeholder { + color: #64748b !important; + font-size: 16px !important; + font-family: Inter, sans-serif !important; + font-weight: 400 !important; + padding: 8px !important; + flex: 1 0 0 !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +/* Override search placeholder text - hide original and show new */ +.navbar .DocSearch-Button-Placeholder, +.navbar__items--right .DocSearch-Button-Placeholder { + font-size: 0 !important; +} + +.navbar .DocSearch-Button-Placeholder::after, +.navbar__items--right .DocSearch-Button-Placeholder::after { + content: "Search or ask AI ✨" !important; + font-size: 16px !important; + font-family: Inter, sans-serif !important; + font-weight: 400 !important; + color: #64748b !important; +} + +/* Search icon wrapper - DocSearch uses SVG */ +.navbar .DocSearch-Button .DocSearch-Search-Icon, +.navbar__items--right .DocSearch-Button .DocSearch-Search-Icon, +.navbar .DocSearch-Button svg, +.navbar__items--right .DocSearch-Button svg { + padding: 8px !important; + flex-shrink: 0 !important; + width: 16px !important; + height: 16px !important; + color: var(--ory-navbar-text) !important; + margin: 0 !important; +} + +/* ⌘K keyboard shortcut badge - Figma node 5211:5845 */ +/* Container for keyboard keys */ +.navbar .DocSearch-Button-Key, +.navbar__items--right .DocSearch-Button-Key, +.navbar .DocSearch-Button-Keys, +.navbar__items--right .DocSearch-Button-Keys, +.DocSearch-Button-Key, +.DocSearch-Button-Keys { + background: #e2e8f0 !important; + color: #64748b !important; + border-radius: 6px !important; + box-shadow: none !important; + border: none !important; + height: 20px !important; + min-width: 20px !important; + padding: 0 4px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + font-family: Inter, sans-serif !important; + font-size: 12px !important; + font-weight: 500 !important; + line-height: 1.25 !important; + margin-left: auto !important; + gap: 2px !important; + opacity: 1 !important; + visibility: visible !important; +} + +/* All text content inside keyboard badge - ensure visibility */ +.navbar .DocSearch-Button-Key *, +.navbar__items--right .DocSearch-Button-Key *, +.navbar .DocSearch-Button-Keys *, +.navbar__items--right .DocSearch-Button-Keys *, +.DocSearch-Button-Key *, +.DocSearch-Button-Keys * { + color: #64748b !important; + opacity: 1 !important; + visibility: visible !important; +} + +/* Individual key elements (kbd tags) inside the badge */ +.navbar .DocSearch-Button-Key kbd, +.navbar__items--right .DocSearch-Button-Key kbd, +.navbar .DocSearch-Button-Keys kbd, +.navbar__items--right .DocSearch-Button-Keys kbd, +.DocSearch-Button-Key kbd, +.DocSearch-Button-Keys kbd, +.navbar .DocSearch-Button-Key > kbd, +.navbar__items--right .DocSearch-Button-Key > kbd, +.navbar .DocSearch-Button-Keys > kbd, +.navbar__items--right .DocSearch-Button-Keys > kbd { + background: transparent !important; + border: none !important; + box-shadow: none !important; + padding: 0 !important; + margin: 0 !important; + font-family: Inter, sans-serif !important; + font-size: 12px !important; + font-weight: 500 !important; + line-height: 1.25 !important; + color: #64748b !important; + min-width: auto !important; + height: auto !important; + display: inline !important; + opacity: 1 !important; + visibility: visible !important; +} + +/* Text/span elements inside the keyboard badge */ +.navbar .DocSearch-Button-Key span, +.navbar__items--right .DocSearch-Button-Key span, +.navbar .DocSearch-Button-Keys span, +.navbar__items--right .DocSearch-Button-Keys span, +.DocSearch-Button-Key span, +.DocSearch-Button-Keys span, +.navbar .DocSearch-Button-Key > span, +.navbar__items--right .DocSearch-Button-Key > span, +.navbar .DocSearch-Button-Keys > span, +.navbar__items--right .DocSearch-Button-Keys > span { + font-family: Inter, sans-serif !important; + font-size: 12px !important; + font-weight: 500 !important; + line-height: 1.25 !important; + color: #64748b !important; + display: inline !important; + opacity: 1 !important; + visibility: visible !important; +} + +/* Direct text content and any other elements */ +.navbar .DocSearch-Button-Key, +.navbar__items--right .DocSearch-Button-Key, +.navbar .DocSearch-Button-Keys, +.navbar__items--right .DocSearch-Button-Keys { + text-align: center !important; + white-space: nowrap !important; + color: #64748b !important; +} + +/* Ensure text nodes are visible */ +.navbar .DocSearch-Button-Key::before, +.navbar__items--right .DocSearch-Button-Key::before, +.navbar .DocSearch-Button-Keys::before, +.navbar__items--right .DocSearch-Button-Keys::before { + display: none !important; +} + @supports (font-variation-settings: normal) { :root { --ifm-font-family-base: InterVariable, var(--ifm-font-family-base-fallback); @@ -543,9 +883,15 @@ svg[class*="iconExternalLink"] { justify-content: flex-end !important; } -.theme-doc-sidebar-item-category-level-2 .menu__list-item-collapsible > .menu__caret, -.theme-doc-sidebar-item-category-level-3 .menu__list-item-collapsible > .menu__caret, -.theme-doc-sidebar-item-category-level-4 .menu__list-item-collapsible > .menu__caret { +.theme-doc-sidebar-item-category-level-2 + .menu__list-item-collapsible + > .menu__caret, +.theme-doc-sidebar-item-category-level-3 + .menu__list-item-collapsible + > .menu__caret, +.theme-doc-sidebar-item-category-level-4 + .menu__list-item-collapsible + > .menu__caret { margin-left: 0 !important; margin-right: 8px !important; opacity: 0.6 !important; @@ -556,15 +902,147 @@ svg[class*="iconExternalLink"] { transform-origin: center center !important; } -.theme-doc-sidebar-item-category-level-2 .menu__list-item-collapsible > .menu__caret:hover, -.theme-doc-sidebar-item-category-level-3 .menu__list-item-collapsible > .menu__caret:hover, -.theme-doc-sidebar-item-category-level-4 .menu__list-item-collapsible > .menu__caret:hover { +.theme-doc-sidebar-item-category-level-2 + .menu__list-item-collapsible + > .menu__caret:hover, +.theme-doc-sidebar-item-category-level-3 + .menu__list-item-collapsible + > .menu__caret:hover, +.theme-doc-sidebar-item-category-level-4 + .menu__list-item-collapsible + > .menu__caret:hover { background: transparent !important; opacity: 0.6 !important; transform: scale(0.667) !important; transform-origin: center center !important; } +/* Code sample tabs styling for welcome page */ +.tabs-container[data-group-id="language-quickstarts"] .tabs { + display: flex; + gap: 0; + margin-bottom: 16px; + padding-left: 0; +} + +.tabs-container[data-group-id="language-quickstarts"] .tabs__item { + background: #ffffff; + border: 1px solid #cbd5e1; + border-right: none; + border-radius: 0; + padding: 10px 16px; + display: inline-flex; + align-items: center; + gap: 12px; + font-family: Inter, sans-serif; + font-size: 14px; + font-weight: 400; + line-height: 1; + color: #0f172a; + cursor: pointer; + transition: none; + border-bottom: 3px solid transparent; +} + +.tabs-container[data-group-id="language-quickstarts"] .tabs__item:last-child { + border-right: 1px solid #cbd5e1; +} + +.tabs-container[data-group-id="language-quickstarts"] .tabs__item:hover { + background-color: #ffffff; +} + +.tabs-container[data-group-id="language-quickstarts"] .tabs__item--active { + background: #e0e1ff; + border-color: #6366f1; + border-right: 1px solid #6366f1; + color: #2e3081; + border-bottom-color: #6366f1; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + z-index: 1; + position: relative; +} + +.tabs-container[data-group-id="language-quickstarts"] + .tabs__item--active:hover { + background-color: #e0e1ff; +} + +/* Override CodeBlock background in code sample tabs */ +.tabs-container[data-group-id="language-quickstarts"] + ~ * + [class*="theme-code-block"], +.tabs-container[data-group-id="language-quickstarts"] + [class*="theme-code-block"], +.tabs-container[data-group-id="language-quickstarts"] pre, +.tabs-container[data-group-id="language-quickstarts"] code { + background: #ffffff !important; + border: none !important; +} + +.tabs-container[data-group-id="language-quickstarts"] + .tabs__item + > div + > div:last-child { + background: #ffffff !important; + border: none !important; +} + +.tabs-container[data-group-id="language-quickstarts"] + .tabs__item + > div + > div:last-child + code { + background: transparent !important; + border: none !important; +} + +.tabs-container[data-group-id="language-quickstarts"] + .tabs__item + > div + > div:last-child + span { + background: transparent !important; + border: none !important; +} + +.tabs-container[data-group-id="language-quickstarts"] + .tabs__item + > div + > div:last-child + * { + border: none !important; +} + +/* Override Docusaurus styles for code sample body in framework selection section */ +.code-sample-body { + background: #ffffff !important; + border: 1px solid #cbd5e1 !important; +} + +.code-sample-body code { + background: transparent !important; + border: none !important; + padding: 0 !important; + font-family: "JetBrains Mono", monospace !important; + font-size: 14px !important; + line-height: 1.65 !important; + color: #0f172a !important; +} + +.code-sample-body code span { + background: transparent !important; + border: none !important; + padding: 0 !important; +} + +.code-sample-body span { + background: transparent !important; + border: none !important; + padding: 0 !important; +} + /* Base styles - apply to all icon items */ .sidebar-icon > .menu__list-item-collapsible > .menu__link { display: flex; @@ -587,13 +1065,19 @@ svg[class*="iconExternalLink"] { } /* Icon variants */ -.sidebar-icon-hydra > .menu__list-item-collapsible > .menu__link > span::before { +.sidebar-icon-hydra + > .menu__list-item-collapsible + > .menu__link + > span::before { background-image: url("/img/ory-hydra-icon.svg"); height: 30px; width: 108px; } -.sidebar-icon-kratos > .menu__list-item-collapsible > .menu__link > span::before { +.sidebar-icon-kratos + > .menu__list-item-collapsible + > .menu__link + > span::before { background-image: url("/img/ory-kratos-icon.svg"); height: 30px; width: 120px; @@ -605,21 +1089,29 @@ svg[class*="iconExternalLink"] { width: 108px; } -.sidebar-icon-oathkeeper > .menu__list-item-collapsible > .menu__link > span::before { +.sidebar-icon-oathkeeper + > .menu__list-item-collapsible + > .menu__link + > span::before { background-image: url("/img/ory-oathkeeper-icon.svg"); height: 30px; width: 140px; } -.sidebar-icon-polis > .menu__list-item-collapsible > .menu__link > span::before { +.sidebar-icon-polis + > .menu__list-item-collapsible + > .menu__link + > span::before { background-image: url("/img/ory-polis-icon.svg"); height: 30px; width: 108px; } -.sidebar-icon-network > .menu__list-item-collapsible > .menu__link > span::before { +.sidebar-icon-network + > .menu__list-item-collapsible + > .menu__link + > span::before { background-image: url("/img/ory-network-icon.svg"); height: 30px; width: 108px; } - diff --git a/src/navbar.ts b/src/navbar.ts index 2ff779fe1..ae6bfbca3 100644 --- a/src/navbar.ts +++ b/src/navbar.ts @@ -7,11 +7,11 @@ export const navbar: Navbar = { hideOnScroll: false, logo: { alt: "Ory", - src: `/docs/img/logos/logo-docs-2023-02-15.svg`, - srcDark: `/docs/img/logos/logo-docs-dark-2023-02-15.svg`, + src: `/docs/img/logos/ory-logo.svg`, + srcDark: `/docs/img/logos/ory-logo.svg`, href: `https://www.ory.com`, - width: 63, - height: 32, + width: 44, + height: 16, }, items: [ @@ -117,7 +117,7 @@ export const navbar: Navbar = { ], }, { - label: "Need Support?", + label: "Support", position: "right", items: [ { diff --git a/src/pages/welcome.module.css b/src/pages/welcome.module.css new file mode 100644 index 000000000..de2ea13a9 --- /dev/null +++ b/src/pages/welcome.module.css @@ -0,0 +1,211 @@ +:root { + /* Local page tokens from Figma node 4994:5842/6425 */ + --home-text-primary: #0f172a; + --home-text-secondary: #334155; + --home-text-tertiary: #64748b; + --home-text-tertiary-alt: #94a3b8; + --home-brand-primary: #383bca; + --home-brand-primary-alt: #6366f1; + --home-brand-on-primary: #eef; + --home-brand-on-tertiary: #2e3081; + + --home-bg-primary: #fff; + --home-bg-secondary: #f8fafc; + --home-bg-secondary-hover: #e2e8f0; + --home-bg-tertiary: #e2e8f0; + --home-bg-dark: #0f172a; + --home-bg-dark-secondary: #1e293b; + --home-bg-brand-tertiary: #e0e1ff; + + --home-border-primary: #cbd5e1; + --home-border-dark: #334155; + --home-border-brand-tertiary: #6366f1; + --home-border-info-tertiary: #0ea5e9; + + --home-info-primary: #0ea5e9; + --home-info-tertiary: #e0f2fe; + --home-info-on-tertiary: #0c4a6e; + + --home-disabled: #e2e8f0; + --home-disabled-border: #cbd5e1; + --home-disabled-text: #94a3b8; + + --home-radius: 6px; + + --home-s0: 0px; + --home-s0_5: 2px; + --home-s1: 4px; + --home-s1_5: 6px; + --home-s2: 8px; + --home-s2_5: 10px; + --home-s3: 12px; + --home-s4: 16px; + --home-s5: 20px; + --home-s6: 24px; + --home-s12: 48px; + --home-s16: 64px; +} + +.container1024 { + max-width: 1024px; +} +.heroTop { + padding-top: var(--home-s16); + padding-bottom: 0; +} +.heroRow { + display: flex; + gap: var(--home-s6); + align-items: center; + margin-bottom: var(--home-s6); +} +.heroCopy { + flex: 1 0 0; + display: flex; + flex-direction: column; + gap: var(--home-s6); +} +.h1 { + font-family: Inter, sans-serif; + font-size: 40px; + font-weight: 400; + line-height: 1.25; + color: var(--home-text-primary); + margin: 0; +} +.pBase { + font-family: Inter, sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.5; + color: var(--home-text-secondary); + margin: 0; +} +.sectionTitle { + font-family: Inter, sans-serif; + font-size: 24px; + font-weight: 400; + line-height: 1.5; + color: var(--home-text-primary); + margin: 0; +} +.sectionSubtitle { + font-family: Inter, sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.5; + color: var(--home-text-secondary); + margin: 0; +} +.guidesGrid { + display: flex; + gap: var(--home-s6); + margin-bottom: var(--home-s6); +} +.guideCard { + flex: 1 0 0; + background: var(--home-bg-primary); + border-radius: var(--home-radius); + padding: var(--home-s6); + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 325px; +} +.guideTitle { + font-family: Inter, sans-serif; + font-size: 16px; + font-weight: 500; + line-height: 1.25; + color: var(--home-text-primary); + margin: 0; +} +.guideDesc { + font-family: Inter, sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.5; + color: var(--home-text-tertiary); + margin: 0; +} +.linkArrow { + display: inline-flex; + gap: var(--home-s1); + align-items: center; + text-decoration: none; + color: var(--home-brand-primary); + font-family: Inter, sans-serif; + font-size: 16px; + line-height: 1.5; +} +.deploymentSection { + padding-top: var(--home-s16); + padding-bottom: var(--home-s16); +} +.deployGrid { + display: flex; + gap: var(--home-s3); +} +.deployCard { + flex: 1 0 0; + background: var(--home-bg-primary); + border: 1px solid var(--home-border-primary); + overflow: hidden; + display: flex; + flex-direction: column; +} +.deployBody { + display: flex; + flex-direction: column; + gap: var(--home-s6); + padding: var(--home-s6); +} +.badge { + background: var(--home-bg-tertiary); + padding: var(--home-s0_5) var(--home-s2); + border-radius: var(--home-radius); + font-family: Inter, sans-serif; + font-size: 12px; + line-height: 1.5; + color: var(--home-text-secondary); +} +.deployFooter { + background: var(--home-bg-secondary); + border-top: 1px solid var(--home-border-primary); + padding: var(--home-s3) var(--home-s6); +} +.setupSection { + padding-top: var(--home-s16); + padding-bottom: var(--home-s16); + background: var(--home-bg-secondary); +} +.uxContainer { + background: var(--home-bg-primary); + border: 1px solid var(--home-border-primary); + overflow: hidden; +} +.tabsPanel { + background: var(--home-bg-secondary-hover); + border: 1px solid var(--home-border-primary); + display: flex; + flex-direction: column; +} +.tabsPanelHeader { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--home-s2) var(--home-s4); +} +.tabsPanelBody { + background: var(--home-bg-secondary); + border-top: 1px solid var(--home-border-primary); + padding: var(--home-s6); +} +.infoBox { + background: var(--home-info-tertiary); + border: 1px solid var(--home-border-info-tertiary); + padding: var(--home-s6); + display: flex; + gap: var(--home-s6); + align-items: center; +} diff --git a/src/pages/welcome.tsx b/src/pages/welcome.tsx index 481e0419c..4727dc1a7 100644 --- a/src/pages/welcome.tsx +++ b/src/pages/welcome.tsx @@ -1,553 +1,9 @@ -// src/pages/welcome.tsx - import React from "react" import Layout from "@theme/Layout" -import Link from "@docusaurus/Link" -import CodeBlock from "@theme/CodeBlock" -import Tabs from "@theme/Tabs" -import TabItem from "@theme/TabItem" -import OryHeroDemo from "@site/src/components/OryHeroDemo" -import heroBg from "@site/src/static/img/background_image2.png" -import { ProductSelectorStepper } from "./_assets/product-selector-stepper" - -function StartHeading() { - const guides = [ - { - to: "/products", - }, - { - to: "/quickstarts", - }, - { - to: "/reference", - }, - ] - - return ( -
-
-
-

Welcome to the Ory Developer Portal

-
- - {/* Intro text and demo in two columns */} -
-
-

- Ory gives you authentication, authorization, and user management - APIs designed for modern applications.{" "} -

-

- Start fast, scale to millions, and keep security best practices - baked in. -

-
-
- -
-
- -
-

- How to use the Ory Developer Portal -

-
-
-

- Not sure where to start? Follow our guided - paths—structured journeys that walk you through Ory's products and - solutions so you can learn and build faster. -

-
- -
- {guides.map((guide, index) => ( -
-
- {index === 0 && ( -
-

- - Want to learn more about a specific product suite or - solution? - {" "} - Go directly to product and solution specific information. -

-
- )} - {index === 1 && ( -
-

- Want to start coding and need an example?{" "} - Take a look in the Quickstarts to find the framework and - language you want to use. -

-
- )} - {index === 2 && ( -
-

- Want to find the right API to use? Go - directly to the REST API, SDKs, or CLI references. -

-
- )} - {index === 0 && ( -
-

- Click on - - Products - {" "} - or{" "} - - Solutions - -

-
- )} - {index === 1 && ( -
-

- Click on - - Quickstarts - -

-
- )} - {index === 2 && ( -
-

- Click on - - Reference - -

-
- )} -
-
- ))} -
-
-
- ) -} - -function Hero() { - const cards = [ - { - label: "Ory Network", - description: - "Managed identity, OAuth2/OIDC, and permissions. Best choice for new projects.", - to: "/network/getting-started", - meta: "Cloud · multi-region · production-ready", - }, - { - label: "Ory Enterprise License", - description: - "Self-host Ory with enterprise support, SLAs, and advanced compliance options.", - to: "/oel/getting-started", - meta: "Self-hosted · enterprise", - }, - { - label: "Ory Open Source", - description: - "Use the individual Ory projects directly and run everything yourself.", - to: "/oss/getting-started", - meta: "Open source · fully self-managed", - }, - ] - - return ( -
-
- {/* Heading row above cards */} -
-
- Choose a deployment option -

- Choose the deployment option that fits your organization and build - secure IAM into your apps. You can switch later — the core - concepts stay the same. -

-
-
- - {/* Product cards - 3 columns */} -
- {cards.map((card) => ( -
-
-
-

- {card.label} -

-
-
-

- {card.description} -

-

- {card.meta} -

- - Learn more - -
-
-
- ))} -
-
-
- ) -} - -function ProductQuickstarts() { - return ( -
-
- Design your Ory solution - -
-
- ) -} - -function LanguageQuickstarts() { - const langs = [ - { - value: "javascript", - label: "JavaScript / TypeScript", - docs: "/getting-started/integrate-auth/react", - snippet: `npm install @ory/client`, - }, - { - value: "nextjs", - label: "Next.js", - docs: "/getting-started/integrate-auth/nextjs-app-router-quickstart", - snippet: `npx create-next-app my-app`, - }, - { - value: "vue", - label: "Vue", - docs: "/getting-started/integrate-auth/vue", - snippet: `npm create vue@latest`, - }, - { - value: "go", - label: "Go", - docs: "/getting-started/integrate-auth/go", - snippet: `go get github.com/ory/client-go`, - }, - ] - - return ( -
-
-
-
- - Select your framework or language - -

- Drop Ory into an existing app. Pick your stack and follow the - step-by-step integration guides. -

-
-
- - - {langs.map((lang) => ( - -
-
- {lang.snippet} -
-
-
-

- Follow the full guide for{" "} - {lang.label}. -

-
    -
  • Set up Ory SDK and environment variables
  • -
  • Protect routes with login and sessions
  • -
  • Handle logout, recovery, and verification flows
  • -
-
-
-
-
- ))} -
-
-
- ) -} - -function OtherGuides() { - const guides = [ - { - label: "Install from green-field", - to: "/getting-started/overview", - description: "Replace your home-grown IAM system.", - }, - { - label: "Migrate to Ory", - to: "/kratos/self-service/flows/user-login-user-registration", - description: "Plan your migration to Ory from an existing system.", - }, - { - label: "Ory architecture", - to: "/kratos/self-service/flows/user-login-user-registration", - description: "Understand the core building blocks and architecture.", - }, - ] - - return ( -
-
-
-
-

Other guides

-

- Opinionated, end-to-end walkthroughs to help you ship real - features, not just hello-world demos. -

-
-
- -
- {guides.map((guide) => ( -
-
-
-

- {guide.label} -

-
-
-

{guide.description}

-
-
-
- ))} -
-
-
- ) -} - -function ComponentsTools() { - const items = [ - { - label: "Ory Console", - to: "/cli/ory", - description: - "User interface to manage projects, configurations, and more.", - }, - { - label: "Ory Account Experience", - to: "/reference/api", - description: - "User interface for all self-service screens like login, registration, or consent.", - }, - { - label: "Ory Elements", - to: "/docs/elements", - description: - "Pre-built UI components for login, registration, and account flows.", - }, - { - label: "Ory Actions", - to: "/docs/kratos/hooks/configure-hooks", - description: - "Define custom business logic, automating system behavior in response to events, and integrating with third-party services.", - }, - { - label: "Changelog", - to: "/ecosystem/changelog", - description: "See what shipped recently across Ory products.", - }, - { - label: "Status & SLA", - to: "https://status.ory.com/", - description: "Monitor uptime and incident history for Ory services.", - }, - ] - - return ( -
-
-
-
-

Components & tools

-

- Everything around the core APIs: observability, tooling. -

-
-
- -
- {items.map((item) => ( -
-
-
-

- {item.to.startsWith("http") ? ( - {item.label} - ) : ( - {item.label} - )} -

-
-
-

{item.description}

-
-
-
- ))} -
-
-
- ) -} - -function SectionDivider() { - return ( -
- ) -} - -function StepHeading({ - step, - children, -}: { - step: number - children: React.ReactNode -}) { - return ( -

- - {step} - - {children} -

- ) -} - -function StepHeading2({ - step, - children, -}: { - step: number - children: React.ReactNode -}) { - return ( -

- - {step} - - {children} -

- ) -} +import { StartHeading } from "@site/src/components/welcomePage/StartHeading" +import { HowToUseSection } from "@site/src/components/welcomePage/HowToUseSection" +import { DeploymentAndFrameworkSection } from "@site/src/components/welcomePage/DeploymentAndFrameworkSection" +import { OtherGuides } from "@site/src/components/welcomePage/OtherGuides" export default function WelcomePage() { return ( @@ -556,11 +12,9 @@ export default function WelcomePage() { description="Developer documentation for Ory" > - - - + + - ) } diff --git a/src/static/img/home-bg-grid.svg b/src/static/img/home-bg-grid.svg new file mode 100644 index 000000000..da8a0c947 --- /dev/null +++ b/src/static/img/home-bg-grid.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/static/img/icons/copy.svg b/src/static/img/icons/copy.svg new file mode 100644 index 000000000..c08819c26 --- /dev/null +++ b/src/static/img/icons/copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/static/img/icons/go.svg b/src/static/img/icons/go.svg new file mode 100644 index 000000000..63c9a6013 --- /dev/null +++ b/src/static/img/icons/go.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/static/img/icons/nav-dropdown-chevron.svg b/src/static/img/icons/nav-dropdown-chevron.svg new file mode 100644 index 000000000..c25272378 --- /dev/null +++ b/src/static/img/icons/nav-dropdown-chevron.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/static/img/icons/nextjs.svg b/src/static/img/icons/nextjs.svg new file mode 100644 index 000000000..2183cd6eb --- /dev/null +++ b/src/static/img/icons/nextjs.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/static/img/icons/terminal.svg b/src/static/img/icons/terminal.svg new file mode 100644 index 000000000..3e77aabd7 --- /dev/null +++ b/src/static/img/icons/terminal.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/static/img/icons/typescript.svg b/src/static/img/icons/typescript.svg new file mode 100644 index 000000000..5d84bacc8 --- /dev/null +++ b/src/static/img/icons/typescript.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/static/img/icons/vue.svg b/src/static/img/icons/vue.svg new file mode 100644 index 000000000..a99596451 --- /dev/null +++ b/src/static/img/icons/vue.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/static/img/logos/ory-logo.svg b/src/static/img/logos/ory-logo.svg new file mode 100644 index 000000000..8c80577c2 --- /dev/null +++ b/src/static/img/logos/ory-logo.svg @@ -0,0 +1,7 @@ + + + + + + +