diff --git a/docs/adopters.md b/docs/adopters.md
index ecc555e..e109de7 100644
--- a/docs/adopters.md
+++ b/docs/adopters.md
@@ -8,7 +8,7 @@ If TyKO handles the lifecycle of your Typesense clusters in Kubernetes, please a
|Name| Description|
|---|---|
-|[Architecture Center of T Cloud Public](https://arch.otc-service.com/)|The Best Practices & Blueprints knowledge-hub of [T Cloud Public](https://public.t-cloud.com/en), the public cloud offering of [Deutsche Telekom AG](https://www.telekom.de/start).|
+|[Architecture Center of T Cloud Public](https://arch.otc-service.com/)|The Best Practices & Blueprints knowledge-hub of [T Cloud Public](https://public.t-cloud.com/en), the public cloud offering of [Deutsche Telekom AG](https://www.telekom.com).|
|[anny](https://anny.co)|Your flexible booking system for all kinds of resources.|
|[Procure Ai](https://www.procure.ai/)|We enable people to run the worldβs most intelligent procurement β human & artificial.|
|[Hardcover.app](https://hardcover.app/)|Social network and book tracking for readers.|
diff --git a/docs/crds/examples.md b/docs/crds/examples.md
index 3c7b393..5334f51 100644
--- a/docs/crds/examples.md
+++ b/docs/crds/examples.md
@@ -79,10 +79,10 @@ As of **v0.3.6**, storage `accessMode` is introduced that supports `ReadWriteOnc
:::warning
-1. When working with [Open Telekom Cloud Object Storage Service (OBS)](https://www.open-telekom-cloud.com/en/products-services/core-services/object-storage-service), [JuiceFS](https://juicefs.com/en/) and [Redis](https://redis.io/) **are not** required in order to mount S3 bucket in the Pods. The `everest-csi-provisioner` takes care of the whole life-cycle of provisioning and mount bucket as volumes
+1. When working with [T Cloud Public Object Storage Service (OBS)](https://www.open-telekom-cloud.com/en/products-services/core-services/object-storage-service), [JuiceFS](https://juicefs.com/en/) and [Redis](https://redis.io/) **are not** required in order to mount S3 bucket in the Pods. The `everest-csi-provisioner` takes care of the whole life-cycle of provisioning and mount bucket as volumes
via annotations. You can skip this section entirely.
-2. When working with [Amazon S3](https://aws.amazon.com/s3/), [Redis](https://redis.io/) **is not** required, as Amazon S3 comes with is own metadata endpoints.
+1. When working with [Amazon S3](https://aws.amazon.com/s3/), [Redis](https://redis.io/) **is not** required, as Amazon S3 comes with is own metadata endpoints.
:::
@@ -222,9 +222,9 @@ spec:
This is by no means a production-ready Redis cluster nor a best-practice on how to deploy Redis on Kubernetes. It's just a quick spin of cluster in order to be able to work with JuiceFS.
:::
-### Open Telekom Cloud OBS
+### T Cloud Public OBS
-If you are running on [Open Telekom Cloud](https://www.open-telekom-cloud.com/en), you can take advantage of the additional annotations field `csi.storage.k8s.io/fstype`
+If you are running on [T Cloud Public](https://www.open-telekom-cloud.com/en), you can take advantage of the additional annotations field `csi.storage.k8s.io/fstype`
that controls how an S3 bucket is mounted into a Kubernetes pod.
- Using `csi.storage.k8s.io/fstype: s3fs` mounts an [SFS Turbo, Scalable File System](https://www.open-telekom-cloud.com/en/products-services/core-services/scalable-file-service) bucket using the S3-compatible API,
@@ -258,7 +258,7 @@ spec:
:::note
One big advantage of using these annotations is that the respective S3 buckets will be provisioned dynamically by the CSI itself.
-For more information about configuring Open Telekom Cloud `StorageClass` consult
+For more information about configuring T Cloud Public `StorageClass` consult
the [official documentation](https://docs.otc.t-systems.com/cloud-container-engine/umn/storage/storageclass.html).
:::
diff --git a/docs/crds/index.mdx b/docs/crds/index.mdx
index 9243a16..20cec67 100644
--- a/docs/crds/index.mdx
+++ b/docs/crds/index.mdx
@@ -19,38 +19,38 @@ Typesense Kubernetes Operator is controlling the lifecycle of multiple Typesense
### TypesenseClusterSpec
| Name | Description | Optional | Default |
-| -------------------------------------- | ------------------------------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| -------------------------------------- | ------------------------------------------------------------------------------ | :------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| image | Typesense image | | |
-| imagePullSecrets | reference to the private registry authentication `Secret` | X | |
-| adminApiKey | reference to the bootstrap `Secret` | X | |
-| replicas | size of the cluster (allowed 1, 3, 5 or 7) | X | 3 |
-| apiPort | REST/API port | X | 8108 |
-| peeringPort | peering port | X | 8107 |
-| resetPeersOnError | automatic reset of peers on error | X | true |
-| enableCors | enables CORS | X | false |
-| corsDomains | comma separated list of domains allowed for CORS | X | |
-| resources | resources (request & limit) | X |
- Your turnkey Typesense Kubernetes Operator {f.desc} Three simple steps to set up a highly available Typesense cluster {s.desc}
+ TyKO runs highly-available Typesense clusters for you with quorum recovery,
+ rolling upgrades, and zero-downtime operations, all Kubernetes-native.
+
+ Built with the Operator SDK. {f.desc}
obs.csi.everest.io | csi-disk
csi-obs |
+| opentelekomcloud | T Cloud Public | disk.csi.everest.io
obs.csi.everest.io | csi-disk
csi-obs |
| gcp | Google Cloud Platform | pd.csi.storage.gke.io | standard-rwo |
| bm | Bare Metal | democratic-csi-iscsi
democratic-csi-nfs | iscsi
nfs |
| kind | KIND | | rancher.io/local-path |
@@ -75,7 +75,7 @@ Provision one of the samples available in **config/samples**:
kubectl apply -f config/samples/ts_v1alpha1_typesensecluster_{{Suffix}}.yaml
```
-e.g. for Open Telekom Cloud it would look like:
+e.g. for T Cloud Public it would look like:
```yaml title=ts_v1alpha1_typesensecluster_opentelekomcloud.yaml
apiVersion: v1
diff --git a/docs/metrics.md b/docs/metrics.md
index 4132584..15e5152 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -62,14 +62,14 @@ The exporter gathers various metrics from the Typesense /metrics.json endpoint,
## Configuration
| Variable | Type | Default | Required | Description |
-| ------------------ | ------ | ------- | -------- | ---------------------------------------------- |
-| LOG_LEVEL | int | `0` | No | Log level |
-| TYPESENSE_API_KEY | string | β | Yes | API key for accessing each Typesense node |
-| TYPESENSE_HOST | string | β | Yes | Hostname or FQDN of the Typesense node |
-| TYPESENSE_PORT | uint | `8108` | No | Port for Typesense REST/API Port |
-| TYPESENSE_PROTOCOL | string | `http` | No | Protocol for Typesense API (`http` or `https`) |
-| TYPESENSE_CLUSTER | string | β | Yes | Cluster identifier label for metrics |
-| METRICS_PORT | uint | `8908` | No | Port on which `/metrics` is served |
+| ------------------ | ------ | ------- | :------: | ---------------------------------------------- |
+| LOG_LEVEL | int | `0` | | Log level |
+| TYPESENSE_API_KEY | string | β | π΄ | API key for accessing each Typesense node |
+| TYPESENSE_HOST | string | β | π΄ | Hostname or FQDN of the Typesense node |
+| TYPESENSE_PORT | uint | `8108` | | Port for Typesense REST/API Port |
+| TYPESENSE_PROTOCOL | string | `http` | | Protocol for Typesense API (`http` or `https`) |
+| TYPESENSE_CLUSTER | string | β | π΄ | Cluster identifier label for metrics |
+| METRICS_PORT | uint | `8908` | | Port on which `/metrics` is served |
:::note
All these values are automatically configured by the operator.
diff --git a/src/css/custom.css b/src/css/custom.css
index 2af8141..1c22dd6 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -1,39 +1,909 @@
/**
- * Any CSS included here will be global. The classic template
- * bundles Infima by default. Infima is a CSS framework designed to
- * work well for content-centric websites.
+ * TyKO β Docusaurus custom theme
+ * Drop-in replacement for src/css/custom.css
+ *
+ * Design system:
+ * - Ember/orange accent pulled from the TyKO logo
+ * - Deep charcoal-navy for dark mode, warm paper for light mode
+ * - Inter for UI/body, JetBrains Mono for code + display accents
+ * - Semantic tokens only β no ad-hoc colors in components
*/
-/* You can override the default Infima variables here. */
+/* ---------- Fonts ---------- */
+@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&display=swap");
+
+/* ============================================================
+ * Design Tokens
+ * ============================================================ */
:root {
- --ifm-color-primary: #2e3c85;
- --ifm-color-primary-dark: #293678;
- --ifm-color-primary-darker: #273371;
- --ifm-color-primary-darkest: #202a5d;
- --ifm-color-primary-light: #334292;
- --ifm-color-primary-lighter: #354599;
- --ifm-color-primary-lightest: #3c4ead;
- --ifm-code-font-size: 95%;
- --ifm-font-family-base: 'JetBrains Mono', monospace;
- --ifm-heading-font-family: 'JetBrains Mono', monospace;
- --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
-}
-
-/* For readability concerns, you should choose a lighter palette in dark mode. */
-[data-theme='dark'] {
- --ifm-color-primary: #c6c8d2;
- --ifm-color-primary-dark: #afb2c0;
- --ifm-color-primary-darker: #a4a7b7;
- --ifm-color-primary-darkest: #82869c;
- --ifm-color-primary-light: #dddee4;
- --ifm-color-primary-lighter: #e8e9ed;
- --ifm-color-primary-lightest: #ffffff;
- --ifm-background-color: #2e3c85;
- --ifm-background-surface-color: #2e3c85;
- --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
-}
-
- /* Github */
+ /* Brand β from TyKO logo */
+ --tyko-ember: #f26d3d;
+ --tyko-ember-bright: #ff8a5b;
+ --tyko-ember-deep: #c94a1e;
+
+ /* Compatibility aliases used by later homepage sections */
+ --tyko-charcoal: #14100d;
+ --tyko-ember-light: var(--tyko-ember-bright);
+ --tyko-ember-dark: var(--tyko-ember-deep);
+ --tyko-ember-glow: rgba(242, 109, 61, 0.35);
+
+ /* Docusaurus primary mapping (Infima) */
+ --ifm-color-primary: #ea5a24;
+ --ifm-color-primary-dark: #d24d1a;
+ --ifm-color-primary-darker: #c64719;
+ --ifm-color-primary-darkest: #a53a14;
+ --ifm-color-primary-light: #ef7a48;
+ --ifm-color-primary-lighter: #f28a5c;
+ --ifm-color-primary-lightest: #f8ad8c;
+
+ /* Surfaces */
+ --tyko-bg: #fbfaf7;
+ --tyko-bg-elevated: #ffffff;
+ --tyko-surface: #ffffff;
+ --tyko-surface-muted: #f4f2ed;
+ --tyko-border: #e7e3db;
+ --tyko-border-strong: #d6d1c6;
+
+ /* Footer β alternates with the preceding homepage section */
+ --tyko-footer-bg: var(--tyko-surface-muted);
+ --tyko-footer-text: var(--tyko-text-muted);
+ --tyko-footer-link: var(--tyko-ember-deep);
+ --tyko-footer-link-hover: var(--tyko-text);
+ --tyko-footer-border: var(--tyko-border);
+
+ /* Text */
+ --tyko-text: #1a1613;
+ --tyko-text-muted: #6b655c;
+ --tyko-text-subtle: #8f8a80;
+
+ /* Effects */
+ --tyko-radius: 14px;
+ --tyko-radius-sm: 10px;
+ --tyko-radius-lg: 22px;
+ --tyko-shadow-sm: 0 1px 2px rgba(24, 20, 16, 0.04),
+ 0 1px 3px rgba(24, 20, 16, 0.06);
+ --tyko-shadow-md: 0 4px 12px rgba(24, 20, 16, 0.06),
+ 0 2px 4px rgba(24, 20, 16, 0.04);
+ --tyko-shadow-glow: 0 10px 40px -12px rgba(242, 109, 61, 0.35);
+
+ --tyko-gradient-ember: linear-gradient(
+ 135deg,
+ var(--tyko-ember-bright) 0%,
+ var(--tyko-ember) 45%,
+ var(--tyko-ember-deep) 100%
+ );
+ --tyko-gradient-hero: radial-gradient(
+ 1200px 600px at 85% -10%,
+ rgba(242, 109, 61, 0.18),
+ transparent 60%
+ ),
+ radial-gradient(
+ 800px 400px at 0% 20%,
+ rgba(242, 109, 61, 0.08),
+ transparent 60%
+ );
+
+ /* Typography */
+ --ifm-font-family-base: "Inter", ui-sans-serif, system-ui, -apple-system,
+ "Segoe UI", Roboto, sans-serif;
+ --ifm-font-family-monospace: "JetBrains Mono", ui-monospace, SFMono-Regular,
+ "SF Mono", Menlo, monospace;
+ --ifm-heading-font-family: "Inter", var(--ifm-font-family-base);
+ --ifm-heading-font-weight: 700;
+ --ifm-h1-font-size: 2.75rem;
+ --ifm-h2-font-size: 2rem;
+ --ifm-line-height-base: 1.65;
+
+ /* Infima overrides */
+ --ifm-background-color: var(--tyko-bg);
+ --ifm-background-surface-color: var(--tyko-surface);
+ --ifm-color-content: var(--tyko-text);
+ --ifm-color-content-secondary: var(--tyko-text-muted);
+ --ifm-navbar-background-color: rgba(251, 250, 247, 0.75);
+ --ifm-navbar-shadow: none;
+ --ifm-navbar-height: 68px;
+ --ifm-footer-background-color: var(--tyko-footer-bg);
+ --ifm-footer-color: var(--tyko-footer-text);
+ --ifm-footer-link-color: var(--tyko-footer-link);
+ --ifm-footer-title-color: var(--tyko-text);
+ --ifm-toc-border-color: transparent;
+ --ifm-code-font-size: 92%;
+ --ifm-code-background: rgba(242, 109, 61, 0.08);
+ --docusaurus-highlighted-code-line-bg: rgba(242, 109, 61, 0.12);
+
+ /* Button text defaults β keep labels readable in both themes */
+ --ifm-button-color: var(--tyko-text);
+ --ifm-button-background-color: transparent;
+}
+
+
+/* ---------- Dark theme ---------- */
+[data-theme="dark"] {
+ --ifm-color-primary: #ff7d47;
+ --ifm-color-primary-dark: #f66a30;
+ --ifm-color-primary-darker: #e85d22;
+ --ifm-color-primary-darkest: #bf4b1c;
+ --ifm-color-primary-light: #ff9366;
+ --ifm-color-primary-lighter: #ffa07a;
+ --ifm-color-primary-lightest: #ffc0a5;
+
+ --tyko-bg: #0e0c0a;
+ --tyko-bg-elevated: #16130f;
+ --tyko-surface: #17140f;
+ --tyko-surface-muted: #1e1a15;
+ --tyko-border: #2a2620;
+ --tyko-border-strong: #3a3428;
+
+ --tyko-footer-bg: var(--tyko-surface-muted);
+ --tyko-footer-text: var(--tyko-text-muted);
+ --tyko-footer-link: var(--tyko-ember-bright);
+ --tyko-footer-link-hover: var(--tyko-text);
+ --tyko-footer-border: var(--tyko-border);
+
+ --tyko-text: #f4efe6;
+ --tyko-text-muted: #b8b0a3;
+ --tyko-text-subtle: #7d7669;
+
+ --tyko-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
+ --tyko-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.5);
+ --tyko-shadow-glow: 0 10px 60px -10px rgba(255, 125, 71, 0.45);
+
+ --tyko-gradient-hero: radial-gradient(
+ 1200px 600px at 85% -10%,
+ rgba(255, 125, 71, 0.22),
+ transparent 60%
+ ),
+ radial-gradient(
+ 800px 400px at 0% 20%,
+ rgba(255, 125, 71, 0.09),
+ transparent 60%
+ );
+
+ --ifm-background-color: var(--tyko-bg);
+ --ifm-background-surface-color: var(--tyko-surface);
+ --ifm-color-content: var(--tyko-text);
+ --ifm-color-content-secondary: var(--tyko-text-muted);
+ --ifm-navbar-background-color: rgba(14, 12, 10, 0.7);
+ --ifm-footer-background-color: var(--tyko-footer-bg);
+ --ifm-code-background: rgba(255, 125, 71, 0.1);
+ --docusaurus-highlighted-code-line-bg: rgba(255, 125, 71, 0.15);
+ --tyko-ember-glow: rgba(255, 125, 71, 0.45);
+}
+
+
+/* ============================================================
+ * Base
+ * ============================================================ */
+html {
+ font-feature-settings: "ss01", "cv11";
+}
+
+body {
+ background: var(--tyko-bg);
+ color: var(--tyko-text);
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+}
+
+h1, h2, h3, h4 {
+ letter-spacing: -0.02em;
+}
+
+/* Selection */
+::selection {
+ background: var(--tyko-ember);
+ color: #fff;
+}
+
+/* ============================================================
+ * Navbar β sticky, translucent, hairline border
+ * ============================================================ */
+.navbar {
+ backdrop-filter: saturate(180%) blur(16px);
+ -webkit-backdrop-filter: saturate(180%) blur(16px);
+ border-bottom: 1px solid var(--tyko-border);
+ padding: 0 1.25rem;
+}
+
+.navbar__brand {
+ font-family: var(--ifm-font-family-monospace);
+ font-weight: 700;
+ letter-spacing: -0.01em;
+}
+
+.navbar__logo {
+ height: 32px;
+ margin-right: 12px;
+}
+
+.navbar__title {
+ font-size: 0.98rem;
+}
+
+.navbar__link {
+ font-weight: 500;
+ font-size: 0.92rem;
+ color: var(--tyko-text-muted);
+ transition: color 0.15s ease;
+}
+.navbar__link:hover,
+.navbar__link--active {
+ color: var(--tyko-text);
+}
+
+.navbar__link--active::after {
+ content: "";
+ display: block;
+ height: 2px;
+ width: 100%;
+ background: var(--tyko-gradient-ember);
+ border-radius: 2px;
+ margin-top: 2px;
+}
+
+/* GitHub icon link in navbar */
+.header-github-link:hover {
+ opacity: 0.75;
+}
+.header-github-link::before {
+ content: "";
+ width: 22px;
+ height: 22px;
+ display: flex;
+ background: currentColor;
+ mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .3a12 12 0 0 0-3.8 23.4c.6.1.8-.3.8-.6v-2c-3.3.7-4-1.6-4-1.6-.6-1.4-1.4-1.8-1.4-1.8-1.1-.7.1-.7.1-.7 1.2.1 1.9 1.3 1.9 1.3 1.1 1.9 2.8 1.3 3.6 1 .1-.8.4-1.3.8-1.6-2.7-.3-5.5-1.3-5.5-6 0-1.2.5-2.3 1.3-3.1-.2-.4-.6-1.6.1-3.2 0 0 1-.3 3.4 1.2a11.5 11.5 0 0 1 6 0c2.3-1.5 3.3-1.2 3.3-1.2.7 1.6.2 2.8.1 3.2.9.8 1.3 1.9 1.3 3.1 0 4.6-2.8 5.6-5.5 5.9.5.4.9 1.1.9 2.3v3.3c0 .3.1.7.8.6A12 12 0 0 0 12 .3'/%3E%3C/svg%3E") no-repeat center / contain;
+ mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .3a12 12 0 0 0-3.8 23.4c.6.1.8-.3.8-.6v-2c-3.3.7-4-1.6-4-1.6-.6-1.4-1.4-1.8-1.4-1.8-1.1-.7.1-.7.1-.7 1.2.1 1.9 1.3 1.9 1.3 1.1 1.9 2.8 1.3 3.6 1 .1-.8.4-1.3.8-1.6-2.7-.3-5.5-1.3-5.5-6 0-1.2.5-2.3 1.3-3.1-.2-.4-.6-1.6.1-3.2 0 0 1-.3 3.4 1.2a11.5 11.5 0 0 1 6 0c2.3-1.5 3.3-1.2 3.3-1.2.7 1.6.2 2.8.1 3.2.9.8 1.3 1.9 1.3 3.1 0 4.6-2.8 5.6-5.5 5.9.5.4.9 1.1.9 2.3v3.3c0 .3.1.7.8.6A12 12 0 0 0 12 .3'/%3E%3C/svg%3E") no-repeat center / contain;
+}
+
+/* Search bar */
+.DocSearch-Button {
+ border-radius: 10px !important;
+ background: var(--tyko-surface-muted) !important;
+ border: 1px solid var(--tyko-border) !important;
+ height: 38px;
+ padding: 0 12px !important;
+}
+.DocSearch-Button:hover {
+ border-color: var(--tyko-border-strong) !important;
+ box-shadow: none !important;
+}
+.DocSearch-Button-Keys {
+ min-width: auto !important;
+}
+.DocSearch-Button,
+.DocSearch-Button * {
+ color: var(--tyko-text) !important;
+}
+.DocSearch-Button-Placeholder {
+ color: var(--tyko-text-muted) !important;
+}
+.DocSearch-Button-Key {
+ color: var(--tyko-text-subtle) !important;
+}
+
+/* ============================================================
+ * Buttons
+ * ============================================================ */
+.button {
+ font-weight: 600;
+ border-radius: 12px;
+ padding: 0.75rem 1.4rem;
+ transition: transform 0.15s ease, box-shadow 0.2s ease, background 0.2s ease, color 0.2s ease;
+ border: 1px solid transparent;
+ letter-spacing: -0.005em;
+}
+
+.button--primary,
+.button--primary:link,
+.button--primary:visited {
+ background: var(--tyko-gradient-ember);
+ border: none;
+ color: #fff !important;
+ box-shadow: var(--tyko-shadow-glow);
+}
+.button--primary:hover,
+.button--primary:focus,
+.button--primary:active {
+ transform: translateY(-1px);
+ color: #fff !important;
+ filter: brightness(1.05);
+}
+
+.button--secondary,
+.button--secondary:link,
+.button--secondary:visited {
+ background: var(--tyko-surface);
+ color: var(--tyko-text) !important;
+ border: 1px solid var(--tyko-border-strong);
+ box-shadow: var(--tyko-shadow-sm);
+}
+.button--secondary:hover,
+.button--secondary:focus,
+.button--secondary:active {
+ background: var(--tyko-surface-muted);
+ color: var(--tyko-text) !important;
+ border-color: var(--tyko-text-muted);
+}
+
+[data-theme="dark"] .button--secondary,
+[data-theme="dark"] .button--secondary:link,
+[data-theme="dark"] .button--secondary:visited {
+ background: var(--tyko-surface);
+ color: var(--tyko-text) !important;
+ border-color: var(--tyko-border-strong);
+}
+[data-theme="dark"] .button--secondary:hover,
+[data-theme="dark"] .button--secondary:focus,
+[data-theme="dark"] .button--secondary:active {
+ background: var(--tyko-surface-muted);
+ color: var(--tyko-text) !important;
+ border-color: var(--tyko-text-muted);
+}
+[data-theme="dark"] .button--primary {
+ color: #fff !important;
+}
+
+/* ============================================================
+ * Homepage β Hero
+ * ============================================================ */
+.tyko-hero {
+ position: relative;
+ padding: clamp(4rem, 10vw, 7rem) 0 clamp(3rem, 6vw, 5rem);
+ background: var(--tyko-gradient-hero), var(--tyko-bg);
+ overflow: hidden;
+}
+
+.tyko-hero::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background-image: linear-gradient(var(--tyko-border) 1px, transparent 1px),
+ linear-gradient(90deg, var(--tyko-border) 1px, transparent 1px);
+ background-size: 48px 48px;
+ mask-image: radial-gradient(ellipse at 50% 0%, black 30%, transparent 70%);
+ opacity: 0.35;
+ pointer-events: none;
+}
+
+.tyko-hero__inner {
+ position: relative;
+ display: grid;
+ grid-template-columns: 1.15fr 1fr;
+ gap: 3rem;
+ align-items: center;
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 1.5rem;
+}
+
+@media (max-width: 900px) {
+ .tyko-hero__inner {
+ grid-template-columns: 1fr;
+ text-align: center;
+ }
+}
+
+.tyko-hero__eyebrow {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ font-family: var(--ifm-font-family-monospace);
+ font-size: 0.78rem;
+ font-weight: 500;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ color: var(--tyko-text-muted);
+ padding: 6px 12px;
+ border: 1px solid var(--tyko-border);
+ border-radius: 999px;
+ background: var(--tyko-surface);
+ margin-bottom: 1.5rem;
+}
+.tyko-hero__eyebrow::before {
+ content: "";
+ width: 6px;
+ height: 6px;
+ border-radius: 999px;
+ background: var(--tyko-ember);
+ box-shadow: 0 0 0 4px rgba(242, 109, 61, 0.18);
+}
+
+.tyko-hero__title {
+ font-size: clamp(2.75rem, 6vw, 4.5rem);
+ line-height: 1.02;
+ font-weight: 800;
+ letter-spacing: -0.035em;
+ margin: 0 0 1.25rem;
+}
+
+.tyko-hero__title-accent {
+ background: var(--tyko-gradient-ember);
+ -webkit-background-clip: text;
+ background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.tyko-hero__subtitle {
+ font-size: clamp(1.05rem, 1.4vw, 1.2rem);
+ color: var(--tyko-text-muted);
+ max-width: 560px;
+ margin: 0 0 2rem;
+ line-height: 1.55;
+}
+@media (max-width: 900px) {
+ .tyko-hero__subtitle {
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+.tyko-hero__cta {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+}
+@media (max-width: 900px) {
+ .tyko-hero__cta {
+ justify-content: center;
+ }
+}
+
+.tyko-hero__logo {
+ position: relative;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+.tyko-hero__logo img {
+ width: min(420px, 90%);
+ height: auto;
+ filter: drop-shadow(0 30px 60px rgba(242, 109, 61, 0.35));
+ animation: tyko-float 6s ease-in-out infinite;
+}
+
+@keyframes tyko-float {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-10px); }
+}
+
+/* ============================================================
+ * Homepage β Features grid
+ * ============================================================ */
+.tyko-section {
+ padding: clamp(3rem, 6vw, 5rem) 1.5rem;
+ max-width: 1200px;
+ margin: 0 auto;
+}
+
+.tyko-section__header {
+ text-align: center;
+ max-width: 640px;
+ margin: 0 auto clamp(2rem, 4vw, 3.5rem);
+}
+.tyko-section__eyebrow {
+ font-family: var(--ifm-font-family-monospace);
+ font-size: 0.78rem;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ color: var(--tyko-ember);
+ font-weight: 600;
+ margin-bottom: 0.75rem;
+}
+.tyko-section__title {
+ font-size: clamp(1.75rem, 3vw, 2.4rem);
+ letter-spacing: -0.025em;
+ font-weight: 700;
+ margin: 0 0 0.75rem;
+}
+.tyko-section__desc {
+ color: var(--tyko-text-muted);
+ font-size: 1.05rem;
+}
+
+.tyko-features {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 20px;
+}
+@media (max-width: 960px) {
+ .tyko-features { grid-template-columns: repeat(2, 1fr); }
+}
+@media (max-width: 640px) {
+ .tyko-features { grid-template-columns: 1fr; }
+}
+
+.tyko-feature {
+ position: relative;
+ padding: 1.75rem;
+ background: var(--tyko-surface);
+ border: 1px solid var(--tyko-border);
+ border-radius: var(--tyko-radius);
+ transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
+ overflow: hidden;
+}
+.tyko-feature::before {
+ content: "";
+ position: absolute;
+ top: 0; left: 0; right: 0;
+ height: 1px;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--tyko-ember) 50%,
+ transparent
+ );
+ opacity: 0;
+ transition: opacity 0.25s ease;
+}
+.tyko-feature:hover {
+ transform: translateY(-3px);
+ border-color: var(--tyko-border-strong);
+ box-shadow: var(--tyko-shadow-md);
+}
+.tyko-feature:hover::before { opacity: 1; }
+
+.tyko-feature__icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 44px;
+ height: 44px;
+ border-radius: 12px;
+ background: rgba(242, 109, 61, 0.1);
+ color: var(--tyko-ember);
+ margin-bottom: 1.1rem;
+}
+.tyko-feature__icon svg {
+ width: 22px;
+ height: 22px;
+ stroke-width: 1.75;
+}
+
+.tyko-feature__title {
+ font-size: 1.08rem;
+ font-weight: 600;
+ margin: 0 0 0.5rem;
+ letter-spacing: -0.01em;
+}
+.tyko-feature__desc {
+ color: var(--tyko-text-muted);
+ font-size: 0.94rem;
+ line-height: 1.6;
+ margin: 0;
+}
+
+/* ============================================================
+ * Homepage β "How it works" steps
+ * ============================================================ */
+.tyko-steps-wrap {
+ background: var(--tyko-surface-muted);
+ border-top: 1px solid var(--tyko-border);
+ border-bottom: 1px solid var(--tyko-border);
+}
+
+.tyko-steps {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 24px;
+ position: relative;
+}
+@media (max-width: 800px) {
+ .tyko-steps { grid-template-columns: 1fr; }
+}
+
+.tyko-step {
+ padding: 1.75rem;
+ background: var(--tyko-surface);
+ border: 1px solid var(--tyko-border);
+ border-radius: var(--tyko-radius);
+ position: relative;
+}
+
+.tyko-step__num {
+ font-family: var(--ifm-font-family-monospace);
+ font-weight: 700;
+ font-size: 0.85rem;
+ color: var(--tyko-ember);
+ background: rgba(242, 109, 61, 0.1);
+ display: inline-flex;
+ padding: 4px 10px;
+ border-radius: 6px;
+ margin-bottom: 1rem;
+ letter-spacing: 0.05em;
+}
+.tyko-step__title {
+ font-size: 1.1rem;
+ font-weight: 600;
+ margin: 0 0 0.4rem;
+}
+.tyko-step__desc {
+ color: var(--tyko-text-muted);
+ font-size: 0.94rem;
+ margin: 0;
+}
+
+/* ============================================================
+ * Doc pages β refined typography & sidebar
+ * ============================================================ */
+.main-wrapper {
+ background: var(--tyko-bg);
+}
+
+.theme-doc-sidebar-container {
+ border-right: 1px solid var(--tyko-border) !important;
+}
+
+.menu {
+ padding: 1rem 0.75rem !important;
+ font-size: 0.9rem;
+}
+
+.menu__link {
+ border-radius: 8px;
+ color: var(--tyko-text-muted);
+ font-weight: 500;
+ padding: 0.4rem 0.75rem;
+ transition: background 0.15s ease, color 0.15s ease;
+}
+.menu__link:hover {
+ background: var(--tyko-surface-muted);
+ color: var(--tyko-text);
+}
+.menu__link--active {
+ background: rgba(242, 109, 61, 0.1);
+ color: var(--tyko-ember) !important;
+ font-weight: 600;
+}
+.menu__link--active:not(.menu__link--sublist) {
+ background: rgba(242, 109, 61, 0.12);
+}
+
+.menu__list-item-collapsible:hover {
+ background: transparent;
+}
+
+/* Article */
+article header h1 {
+ font-size: 2.5rem;
+ letter-spacing: -0.03em;
+}
+
+.theme-doc-markdown h2 {
+ padding-top: 0.5rem;
+ margin-top: 2.5rem;
+ border-top: 1px solid var(--tyko-border);
+ padding-top: 2rem;
+}
+
+/* Inline code */
+code {
+ background: var(--ifm-code-background);
+ border: 1px solid rgba(242, 109, 61, 0.15);
+ color: var(--tyko-ember-deep);
+ padding: 0.15rem 0.4rem;
+ border-radius: 6px;
+ font-size: 0.88em;
+ font-weight: 500;
+}
+[data-theme="dark"] code {
+ color: var(--tyko-ember-bright);
+ border-color: rgba(255, 125, 71, 0.2);
+}
+a code { color: inherit; }
+
+/* Code blocks */
+.theme-code-block {
+ border-radius: var(--tyko-radius) !important;
+ box-shadow: var(--tyko-shadow-sm) !important;
+ border: 1px solid var(--tyko-border);
+}
+.prism-code {
+ font-size: 0.88rem !important;
+ line-height: 1.6 !important;
+}
+
+/* Admonitions */
+.admonition,
+.alert {
+ border-radius: var(--tyko-radius) !important;
+ border: 1px solid var(--tyko-border) !important;
+ border-left: 3px solid var(--ifm-color-primary) !important;
+ background: var(--tyko-surface) !important;
+ box-shadow: var(--tyko-shadow-sm);
+}
+
+/* Tables */
+table {
+ border-radius: var(--tyko-radius);
+ overflow: hidden;
+ border: 1px solid var(--tyko-border);
+ border-collapse: separate;
+ border-spacing: 0;
+}
+table thead {
+ background: var(--tyko-surface-muted);
+}
+table th, table td {
+ border: none;
+ border-bottom: 1px solid var(--tyko-border);
+}
+
+/* Pagination nav */
+.pagination-nav__link {
+ border: 1px solid var(--tyko-border);
+ border-radius: var(--tyko-radius);
+ background: var(--tyko-surface);
+ transition: border-color 0.15s ease, transform 0.15s ease;
+}
+.pagination-nav__link:hover {
+ border-color: var(--ifm-color-primary);
+ transform: translateY(-1px);
+}
+
+/* TOC */
+.table-of-contents__link {
+ color: var(--tyko-text-muted);
+ transition: color 0.15s ease;
+}
+.table-of-contents__link:hover,
+.table-of-contents__link--active {
+ color: var(--tyko-ember) !important;
+ font-weight: 500;
+}
+
+/* ============================================================
+ * Footer
+ * ============================================================ */
+.footer {
+ padding: 4rem 1.5rem 2.5rem;
+ background: var(--tyko-footer-bg);
+ color: var(--tyko-footer-text);
+ border-top: 1px solid var(--tyko-footer-border);
+}
+.footer__title {
+ font-size: 0.8rem;
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+ opacity: 0.7;
+}
+.footer__link-item {
+ color: var(--tyko-footer-link);
+ transition: color 0.15s ease;
+}
+.footer__link-item:hover {
+ color: var(--tyko-footer-link-hover);
+ text-decoration: none;
+}
+.footer__copyright {
+ font-family: var(--ifm-font-family-monospace);
+ font-size: 0.8rem;
+ opacity: 0.55;
+ margin-top: 2rem;
+}
+
+
+/* βββββββββββββββββββββββββββββββββββββββββββββββ
+ Homepage footer
+ βββββββββββββββββββββββββββββββββββββββββββββββ */
+.tyko-home-footer {
+ padding: 2.5rem 0;
+ background: var(--tyko-footer-bg);
+ color: var(--tyko-footer-text);
+ text-align: center;
+ border-top: 1px solid var(--tyko-footer-border);
+}
+
+.tyko-home-footer__copyright {
+ margin: 0 0 0.75rem;
+ font-size: 0.9rem;
+ color: var(--tyko-footer-text);
+}
+
+.tyko-home-footer__links {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 0.5rem;
+ margin: 0;
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+.tyko-home-footer a {
+ color: var(--tyko-footer-link);
+ transition: color 0.2s ease;
+}
+
+.tyko-home-footer a:hover {
+ color: var(--tyko-footer-link-hover);
+ text-decoration: none;
+}
+
+.tyko-home-footer__divider {
+ color: var(--tyko-text-subtle);
+}
+
+
+/* βββββββββββββββββββββββββββββββββββββββββββββββ
+ Bottom CTA
+ βββββββββββββββββββββββββββββββββββββββββββββββ */
+.tyko-cta {
+ padding: 3.5rem 2rem;
+ border-radius: 1.25rem;
+ text-align: center;
+ background: var(--tyko-gradient-ember);
+ color: #fff;
+ box-shadow: 0 16px 40px var(--tyko-ember-glow);
+}
+
+.tyko-cta__title {
+ font-size: clamp(1.5rem, 3.5vw, 2.25rem);
+ font-weight: 800;
+ letter-spacing: -0.02em;
+ margin-bottom: 0.75rem;
+ color: #fff;
+}
+
+.tyko-cta__desc {
+ font-size: clamp(1rem, 2vw, 1.2rem);
+ margin: 0 auto 1.75rem;
+ max-width: 32rem;
+ opacity: 0.95;
+}
+
+.tyko-cta__actions {
+ display: flex;
+ gap: 1rem;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+.tyko-cta .button--primary,
+.tyko-cta .button--primary:link,
+.tyko-cta .button--primary:visited {
+ background: #fff;
+ color: var(--tyko-ember-deep) !important;
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
+}
+
+.tyko-cta .button--primary:hover,
+.tyko-cta .button--primary:focus,
+.tyko-cta .button--primary:active {
+ color: var(--tyko-ember-deep) !important;
+ box-shadow: 0 8px 22px rgba(0, 0, 0, 0.2);
+}
+
+.tyko-cta .button--secondary {
+ background: rgba(255, 255, 255, 0.12);
+ border-color: rgba(255, 255, 255, 0.3);
+ color: #fff;
+}
+
+.tyko-cta .button--secondary:hover {
+ background: rgba(255, 255, 255, 0.2);
+ border-color: #fff;
+ color: #fff;
+}
+
+.tyko-cta .button--secondary:hover {
+ background: rgba(255, 255, 255, 0.2);
+ border-color: #fff;
+ color: #fff;
+}
+
+.tyko-cta .button--tertiary {
+ background: rgba(255, 255, 255, 0.12);
+ border-color: rgba(255, 255, 255, 0.3);
+ color: white;
+}
+
+.tyko-cta .button--tertiary:hover {
+ background: rgba(255, 255, 255, 0.2);
+ border-color: #fff;
+ color: white;
+}
+
+/* Github */
.navbar--github-link {
width: 36px;
@@ -60,4 +930,4 @@
html[data-theme='dark'] .navbar--github-link:before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 25 25' width='25' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
- }
+ }
\ No newline at end of file
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index a638a9d..5b838b1 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -1,211 +1,269 @@
-import React from "react";
-import Layout from "@theme/Layout";
-import Link from "@docusaurus/Link";
+import React from 'react';
+import Link from '@docusaurus/Link';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import useBaseUrl from '@docusaurus/useBaseUrl';
-import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
-import { BarChart3, Lock, HeartPulse, Rocket, CircleFadingArrowUp, Ship, Cable, HandPlatter, Archive } from "lucide-react";
+import Layout from '@theme/Layout';
+import Heading from "@theme/Heading";
-export default function Home(): JSX.Element {
- const { siteConfig } = useDocusaurusContext();
-
- return (
-
- TyKO
-
-
- for highly available self-healing Typesense clusters
-
{ (e.currentTarget as HTMLImageElement).style.display = 'none'; }}
- />
- {f.title}
- How it works
- {s.title}
-
+ Turnkey Typesense.
+
+ Highly available on Kubernetes.
+
+
Everything you need to run Typesense on Kubernetes
+
+ Opinionated where it matters, flexible where it counts.
+ {f.title}
+
+ A highly-available Typesense cluster on Kubernetes, without the yak-shaving. +
+{s.desc}
++ Deploy your first cluster in minutes. +
+