mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-10-26 06:04:08 +00:00
docs: community fixes for self-hosting, contributing and the sidebar (#1802)
Community docs fixes, checked against the self-hosted server source. - CONTRIBUTING.md: setup steps and project structure match the repo (#1745). - README: link the self-hosting quickstart (#1713). - Self-hosting: database snapshot behavior (#1687) and embedding env vars, local model dimensions and the v0.0.6 upgrade lock (#1659), trimmed to what the code does. - Docs sidebar: hover and selected state CSS from #1784, without the duplicated bold icon set. - `SUPERMEMORY_DATA_DIR` now defaults to `~/.supermemory` (server-v0.0.9). Co-Authored-By: Agnik47 <140933190+Agnik47@users.noreply.github.com> Co-Authored-By: Fullstop000 <fullstop1005@gmail.com> Co-Authored-By: Adityakk9031 <143548997+Adityakk9031@users.noreply.github.com> Co-Authored-By: parthivdzns <parthiv.des@gmail.com>
This commit is contained in:
parent
575ee2eaf5
commit
87af03a55f
6 changed files with 179 additions and 61 deletions
|
|
@ -26,25 +26,17 @@ Before you begin, ensure you have the following installed:
|
|||
bun install
|
||||
```
|
||||
|
||||
3. **Set Up Environment Variables**
|
||||
|
||||
```bash
|
||||
# Copy the example environment file
|
||||
cp .env.example .env.local
|
||||
|
||||
# Edit the file with your configuration
|
||||
# You'll need to add your API keys and database URLs
|
||||
```
|
||||
|
||||
4. **Start the Development Server**
|
||||
3. **Start the Development Server**
|
||||
|
||||
```bash
|
||||
bun run dev:local
|
||||
```
|
||||
|
||||
This starts each app on plain `localhost` ports (web on 3000, mcp on 8788, docs on 3003, graph on 3004) and points the web app at the public API at `https://api.supermemory.ai` via `NEXT_PUBLIC_BACKEND_URL` in `.env.example`. Sign in with magic-link/email-OTP — Google/GitHub OAuth sign-in won't round-trip back to localhost.
|
||||
This starts each app on plain `localhost` ports (web on 3000, mcp on 8788, docs on 3003, graph playground on 3004, sdk playground on 3005).
|
||||
|
||||
> **Internal team note:** `bun run dev` (without `:local`) routes through [portless](https://github.com/portless/portless) to give every app a stable `*.dev.supermemory.ai` HTTPS URL with shared cookies and a working OAuth proxy. That path requires `bun run setup:dev` once (binds port 443, trusts a local CA). OSS contributors don't need it.
|
||||
> **Note:** `apps/web` only redirects to the console at `https://console.supermemory.ai`, so it needs no env setup.
|
||||
|
||||
> **Internal team note:** `bun run dev` (without `:local`) routes through [portless](https://github.com/portless/portless) to give every app a stable `*.dev.supermemory.ai` HTTPS URL with shared cookies and a working OAuth proxy. That path needs portless set up once (it binds port 443 and trusts a local CA). OSS contributors don't need it.
|
||||
|
||||
## 📁 Project Structure
|
||||
|
||||
|
|
@ -53,24 +45,29 @@ supermemory is organized as a monorepo using Turbo:
|
|||
```
|
||||
supermemory/
|
||||
├── apps/
|
||||
│ ├── web/ # Next.js web application
|
||||
│ ├── browser-extension/ # Browser extension (WXT-based)
|
||||
│ ├── docs/ # Documentation site
|
||||
│ └── raycast-extension/ # Raycast extension
|
||||
│ ├── web/ # Redirects to the console
|
||||
│ ├── mcp/ # Model Context Protocol server
|
||||
│ ├── docs/ # Documentation site
|
||||
│ ├── raycast-extension/ # Raycast extension
|
||||
│ ├── memory-graph-playground/ # Demo app for the memory graph component
|
||||
│ └── sdk-playground/ # Playground for the SDK integrations
|
||||
├── packages/
|
||||
│ ├── ui/ # Shared UI components
|
||||
│ ├── lib/ # Shared utilities and logic
|
||||
│ ├── hooks/ # Shared React hooks
|
||||
│ ├── validation/ # Zod schemas and validation
|
||||
│ ├── ai-sdk/ # AI SDK for memory operations
|
||||
│ ├── tools/ # Development tools and utilities
|
||||
│ ├── openai-sdk-python/ # Python SDK for OpenAI integration
|
||||
│ ├── openai-sdk-ts/ # TypeScript SDK for OpenAI integration
|
||||
│ ├── eslint-config/ # ESLint configurations
|
||||
│ └── typescript-config/ # TypeScript configurations
|
||||
├── turbo.json # Turbo configuration
|
||||
├── biome.json # Biome configuration
|
||||
└── package.json # Root package configuration
|
||||
│ ├── tools/ # Memory tools for AI SDK, OpenAI, Voltagent and Mastra
|
||||
│ ├── memory-graph/ # Interactive memory graph component
|
||||
│ ├── openai-sdk-python/ # Memory tools for OpenAI function calling (Python)
|
||||
│ ├── agent-framework-python/ # Microsoft Agent Framework integration (Python)
|
||||
│ ├── pipecat-sdk-python/ # Pipecat integration (Python)
|
||||
│ ├── cartesia-sdk-python/ # Cartesia Line integration (Python)
|
||||
│ ├── livekit-sdk-python/ # LiveKit Agents integration (Python)
|
||||
│ ├── ui/ # Shared UI components
|
||||
│ ├── lib/ # Shared utilities and logic
|
||||
│ ├── hooks/ # Shared React hooks
|
||||
│ ├── validation/ # Zod schemas and validation
|
||||
│ └── docs-test/ # Runs the code samples from the docs
|
||||
├── skills/ # Supermemory agent skill
|
||||
├── turbo.json # Turbo configuration
|
||||
├── biome.json # Biome configuration
|
||||
└── package.json # Root package configuration
|
||||
```
|
||||
|
||||
## 🛠️ Development Workflow
|
||||
|
|
@ -101,7 +98,7 @@ bun run build
|
|||
|
||||
### Tech Stack
|
||||
|
||||
- **Frontend**: Next.js 15, React 19, TypeScript
|
||||
- **Frontend**: Next.js 16, React 19, TypeScript
|
||||
- **Styling**: Tailwind CSS, Radix UI components
|
||||
- **State Management**: Zustand, TanStack Query
|
||||
- **Build Tool**: Turbo (monorepo)
|
||||
|
|
|
|||
|
|
@ -337,7 +337,7 @@ const client = new Supermemory({
|
|||
- **Bring any model** — OpenAI, Anthropic, Gemini, Groq, or any OpenAI-compatible endpoint. An interactive wizard walks you through it on first boot.
|
||||
- **Embeddings** — local `Xenova/bge-base-en-v1.5` by default (no API key); optionally OpenAI, Gemini, or Ollama. Same provider stack as cloud.
|
||||
- **Offline text memories if you want** — point it at Ollama (`gpt-oss:20b` works great), disable telemetry with `SUPERMEMORY_DISABLE_TELEMETRY=1`, and use local text or file inputs after the first embedding-model download. URL ingestion uses a hosted reader service.
|
||||
- **Your data, one directory** — everything lives in `./.supermemory`, easy to back up or move.
|
||||
- **Your data, one directory** — everything lives in `~/.supermemory`, easy to back up or move.
|
||||
- **Same API as the platform** — prototype locally, ship on the hosted platform by changing `baseURL`.
|
||||
|
||||
### Run with Docker
|
||||
|
|
@ -358,7 +358,7 @@ The API listens on `http://localhost:6767`. Data and credentials persist in the
|
|||
|
||||
Read the [Docker setup and upgrade instructions](apps/docs/self-hosting/docker.mdx) for persistent provider configuration, backups and upgrades. Keep the existing volume and keys when upgrading; **don’t run `docker compose down -v`**.
|
||||
|
||||
Read the [self-hosting docs](https://supermemory.ai/docs/self-hosting/overview) — quickstart, [configuration](https://supermemory.ai/docs/self-hosting/configuration), [embeddings](https://supermemory.ai/docs/self-hosting/embeddings), and [local vs. Enterprise](https://supermemory.ai/docs/self-hosting/local-vs-enterprise).
|
||||
Read the [self-hosting docs](https://supermemory.ai/docs/self-hosting/overview) — [quickstart](https://supermemory.ai/docs/self-hosting/quickstart), [configuration](https://supermemory.ai/docs/self-hosting/configuration), [embeddings](https://supermemory.ai/docs/self-hosting/embeddings), and [local vs. Enterprise](https://supermemory.ai/docs/self-hosting/local-vs-enterprise).
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -14,10 +14,12 @@ The installer writes API keys to `~/.supermemory/env`, which is loaded on every
|
|||
| Variable | Purpose | Default |
|
||||
|---|---|---|
|
||||
| `PORT` (or `SUPERMEMORY_PORT`) | HTTP listen port | `6767` |
|
||||
| `SUPERMEMORY_HOST` | In the next release, controls the listen address; not supported by v0.0.8 | `127.0.0.1` in the next release |
|
||||
| `SUPERMEMORY_DATA_DIR` | Where the graph engine's data, auth secret, and model cache live | `./.supermemory` |
|
||||
| `SUPERMEMORY_HOST` | Listen address (v0.0.9 and later). Set `0.0.0.0` only when you protect the server with TLS and firewall rules | `127.0.0.1` |
|
||||
| `SUPERMEMORY_DATA_DIR` | Where the graph engine's data, auth secret, and model cache live | `~/.supermemory` |
|
||||
|
||||
**The currently published v0.0.8 binds all interfaces and its implicit local authentication is unsafe when exposed to untrusted networks. Do not expose it; restrict access with a firewall or run it on an isolated machine.** The next release will bind loopback and require the generated key for every API request, including requests from localhost. Its browser welcome page will no longer reveal the key; enter the key printed at first boot in the Memory tab. If you later expose that release through a reverse proxy, protect the endpoint with TLS and access controls.
|
||||
From v0.0.9, an unset `SUPERMEMORY_DATA_DIR` uses `~/.supermemory`. An existing `./.supermemory` store in the current directory is still used if `~/.supermemory` has none. If both have a store, the server refuses to start until you set `SUPERMEMORY_DATA_DIR`. v0.0.8 and older always use `./.supermemory`.
|
||||
|
||||
From v0.0.9, the server binds `127.0.0.1` and every API request needs the generated key, including requests from localhost. The welcome page does not show the key; enter the key printed at first boot in the Memory tab. If you expose the server through a reverse proxy, protect it with TLS and access controls. **v0.0.8 and older bind all interfaces with implicit local authentication. Do not expose them; upgrade, or restrict access with a firewall.**
|
||||
|
||||
## LLM providers
|
||||
|
||||
|
|
@ -60,22 +62,26 @@ OPENAI_MODEL=gpt-oss:20b
|
|||
| `OPENAI_FAST_MODEL` | Override for fast/light tasks | `OPENAI_MODEL` |
|
||||
| `OPENAI_TEXT_MODEL` | Override for heavier text tasks | `OPENAI_MODEL` |
|
||||
|
||||
## File storage
|
||||
## Storage & persistence
|
||||
|
||||
### File storage
|
||||
|
||||
Uploaded files (PDFs, images) are stored on local disk inside `$SUPERMEMORY_DATA_DIR` and served by the server at `/files/:key`.
|
||||
|
||||
### Database snapshots & resource usage
|
||||
|
||||
The server saves its database and vector indices as one encrypted snapshot file at `$SUPERMEMORY_DATA_DIR/data`.
|
||||
|
||||
- **Idle (v0.0.7 and later):** if nothing changed since the last snapshot, the server skips it, so an idle server does no snapshot work.
|
||||
- **While writing:** each snapshot is a full dump, taken every 10 seconds while writes continue. The interval is not configurable.
|
||||
- **Shutdown:** on `SIGINT` or `SIGTERM`, pending changes are saved before the process exits.
|
||||
|
||||
Nothing to configure. Uploaded files (PDFs, images) are stored on local disk inside `$SUPERMEMORY_DATA_DIR` and served by the server at `/files/:key`.
|
||||
|
||||
## Embeddings
|
||||
|
||||
By default, vectors are computed locally with `Xenova/bge-base-en-v1.5` (768d) — no embedding API key. On interactive first boot you can pick a different provider after the LLM key step; for Docker/CI set env vars instead.
|
||||
|
||||
The full provider table, multilingual guidance, remote examples (OpenAI, Gemini, Ollama) and the dimension-lock warning are in [embeddings for self-hosting](/self-hosting/embeddings).
|
||||
|
||||
| Variable | Purpose | Default |
|
||||
|---|---|---|
|
||||
| `SUPERMEMORY_EMBEDDING_PROVIDER` | `local`, `openai`, `gemini`, or OpenAI-compatible remote | `local` |
|
||||
| `SUPERMEMORY_EMBEDDING_MODEL` | Model id for the chosen provider | `Xenova/bge-base-en-v1.5` |
|
||||
| `SUPERMEMORY_EMBEDDING_DIMENSIONS` | Vector size; must match model and stored data | `768` |
|
||||
| `SUPERMEMORY_EMBEDDING_BASE_URL` | Base URL for OpenAI-compatible embedding APIs | unset |
|
||||
The `SUPERMEMORY_EMBEDDING_*` env vars, the local model table, remote examples (OpenAI, Gemini, Ollama) and the dimension lock are in [embeddings for self-hosting](/self-hosting/embeddings).
|
||||
|
||||
### Embedding performance
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ On first boot with a TTY, Supermemory asks for an LLM API key (required), then o
|
|||
|
||||
1. Choose or paste an LLM provider key (OpenAI, Anthropic, Gemini, Groq, or OpenAI-compatible).
|
||||
2. Optionally pick an embedding provider/model. **Press Enter to keep the local English model.**
|
||||
3. Choices are saved encrypted under your data directory (`$SUPERMEMORY_DATA_DIR`, typically `./.supermemory` / `~/.supermemory`).
|
||||
3. Choices are saved encrypted under your data directory (`$SUPERMEMORY_DATA_DIR`, `~/.supermemory` by default from v0.0.9, `./.supermemory` before).
|
||||
|
||||
Boot order is intentional: LLM keys load first so remote embedding options can reuse them (for example OpenAI or Gemini embeddings with the same key).
|
||||
|
||||
|
|
@ -42,10 +42,11 @@ For Docker, CI, or any non-interactive deploy, set env vars — there is **no in
|
|||
|
||||
| Variable | Purpose | Default |
|
||||
|---|---|---|
|
||||
| `SUPERMEMORY_EMBEDDING_PROVIDER` | Embedding backend: `local`, `openai`, `gemini`, or an OpenAI-compatible remote (`ollama` / custom base URL) | `local` |
|
||||
| `SUPERMEMORY_EMBEDDING_MODEL` | Model id for the chosen provider | `Xenova/bge-base-en-v1.5` (local) |
|
||||
| `SUPERMEMORY_EMBEDDING_DIMENSIONS` | Vector size; must match the model and any already-stored data | `768` (local default) |
|
||||
| `SUPERMEMORY_EMBEDDING_PROVIDER` | Embedding backend: `local`, `openai`, `gemini`, or `openai-compatible` (Ollama, vLLM, or any custom base URL) | `local` |
|
||||
| `SUPERMEMORY_EMBEDDING_MODEL` | Model id for the chosen provider (e.g. `Xenova/bge-m3`, `text-embedding-3-small`) | `Xenova/bge-base-en-v1.5` (local) |
|
||||
| `SUPERMEMORY_EMBEDDING_DIMENSIONS` | Vector size; must match the model's output size (native, or a reduced size for `text-embedding-3-*` and Gemini) and any stored data | `768` (local default) |
|
||||
| `SUPERMEMORY_EMBEDDING_BASE_URL` | Base URL for OpenAI-compatible embedding APIs (Ollama, vLLM, etc.) | unset |
|
||||
| `SUPERMEMORY_EMBEDDING_API_KEY` | API key for embedding endpoint (falls back to `OPENAI_API_KEY` / `GEMINI_API_KEY`; `openai-compatible` needs this or `OPENAI_API_KEY`; use any non-empty string if the endpoint has no auth) | unset |
|
||||
| `OPENAI_API_KEY` | Used when provider is `openai` (or compatible) if not otherwise supplied | unset |
|
||||
| `GEMINI_API_KEY` | Used when provider is `gemini` | unset |
|
||||
|
||||
|
|
@ -91,6 +92,22 @@ SUPERMEMORY_EMBEDDING_MODEL=Xenova/bge-base-en-v1.5
|
|||
SUPERMEMORY_EMBEDDING_DIMENSIONS=768
|
||||
```
|
||||
|
||||
#### Local models with known dimensions
|
||||
|
||||
Local models do not support dimension reduction, so `SUPERMEMORY_EMBEDDING_DIMENSIONS` must match the model's native size:
|
||||
|
||||
| Model ID | Dimensions | Notes |
|
||||
|---|---|---|
|
||||
| `Xenova/bge-base-en-v1.5` | `768` | Default local model (English) |
|
||||
| `Xenova/bge-m3` | `1024` | Multilingual (uses `cls` pooling) |
|
||||
| `Xenova/bge-small-en-v1.5` | `384` | English (lightweight) |
|
||||
| `Xenova/bge-large-en-v1.5` | `1024` | English (high capacity) |
|
||||
| `Xenova/multilingual-e5-small` | `384` | Multilingual (lightweight) |
|
||||
| `Xenova/multilingual-e5-base` | `768` | Multilingual |
|
||||
| `Xenova/multilingual-e5-large` | `1024` | Multilingual (high capacity) |
|
||||
| `Xenova/all-MiniLM-L6-v2` | `384` | English general purpose |
|
||||
| `Xenova/paraphrase-multilingual-MiniLM-L12-v2` | `384` | Multilingual sentence similarity |
|
||||
|
||||
### OpenAI
|
||||
|
||||
```bash
|
||||
|
|
@ -112,9 +129,9 @@ SUPERMEMORY_EMBEDDING_DIMENSIONS=768
|
|||
### Ollama (OpenAI-compatible)
|
||||
|
||||
```bash
|
||||
SUPERMEMORY_EMBEDDING_PROVIDER=openai
|
||||
SUPERMEMORY_EMBEDDING_PROVIDER=openai-compatible
|
||||
SUPERMEMORY_EMBEDDING_BASE_URL=http://localhost:11434/v1
|
||||
OPENAI_API_KEY=ollama
|
||||
SUPERMEMORY_EMBEDDING_API_KEY=ollama
|
||||
SUPERMEMORY_EMBEDDING_MODEL=nomic-embed-text
|
||||
SUPERMEMORY_EMBEDDING_DIMENSIONS=768
|
||||
```
|
||||
|
|
@ -127,15 +144,22 @@ Use the dimension published for your chosen model. A mismatch with vectors alrea
|
|||
**Not supported in place.** Embeddings from different models (or different dimensions) are not comparable. Start from a fresh data directory or re-ingest all content so vectors stay in one space. If configured dimensions disagree with stored data, the server **refuses to boot**.
|
||||
</Warning>
|
||||
|
||||
**Changing embeddings later:** Not supported in place. Start from a fresh data directory or re-ingest all content so vectors stay comparable.
|
||||
<Note>
|
||||
**Embedding env vars are ignored in v0.0.6 and v0.0.7-rc.2**
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Model Mixing Bug in v0.0.5 (Exact match returns nothing)**
|
||||
>
|
||||
> In version `v0.0.5`, there was a bug where the server could mix different embedding models between write and read paths (e.g., document ingestion using OpenAI but memory queries using local default embeddings). In multilingual contexts like Japanese (which lacks space tokenization for fallback lexical FTS matching), this caused exact-text memory searches through `/v4/search` and `/v4/profile` to silently return `{"results":[],"total":0}`.
|
||||
>
|
||||
> **Resolution:**
|
||||
> This was fully resolved in `v0.0.7` by locking the embedding plan uniformly across all document and query embedding paths (enforced via a locked plan in the database store). If you are running `v0.0.5` and experiencing this issue, you should upgrade to `v0.0.7` or later.
|
||||
Those two releases ignore `SUPERMEMORY_EMBEDDING_*` and always use local `Xenova/bge-base-en-v1.5`. The env vars work in `v0.0.7` and later.
|
||||
|
||||
A data directory created on `v0.0.6` has no `embedding-plan.json`. From `v0.0.7`, if such a directory already has embeddings, the server locks it to `local · Xenova/bge-base-en-v1.5 · 768d`. To use another provider or model, point `SUPERMEMORY_DATA_DIR` at a fresh directory (or delete the old one) before starting with the new env vars.
|
||||
</Note>
|
||||
|
||||
<Note>
|
||||
**Model Mixing Bug in v0.0.5 (Exact match returns nothing)**
|
||||
|
||||
In version `v0.0.5`, there was a bug where the server could mix different embedding models between write and read paths (e.g., document ingestion using OpenAI but memory queries using local default embeddings). In multilingual contexts like Japanese (which lacks space tokenization for fallback lexical FTS matching), this caused exact-text memory searches through `/v4/search` and `/v4/profile` to silently return `{"results":[],"total":0}`.
|
||||
|
||||
**Resolution:**
|
||||
This was fully resolved in `v0.0.7` by locking the embedding plan uniformly across all document and query embedding paths (enforced via a locked plan in the database store). If you are running `v0.0.5` and experiencing this issue, you should upgrade to `v0.0.7` or later.
|
||||
</Note>
|
||||
|
||||
## Related
|
||||
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ By default, all state lives in a single directory you can back up or move:
|
|||
|
||||
| Path | Contents |
|
||||
|---|---|
|
||||
| `./.supermemory/` (or `$SUPERMEMORY_DATA_DIR`) | The Supermemory graph engine's data, auth secret, embedding model cache |
|
||||
| `~/.supermemory/` (or `$SUPERMEMORY_DATA_DIR`; `./.supermemory/` before v0.0.9) | The Supermemory graph engine's data, auth secret, embedding model cache |
|
||||
| `~/.supermemory/env` | API keys saved by the installer, loaded on every launch |
|
||||
|
||||
## Next steps
|
||||
|
|
|
|||
|
|
@ -1781,6 +1781,97 @@ a[class*="-ml-10"] {
|
|||
font-weight: inherit !important;
|
||||
}
|
||||
|
||||
/* Mintlify paints group-hover:bg-* behind anchor icons; on an <img> that fills the whole box */
|
||||
img[src*="/icons/hugeicons/"] {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
/* Icons are black/white <img>s; opacity tones them to the label colour (#3e3f3f light, #9e9f9f dark) */
|
||||
#sidebar-content {
|
||||
--sm-nav-icon-rest: 0.76;
|
||||
}
|
||||
|
||||
.dark #sidebar-content {
|
||||
--sm-nav-icon-rest: 0.62;
|
||||
}
|
||||
|
||||
#sidebar-content a img[src*="/icons/hugeicons/"] {
|
||||
opacity: var(--sm-nav-icon-rest);
|
||||
transition: opacity var(--sm-dur-hover) var(--sm-ease-out) !important;
|
||||
}
|
||||
|
||||
#sidebar-content a:hover img[src*="/icons/hugeicons/"],
|
||||
#sidebar-content a[aria-current] img[src*="/icons/hugeicons/"] {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Anchors ship as a bare 24px row; give them the page items' 32px box (36px pitch kept via the margin) */
|
||||
#sidebar-content a.nav-anchor {
|
||||
column-gap: 12px;
|
||||
padding: 6px 12px 6px 16px !important;
|
||||
margin-bottom: 4px !important;
|
||||
line-height: 20px !important;
|
||||
border-radius: var(--sm-radius-lg) !important;
|
||||
transition:
|
||||
color var(--sm-dur-hover) var(--sm-ease-out),
|
||||
background-color var(--sm-dur-hover) var(--sm-ease-out);
|
||||
}
|
||||
|
||||
#sidebar-content a.nav-anchor:not([aria-current]):hover {
|
||||
background-color: var(--sm-control-hover) !important;
|
||||
color: var(--sm-text) !important;
|
||||
}
|
||||
|
||||
/* Mintlify fakes bold on selected items with a 0.2px text-shadow; keep true Geist Medium */
|
||||
#navigation-items a[aria-current],
|
||||
#navigation-items a[aria-current] *,
|
||||
a.nav-tabs-item,
|
||||
a.nav-tabs-item * {
|
||||
text-shadow: none !important;
|
||||
}
|
||||
|
||||
/* Inactive top tabs ship in the active ink, so hover had nothing to change */
|
||||
a.nav-tabs-item:not(:has(> div[class*="bg-primary"])) {
|
||||
color: var(--sm-text-2) !important;
|
||||
}
|
||||
|
||||
a.nav-tabs-item:not(:has(> div[class*="bg-primary"])):hover {
|
||||
color: var(--sm-text) !important;
|
||||
}
|
||||
|
||||
a.nav-tabs-item:not(:has(> div[class*="bg-primary"])) img {
|
||||
opacity: var(--sm-nav-icon-rest, 0.76);
|
||||
transition: opacity var(--sm-dur-hover) var(--sm-ease-out) !important;
|
||||
}
|
||||
|
||||
.dark a.nav-tabs-item img {
|
||||
--sm-nav-icon-rest: 0.62;
|
||||
}
|
||||
|
||||
a.nav-tabs-item:not(:has(> div[class*="bg-primary"])):hover img {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#search-bar-entry:hover {
|
||||
background-color: rgb(9 17 32 / 0.06) !important;
|
||||
}
|
||||
|
||||
.dark #search-bar-entry:hover {
|
||||
background-color: rgb(255 255 255 / 0.06) !important;
|
||||
}
|
||||
|
||||
.dark [class*="text-tooltip-foreground"] {
|
||||
background-color: #262626 !important;
|
||||
}
|
||||
|
||||
.sm-home-link-icon {
|
||||
transition: background-color var(--sm-dur-hover) var(--sm-ease-out);
|
||||
}
|
||||
|
||||
.sm-home-link:hover .sm-home-link-icon {
|
||||
background: var(--sm-surface);
|
||||
}
|
||||
|
||||
.dark img[src*="/icons/hugeicons/"],
|
||||
.sm-scene .m-ic.is-on img[src*="/icons/hugeicons/"],
|
||||
.sm-scene .m-badge img[src*="/icons/hugeicons/"] {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue