diff --git a/docs/api/index.md b/docs/api/index.md
index 87ddf65a..4cdc901e 100644
--- a/docs/api/index.md
+++ b/docs/api/index.md
@@ -22,9 +22,9 @@ Make sure that you are sending the requests over HTTPS.
1. [Schema](stream/schema)
1. [Setting](stream/setting)
1. [Ingestion](ingestion/)
- 1. [Bulk](ingestion/bulk)
- 1. [Json](ingestion/json)
- 1. [Multi](ingestion/multi)
+ 1. [Bulk](ingestion/logs/bulk)
+ 1. [Json](ingestion/logs/json)
+ 1. [Multi](ingestion/logs/multi)
1. [Search](search/)
1. [Function](function/)
1. [User](user/)
diff --git a/docs/api/user/add_user.md b/docs/api/user/add_user.md
index 731da2fd..deddc354 100644
--- a/docs/api/user/add_user.md
+++ b/docs/api/user/add_user.md
@@ -3,7 +3,7 @@ description: >-
Add an existing user to an OpenObserve organization with a specified role
using a simple POST request. Supports admin and user roles.
---
-# Add exiting user to org
+# Add existing user to org
Endpoint: `POST /api/{organization}/users/{user_email}`
diff --git a/docs/assets/close-icon.svg b/docs/assets/close-icon.svg
new file mode 100644
index 00000000..f6f83d2b
--- /dev/null
+++ b/docs/assets/close-icon.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/docs/assets/moon.svg b/docs/assets/moon.svg
index 6bd2db16..4345aa4b 100644
--- a/docs/assets/moon.svg
+++ b/docs/assets/moon.svg
@@ -2,12 +2,12 @@
-
-
+
+
-
-
+
+
-
+
\ No newline at end of file
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index 5fe0f32f..9ba6481b 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -3,11 +3,680 @@ description: >-
Configure OpenObserve with flexible environment variables for roles, storage,
performance, and scaling across open source and enterprise deployments.
---
-> Applicable to open source & enterprise version
+> Applicable to both Open Source and Enterprise editions.
-OpenObserve is configured through the use of below environment variables.
+OpenObserve is configured using the following environment variables.
-## Common
+## Basic Configuration
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_ROOT_USER_EMAIL | - | Email ID of the root user. |
+| ZO_ROOT_USER_PASSWORD | - | Password for the root user. |
+| ZO_LOCAL_MODE | true | If local mode is set to true, OpenObserve becomes single node deployment.If it is set to false, it indicates cluster mode deployment which supports multiple nodes with different roles. For local mode one needs to configure SQLite DB, for cluster mode one needs to configure PostgreSQL (recommended) or MySQL. |
+| ZO_LOCAL_MODE_STORAGE | disk | Applicable only for local mode. By default, local disk is used as storage. OpenObserve supports both disk and S3 in local mode. |
+| ZO_NODE_ROLE | all | Node role assignment. Possible values are ingester, querier, router, compactor, alertmanager, and all. A single node can have multiple roles by specifying them as a comma-separated list. For example, compactor, alertmanager. |
+| ZO_NODE_HEARTBEAT_TTL | 30 | Time-to-live (TTL) for node heartbeats in seconds. |
+| ZO_INSTANCE_NAME | - | In the cluster mode, each node has a instance name. Default is instance hostname. |
+| ZO_CLUSTER_COORDINATOR | nats | Defines how nodes in the cluster discover each other. |
+| ZO_APP_NAME | openobserve | Application name for the OpenObserve instance. |
+
+## Network and Communication
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_HTTP_PORT | 5080 | Port number on which the OpenObserve server listens for HTTP requests. |
+| ZO_HTTP_ADDR | | IP address on which the OpenObserve server listens for HTTP requests. |
+| ZO_HTTP_IPV6_ENABLED | false | Set this to true to enable IPv6 support for HTTP. |
+| ZO_HTTP_WORKER_NUM | 0 | Number of threads for HTTP services. Default is equal to the number of CPU cores (cpu_num). |
+| ZO_HTTP_WORKER_MAX_BLOCKING | 1024 | Maximum number of blocking connections allowed per HTTP thread. |
+| ZO_GRPC_PORT | 5081 | Port number on which the OpenObserve server listens for gRPC requests. |
+| ZO_GRPC_ADDR | | IP address on which the OpenObserve server listens for gRPC requests. |
+| ZO_GRPC_ORG_HEADER_KEY | openobserve-org-id | Header key for sending organization information in traces using OTLP over gRPC. |
+| ZO_GRPC_STREAM_HEADER_KEY | stream-name | Header key for sending stream name information in traces using OTLP over gRPC. |
+| ZO_GRPC_MAX_MESSAGE_SIZE | 16 | Maximum gRPC message size in MB. Default is 16 MB. |
+| ZO_GRPC_CONNECT_TIMEOUT | 5 | Timeout in seconds for connecting to the gRPC server. |
+| ZO_ROUTE_TIMEOUT | 600 | Timeout value for the router node in seconds. |
+| ZO_ROUTE_MAX_CONNECTIONS | 1024 | Sets the maximum number of simultaneous connections per type of scheme for the Router node role. |
+
+
+## Data Storage and Directories
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_DATA_DIR | ./data/openobserve/ | Defaults to "data" folder in current working directory if not provided. |
+| ZO_DATA_DB_DIR | ./data/openobserve/db/ | Directory for storing the metadata database locally. |
+| ZO_DATA_WAL_DIR | ./data/openobserve/wal/ | Directory for storing Write-Ahead Log (WAL) data. |
+| ZO_DATA_STREAM_DIR | ./data/openobserve/stream/ | Directory for storing stream data locally. Applicable only in local mode. |
+| ZO_DATA_IDX_DIR | | Local WAL Idx directory. |
+
+
+## Ingestion and Schema Management
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_COLS_PER_RECORD_LIMIT | 1000 | Maximum number of fields allowed per record during ingestion. Records with more fields than this limit are discarded. |
+| ZO_WIDENING_SCHEMA_EVOLUTION | true | If set to false, user can add new columns to the ingested data, but changes to existing column data types are not supported. |
+| ZO_SKIP_SCHEMA_VALIDATION | false | By default, every ingested record is validated against the schema. If the schema is fixed, validation can be skipped to double ingestion performance. |
+| ZO_ALLOW_USER_DEFINED_SCHEMAS | false | When set to true, allows users to define user-defined schemas for a stream. |
+| ZO_SKIP_FORMAT_STREAM_NAME | false | When set to true, it skips formatting stream name while ingestion. |
+| ZO_CONCATENATED_SCHEMA_FIELD_NAME | _all | Field name where all fields, after applying user-defined schema rules and flattening, are stored as a single field. The default value is _all. For example, if the processed data is {a:5, b:"abc"}, an additional field _all is added as {a:5, b:"abc", _all:"{a:5,b:"abc"}"}. This field is used for full-text search, allowing match_all queries to run across all data instead of being limited to a single field. |
+| ZO_INGEST_ALLOWED_UPTO | 5 | Discards events older than the specified number of hours. By default, OpenObserve accepts data only if it is not older than 5 hours from the current ingestion time. |
+| ZO_INGEST_ALLOWED_IN_FUTURE | 24 | Discards events dated beyond the specified number of future hours. By default, OpenObserve accepts data only if it is not timestamped more than 24 hours into the future. |
+| ZO_INGEST_BUFFER_QUEUE_NUM | 5 | Number of queues to buffer ingestion requests. ZO_FEATURE_INGEST_BUFFER_ENABLED must be true |
+| ZO_INGEST_FLATTEN_LEVEL | 3 | The level of flatten ingestion json data, if you want flatten everything you can simple set it to 0, or you can set it to N to limit the flatten level. |
+| ZO_FEATURE_INGEST_BUFFER_ENABLED | false | Enables ingestion requests to be enqueued for background processing, improving responsiveness of ingestion endpoints. |
+| ZO_INGEST_BLOCKED_STREAMS | - | Comma-separated list of streams blocked from ingestion. |
+| ZO_FORMAT_STREAM_NAME_TO_LOWERCASE | true | Converts stream names to lowercase. |
+| ZO_MEM_TABLE_STREAMS | - | Comma-separated list of streams that use dedicated MemTables. |
+| ZO_INGEST_DEFAULT_HEC_STREAM | - | Default stream used for HEC ingestion. |
+
+
+## File Management, WAL, and Memtable
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_MAX_FILE_SIZE_ON_DISK | 64 | Maximum WAL log file size in MB before creating a new log file. Default is 64 MB. WAL files are created per organization and stream type. |
+| ZO_MAX_FILE_SIZE_IN_MEMORY | 256 | Maximum memtable size in MB before it becomes immutable and is written to disk. Default is 256 MB. |
+| ZO_MAX_FILE_RETENTION_TIME | 600 | Maximum retention time in seconds for a WAL log file or memtable. Default is 600 seconds (10 minutes). When this limit is reached, a new WAL file is created and the memtable is written to disk. |
+| ZO_FILE_PUSH_INTERVAL | 60 | Interval in seconds at which WAL files are moved to storage. Default is 60 seconds. |
+| ZO_FILE_PUSH_LIMIT | 0 | Maximum number of WAL files that can be pushed to storage in a single cycle. |
+| ZO_FILE_MOVE_THREAD_NUM | - | Number of threads used by the ingester to move WAL files to storage. Default equals the number of CPU cores. |
+| ZO_MEM_DUMP_THREAD_NUM | - | Number of threads used by the ingester to dump memtables to disk. Default equals the number of CPU cores. |
+| ZO_FILE_MERGE_THREAD_NUM | - | Number of threads used by the compactor to merge WAL files to storage. Default equals the number of CPU cores. |
+| ZO_FILE_MOVE_FIELDS_LIMIT | 2000 | Field count threshold per WAL file. If exceeded, merging is skipped on the ingester. |
+| ZO_MEM_TABLE_MAX_SIZE | 0 | Total size limit of all memtables. Multiple memtables exist for different organizations and stream types. Each memtable cannot exceed ZO_MAX_FILE_SIZE_IN_MEMORY, and the combined size cannot exceed this limit. If exceeded, the system returns a MemoryTableOverflowError to prevent out-of-memory conditions. Default is 50 percent of total memory. |
+| ZO_MEM_PERSIST_INTERVAL | 5 | Interval in seconds at which immutable memtables are persisted from memory to disk. Default is 5 seconds. |
+
+
+## Indexing
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_FEATURE_FULLTEXT_EXTRA_FIELDS | - | Automatically enables global full-text indexing on the specified fields if they exist in the ingested log data. By default, OpenObserve applies full-text indexing to the following global fields: log, message, msg, content, data, and JSON. Example: field1,field2 |
+| ZO_FEATURE_INDEX_EXTRA_FIELDS | - | Automatically enables global secondary indexing on the specified fields if they exist in the ingested log data. Example: field1,field2 |
+| ZO_FEATURE_QUERY_PARTITION_STRATEGY | file_num | Query partition strategy. Possible values are file_num, file_size, file_hash. |
+| ZO_ENABLE_INVERTED_INDEX | true | Enables inverted index creation. |
+
+## Compaction and Data Retention
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_COMPACT_ENABLED | true | Enables compact for small files. |
+| ZO_COMPACT_INTERVAL | 60 | The interval at which job compacts small files into larger files. default is 60s, unit: second |
+| ZO_COMPACT_MAX_FILE_SIZE | 256 | Max file size for a single compacted file, after compaction all files will be below this value. Default is 256MB, unit: MB |
+| ZO_COMPACT_DATA_RETENTION_DAYS | 3650 | Data retention days, default is 10 years. Minimal 3. eg: 30, it means will auto delete the data older than 30 days. You also can set data retention for stream in the UI. |
+| ZO_COMPACT_SYNC_TO_DB_INTERVAL | 1800 | The interval time in seconds after which compactor sync cache to db is run. |
+| ZO_COMPACT_DELETE_FILES_DELAY_HOURS | 2 | The number of hours to delay to delete the pending deleted files by compactor. Value can not be less than 1. |
+| ZO_COMPACT_DATA_RETENTION_HISTORY | false | When enabled, this will move the file_list into file_list_history and not delete files from storage. |
+| ZO_COMPACT_BLOCKED_ORGS | | Use comma to split multiple orgs. Blocked organizations will not be able to ingest data |
+| ZO_COMPACT_FAST_MODE | true |Enables fast compaction mode. Uses more memory but improves performance. Disabling reduces memory usage by about 50 percent. |
+| ZO_COMPACT_OLD_DATA_INTERVAL | 3600 | Interval to compact old data in seconds. |
+| ZO_COMPACT_STRATEGY | file_time | Compaction strategy. Allowed values are file_size, file_time, time_range. |
+| ZO_COMPACT_EXTENDED_DATA_RETENTION_DAYS | 3650 | Extended data retention period in days. |
+| ZO_COMPACT_OLD_DATA_STREAMS | - | Comma-separated stream list to treat as old data. |
+| ZO_COMPACT_OLD_DATA_MAX_DAYS | 7 | Maximum age of data to qualify as old in days. |
+| ZO_COMPACT_OLD_DATA_MIN_HOURS | 2 | Minimum age of data to qualify as old in hours. |
+| ZO_COMPACT_OLD_DATA_MIN_RECORDS | 100 | Minimum record count to compact old data. |
+| ZO_COMPACT_OLD_DATA_MIN_FILES | 10 | Minimum file count to compact old data. |
+| ZO_COMPACT_BATCH_SIZE | 0 | Batch size for fetching pending compaction jobs. |
+| ZO_COMPACT_JOB_RUN_TIMEOUT | 600 | Time limit for one compaction job in seconds. Jobs that exceed this time are marked as failed. |
+| ZO_COMPACT_JOB_CLEAN_WAIT_TIME | 7200 | Minimum age of finished jobs before cleanup in seconds. |
+| ZO_COMPACT_PENDING_JOBS_METRIC_INTERVAL | 300 | Interval to publish pending job metrics in seconds. |
+| ZO_COMPACT_MAX_GROUP_FILES | 10000 | Maximum number of files allowed in a compaction group. |
+
+## UI and Web
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_UI_SQL_BASE64_ENABLED | false | Enable base64 encoding for SQL in UI. |
+| ZO_WEB_URL | - | UI access URL. For example, http://localhost:5080 is used as redirect URL and alert URL. |
+| ZO_BASE_URI | - | If OpenObserve is hosted under a subpath, set the path prefix. Use this for deployments with a Kubernetes NGINX ingress or any reverse proxy that serves OpenObserve under a subpath such as www.example.com/openobserve. |
+| ZO_SWAGGER_ENABLED | true | Generate SWAGGER API documentation by default. |
+
+## Dashboard
+| Environment Variable | Default Value | Description |
+| ------------------------------------ | ------------- | ------------------------------------------------- |
+| ZO_DASHBOARD_SHOW_SYMBOL_ENABLED | false | Shows the symbol selector in dashboards. |
+| ZO_DASHBOARD_PLACEHOLDER | `_o2_all_` | Placeholder stream name used in dashboards. |
+| ZO_MIN_AUTO_REFRESH_INTERVAL | 5 | Minimum allowed auto refresh interval in seconds. |
+
+## Payload Limits
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_JSON_LIMIT | 209715200 | The max payload size of JSON. |
+| ZO_PAYLOAD_LIMIT | 209715200 | The max payload size of http request body. |
+
+## Actix Server
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_ACTIX_REQ_TIMEOUT | 30 | Sets actix server client timeout in seconds for first request. |
+| ZO_ACTIX_KEEP_ALIVE | 30 | Sets actix server keep-alive preference in seconds. |
+| ZO_ACTIX_SHUTDOWN_TIMEOUT | | Sets timeout for graceful worker shutdown of actix workers. |
+
+## Cookies
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_COOKIE_SAME_SITE_LAX | true | If true, same site "lax" cookie is set by the server while authentication. |
+| ZO_COOKIE_SECURE_ONLY | false | If true, secure flag is enabled for the cookie set by the server while authentication. |
+
+## Telemetry and Monitoring
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_TELEMETRY | true | Sends anonymous telemetry data to help improve OpenObserve. Set to false to disable telemetry. |
+| ZO_TELEMETRY_URL | https://e1.zinclabs.dev | OpenTelemetry report URL. You can report to your own server. |
+| ZO_HEARTBEAT_INTERVAL | 30 | OpenTelemetry report frequency. Default is 30 minutes |
+| ZO_PROMETHEUS_ENABLED | false | Enables prometheus metrics on /metrics endpoint |
+| ZO_CALCULATE_STATS_INTERVAL | 600 | In seconds. How often stream stats (total size) is calculated |
+
+## File Retention
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_LOGS_FILE_RETENTION | hourly | Default time partition level for log streams. Supported values are hourly and daily. |
+| ZO_TRACES_FILE_RETENTION | hourly | Default time partition level for trace streams. Supported values are hourly and daily. |
+| ZO_METRICS_FILE_RETENTION | daily | Default time partition level for metric streams. Supported values are hourly and daily. |
+
+## Metrics
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_METRICS_DEDUP_ENABLED | true | Enable de-duplication for metrics |
+| ZO_METRICS_LEADER_PUSH_INTERVAL | 15 | Interval at which current leader information is updated to metadata store , default 15s, unit: second |
+| ZO_METRICS_LEADER_ELECTION_INTERVAL | 30 | Interval after which new leader for metrics will be elected, when data is not received from current leader, default: 30, unit: second. |
+| ZO_SELF_METRIC_CONSUMPTION_ENABLED | false | Self-consumption metrics generated by OpenObserve. |
+| ZO_SELF_METRIC_CONSUMPTION_INTERVAL | 60 | Interval in seconds for self-consumption of metrics. |
+| ZO_SELF_METRIC_CONSUMPTION_ACCEPTLIST | - | Comma-separated list of metrics to self-consume. |
+
+
+## Distinct Values
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_DISTINCT_VALUES_INTERVAL | 10s | Controls how often distinct values for a stream are written from memory to disk. Distinct values are automatically collected when data is ingested. Instead of writing every value to disk immediately, the system waits for this interval. This prevents the system from frequently writing very small chunks of data to disk. Example: If the interval is 10 seconds, distinct values ingested within that 10-second window are combined and written once. |
+| ZO_DISTINCT_VALUES_HOURLY | false | Enables additional deduplication at an hourly level. When enabled, distinct values that repeat within the same hour are merged again, and the system logs a count instead of storing duplicate entries. The collected distinct values are stored in a special stream named distinct_values. Example: Suppose request IDs 123 appear multiple times in one hour. Instead of separate entries, they are merged into one record like: request_id: 123, count: 3 |
+
+## Alerts and Reports
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_ALERT_SCHEDULE_INTERVAL | 10s | Defines how often the alert manager checks for scheduled jobs such as alerts, reports, or scheduled pipelines. The default value is 10 seconds. This means the alert manager fetches and processes alerts, reports, and pipelines every 10 seconds. |
+| ZO_ALERT_SCHEDULE_TIMEOUT | 90 | The maximum expected time duration in seconds within which the processing of alert by the alert manager should be complete. If the processing of the alert is not complete within the timeframe, the alert will become available again for other alert managers to pick. |
+| ZO_SCHEDULER_WATCH_INTERVAL | 30 | The scheduler frequently watches if there are any scheduled jobs which are in processing state for more than the `ZO_ALERT_SCHEDULE_TIMEOUT`/`ZO_REPORT_SCHEDULE_TIMEOUT`, if so it increases their `retries` field by 1 and marks them as available for processing again by alert managers. |
+| ZO_ALERT_SCHEDULE_CONCURRENCY | 5 | The number of scheduled jobs the the alert manager will pull at a time from the scheduler for processing |
+| ZO_CHROME_ENABLED | false | When true, it looks for chromium executable. Required for dashboard reports. |
+| ZO_CHROME_PATH | - | If chrome is enabled, custom chrome executable path can be specified. If not specified, it looks for chrome executable in default locations. If still not found, it automatically downloads a good known version of chromium. |
+| ZO_CHROME_CHECK_DEFAULT_PATH | true | If false, it skips default locations (e.g. CHROME env, usual chrome file path etc.) when looking for chrome executable. |
+| ZO_CHROME_NO_SANDBOX | false | If true, it launches chromium in no-sandbox environment. |
+| ZO_CHROME_SLEEP_SECS | 20 | Specify the number of timeout seconds the headless chrome will wait until all the dashboard data is loaded. |
+| ZO_CHROME_WITH_HEAD | false | If true, it launches the chromium browser in non-headless mode. |
+| ZO_CHROME_WINDOW_WIDTH | 1370 | Specifies the width of the headless chromium browser. |
+| ZO_CHROME_WINDOW_HEIGHT | 730 | Specifies the height of the headless chromium browser. |
+| ZO_CHROME_AUTO_DOWNLOAD | false | Only used by the report-server. If true, the report-server automatically downloads a good known version of chromium if chromium is not found in the system. **Note:** If auto download of chromium is desired, make sure that the system has all the required dependency libraries of chromium already installed. |
+| ZO_SCHEDULER_MAX_RETRIES | 3 | The maximum number of times the scheduler will retry processing the alert/report. If exceeded, the scheduler will skip to the next trigger time of the alert/report. |
+| ZO_SCHEDULER_CLEAN_INTERVAL | 30 | The interval in seconds after which the scheduler will clean up the completed scheduled jobs. |
+| ZO_REPORT_USER_NAME | | The username that will be used by the headless chromium to login into openobserve and generate report. |
+| ZO_REPORT_USER_PASSWORD | | The password that will be used by the headless chromium to login into openobserve and generate report. |
+| ZO_ENABLE_EMBEDDED_REPORT_SERVER | false | If true, the alert manager (for which this ENV is enabled) spawns a new report-server running on PORT `5082` (default, can be changed through `ZO_REPORT_SERVER_HTTP_PORT`). |
+| ZO_REPORT_SERVER_HTTP_PORT | `5082` | The port used by the newly spawned report-server. |
+| ZO_REPORT_SERVER_HTTP_ADDR | `127.0.0.1` | The ip address used by the newly spawned report-server. |
+| ZO_REPORT_SERVER_URL | `localhost:5082` | The report server server URL. E.g. - `https://report-server.example.com/api`. |
+| ZO_REPORT_SERVER_SKIP_TLS_VERIFY | false| If true, it will skip tls verification while making request to report-server from alert manager. |
+
+## Enrichment Tables
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_ENRICHMENT_TABLE_LIMIT | 256 | Controls the maximum size of an enrichment table. If the enrichment table exceeds this limit, you cannot append additional records. OpenObserve returns an error when the size threshold is reached. |
+| ZO_ENRICHMENT_TABLE_CACHE_DIR | - | Local cache directory for enrichment tables. |
+| ZO_ENRICHMENT_TABLE_MERGE_THRESHOLD_MB | 60 | Size threshold to merge small files before uploading to S3 in megabytes. |
+| ZO_ENRICHMENT_TABLE_MERGE_INTERVAL | 600 | Background sync and merge interval in seconds. |
+
+## File List Dump
+| Environment Variable | Default Value | Description |
+| ---------------------------------- | ------------- | ------------------------------------------- |
+| ZO_FILE_LIST_DUMP_ENABLED | false | Enables file list dump. |
+| ZO_FILE_LIST_DUMP_DUAL_WRITE | true | Enables dual write for file list dump. |
+| ZO_FILE_LIST_DUMP_MIN_HOUR | 2 | Minimum hour of day to run file list dump. |
+| ZO_FILE_LIST_DUMP_DEBUG_CHECK | true | Enables debug checks during file list dump. |
+
+## Queue
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_QUEUE_STORE | | Set to "nats" to enable internal queuing through NATS for coordinating rate limiting. |
+
+
+## Query Execution and Optimization
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_UTF8_VIEW_ENABLED | true | When set to true , this environment variable activates DataFusion's StringView optimization in OpenObserve, which automatically converts UTF8 string fields to the more efficient UTF8View data type during query processing. |
+| ZO_SEARCH_INSPECTOR_ENABLED | false | Controls search inspector feature for detailed search operation tracing. When enabled, tracks search operations with trace_id and generates extensive logs for debugging. |
+
+
+## Logs
+ Environment Variable | Default Value | Description |
+| ---------------------------- | -------------------------------------------- | ------------------------------------------------------------------------- |
+| ZO_LOG_JSON_FORMAT | false | Emits logs in JSON format. |
+| ZO_LOG_FILE_DIR | - | Directory for log files. |
+| ZO_LOG_FILE_NAME_PREFIX | - | Prefix for log file names. |
+| ZO_LOG_LOCAL_TIME_FORMAT | - | Local timestamp format for logs. Use a strftime-compatible format string. |
+| ZO_EVENTS_ENABLED | false | Enables internal debug events publishing. |
+| ZO_EVENTS_AUTH | cm9vdEBleGFtcGxlLmNvbTpUZ0ZzZFpzTUZQdzg2SzRK | Basic authentication value used for events publishing. |
+| ZO_EVENTS_BATCH_SIZE | 10 | Number of events per publish batch. |
+| ZO_PRINT_KEY_CONFIG | false | Print key config information in logs. |
+| ZO_PRINT_KEY_SQL | false | Print key sql in logs. |
+| RUST_LOG | info | Log level, also supports: error, warn, info, debug, trace. |
+| ZO_FEATURE_QUICK_MODE_FIELDS | - | Comma-separated list of field names to use when quick mode is enabled. Overrides the default quick mode fields. |
+
+## Caching
+
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_DATA_CACHE_DIR | ./data/openobserve/cache/ | local query cache storage directory, applicable only for cluster mode. |
+| ZO_MEMORY_CACHE_ENABLED | true | enable in-memory caching for files, default is true, the latest files are cached for accelerated queries. |
+| ZO_CACHE_LATEST_FILES_ENABLED | false | Enables or disables latest file caching. |
+| ZO_CACHE_LATEST_FILES_PARQUET | true | Enables caching of latest parquet files. |
+| ZO_CACHE_LATEST_FILES_INDEX | true | Enables caching of index files. |
+| ZO_CACHE_LATEST_FILES_DELETE_MERGE_FILES | false | Controls whether merged files should be deleted from cache. |
+| ZO_CACHE_LATEST_FILES_DOWNLOAD_FROM_NODE | false | Downloads latest files from a peer node instead of object storage. |
+| ZO_CACHE_LATEST_FILES_DOWNLOAD_NODE_SIZE | 100 | Threshold size in megabytes for node to node download. |
+| ZO_MEMORY_CACHE_SKIP_DISK_CHECK | false | Skips free disk space checks during cache operations. |
+| ZO_DISK_RESULT_CACHE_MAX_SIZE | 0 | Maximum disk cache size for query results in megabytes. |
+| ZO_DISK_AGGREGATION_CACHE_MAX_SIZE | 0 | Maximum disk cache size for aggregation results in megabytes. |
+| ZO_DISK_CACHE_MULTI_DIR | - | Comma-separated list of disk cache directories. When set, OpenObserve uses multiple directories for the disk cache. For example, ZO_DISK_CACHE_MULTI_DIR: "ssdpvc1,ssdpvc2" |
+| ZO_DISK_CACHE_GC_SIZE | 100 | Amount of data to release during disk cache garbage collection in megabytes. |
+| ZO_DISK_CACHE_GC_INTERVAL | 60 | Interval to check whether the disk cache is full and to run garbage collection in seconds. |
+| ZO_SCHEMA_CACHE_COMPRESS_ENABLED | - | Removed. No longer supported. |
+| ZO_DISK_CACHE_BUCKET_NUM | 0 | Disk data cache bucket num, multiple bucket means multiple locker, default is 0 |
+| ZO_DISK_CACHE_ENABLED | true | Enable in-disk caching for files, default is true, the latest files are cached for accelerated queries. when the memory cache is not enough will try to cache in local disk, you can consider the memory cache is first level, disk cache is second level. |
+| ZO_DISK_CACHE_MAX_SIZE | - | Default 50% of the total free disk for in-disk cache, one can set it to desired amount unit: MB |
+| ZO_DISK_CACHE_SKIP_SIZE | - | Default 80% of the total disk cache size, A query will skip disk cache if it need more than this value. one can set it to desired amount unit: MB |
+| ZO_DISK_CACHE_RELEASE_SIZE | - | Default drop 1% entries from in-disk cache as cache is full, one can set it to desired amount unit: MB |
+| ZO_DISK_CACHE_STRATEGY | lru | Disk data cache strategy, values are lru, time_lru, fifo |
+
+
+## HTTP TLS
+| Environment Variable | Default Value | Description |
+| --------------------------------- | ------------- | ------------------------------------------------------------------------------------------------- |
+| ZO_HTTP_TLS_ENABLED | false | Enables TLS for HTTP. |
+| ZO_HTTP_TLS_CERT_PATH | - | Path to the TLS certificate file for HTTP. |
+| ZO_HTTP_TLS_KEY_PATH | - | Path to the TLS key file for HTTP. |
+| ZO_HTTP_TLS_MIN_VERSION | - | Minimum TLS version for HTTP. Supported values are 1.2 or 1.3. Empty uses all supported versions. |
+| ZO_HTTP_TLS_ROOT_CERTIFICATES | webpki | Root certificate store to use. Supported values are webpki and native. |
+
+## gRPC TLS and Authentication
+| Environment Variable | Default Value | Description |
+| ---------------------------------- | ------------- | ------------------------------------------ |
+| ZO_INTERNAL_GRPC_TOKEN | - | Internal gRPC authentication token. |
+| ZO_GRPC_CHANNEL_CACHE_DISABLED | false | Disables the gRPC channel cache. |
+| ZO_GRPC_TLS_ENABLED | false | Enables TLS for gRPC. |
+| ZO_GRPC_TLS_CERT_DOMAIN | - | Expected TLS server name for gRPC. |
+| ZO_GRPC_TLS_CERT_PATH | - | Path to the TLS certificate file for gRPC. |
+| ZO_GRPC_TLS_KEY_PATH | - | Path to the TLS key file for gRPC. |
+
+
+## Router
+| Environment Variable | Default Value | Description |
+| -------------------- | ------------- | ------------------------------------------------------------ |
+| ZO_ROUTE_STRATEGY | workload | Dispatch strategy. Supported values are workload and random. |
+
+
+## Authentication
+| Environment Variable | Default Value | Description |
+| ------------------------- | ------------- | -------------------------------------- |
+| ZO_ROOT_USER_TOKEN | - | Root user token. |
+| ZO_CLI_USER_COOKIE | - | Cookie value used by the CLI user. |
+| ZO_COOKIE_MAX_AGE | 2592000 | Cookie max age in seconds. |
+| ZO_EXT_AUTH_SALT | openobserve | Salt used for external authentication. |
+| O2_ACTION_SERVER_TOKEN | - | Token used by the action server. |
+
+## NATS
+| Environment Variable | Default Value | Description |
+| -------------------------- | ------------- | ------------------------------------------------------------------------------------- |
+| ZO_NATS_ADDR | `localhost:4222` |NATS server address - If not stated explicitly the `nats://` schema and port `4222` is assumed.|
+| ZO_NATS_PREFIX | `o2_` | NATS prefix for openobserve. |
+| ZO_NATS_USER | - | NATS user name. |
+| ZO_NATS_PASSWORD | - | NATS user password. |
+| ZO_NATS_REPLICAS | 3 | Number of replicas for NATS. |
+| ZO_NATS_CONNECT_TIMEOUT | 5 | NATS connection timeout in seconds. |
+| ZO_NATS_COMMAND_TIMEOUT | 10 | NATS command timeout in seconds. |
+| ZO_NATS_LOCK_WAIT_TIMEOUT | 3600 | NATS lock wait timeout in seconds. |
+| ZO_NATS_QUEUE_MAX_AGE | 60 | NATS queue maximum age in days. |
+| ZO_NATS_HISTORY | 3 | Number of historical entries to keep in NATS key value buckets. |
+| ZO_NATS_DELIVER_POLICY | all | Starting point in the stream for message delivery. Allowed values are all, last, new. |
+| ZO_NATS_SUB_CAPACITY | 65535 | Maximum subscription capacity. |
+| ZO_NATS_QUEUE_MAX_SIZE | 2048 | Maximum queue size in megabytes. |
+
+
+## S3 and Object Storage
+| Environment Variable | Default Value | Description |
+| -------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| ZO_S3_SERVER_URL | - | Default for aws s3 & leave it empty, but for `minIO`, `gcs` one should configure it. |
+| ZO_S3_REGION_NAME | - | Region name |
+| ZO_S3_ACCESS_KEY | - | Access key |
+| ZO_S3_SECRET_KEY | - | Secret key |
+| ZO_S3_BUCKET_NAME | - | Bucket name |
+| ZO_S3_BUCKET_PREFIX | - | You can store data in a sub directory, like: `openobserve/` |
+| ZO_S3_PROVIDER | s3 | S3 provider name, like: aws, gcs, gcp, oss, minio, swift |
+| ZO_S3_FEATURE_FORCE_HOSTED_STYLE | false | Feature: `force_hosted_style`, default enable for provider `minio` and `swift`. |
+| AWS_EC2_METADATA_DISABLED | false | Feature, default enable for `swift`. |
+| ZO_S3_FEATURE_BULK_DELETE | false | Enables bulk deletion of streams in object stores that support stream deletion. If your object store supports stream delete, you can enable this variable. AWS S3 and Azure ObjectStore are known to support it. When set to **true**, OpenObserve issues a single operation to delete all files under the stream’s storage prefix, reducing deletion time and API usage. |
+| ZO_S3_ACCOUNTS | - | Comma-separated list of account identifiers. |
+| ZO_S3_STREAM_STRATEGY | - | Stream to account selection strategy. Empty uses the default account. Other values are file_hash, stream_hash, and explicit mappings in the form stream1:account1. |
+| ZO_S3_CONNECT_TIMEOUT | 10 | Connect timeout in seconds. |
+| ZO_S3_REQUEST_TIMEOUT | 3600 | Request timeout in seconds. |
+| ZO_S3_ALLOW_INVALID_CERTIFICATES | false | Allows invalid TLS certificates. |
+| ZO_S3_SYNC_TO_CACHE_INTERVAL | 600 | Interval to sync object storage state to cache in seconds. |
+| ZO_S3_MAX_RETRIES | 10 | Maximum number of retries for S3 operations. |
+| ZO_S3_MAX_IDLE_PER_HOST | 0 | Maximum idle connections per host. |
+| ZO_S3_CONNECTION_KEEPALIVE_TIMEOUT | 20 | Keepalive timeout in seconds for S3 connections. |
+| ZO_S3_MULTI_PART_UPLOAD_SIZE | 100 | File size threshold for switching to multi part upload in megabytes. |
+| ZO_S3_FEATURE_HTTP1_ONLY | false | Uses HTTP 1 only for S3 client connections. |
+| ZO_S3_FEATURE_HTTP2_ONLY | false | Uses HTTP 2 only for S3 client connections. |
+
+## SNS
+| Environment Variable | Default Value | Description |
+| --------------------------- | ------------- | ----------------------------- |
+| ZO_SNS_ENDPOINT | - | SNS endpoint URL. |
+| ZO_SNS_CONNECT_TIMEOUT | 10 | Connect timeout in seconds. |
+| ZO_SNS_OPERATION_TIMEOUT | 30 | Operation timeout in seconds. |
+
+## Real User Monitoring (RUM)
+| Environment Variable | Default Value | Description |
+| --------------------------------- | ------------- | ------------------------------------ |
+| ZO_RUM_ENABLED | false | Enables Real User Monitoring. |
+| ZO_RUM_CLIENT_TOKEN | - | Client token used by the RUM SDK. |
+| ZO_RUM_APPLICATION_ID | - | RUM application identifier. |
+| ZO_RUM_SITE | - | RUM site or domain. |
+| ZO_RUM_SERVICE | - | Service name reported by RUM. |
+| ZO_RUM_ENV | - | Environment name reported by RUM. |
+| ZO_RUM_VERSION | - | Version string reported by RUM. |
+| ZO_RUM_ORGANIZATION_IDENTIFIER | - | Organization identifier used by RUM. |
+| ZO_RUM_API_VERSION | - | API version for RUM. |
+| ZO_RUM_INSECURE_HTTP | false | Allows HTTP for RUM endpoints. |
+
+
+## Pipeline
+| Environment Variable | Default Value | Description |
+| ------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| ZO_PIPELINE_REMOTE_STREAM_WAL_DIR | - | Directory for remote stream WAL files. Used to separate remote WAL from local WAL. |
+| ZO_PIPELINE_REMOTE_STREAM_CONCURRENT_COUNT | 30 | Concurrent send count for remote stream WAL. |
+| ZO_PIPELINE_OFFSET_FLUSH_INTERVAL | 10 | Interval to flush the sent offset for remote stream WAL in seconds. |
+| ZO_PIPELINE_REMOTE_REQUEST_TIMEOUT | 600 | Request timeout for pipeline exporters in seconds. |
+| ZO_PIPELINE_REMOTE_REQUEST_MAX_RETRY_TIME | 86400 | Maximum total retry time for pipeline exporters in seconds. |
+| ZO_PIPELINE_WAL_SIZE_LIMIT | 0 | Data size limit for the pipeline WAL directory in MB. When set to zero the default is 50 percent of available local volume space. |
+| ZO_PIPELINE_MAX_CONNECTIONS | 1024 | Maximum number of HTTP connections for the pipeline exporter client. |
+| ZO_PIPELINE_BATCH_ENABLED | false | Enables batching of entries before sending HTTP requests. |
+| ZO_PIPELINE_BATCH_SIZE | 100 | Maximum number of entries per batch. |
+| ZO_PIPELINE_BATCH_TIMEOUT_MS | 1000 | Maximum time to wait for a batch to fill up in milliseconds. |
+| ZO_PIPELINE_BATCH_SIZE_BYTES | 10485760 | Maximum batch size in bytes. |
+| ZO_PIPELINE_BATCH_RETRY_MAX_ATTEMPTS | 3 | Maximum number of retry attempts for batch flush. |
+| ZO_PIPELINE_BATCH_RETRY_INITIAL_DELAY_MS | 1000 | Initial delay for batch flush retries in milliseconds. |
+| ZO_PIPELINE_BATCH_RETRY_MAX_DELAY_MS | 30000 | Maximum delay for batch flush retries in milliseconds. |
+| ZO_PIPELINE_USE_SHARED_HTTP_CLIENT | false | Uses shared HTTP client instances to improve connection pooling. |
+| ZO_PIPELINE_REMOVE_FILE_AFTER_MAX_RETRY | true | Removes the WAL file after reaching the maximum retry count. |
+| ZO_PIPELINE_MAX_RETRY_COUNT | 10 | Maximum number of retries for pipeline exporters. |
+| ZO_PIPELINE_MAX_RETRY_TIME_IN_HOURS | 24 | Maximum retry time for pipeline exporters in hours. |
+| ZO_PIPELINE_MAX_FILE_SIZE_ON_DISK_MB | 128 | Maximum file size on disk for pipeline files in megabytes. |
+| ZO_PIPELINE_MAX_FILE_RETENTION_TIME_SECONDS | 600 | Maximum retention time for pipeline files in seconds. |
+
+## Encryption
+| Environment Variable | Default Value | Description |
+| --------------------------------- | ------------- | --------------------------------------- |
+| ZO_MASTER_ENCRYPTION_ALGORITHM | - | Master encryption algorithm identifier. |
+| ZO_MASTER_ENCRYPTION_KEY | - | Master encryption key material. |
+
+## Health Check
+| Environment Variable | Default Value | Description |
+| -------------------------------- | ------------- | ------------------------------------------------------------------------------- |
+| ZO_HEALTH_CHECK_ENABLED | true | Enables node health checks. |
+| ZO_HEALTH_CHECK_TIMEOUT | 5 | Health check timeout in seconds. |
+| ZO_HEALTH_CHECK_FAILED_TIMES | 3 | Removes the node from the consistent hash after this many consecutive failures. |
+
+## Search Group Resource Allocation
+| Environment Variable | Default Value | Description |
+| ------------------------------------------ | ------------- | -------------------------------------------------- |
+| O2_SEARCH_GROUP_LONG_MAX_CPU | 0.8 | The percentage of CPU allocated to long queries |
+| O2_SEARCH_GROUP_LONG_MAX_MEMORY | 0.8 | The percentage of memory allocated to long queries |
+| O2_SEARCH_GROUP_LONG_MAX_CONCURRENCY | 2 | Maximum number of concurrent long queries. |
+| O2_SEARCH_GROUP_SHORT_MAX_CPU | 0.2 | Percentage of CPU allocated to short queries. |
+| O2_SEARCH_GROUP_SHORT_MAX_CONCURRENCY | 4 | Maximum number of concurrent short queries. |
+| O2_SEARCH_GROUP_SHORT_MAX_MEMORY | 0.2 | Percentage of memory allocated to short queries. |
+
+## Organization Management
+| Environment Variable | Default Value | Description |
+| --------------------------------------------------- | ------------- | --------------------------------------------------------------------------- |
+| ZO_USE_STREAM_SETTINGS_FOR_PARTITIONS_ENABLED | false | Uses stream settings for partitions for all streams. |
+| ZO_ADDITIONAL_REPORTING_ORGS | - | Additional organizations included in reporting. |
+| ZO_CREATE_ORG_THROUGH_INGESTION | true | Allows automatic organization creation through ingestion for the root user. |
+| ZO_ORG_INVITE_EXPIRY | 7 | Number of days an invite token remains valid. |
+
+
+## Elasticsearch Compatibility
+| Environment Variable | Default Value | Description |
+| --------------------- | ------------- | ------------------------------------- |
+| ZO_FAKE_ES_VERSION | - | Fake Elasticsearch version to report. |
+| ZO_ES_VERSION | - | Elasticsearch version to report. |
+| ZO_BULK_RESPONSE_INCLUDE_ERRORS_ONLY | false | When using _bulk API which is compatible with Elasticsearch do not respond with records that succeeded. This allows for higher performance by returing smaller amount of data. |
+
+
+## Prometheus Integration
+| Environment Variable | Default Value | Description |
+| ----------------------------- | ------------- | ---------------------------------------------- |
+| ZO_DEFAULT_SCRAPE_INTERVAL | 15 | Default Prometheus scrape interval in seconds. |
+| ZO_PROMETHEUS_HA_CLUSTER | cluster | For Prometheus cluster deduplication. |
+| ZO_PROMETHEUS_HA_REPLICA | `__replica__` | For Prometheus cluster deduplication. |
+
+## Traces
+| Environment Variable | Default Value | Description |
+| ------------------------------------------- | ------------- | ----------------------------------------- |
+| ZO_TRACES_SPAN_METRICS_ENABLED | false | Enables span metrics for traces. |
+| ZO_TRACES_SPAN_METRICS_EXPORT_INTERVAL | 60 | Span metrics export interval in seconds. |
+| ZO_TRACES_SPAN_METRICS_CHANNEL_BUFFER | 100000 | Buffer size for the span metrics channel. |
+| ZO_TRACING_SEARCH_ENABLED | false | Enables tracing for search operations. |
+| ZO_TRACING_ENABLED | false | enable it to send traces to remote trace server. |
+| ZO_TRACING_HEADER_KEY | Authorization| Remote trace server endpoint authentication header key. |
+| ZO_TRACING_HEADER_VALUE | - / e.g. Basic gjdsgfksgkfjgdskfgsdlfglsjdg | remote trace server endpoint authentication header value. |
+| ZO_TRACING_SEARCH_ENABLED | false | Enables tracing for search operations. |
+| OTEL_OTLP_HTTP_ENDPOINT | - / e.g. https://api.openobserve.ai/api/default | Remote trace server endpoint. |
+
+## Tokio Console
+| Environment Variable | Default Value | Description |
+| -------------------------------- | ------------- | --------------------------------------------------- |
+| ZO_TOKIO_CONSOLE_SERVER_ADDR | 0.0.0.0 | Address for the Tokio console server. |
+| ZO_TOKIO_CONSOLE_SERVER_PORT | 6699 | Port for the Tokio console server. |
+| ZO_TOKIO_CONSOLE_RETENTION | 60 | Retention period in seconds for Tokio console data. |
+
+## Profiling
+| Environment Variable | Default Value | Description |
+| ---------------------------------- | ---------------------------------------------- | --------------------------------------------- |
+| ZO_PROF_PPROF_ENABLED | false | Enables profiling with pprof-rs. |
+| ZO_PROF_PPROF_PROTOBUF_ENABLED | false | Exports pprof-rs profiles in protobuf format. |
+| ZO_PROF_PPROF_FLAMEGRAPH_PATH | - | Path to save flamegraph output. |
+| ZO_PROF_PYROSCOPE_ENABLED | false | Enables profiling with pyroscope-rs. |
+| ZO_PROF_PYROSCOPE_SERVER_URL | [http://localhost:4040](http://localhost:4040) | Pyroscope server URL. |
+| ZO_PROF_PYROSCOPE_PROJECT_NAME | openobserve | Pyroscope project name. |
+
+## Tantivy Index
+| Environment Variable | Default Value | Description |
+| ----------------------------------------------------- | ------------- | ------------------------------------------------------------------------ |
+| ZO_INVERTED_INDEX_RESULT_CACHE_ENABLED | false | Enables Tantivy result cache. |
+| ZO_INVERTED_INDEX_OLD_FORMAT | false | Uses the old index format that generates the same stream name for index. |
+| ZO_INVERTED_INDEX_CAMEL_CASE_TOKENIZER_DISABLED | false | Disables camel case tokenizer for inverted index. |
+| ZO_INVERTED_INDEX_COUNT_OPTIMIZER_ENABLED | true | Enables inverted index count optimizer. |
+
+
+## MaxMind GeoIP
+| Environment Variable | Default Value | Description |
+| -------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
+| ZO_MMDB_DISABLE_DOWNLOAD | true | By default, auto download of MMDB is disabled. To enable it, set this to false. |
+| ZO_MMDB_DATA_DIR | ./data/openobserve/mmdb/ | Defines the local directory path where OpenObserve looks for MaxMind database files. |
+| ZO_MMDB_UPDATE_DURATION_DAYS | 30 | Update interval for MMDB downloads in days. |
+| ZO_MMDB_GEOLITE_CITYDB_URL | [https://geoip.zinclabs.dev/GeoLite2-City.mmdb](https://geoip.zinclabs.dev/GeoLite2-City.mmdb) | GeoLite City database URL. |
+| ZO_MMDB_GEOLITE_ASNDB_URL | [https://geoip.zinclabs.dev/GeoLite2-ASN.mmdb](https://geoip.zinclabs.dev/GeoLite2-ASN.mmdb) | GeoLite ASN database URL. |
+| ZO_MMDB_GEOLITE_CITYDB_SHA256_URL | [https://geoip.zinclabs.dev/GeoLite2-City.sha256](https://geoip.zinclabs.dev/GeoLite2-City.sha256) | GeoLite City database SHA-256 URL. |
+| ZO_MMDB_GEOLITE_ASNDB_SHA256_URL | [https://geoip.zinclabs.dev/GeoLite2-ASN.sha256](https://geoip.zinclabs.dev/GeoLite2-ASN.sha256) | GeoLite ASN database SHA-256 URL. |
+
+## Meta Storage
+| Environment Variable | Default Value | Description |
+| ------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| ZO_META_STORE | - | Default is sqlite for local mode, postgres or mysql for cluster mode. and supported values are: sqlite, postgres, mysql. Note that sqlite is supported only for local mode. |
+| ZO_META_TRANSACTION_LOCK_TIMEOUT | 600 | Timeout (in seconds) of transaction lock in meta table. |
+| ZO_META_TRANSACTION_RETRIES | 3 | Maximum time the transaction in the meta table will be retried. |
+| ZO_META_POSTGRES_DSN | - | If you enable postgres as meta store, you need configure the database source address, like this: postgres://postgres:12345678@localhost:5432/openobserve |
+| ZO_META_MYSQL_DSN | - | set this if you want to use MySQL as metadata and filelist store. |
+| ZO_META_CONNECTION_POOL_MIN_SIZE | - | Minimum number of connections created in the connection pool size for postgres, sqlite, and mysql. Defaults to cpu_limits |
+| ZO_META_CONNECTION_POOL_MAX_SIZE | - | Maximum number of connections created in the connection pool size for postgres, sqlite, and mysql. Defaults to `cpu_limits * 2` |
+
+> For local mode, OpenObserve use SQLite as the metadata store.
+> For cluster mode, OpenObserve use PostgreSQL (recommended) or MySQL as the metadata store.
+
+## Bloom Filter
+| Environment Variable | Default Value | Description |
+| --------------------------------------- | ------------- | ------------------------------------------------------------------- |
+| ZO_BLOOM_FILTER_ENABLED | true | Enable by default, but only enabled for trace_id field. |
+| ZO_BLOOM_FILTER_DEFAULT_FIELDS | - | Add more fields support by bloom filter, will add UI setting later. |
+| ZO_BLOOM_FILTER_DISABLED_ON_SEARCH | false | Disable bloom filter for search queries. |
+
+## Usage Reporting
+| Environment Variable | Default Value | Description |
+| ----------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| ZO_USAGE_REPORTING_ENABLED | false | Enable usage reporting. This will start capturing how much data has been ingested across each org/stream. You can use this info to enable charge back for internal teams. |
+| ZO_USAGE_ORG | meta | To which org the usage data should be sent. |
+| ZO_USAGE_BATCH_SIZE | 2000 | How many requests should be batched before flushing the usage data from memory to disk. |
+| ZO_USAGE_REPORTING_MODE | local | Local mode means the usage will be reported only in the internal cluster of ZO_USAGE_ORG. remote mode means that the usage reporting will be ingested to the remote target. both ingests the usage reports both to internal and remote target. |
+| ZO_USAGE_REPORTING_URL | [http://localhost:5080/api/_meta/usage/_json](http://localhost:5080/api/_meta/usage/_json) | In case of remote or both value of ZO_USAGE_REPORTING_MODE, this URL is used to post the usage reports to remote target. |
+| ZO_USAGE_REPORTING_CREDS | - | The credentials required to send along with the post request to the ZO_USAGE_REPORTING_URL. E.g. - Basic cm9vdEBleGFtcGxlLmNvbTpDb21wbGV4UGFzcyMxMjM=. |
+| ZO_USAGE_PUBLISH_INTERVAL | 600 | Duration in seconds after the last reporting usage will be published. |
+
+## SMTP
+
+| Environment Variable | Default Value| Description |
+| -------------------- | --------- | --------------------------------------------------------------------------- |
+| ZO_SMTP_ENABLED | false | Indicates if smtp configuration is present. |
+| ZO_SMTP_HOST | `localhost` | The SMTP host to connect to.|
+| ZO_SMTP_PORT | 25 | The SMTP port to connect to. |
+| ZO_SMTP_USER_NAME | | SMTP user name. `Required` when using smtp. |
+| ZO_SMTP_PASSWORD | | SMTP user password. `Required` when using smtp. |
+| ZO_SMTP_REPLY_TO | | The user email whom people can reply to. |
+| ZO_SMTP_FROM_EMAIL | | The user email that is going to send the email. `Required` when using smtp. |
+| ZO_SMTP_ENCRYPTION | | SMTP encryption method. Possible values are `ssltls`, `starttls` and "" (in case of localhost smtp). |
+
+
+## Streaming search
+
+| Environment Variable | Default Value| Description |
+| -------------------------------- | --------- | ------------------------------------------------------- |
+| ZO_STREAMING_ENABLED | true | Enables streaming search. |
+| ZO_STREAMING_RESPONSE_CHUNK_SIZE_MB | 1 | Size in megabytes for each chunk when streaming search responses. |
+
+
+## Rate limiting
+
+| Environment Variable | Default Value | Description |
+| -------------------------------- | --------- | ------------------------------------------------------- |
+| O2_RATE_LIMIT_ENABLED | false | Enables rate limiting. |
+| O2_RATE_LIMIT_RULE_REFRESH_INTERVAL | 10 | Refresh interval for rate limit rules in seconds. |
+
+
+## Quick mode
+
+| Environment Variable | Default Value | Description |
+| -------------------------------- | --------- | ------------------------------------------------------- |
+| ZO_QUICK_MODE_ENABLED | false | Indicates if quick mode is enabled. |
+| ZO_QUICK_MODE_NUM_FIELDS | 500 | The number of fields to consider for quick mode. |
+| ZO_QUICK_MODE_STRATEGY | | Possible values are `first`, `last`, `both`. |
+
+
+## Miscellaneous
+| Environment Variable | Default Value | Description |
+|---------------------|---------------|-------------|
+| ZO_STARTING_EXPECT_QUERIER_NUM | 0 | The number of queriers expected to be running while caching enrichment tables. |
+| ZO_QUERY_THREAD_NUM | - | The number of threads for searching in data files. |
+| ZO_QUERY_TIMEOUT | 600 | Default timeout of query, unit: seconds |
+| ZO_QUERY_INDEX_THREAD_NUM | 0 | Controls thread count for Tantivy index search. Set to 0 to use default: CPU cores × 4. Set a positive integer to override. 0 does not mean unlimited. |
+| ZO_QUERY_OPTIMIZATION_NUM_FIELDS | 1000 | Field count threshold used by query optimizations. |
+| ZO_QUERY_PARTITION_BY_SECS | 10 | Query partition size. Unit is seconds. |
+| ZO_QUERY_GROUP_BASE_SPEED | 768 | Baseline throughput per core for group operations. Unit is MB per second per core. |
+| ZO_MEMORY_CIRCUIT_BREAKER_ENABLED | false | Enables memory circuit breaker. |
+| ZO_MEMORY_CIRCUIT_BREAKER_RATIO | 90 | Memory usage threshold percentage for circuit breaker. |
+| ZO_RESTRICTED_ROUTES_ON_EMPTY_DATA | false | Redirects users to the ingestion page when no stream is found. |
+| ZO_QUERY_ON_STREAM_SELECTION | true | Triggers search based on a button click event. |
+| ZO_RESULT_CACHE_ENABLED | true | Enables result cache for query results. |
+| ZO_USE_MULTIPLE_RESULT_CACHE | false | Uses multiple result caches for query results. |
+| ZO_RESULT_CACHE_SELECTION_STRATEGY | overlap | Strategy for selecting result cache. Allowed values include both, overlap, duration. |
+| ZO_ALIGN_PARTITIONS_FOR_INDEX | false | Uses large partitions for index across all streams. |
+| ZO_TRACING_SEARCH_ENABLED | false | Enables tracing for search operations. |
+| ZO_AGGREGATION_TOPK_ENABLED | true | Enables approx top-k aggregations. |
+| ZO_FEATURE_FILELIST_DEDUP_ENABLED | false | Deprecated. Not used by the code. Will be removed. |
+| ZO_FEATURE_QUERY_QUEUE_ENABLED | true | Enterprise edition must not enable this. In the open source edition, when enabled, the system processes only one search request at a time. |
+| ZO_FEATURE_QUERY_INFER_SCHEMA | false | Deprecated. Not used by the code. Will be removed. |
+| ZO_FEATURE_DISTINCT_EXTRA_FIELDS | - | Reserved for future use. Contact the maintainers for guidance. |
+
+
+---
+
+## Super-Cluster
+
+> The following environment variables are available only in the Enterprise edition.
+
+| Environment Variable | Default Value | Description |
+| ---------------------------- | ------------- | ----------------------------------------------- |
+| O2_SUPER_CLUSTER_ENABLED | false | Indicates if super cluster is enabled. |
+| O2_SUPER_CLUSTER_REGION | default | Region of super cluster. |
+| O2_SUPER_CLUSTER_PUBLIC_ADDR | | Public address of super cluster. |
+| O2_SUPER_CLUSTER_PUBLIC_PORT | | Public port of super cluster (in case of gRPC). |
+| O2_SUPER_CLUSTER_GRPC_TOKEN | | gRPC token. |
+
+## Search-Group
+> The following environment variables are available only in the Enterprise edition.
+
+| Environment Variable | Default Value | Description |
+| --------------------------------------- | ------------- | ------------------- |
+| O2_SEARCH_GROUP_LONG_MAX_CPU | 80% | The percentage of CPU allocated to long queries. |
+| O2_SEARCH_GROUP_LONG_MAX_MEMORY | 80% |The percentage of memory allocated to long queries. |
+| O2_SEARCH_GROUP_LONG_MAX_CONCURRENCY | 2 |Maximum number of concurrent long queries.|
+| O2_SEARCH_GROUP_SHORT_MAX_CPU | 20% |Percentage of CPU allocated to short queries.|
+| O2_SEARCH_GROUP_SHORT_MAX_CONCURRENCY | 4 |Maximum number of concurrent short queries.|
+| O2_SEARCH_GROUP_SHORT_MAX_MEMORY | 20% |Percentage of memory allocated to short queries.|
+| O2_SEARCH_GROUP_BASE_SPEED | 1024 | Base speed in MB. |
+| O2_SEARCH_GROUP_BASE_SECS | 10 | Base speed in secs. |
+
+## OpenFGA
+> The following environment variables are available only in the Enterprise edition.
+
+| Environment Variable | Default Value | Description |
+| ---------------------------------- | --------- | ---------------------------------------------------------------------------- |
+| O2_OPENFGA_ENABLED | false| Indicates if openfga is enabled. |
+| O2_OPENFGA_BASE_URL | `http://127.0.0.1:8080/stores` | The base URL of openfga stores server. **Required** when openfga is enabled. |
+| O2_OPENFGA_STORE_NAME | `openobserve` | OpenFGA store name. **Required** when openfga is enabled. |
+| O2_MAP_GROUP_TO_ROLE | false | If true, the group claims are mapped into roles in the default org. |
+| O2_OPENFGA_PAGE_SIZE | `100`| The page size used for openfga queries. |
+| O2_OPENFGA_LIST_ONLY_PERMITTED | false | If true, openobserve only lists resources that have `GET` permission. |
+| O2_MAP_GROUP_TO_ROLE_SKIP_CREATION | true | Used with `O2_MAP_GROUP_TO_ROLE`. Skips creating the roles mapped from group claims assuming they already exists. |
+
+## DEX
+> The following environment variables are available only in the Enterprise edition.
+
+| Environment Variable | Default Value |Description |
+| --------------------------- | --------------------------- | ------------------------------------------------------------------- |
+| O2_DEX_ENABLED | false | Enables SSO in OpenObserve using Dex. |
+| O2_DEX_CLIENT_ID | - | Client id of static client. **Required** when dex is enabled. |
+| O2_DEX_CLIENT_SECRET | - | Client secret of static client. **Required** when dex is enabled. |
+| O2_DEX_BASE_URL | `http://127.0.0.1:5556/dex` | URL of the Dex identity provider. **Required** when dex is enabled. |
+| O2_CALLBACK_URL | - | Set this value to `/web/cb`, after successful token received from dex, user will be redirected to this page. **Required** when dex is enabled. |
+| O2_DEX_REDIRECT_URL | - | Set this value to `/config/redirect`, Should match to redirect uri specified in dex. **Required** when dex is enabled. |
+| O2_DEX_SCOPES | openid profile email groups offline_access | Scopes to be fetched from dex. |
+| O2_DEX_GROUP_ATTRIBUTE | ou | Maps user to OpenObserve organization. |
+| O2_DEX_ROLE_ATTRIBUTE | cn | User's role in the organization. |
+| O2_DEX_DEFAULT_ORG | default | Default organization for users not belonging to any group in ldap. |
+| O2_DEX_TOKEN_EP_SUFFIX | `/token` | Suffix for dex token endpoint.|
+| O2_DEX_KEYS_EP_SUFFIX | `/keys` | Suffix for dex keys endpoint. |
+| O2_DEX_AUTH_EP_SUFFIX | `/auth` | Suffix for dex authentication endpoint. |
+| O2_DEX_NATIVE_LOGIN_ENABLED | true | Indicates if native dex login is enabled. |
+
+
+## Other Enterprise Features
+
+| Environment Variable | Default Value | Description |
+| ------------------------- | ------------- | --------------------------------------------------------------------------------------- |
+| O2_AUDIT_ENABLED | false | Indicates if audit reporting is enabled. |
+| O2_AUDIT_BATCH_SIZE | 500 | How many requests should be batched before flushing the audit data from memory to disk. |
+| O2_CUSTOM_LOGO_TEXT | | Custom logo text that will appear along with the openobserve logo. |
+| O2_CUSTOM_SLACK_URL | | Custom slack URL that will be used by the `Slack` menu on the openobserve UI. |
+| O2_CUSTOM_DOCS_URL | | Custom docs URL that will be used by the `docs` tab on the openobserve UI. |
+| O2_CUSTOM_HIDE_MENUS | | Comma-separated menu items that should not be shown in the menu on openobserve UI. For example, `metrics,traces`. |
+
+
+
+
\ No newline at end of file
diff --git a/docs/images/enable-disable-streaming-search.png b/docs/images/enable-disable-streaming-search.png
index 454b4d04..f88cf729 100644
Binary files a/docs/images/enable-disable-streaming-search.png and b/docs/images/enable-disable-streaming-search.png differ
diff --git a/docs/js/search-close-minimal.js b/docs/js/search-close-minimal.js
index d5e44bd1..ac659bba 100644
--- a/docs/js/search-close-minimal.js
+++ b/docs/js/search-close-minimal.js
@@ -1,9 +1,65 @@
+// Show/hide close icon based on .md-search-result__meta visibility
+function isElementInViewport(el) {
+ if (!el) return false;
+ const rect = el.getBoundingClientRect();
+ return (
+ rect.top < window.innerHeight &&
+ rect.bottom > 0 &&
+ rect.left < window.innerWidth &&
+ rect.right > 0
+ );
+}
+
+function toggleCloseIconVisibility() {
+ const meta = document.querySelector(".md-search-result__meta");
+ const closeIcon = document.querySelector(".md-search__close");
+ if (closeIcon) {
+ if (isElementInViewport(meta)) {
+ closeIcon.style.display = "flex";
+ } else {
+ closeIcon.style.display = "none";
+ }
+ }
+}
+
+window.addEventListener("scroll", toggleCloseIconVisibility);
+window.addEventListener("resize", toggleCloseIconVisibility);
+document.addEventListener("DOMContentLoaded", toggleCloseIconVisibility);
+// Also run after search results update
+document.addEventListener("input", function (e) {
+ if (e.target.classList.contains("md-search__input")) {
+ setTimeout(toggleCloseIconVisibility, 50);
+ }
+});
/**
* Minimal Search Close Functionality
* Adds click handler to the close icon in the search input
*/
document.addEventListener("DOMContentLoaded", function () {
+ // Inject clear button if not present
+ const searchInput = document.querySelector(".md-search__input");
+ if (searchInput && !document.querySelector(".md-search__clear")) {
+ const clearBtn = document.createElement("button");
+ clearBtn.className = "md-search__clear";
+ clearBtn.type = "button";
+ clearBtn.textContent = "Clear";
+ searchInput.parentNode.insertBefore(clearBtn, searchInput.nextSibling);
+
+ clearBtn.addEventListener("click", function () {
+ searchInput.value = "";
+ searchInput.dispatchEvent(new Event("input", { bubbles: true }));
+ searchInput.focus();
+ clearBtn.style.display = "none";
+ });
+
+ searchInput.addEventListener("input", function () {
+ clearBtn.style.display = searchInput.value ? "inline" : "none";
+ });
+
+ // Initial state
+ clearBtn.style.display = searchInput.value ? "inline" : "none";
+ }
// Add click handler to search input when close icon area is clicked
document.addEventListener("click", function (e) {
const searchInput = document.querySelector(".md-search__input");
diff --git a/docs/js/toc-highlight.js b/docs/js/toc-highlight.js
new file mode 100644
index 00000000..94dbdae0
--- /dev/null
+++ b/docs/js/toc-highlight.js
@@ -0,0 +1,92 @@
+/**
+ * Simple TOC scroll-based highlighting
+ * Highlights current section in purple text
+ */
+
+(function () {
+ "use strict";
+
+ let tocLinks = [];
+ let headings = [];
+
+ function init() {
+ // Find TOC links
+ tocLinks = Array.from(
+ document.querySelectorAll(".md-nav--secondary .md-nav__link")
+ );
+ if (tocLinks.length === 0) return;
+
+ // Find corresponding headings
+ headings = tocLinks
+ .map((link) => {
+ const href = link.getAttribute("href");
+ return href && href.startsWith("#")
+ ? document.getElementById(href.substring(1))
+ : null;
+ })
+ .filter((h) => h !== null);
+
+ if (headings.length === 0) return;
+
+ // Listen to scroll
+ window.addEventListener("scroll", updateHighlight, { passive: true });
+ updateHighlight();
+ }
+
+ function updateHighlight() {
+ const scrollTop = window.pageYOffset;
+ const windowHeight = window.innerHeight;
+ const documentHeight = document.documentElement.scrollHeight;
+
+ // If near bottom, highlight last item
+ if (scrollTop + windowHeight >= documentHeight - 50) {
+ setActive(tocLinks.length - 1);
+ return;
+ }
+
+ // Find current section
+ let activeIndex = -1;
+ for (let i = headings.length - 1; i >= 0; i--) {
+ if (headings[i] && headings[i].getBoundingClientRect().top <= 80) {
+ activeIndex = i;
+ break;
+ }
+ }
+
+ setActive(activeIndex);
+ }
+
+ function setActive(index) {
+ // Remove all active classes
+ tocLinks.forEach((link) => {
+ link.classList.remove("md-nav__link--active", "is-active");
+ });
+
+ // Add active class to current item and scroll into view if needed
+ if (index >= 0 && index < tocLinks.length) {
+ const activeLink = tocLinks[index];
+ activeLink.classList.add("md-nav__link--active", "is-active");
+ // Scroll the active link into view within the sidebar
+ // Only if not already fully visible
+ if (typeof activeLink.scrollIntoView === "function") {
+ activeLink.scrollIntoView({ block: "nearest", behavior: "smooth" });
+ }
+ }
+ }
+
+ // Initialize when ready
+ if (document.readyState === "loading") {
+ document.addEventListener("DOMContentLoaded", init);
+ } else {
+ init();
+ }
+
+ // Re-initialize on page changes
+ let currentUrl = location.href;
+ new MutationObserver(() => {
+ if (location.href !== currentUrl) {
+ currentUrl = location.href;
+ setTimeout(init, 100);
+ }
+ }).observe(document, { childList: true, subtree: true });
+})();
diff --git a/docs/operator-guide/etcd.md b/docs/operator-guide/etcd.md
index 8cca3300..f4363177 100644
--- a/docs/operator-guide/etcd.md
+++ b/docs/operator-guide/etcd.md
@@ -1,12 +1,16 @@
---
-title: Etcd Maintenance
+title: Etcd Maintenance (Deprecated)
weight: 4450
description: >-
Learn how to maintain your etcd cluster with compaction, defragmentation, and
space quotas to prevent data loss and ensure reliable performance.
---
-# Etcd Maintenance
+# Etcd Maintenance (Deprecated)
+
+!!! warning "Deprecation Notice"
+ Support for **etcd** has been deprecated in OpenObserve.
+
## Overview
diff --git a/docs/operator-guide/etcd_restore.md b/docs/operator-guide/etcd_restore.md
index 6b1d0fea..a0c30630 100644
--- a/docs/operator-guide/etcd_restore.md
+++ b/docs/operator-guide/etcd_restore.md
@@ -3,7 +3,7 @@ description: >-
Restore a broken etcd cluster in OpenObserve by restarting pods, resetting
data, and rejoining members using CLI and updated Helm configs.
---
-# Etcd Cluster Restore
+# Etcd Cluster Restore (Deprecated)
Many users ran into the case only one of the 3 pods of etcd cluster can works. The other 2 pods always restart and can't back to work.
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 2ce80a1b..8d9e5924 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -1,3 +1,85 @@
+/* Hide the search close icon by default; JS will show it when needed */
+.md-search__close {
+ display: none !important;
+}
+/* === FINAL SECONDARY SIDEBAR POSITIONING OVERRIDE === */
+.md-sidebar--secondary,
+.md-sidebar--secondary[data-md-component="sidebar"],
+.md-sidebar--secondary[data-md-state],
+.md-sidebar--secondary[data-md-state="lock"] {
+ position: sticky !important;
+ top: 8rem !important;
+ transform: none !important;
+ transition: none !important;
+ will-change: auto !important;
+ z-index: 200 !important;
+}
+
+/* STRONG FINAL MOBILE SCROLL FIX (highest priority):
+ Lock the sidebar inner to the viewport and force the scrollwrap to handle
+ vertical scrolling. This is intentionally placed at the end and uses
+ !important to win over earlier rules that made nested lists overflow.
+*/
+@media (max-width: 76.24em) {
+ /* Ensure the sidebar occupies the viewport height while drawer is open */
+ .md-sidebar--primary,
+ input[id="__drawer"]:checked ~ .md-container .md-sidebar--primary,
+ .md-toggle[data-md-toggle="drawer"]:checked
+ ~ .md-container
+ .md-sidebar--primary {
+ position: fixed !important;
+ top: 0 !important;
+ left: 0 !important;
+ height: 100vh !important;
+ max-height: 100vh !important;
+ overflow: hidden !important; /* prevent sidebar itself from scrolling */
+ will-change: auto !important;
+ }
+
+ /* Keep the inner wrapper full height but clipped; scrollwrap will scroll */
+ .md-sidebar--primary .md-sidebar__inner {
+ height: 100% !important;
+ max-height: 100% !important;
+ overflow: hidden !important;
+ position: relative !important;
+ }
+
+ /* Force scrollwrap to fill available space and handle vertical scrolling */
+ .md-sidebar--primary .md-sidebar__scrollwrap,
+ input[id="__drawer"]:checked
+ ~ .md-container
+ .md-sidebar--primary
+ .md-sidebar__scrollwrap,
+ .md-toggle[data-md-toggle="drawer"]:checked
+ ~ .md-container
+ .md-sidebar--primary
+ .md-sidebar__scrollwrap {
+ height: 100% !important;
+ max-height: 100% !important;
+ overflow-y: auto !important;
+ overflow-x: hidden !important;
+ -webkit-overflow-scrolling: touch !important;
+ position: relative !important;
+ }
+
+ /* Prevent nested navs from using absolute/transform tricks that remove them
+ from the scroll context (keep them in normal flow) */
+ .md-sidebar--primary .md-nav__list,
+ .md-sidebar--primary .md-nav__item,
+ .md-sidebar--primary .md-nav__item > .md-nav__list,
+ .md-sidebar--primary nav[data-md-level] {
+ position: static !important;
+ transform: none !important;
+ max-height: none !important;
+ overflow: visible !important;
+ }
+
+ /* Make sure scrolling works with touch and pointer events */
+ .md-sidebar--primary .md-sidebar__scrollwrap {
+ touch-action: pan-y !important;
+ }
+}
+
[data-md-color-scheme="openobserve"] {
--md-primary-fg-color: #ffffff;
--md-primary-fg-color--light: #ecb7b7;
@@ -42,15 +124,6 @@ html {
4. Provide stable scrollbar to avoid layout shift.
*/
@media (min-width: 60em) {
- /* Minimal, non-intrusive adjustments */
- .md-sidebar--primary {
- position: sticky; /* stay visible */
- top: 0; /* eliminate excess gap */
- z-index: 200;
- display: flex;
- flex-direction: column;
- }
-
/* Add bottom padding to main content so sidebar never gets overlapped by footer */
.md-main,
.md-content {
@@ -59,12 +132,19 @@ html {
.md-footer {
z-index: 0;
}
- /* Give room so last items can scroll fully into view */
+ /* Primary sidebar scroll container - content-based height like secondary sidebar */
.md-sidebar--primary .md-sidebar__scrollwrap {
- flex: 1;
- overflow-y: auto;
- padding: 0.25rem 0 2.25rem; /* trim top, moderate bottom */
- overscroll-behavior: contain;
+ overflow-y: auto !important;
+ padding: 0.25rem 0 1rem !important;
+ overscroll-behavior: contain !important;
+ width: 100% !important;
+ padding-right: 0 !important;
+ margin-right: 0 !important;
+ border-right: none !important;
+ box-sizing: border-box !important;
+ /* Allow content-based height with increased footer clearance */
+ height: auto !important;
+ max-height: calc(100vh - 12rem) !important;
}
/* Remove bottom fade/overlay that appeared as white block */
.md-sidebar--primary .md-sidebar__scrollwrap:after {
@@ -139,20 +219,6 @@ html {
background-color: #1a1a2e !important;
}
-/* Custom search bar styles for MkDocs Material */
-
-.md-search__input {
- background-color: rgb(245, 243, 254);
- border: 2px solid #7c3aed !important;
- border-radius: 8px !important;
- color: #222 !important;
- transition: border-color 0.2s;
- box-shadow: none !important;
- padding: 0.75em 2.5em 0.75em 1em !important; /* more height and space for icon */
- font-size: 1.5em !important;
- min-width: 16em !important;
-}
-
.md-search__input:focus {
border-color: #7c3aed !important;
outline: none;
@@ -171,7 +237,7 @@ html {
color: #fff !important;
border-radius: 8px !important;
box-shadow: none !important;
- padding: 0.75em 2.5em 0.75em 3.2em !important;
+ padding: 8px 3.2em 8px 3.2em !important;
font-size: 1.5em !important;
min-width: 16em !important;
}
@@ -196,24 +262,30 @@ html {
/* Direct approach: Add close button to search input */
.md-search__input {
- background-color: rgb(245, 243, 254);
- border: 2px solid #7c3aed !important;
+ background-color: #ede9fe;
+ border: 1px solid #7c3aed !important;
border-radius: 8px !important;
color: #222 !important;
transition: border-color 0.2s;
box-shadow: none !important;
- padding: 0.2em 3.2em 0.2em 3.2em !important; /* Remove extra right padding for desktop */
+ padding: 9px 3.2em 9px 3.2em !important; /* Match docs title padding: 5px vertical */
font-size: 1.5em !important;
min-width: 20em !important;
- height: 3em !important;
- /* Remove background image for desktop - will be added for mobile only */
+ height: auto !important; /* Let height be determined by padding + content */
+ background-image: url("/docs/assets/close-icon.svg") !important;
+ background-repeat: no-repeat !important;
+ background-position: calc(100% - 1em) center !important;
+ background-size: 1.2em !important;
}
.md-search__input::placeholder {
color: #7c3aed !important;
opacity: 1 !important;
- font-size: 1.25em !important;
- font-weight: 500 !important;
+ font-size: 1.2em !important;
+ font-weight: 400 !important;
letter-spacing: 0.02em;
+ position: absolute !important;
+ top: 50% !important;
+ transform: translateY(-50%) !important;
}
.md-search__icon {
@@ -221,7 +293,7 @@ html {
/* transition: color 0.2s; */
position: absolute !important;
right: 1.5em !important;
- top: 50% !important;
+ top: 46% !important;
transform: translateY(-50%) !important;
font-size: 1.25em !important;
pointer-events: auto;
@@ -241,20 +313,16 @@ html {
[data-md_color-scheme="slate"] .md-search__input {
background-color: #7c3aed !important;
color: #fff !important;
- border-radius: 999px !important;
+ border-radius: 8px !important;
box-shadow: none !important;
- padding: 0.85em 3.2em 0.85em 3.2em !important; /* Remove extra right padding for desktop */
+ padding: 8px 3.2em 8px 3.2em !important; /* Match docs title padding: 5px vertical */
font-size: 1.5em !important;
min-width: 20em !important;
- height: 3em !important;
+ height: auto !important; /* Let height be determined by padding + content */
/* Remove close button for desktop - will be added for mobile only */
}
[data-md-color-scheme="slate"] .md-search__input::placeholder {
color: #fff !important;
- opacity: 1 !important;
- font-size: 1.25em !important;
- font-weight: 500 !important;
- letter-spacing: 0.02em;
}
[data-md-color-scheme="slate"] .md-search__icon {
@@ -267,6 +335,20 @@ html {
pointer-events: none;
}
+/* --- NAVBAR HEIGHT CONSISTENCY --- */
+.md-header {
+ min-height: 4rem !important;
+ height: auto !important;
+ position: sticky !important;
+ top: 0 !important;
+}
+
+.md-header__inner {
+ min-height: 4rem !important;
+ height: auto !important;
+ /* padding: 0.5rem 1rem !important; */
+}
+
/* --- FINAL: Sidebar Custom Design --- */
.md-sidebar--primary {
background: rgb(245, 243, 254) !important;
@@ -275,14 +357,24 @@ html {
padding: 1em 0.5em !important;
/* margin-right: 2em !important; */
box-shadow: none !important;
- z-index: 10 !important;
- /* allow the active indicator to sit inside the rounded border */
- overflow: visible !important;
+ z-index: 200 !important;
+ position: sticky !important;
+ top: 8rem !important;
+ /* Content-based height with increased footer clearance */
+ height: auto !important;
+ min-height: auto !important;
+ max-height: calc(100vh - 9rem) !important;
+ overflow: hidden !important;
+ /* Keep it visible when scrolling */
+ transform: none !important;
+ display: block !important;
}
-@media (min-width: 1024px) {
+/* Desktop-only styles */
+@media (min-width: 76.25em) {
.md-sidebar--primary {
margin-left: 12px;
+ margin-right: 1em !important;
}
}
[data-md-color-scheme="slate"] .md-sidebar--primary {
@@ -290,10 +382,24 @@ html {
border: 2px solid #7c3aed !important;
border-radius: 8px !important;
padding: 1em 0.5em !important;
- margin-right: 2em !important;
box-shadow: none !important;
- z-index: 10 !important;
+ z-index: 200 !important;
+ position: sticky !important;
+ top: 8rem !important;
+ /* Content-based height with increased footer clearance */
+ height: auto !important;
+ min-height: auto !important;
+ max-height: calc(100vh - 9rem) !important;
overflow: hidden !important;
+ transform: none !important;
+ display: block !important;
+}
+
+/* Desktop-only dark theme margin */
+@media (min-width: 76.25em) {
+ [data-md-color-scheme="slate"] .md-sidebar--primary {
+ margin-right: 1em !important;
+ }
}
.md-sidebar__title,
@@ -307,55 +413,31 @@ html {
.md-sidebar--primary .md-nav__item--active > .md-nav__link {
position: relative !important;
background: transparent !important;
- border-radius: 5px !important;
+ border-radius: 3px !important;
/* make the active link text bold (applies to the text, not the empty pseudo-element) */
font-weight: 700 !important;
/* leave space on the RIGHT for the indicator that sits against the sidebar border */
padding-right: 1.6em !important;
/* keep a little left padding for text alignment */
padding-left: 1.1em !important;
- overflow: visible !important;
+ overflow: hidden !important;
}
.md-sidebar--primary .md-nav__item--active > .md-nav__link::before {
content: "";
position: absolute;
- /* place the indicator INSIDE the sidebar inner border (right side in this theme)
- tweak the `right` value if you want it closer/further from the border */
- right: 8px; /* adjust this number to visually align with your border (2px) */
+ right: 8px;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 4px;
- height: 25px;
+ height: 30px;
background: #4b237a;
- /* slightly rounded marker to match sidebar corner curvature */
border-radius: 3px !important;
z-index: 3 !important;
- /* font-weight on an empty pseudo-element has no effect; kept empty for visual bar */
-}
-
-/* Thin sidebar scrollbar thumb, flush with border */
-.md-sidebar--primary .md-sidebar__scrollwrap {
- scrollbar-width: thin !important;
-}
-.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar {
- width: 6px !important;
- background: transparent !important;
-}
-.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar-thumb {
- background: #7c3aed !important;
- border-radius: 6px !important;
- margin: 0 !important;
- border: none !important;
}
/* --- Sidebar: Add right margin for full rounded border visibility --- */
-.md-sidebar--primary {
- margin-right: 1em !important;
-}
-[data-md_color-scheme="slate"] .md-sidebar--primary {
- margin-right: 1em !important;
-}
+/* Margins are now handled in the main sidebar rules above */
/* --- Remove white shadow from sidebar title --- */
.md-sidebar__title {
@@ -382,16 +464,6 @@ html {
border-right: none !important;
box-sizing: border-box !important;
}
-.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar {
- width: 6px !important;
- background: transparent !important;
-}
-.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar-thumb {
- background: #7c3aed !important;
- border-radius: 6px !important;
- border-right: none !important;
- margin-right: 0 !important;
-}
/* --- Final fix: Remove all space between sidebar scrollbar and border --- */
.md-sidebar--primary {
@@ -438,43 +510,6 @@ html {
}
/* Hide native scrollbar inside the sidebar scrollwrap and provide a custom
- visual track + thumb that we control via JS so the active marker can be
- aligned exactly with the visible thumb. */
-.md-sidebar--primary .md-sidebar__scrollwrap {
- scrollbar-width: none !important; /* Firefox */
-}
-.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar {
- display: none !important; /* Chrome/Safari */
-}
-
-/* custom track & thumb appended as children of the outer sidebar */
-.md-sidebar--primary > .o-scroll-track {
- position: absolute;
- right: 2px;
- width: 12px; /* includes some padding so thumb doesn't touch the border */
- top: 0;
- height: 100%;
- pointer-events: none; /* visual only */
-}
-.md-sidebar--primary > .o-scroll-track .o-scroll-thumb {
- position: absolute;
- right: 3px; /* place thumb inside track, a few px from border */
- width: 6px;
- background: #4b237a; /* purple thumb */
- border-radius: 6px;
- box-shadow: 0 0 0 2px rgba(75, 35, 122, 0.06) inset;
- transition: top 120ms linear, height 120ms linear;
- pointer-events: auto;
-}
-
-/* Keep the active indicator visually matching the custom thumb (same color)
- but slightly narrower so it reads as an indicator inside the sidebar. */
-.md-sidebar--primary > .o-active-indicator {
- right: 8px; /* move it slightly left so it appears inside the content area */
- width: 4px;
- background: #4b237a;
-}
-
/* --- Remove background and shadow from sidebar nav title --- */
.md-sidebar--primary .md-nav__title,
.md-sidebar--primary .md-nav__title:before,
@@ -484,6 +519,25 @@ html {
border: none !important;
}
+/* Ensure primary sidebar inner container is content-based like secondary */
+.md-sidebar--primary .md-sidebar__inner {
+ height: auto !important;
+ min-height: auto !important;
+ display: block !important;
+ overflow: hidden !important;
+}
+
+/* Ensure all navigation elements stay within sidebar boundaries */
+.md-sidebar--primary .md-nav,
+.md-sidebar--primary .md-nav__list,
+.md-sidebar--primary .md-nav__item,
+.md-sidebar--primary .md-nav__link {
+ max-width: 100% !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ word-wrap: break-word !important;
+}
+
.md-nav__title {
font-weight: 700 !important;
/* Ensure the nav title is not sticky — override any theme "sticky" rules */
@@ -506,6 +560,21 @@ html {
display: none !important;
}
+/* Prevent theme from adding background or shadow to secondary nav titles */
+@media screen and (min-width: 60em) {
+ .md-nav--secondary .md-nav__title,
+ .md-nav--secondary .md-nav__title:before,
+ .md-nav--secondary .md-nav__title:after,
+ .md-sidebar--secondary .md-nav__title,
+ .md-sidebar--secondary .md-nav__title:before,
+ .md-sidebar--secondary .md-nav__title:after {
+ background: transparent !important;
+ box-shadow: none !important;
+ border: none !important;
+ position: static !important; /* prevent sticky if applied elsewhere */
+ z-index: auto !important;
+ }
+}
/* Reset any conflicting styles */
/* Reset any conflicting styles */
@@ -515,6 +584,7 @@ html {
.md-header .md-search__input {
min-width: 14em !important;
font-size: 1.5em !important;
+ height: auto !important; /* Ensure consistent height calculation */
}
}
@@ -536,7 +606,7 @@ html {
width: 100% !important;
min-width: auto !important;
margin: 0 !important;
- padding: 0.75em 4.5em 0.75em 1em !important; /* Extra right padding for close button on mobile */
+ padding: 5px 4.5em 5px 1em !important; /* Match docs title padding: 5px vertical, extra right for close button */
font-size: 1.2em !important;
border-radius: 8px !important;
pointer-events: auto !important;
@@ -602,5 +672,835 @@ html {
min-width: 20em !important;
font-size: 1.5em !important;
display: inline-block !important;
+ height: auto !important; /* Ensure consistent height calculation */
+ }
+}
+
+/* Slim scrollbar styling for both sidebars - High specificity override */
+.md-sidebar--primary .md-sidebar__scrollwrap {
+ scrollbar-width: thin !important;
+ scrollbar-color: #7c3aed transparent !important;
+}
+
+.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar {
+ width: 3px !important;
+ height: 3px !important;
+ background: transparent !important;
+ background-color: transparent !important;
+}
+
+.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar-track {
+ background: transparent !important;
+ background-color: transparent !important;
+}
+
+.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar-thumb {
+ background: #7c3aed !important;
+ background-color: #7c3aed !important;
+ border-radius: 3px !important;
+ border: none !important;
+ min-height: 20px !important;
+}
+
+.md-sidebar--primary .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover {
+ background: #6d28d9 !important;
+ background-color: #6d28d9 !important;
+}
+
+/* Fix sidebar overflow and ensure proper scrolling */
+.md-sidebar--primary .md-sidebar__scrollwrap {
+ overflow-y: auto !important;
+ max-height: inherit !important;
+}
+
+/* Ensure sidebars maintain their position and don't move */
+.md-sidebar--primary {
+ will-change: auto !important;
+ transition: none !important;
+ /* Force sticky positioning and prevent any transforms */
+ position: sticky !important;
+ transform: none !important;
+}
+
+/* Override any MkDocs Material default transforms */
+.md-sidebar--primary[data-md-state] {
+ transform: none !important;
+}
+
+/* Stronger override for primary sidebar positioning */
+.md-sidebar--primary {
+ top: 8rem !important;
+ position: sticky !important;
+}
+
+/* Ensure both sidebars have proper footer clearance */
+@media (min-width: 60em) {
+ .md-main,
+ .md-content {
+ padding-bottom: 3rem;
+ }
+ .md-footer {
+ z-index: 0;
+ margin-top: 2rem;
+ }
+}
+
+/* === FINAL SIDEBAR POSITIONING OVERRIDE === */
+/* These rules must be at the end to override all other positioning */
+.md-sidebar--primary,
+.md-sidebar--primary[data-md-component="sidebar"],
+.md-sidebar--primary[data-md-state],
+.md-sidebar--primary[data-md-state="lock"] {
+ position: sticky !important;
+ top: 8rem !important;
+ transform: none !important;
+ transition: none !important;
+ will-change: auto !important;
+ z-index: 200 !important;
+}
+
+/* Override any CSS transforms that might be applied by JavaScript */
+.md-sidebar--primary * {
+ transform: none !important;
+}
+/* Force override any inline styles that might be applied by MkDocs Material */
+.md-sidebar--primary[style*="transform"] {
+ transform: none !important;
+}
+
+/* Additional safety measures to prevent sidebar shifting */
+html .md-sidebar--primary {
+ position: sticky !important;
+ top: 8rem !important;
+}
+
+/* Remove any masking pseudo-elements from primary sidebar - like secondary sidebar */
+.md-sidebar--primary .md-sidebar__scrollwrap:after {
+ display: none !important;
+}
+
+.md-sidebar--primary:before,
+.md-sidebar--primary:after,
+.md-sidebar--primary .md-sidebar__inner:before,
+.md-sidebar--primary .md-sidebar__inner:after {
+ display: none !important;
+}
+
+.md-header {
+ position: fixed !important;
+ top: 70px !important;
+}
+
+.md-main__inner {
+ margin-top: 70px !important;
+}
+
+nav.md-grid {
+ max-width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+ padding-left: 1rem; /* default (base) = px-4 */
+ padding-right: 1rem;
+}
+
+@media (min-width: 640px) {
+ nav.md-grid {
+ padding-left: 1.5rem; /* sm:px-6 */
+ padding-right: 1.5rem;
+ }
+}
+
+@media (min-width: 1024px) {
+ nav.md-grid {
+ padding-left: 2rem; /* lg:px-8 */
+ padding-right: 2rem;
+ }
+}
+
+@media (min-width: 1280px) {
+ nav.md-grid {
+ padding-left: 2.5rem; /* xl:px-10 */
+ padding-right: 2.5rem;
+ }
+}
+.md-search__inner {
+ width: 20rem;
+}
+@media (max-width: 768px) {
+ .md-search__inner {
+ top: 80px !important;
+ }
+
+ .md-search__input {
+ pointer-events: auto !important;
+ color: black !important;
+ }
+}
+
+.md-header__title {
+ margin-left: 0.1rem;
+ width: 100px;
+}
+
+@media (min-width: 1025px) {
+ .md-header__title {
+ flex-grow: 0;
+ flex-basis: auto;
+ max-width: 400px;
+ }
+ .md-header__inner {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+}
+
+/* === MOBILE SIDEBAR RESPONSIVE FIXES === */
+
+/* Mobile breakpoints for sidebar */
+@media (max-width: 76.24em) {
+ /* Reset sidebar positioning for mobile */
+ .md-sidebar--primary,
+ .md-sidebar--primary[data-md-component="sidebar"],
+ .md-sidebar--primary[data-md-state],
+ .md-sidebar--primary[data-md-state="lock"] {
+ position: fixed !important;
+ top: 0 !important;
+ left: 0 !important;
+ width: 100% !important;
+ max-width: 280px !important;
+ height: 100vh !important;
+ max-height: 100vh !important;
+ z-index: 300 !important;
+ transform: translateX(-100%) !important;
+ transition: transform 0.3s ease-in-out !important;
+ margin: 0 !important;
+ padding: 1rem !important;
+ border-radius: 0 !important;
+ border: none !important;
+ border-right: 2px solid #7c3aed !important;
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1) !important;
+ will-change: transform !important;
+ }
+
+ /* Show sidebar when drawer is checked (mobile menu open) */
+ .md-toggle[data-md-toggle="drawer"]:checked
+ ~ .md-container
+ .md-sidebar--primary,
+ input[id="__drawer"]:checked ~ .md-container .md-sidebar--primary {
+ transform: translateX(0) !important;
+ }
+
+ /* Mobile sidebar scroll container */
+ .md-sidebar--primary .md-sidebar__scrollwrap {
+ height: 100% !important;
+ max-height: calc(100vh - 2rem) !important;
+ overflow-y: auto !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ border: none !important;
+ }
+
+ /* Mobile sidebar inner container */
+ .md-sidebar--primary .md-sidebar__inner {
+ height: 100% !important;
+ min-height: 100% !important;
+ padding: 1rem 0 !important;
+ }
+
+ /* Hide secondary sidebar on mobile */
+ .md-sidebar--secondary {
+ display: none !important;
+ }
+
+ /* Ensure main content doesn't overlap */
+ .md-main {
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ }
+
+ .md-main__inner {
+ margin-top: 4rem !important;
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ padding: 0 1rem !important;
+ }
+
+ /* Mobile navigation improvements */
+ .md-sidebar--primary .md-nav__title {
+ padding: 1rem 0 0.5rem !important;
+ font-size: 1.1rem !important;
+ border-bottom: 1px solid rgba(124, 58, 237, 0.2) !important;
+ margin-bottom: 0.5rem !important;
+ }
+
+ .md-sidebar--primary .md-nav__link {
+ padding: 0.75rem 1rem !important;
+ font-size: 0.9rem !important;
+ line-height: 1.4 !important;
+ }
+
+ /* Mobile nested navigation */
+ .md-sidebar--primary .md-nav__item--nested .md-nav__link {
+ padding-left: 1rem !important;
+ }
+
+ .md-sidebar--primary .md-nav[data-md-level="1"] .md-nav__link {
+ padding-left: 1.5rem !important;
+ }
+
+ .md-sidebar--primary .md-nav[data-md-level="2"] .md-nav__link {
+ padding-left: 2rem !important;
+ }
+
+ .md-sidebar--primary .md-nav[data-md-level="3"] .md-nav__link {
+ padding-left: 2.5rem !important;
+ }
+
+ /* Mobile active link styling */
+ .md-sidebar--primary .md-nav__item--active > .md-nav__link::before {
+ right: 0 !important;
+ width: 3px !important;
+ height: 100% !important;
+ top: 0 !important;
+ transform: none !important;
+ }
+
+ /* Mobile drawer overlay */
+ .md-overlay {
+ position: fixed !important;
+ top: 0 !important;
+ left: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ background: rgba(0, 0, 0, 0.5) !important;
+ z-index: 250 !important;
+ opacity: 0 !important;
+ pointer-events: none !important;
+ transition: opacity 0.3s ease !important;
+ }
+
+ input[id="__drawer"]:checked ~ .md-overlay {
+ opacity: 1 !important;
+ pointer-events: auto !important;
+ }
+}
+
+/* Tablet-specific adjustments */
+@media (max-width: 1024px) and (min-width: 769px) {
+ .md-sidebar--primary {
+ max-width: 260px !important;
+ padding: 0.75rem !important;
+ }
+
+ .md-sidebar--primary .md-sidebar__scrollwrap {
+ max-height: calc(100vh - 6rem) !important;
+ }
+}
+
+/* Extra small mobile devices */
+@media (max-width: 480px) {
+ .md-sidebar--primary {
+ max-width: 90vw !important;
+ padding: 0.75rem !important;
+ }
+
+ .md-sidebar--primary .md-nav__link {
+ padding: 0.6rem 0.75rem !important;
+ font-size: 0.85rem !important;
+ }
+
+ .md-main__inner {
+ padding: 0 0.5rem !important;
+ }
+}
+
+/* Dark theme mobile adjustments */
+@media (max-width: 76.24em) {
+ [data-md-color-scheme="slate"] .md-sidebar--primary {
+ background: rgb(23, 20, 29) !important;
+ border-right: 2px solid #7c3aed !important;
+ box-shadow: 2px 0 12px rgba(0, 0, 0, 0.3) !important;
+ }
+
+ [data-md-color-scheme="openobserve"] .md-sidebar--primary {
+ background: #1a1a2e !important;
+ border-right: 2px solid #7c3aed !important;
+ box-shadow: 2px 0 12px rgba(0, 0, 0, 0.4) !important;
+ }
+}
+
+/* Improve mobile header and navigation button */
+@media (max-width: 76.24em) {
+ .md-header__button[for="__drawer"] {
+ margin-right: 0.5rem !important;
+ color: #7c3aed !important;
+ }
+
+ .md-header__title {
+ margin-left: 0.5rem !important;
+ flex-grow: 1 !important;
+ }
+}
+
+/* MOBILE FIX: Ensure primary sidebar links are tappable on mobile
+ - force the sidebar and its inner containers above the overlay
+ - ensure pointer-events are enabled for sidebar and links
+ - enable smooth touch scrolling inside the scrollwrap
+*/
+@media (max-width: 76.24em) {
+ /* Make sure the sidebar sits above the overlay and other content */
+ .md-sidebar--primary {
+ z-index: 1000 !important;
+ pointer-events: auto !important;
+ -webkit-overflow-scrolling: touch !important; /* smooth scrolling on iOS */
+ }
+
+ /* Ensure the scroll container accepts touch and clicks */
+ .md-sidebar--primary .md-sidebar__scrollwrap,
+ .md-sidebar--primary .md-sidebar__inner {
+ z-index: 1001 !important;
+ pointer-events: auto !important;
+ overflow: auto !important; /* allow scrolling and tapping inside */
+ }
+
+ /* Make links fully interactive and on top of any small pseudo-elements */
+ .md-sidebar--primary .md-nav__link {
+ position: relative !important;
+ z-index: 1002 !important;
+ pointer-events: auto !important;
+ display: block !important;
+ }
+
+ /* Prevent any active-indicator pseudo-elements from intercepting taps */
+ .md-sidebar--primary .md-nav__item--active > .md-nav__link::before,
+ .md-sidebar--primary > .o-active-indicator {
+ pointer-events: none !important;
+ }
+
+ /* Keep overlay visually behind sidebar and don't intercept taps when drawer is open */
+ .md-overlay {
+ z-index: 900 !important;
+ }
+}
+
+/* STRONG MOBILE OVERRIDES: fix overlap and non-clickable links */
+@media (max-width: 76.24em) {
+ /* Make sidebar a narrow drawer (avoid full-width that can cover content) */
+ .md-sidebar--primary {
+ position: fixed !important;
+ left: 0 !important;
+ right: auto !important;
+ width: 280px !important;
+ max-width: 90vw !important;
+ transform: translateX(-100%) !important; /* hidden by default */
+ z-index: 1200 !important; /* baseline above header */
+ top: 0 !important;
+ height: 100vh !important;
+ box-shadow: 0 2px 16px rgba(0, 0, 0, 0.25) !important;
+ background-clip: padding-box !important;
+ }
+
+ /* When drawer is checked (open), bring sidebar fully into view and above overlay */
+ input[id="__drawer"]:checked ~ .md-container .md-sidebar--primary,
+ .md-toggle[data-md-toggle="drawer"]:checked
+ ~ .md-container
+ .md-sidebar--primary {
+ transform: translateX(0) !important;
+ z-index: 1400 !important; /* ensure it's above overlay and header */
+ pointer-events: auto !important;
+ }
+
+ /* Ensure overlay remains behind the sidebar when open */
+ input[id="__drawer"]:checked ~ .md-overlay,
+ .md-toggle[data-md-toggle="drawer"]:checked ~ .md-container .md-overlay {
+ z-index: 1300 !important; /* below the sidebar but above page */
+ opacity: 1 !important;
+ pointer-events: auto !important;
+ }
+
+ /* Keep header beneath the sidebar so it doesn't capture taps */
+ .md-header {
+ z-index: 1250 !important;
+ }
+
+ /* Scroll container should allow touch scrolling and not intercept taps */
+ .md-sidebar--primary .md-sidebar__scrollwrap,
+ .md-sidebar--primary .md-sidebar__inner {
+ overflow-y: auto !important;
+ -webkit-overflow-scrolling: touch !important;
+ pointer-events: auto !important;
+ z-index: 1401 !important;
+ }
+
+ /* Links: ensure they receive taps and use touch-action for faster response */
+ .md-sidebar--primary .md-nav__link {
+ pointer-events: auto !important;
+ z-index: 1402 !important;
+ touch-action: manipulation !important;
+ }
+
+ /* Deactivate any decorative element from intercepting touches */
+ .md-sidebar--primary .md-nav__item--active > .md-nav__link::before,
+ .md-sidebar--primary > .o-active-indicator,
+ .md-sidebar--primary:before,
+ .md-sidebar--primary:after {
+ pointer-events: none !important;
+ }
+
+ /* Safety: ensure nothing else is layered above the sidebar when open */
+ input[id="__drawer"]:checked ~ .md-container * {
+ pointer-events: auto !important;
+ }
+}
+
+/* MOBILE ACCORDION: hide nested navs by default and show only when toggled */
+@media (max-width: 76.24em) {
+ /* Hide all nested nav blocks by default to prevent them stacking above parents
+ but keep top-level (data-md-level="0") visible */
+ .md-sidebar--primary .md-nav[data-md-level]:not([data-md-level="0"]) {
+ display: none !important;
+ visibility: hidden !important;
+ height: 0 !important;
+ max-height: 0 !important;
+ overflow: hidden !important;
+ position: static !important;
+ transform: none !important;
+ }
+
+ /* When the toggle checkbox is checked, show the corresponding nav below the label */
+ .md-nav__toggle:checked ~ nav[data-md-level],
+ .md-nav__toggle:checked + label + nav[data-md-level] {
+ display: block !important;
+ visibility: visible !important;
+ height: auto !important;
+ max-height: none !important;
+ overflow: visible !important;
+ position: static !important;
+ transform: none !important;
+ }
+
+ /* Ensure child ul lists are visible when their parent nav is shown */
+ .md-nav__toggle:checked ~ nav[data-md-level] .md-nav__list,
+ .md-nav__toggle:checked + label + nav[data-md-level] .md-nav__list {
+ display: block !important;
+ visibility: visible !important;
+ overflow: visible !important;
+ max-height: none !important;
+ }
+
+ /* Make sure labels remain interactive and in normal flow */
+ .md-sidebar--primary .md-nav__link {
+ display: block !important;
+ position: relative !important;
+ }
+}
+
+/* MOBILE NESTED-LIST FIX: ensure subitems expand below their parent and are readable */
+@media (max-width: 76.24em) {
+ /* Allow the sidebar scrolling container and inner container to show expanded content */
+ .md-sidebar--primary .md-sidebar__scrollwrap,
+ .md-sidebar--primary .md-sidebar__inner {
+ overflow: visible !important;
+ max-height: none !important;
+ position: static !important;
+ }
+
+ /* Ensure nav lists and items flow in document order (not absolutely positioned) */
+ .md-sidebar--primary .md-nav__list,
+ .md-sidebar--primary .md-nav__item,
+ .md-sidebar--primary .md-nav__item > .md-nav__list {
+ position: static !important;
+ overflow: visible !important;
+ max-height: none !important;
+ display: block !important;
+ }
+
+ /* If nested lists were collapsed using transforms or translate, reset them */
+ .md-sidebar--primary .md-nav__item .md-nav__list {
+ transform: none !important;
+ }
+
+ /* Remove clipping on individual link elements so child lists aren't hidden */
+ .md-sidebar--primary .md-nav__link,
+ .md-sidebar--primary .md-nav__title {
+ overflow: visible !important;
+ }
+
+ /* Reduce z-index stacking on nav elements so expanded lists appear in normal flow */
+ .md-sidebar--primary .md-nav__list,
+ .md-sidebar--primary .md-nav__item {
+ z-index: auto !important;
+ }
+}
+
+/* Ensure main content is always tall enough so sidebar never shifts above navbar */
+.md-main,
+.md-content {
+ min-height: calc(100vh - 4rem); /* 4rem = navbar height, adjust if needed */
+}
+
+/* MOBILE: keep label text and arrow on one line; ensure nested navs expand in-flow */
+@media (max-width: 76.24em) {
+ .md-sidebar--primary .md-nav__link {
+ display: flex !important;
+ align-items: center !important;
+ justify-content: space-between !important;
+ gap: 0.5rem !important;
+ white-space: nowrap !important;
+ width: 100% !important;
+ box-sizing: border-box !important;
+ }
+
+ .md-sidebar--primary .md-nav__icon {
+ margin-left: 0.5rem !important;
+ flex-shrink: 0 !important;
+ order: 2 !important;
+ }
+
+ /* Show nested nav when its toggle checkbox is checked */
+ input[type="checkbox"].md-nav__toggle:checked + label + nav[data-md-level],
+ input[type="checkbox"].md-nav__toggle:checked ~ nav[data-md-level],
+ .md-nav__toggle:checked + label + nav[data-md-level],
+ .md-nav__toggle:checked ~ nav[data-md-level] {
+ display: block !important;
+ visibility: visible !important;
+ height: auto !important;
+ max-height: none !important;
+ overflow: visible !important;
+ position: static !important;
+ transform: none !important;
+ }
+
+ /* Ensure child lists inside shown nav are visible and flow below */
+ input[type="checkbox"].md-nav__toggle:checked
+ + label
+ + nav[data-md-level]
+ .md-nav__list,
+ input[type="checkbox"].md-nav__toggle:checked
+ ~ nav[data-md-level]
+ .md-nav__list,
+ .md-nav__toggle:checked + label + nav[data-md-level] .md-nav__list,
+ .md-nav__toggle:checked ~ nav[data-md-level] .md-nav__list {
+ display: block !important;
+ visibility: visible !important;
+ overflow: visible !important;
+ max-height: none !important;
+ }
+
+ /* Ensure nested labels stay full-width and don't wrap arrow */
+ .md-sidebar--primary .md-nav__item--nested > .md-nav__link {
+ display: flex !important;
+ align-items: center !important;
+ justify-content: space-between !important;
+ white-space: nowrap !important;
+ }
+}
+
+/* SHOW ACTUAL SUBITEMS: hide duplicate nav titles and force UL visible when open */
+@media (max-width: 76.24em) {
+ /* Hide the internal nav title that repeats the parent label inside the nav block */
+ .md-sidebar--primary nav[data-md-level] > .md-nav__title {
+ display: none !important;
+ visibility: hidden !important;
+ height: 0 !important;
+ overflow: hidden !important;
+ }
+
+ /* Show the direct UL (.md-nav__list) when the toggle checkbox is checked or nav reports expanded */
+ input.md-nav__toggle:checked + label + nav[data-md-level] > .md-nav__list,
+ input.md-nav__toggle:checked ~ nav[data-md-level] > .md-nav__list,
+ nav[data-md-level][aria-expanded="true"] > .md-nav__list {
+ display: block !important;
+ visibility: visible !important;
+ max-height: none !important;
+ overflow: visible !important;
+ height: auto !important;
+ }
+
+ /* Also ensure the nav container itself is visible when toggled */
+ input.md-nav__toggle:checked + label + nav[data-md-level],
+ input.md-nav__toggle:checked ~ nav[data-md-level],
+ nav[data-md-level][aria-expanded="true"] {
+ display: block !important;
+ visibility: visible !important;
+ height: auto !important;
+ max-height: none !important;
+ overflow: visible !important;
+ }
+
+ /* Make sure nested items are in normal flow */
+ .md-sidebar--primary .md-nav__item--nested {
+ display: block !important;
+ }
+}
+
+/* EXTRA: explicitly show/hide the actual
child
+ when a toggle is checked, with very high specificity to override
+ any framework rules that might still hide the lists. */
+@media (max-width: 76.24em) {
+ /* Hide all nested ul lists by default (safety) */
+ .md-sidebar--primary
+ nav[data-md-level]:not([data-md-level="0"])
+ > .md-nav__list {
+ display: none !important;
+ visibility: hidden !important;
+ max-height: 0 !important;
+ overflow: hidden !important;
+ }
+
+ /* Show the direct child .md-nav__list when the preceding checkbox is checked */
+ input[type="checkbox"].md-nav__toggle:checked
+ + label
+ + nav[data-md-level]
+ > .md-nav__list,
+ input[type="checkbox"].md-nav__toggle:checked
+ ~ nav[data-md-level]
+ > .md-nav__list,
+ .md-nav__toggle:checked + label + nav[data-md-level] > .md-nav__list,
+ .md-nav__toggle:checked ~ nav[data-md-level] > .md-nav__list {
+ display: block !important;
+ visibility: visible !important;
+ max-height: none !important;
+ overflow: visible !important;
+ }
+
+ /* Also make sure any nested lists deeper inside are visible when parent is open */
+ input[type="checkbox"].md-nav__toggle:checked
+ + label
+ + nav[data-md-level]
+ .md-nav__list,
+ input[type="checkbox"].md-nav__toggle:checked
+ ~ nav[data-md-level]
+ .md-nav__list,
+ .md-nav__toggle:checked + label + nav[data-md-level] .md-nav__list,
+ .md-nav__toggle:checked ~ nav[data-md-level] .md-nav__list {
+ display: block !important;
+ visibility: visible !important;
+ max-height: none !important;
+ overflow: visible !important;
+ }
+}
+
+/* FINAL MOBILE SCROLL FIX: force the mobile sidebar scrollwrap to scroll when
+ the menu content is taller than the viewport. Placed last to override
+ earlier overflow:visible rules. */
+@media (max-width: 76.24em) {
+ /* Apply to the scrollwrap generally and when the drawer is open */
+ .md-sidebar--primary .md-sidebar__scrollwrap,
+ input[id="__drawer"]:checked
+ ~ .md-container
+ .md-sidebar--primary
+ .md-sidebar__scrollwrap,
+ .md-toggle[data-md-toggle="drawer"]:checked
+ ~ .md-container
+ .md-sidebar--primary
+ .md-sidebar__scrollwrap {
+ max-height: calc(100vh - 3.5rem) !important; /* leave space for header */
+ height: calc(100vh - 3.5rem) !important;
+ overflow-y: auto !important;
+ overflow-x: hidden !important;
+ -webkit-overflow-scrolling: touch !important;
+ position: relative !important;
+ }
+
+ /* Ensure nested navs don't push content out of the scroll container */
+ .md-sidebar--primary .md-nav__list,
+ .md-sidebar--primary .md-nav__item {
+ box-sizing: border-box !important;
+ }
+}
+/* === FINAL OVERRIDE: Always hide close icon unless shown by JS === */
+.md-search__close {
+ display: none !important;
+ visibility: hidden !important;
+ opacity: 0 !important;
+ pointer-events: none !important;
+}
+/* Minimal clear button for search input */
+.md-search__clear {
+ display: none;
+ position: absolute;
+ right: 4em;
+ top: 57%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ color: #7c3aed;
+ font-size: 1.25em;
+ cursor: pointer;
+ z-index: 10;
+}
+.md-search__clear:active {
+ color: #4b237a;
+}
+/* Mobile-specific position for .md-search__clear */
+@media (max-width: 1024px) {
+ .md-search__clear {
+ right: 4em;
+ top: 32%;
+ font-size: 1.5em;
+ transform: translateY(-50%);
+ }
+}
+/* Show close icon only on search input focus for desktop screens */
+@media (min-width: 1025px) {
+ .md-search__input {
+ background-image: none !important;
+ }
+ .md-search__input:focus {
+ background-image: url("/docs/assets/close-icon.svg") !important;
+ }
+}
+
+.md-main__inner.md-grid {
+ width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+ padding-left: 1rem; /* px-4 */
+ padding-right: 1rem;
+ display: flex;
+ align-items: center;
+}
+
+/* sm (≥640px) */
+@media (min-width: 640px) {
+ .md-main__inner.md-grid {
+ max-width: 640px;
+ padding-left: 1.5rem; /* sm:px-6 */
+ padding-right: 1.5rem;
+ }
+}
+
+/* md (≥768px) */
+@media (min-width: 768px) {
+ .md-main__inner.md-grid {
+ max-width: 768px;
+ }
+}
+
+/* lg (≥1024px) */
+@media (min-width: 1024px) {
+ .md-main__inner.md-grid {
+ max-width: 1024px;
+ padding-left: 2rem; /* lg:px-8 */
+ padding-right: 2rem;
+ justify-content: space-between; /* lg:justify-between */
+ }
+}
+
+/* xl (≥1280px) */
+@media (min-width: 1280px) {
+ .md-main__inner.md-grid {
+ max-width: 1480px;
+ padding-left: 2.5rem; /* xl:px-10 */
+ padding-right: 2.5rem;
+ }
+}
+
+/* 2xl (≥1536px) */
+@media (min-width: 1536px) {
+ .md-main__inner.md-grid {
+ max-width: 1736px;
}
}
diff --git a/docs/user-guide/alerts/.pages b/docs/user-guide/alerts/.pages
index 5d04b8c2..1f7d9096 100644
--- a/docs/user-guide/alerts/.pages
+++ b/docs/user-guide/alerts/.pages
@@ -6,3 +6,4 @@ nav:
- Import and Export Alerts: import-export-alerts.md
- Multi-window Selector in Scheduled Alerts (SQL Mode): multi-window-selector-scheduled-alerts-concept.md
- Use Multi-window Selector in Scheduled Alerts: how-to-access-multi-window-selector-scheduled-alerts.md
+ - Use Telegram for Alerts: alerting-example-telegram.md
\ No newline at end of file
diff --git a/docs/user-guide/alerts/alerting-example-telegram.md b/docs/user-guide/alerts/alerting-example-telegram.md
new file mode 100644
index 00000000..f2708ee3
--- /dev/null
+++ b/docs/user-guide/alerts/alerting-example-telegram.md
@@ -0,0 +1,82 @@
+This guide explains how to configure [OpenObserve alerts]() to send notifications directly to Telegram. You will create a template, configure an alert destination, and attach it to an alert rule.
+
+## Configure OpenObserve alerts
+??? "Prerequisites"
+ - A Telegram account
+ - Telegram bot token: Create a bot in Telegram using **BotFather**. BotFather provides the token.
+ - Telegram chat ID: Start a chat with your bot, send a message, and run `getUpdates` with your bot token to retrieve the `chat.id`.
+
+ Verify the bot token and chat ID with the following commands:
+
+ **Get updates**
+ ```bash
+ curl "https://api.telegram.org/bot/getUpdates"
+ ```
+
+ **Get bot details**
+ ```bash
+ curl "https://api.telegram.org/bot/getMe"
+ ```
+
+ **Send a test message**
+ ```bash
+ set TOKEN=
+ set CHAT=
+
+ curl.exe -X POST "https://api.telegram.org/bot%TOKEN%/sendMessage" ^
+ --data-urlencode "chat_id=%CHAT%" ^
+ --data-urlencode "text=OpenObserve test"
+ ```
+ If the message appears in Telegram, your setup is correct.
+
+??? "Step 1: Create Template"
+ 1. Go to **Management > Templates > Add Template**.
+ 2. Enter a name, for example `Telegram_alert`.
+ 3. Select **Web Hook**.
+ 4. In the Body, add the following JSON. Replace with your chat ID.
+ 
+ 5. Save the template.
+
+??? "Step 2: Create Alert Destination"
+ 1. Go to **Management > Alert Destinations > Add Destination**.
+ 2. Enter a name, for example `Telegram_alert`.
+ 3. Select the template you created earlier (Telegram_alert).
+ 4. Set **URL** to: https://api.telegram.org/bot/sendMessage
+ 5. Set **Method** to POST.
+ 6. Add the header: Content-Type = application/json
+ 7. Save the destination.
+ 
+
+??? "Step 3: Create Alert"
+ 1. Go to **Alerts > Add Alert**.
+ 2. Configure the alert:
+
+ - Name: any name
+ - Stream Type: logs
+ - Stream Name: select your stream. For example, default.
+ - Alert Type: Scheduled
+ - Condition: for example service_name = ingress-nginx
+ 
+ - Threshold: >= 1 time
+ - Period: 1 minute
+ - Frequency: 1 minute
+ - Destination: select `Telegram_alert`
+ 
+ - In Row Template, define the row format, for example: `Alert was active at {_timestamp}`
+ 3. Save the alert.
+
+??? "Step 4: Verify alert delivery"
+ After you save the alert, wait until the condition is met.
+ If configured correctly, you will receive a message in Telegram that looks similar to the following:
+ 
+
+??? "Troubleshooting"
+ **Issue:** No message received in Telegram
+ **Solution:** Verify that the template body includes a valid `chat_id`. Without `chat_id`, Telegram cannot deliver the message.
+
+ Example of a valid body:
+
+ {
+ "chat_id": "8237******",
+ "text": "{alert_name} is active \nDetails:\n{rows}"
+ }
diff --git a/docs/user-guide/alerts/alerting-telegram-alert-delivery.png b/docs/user-guide/alerts/alerting-telegram-alert-delivery.png
new file mode 100644
index 00000000..10a7bc87
Binary files /dev/null and b/docs/user-guide/alerts/alerting-telegram-alert-delivery.png differ
diff --git a/docs/user-guide/alerts/alerting-telegram-config-conditions.png b/docs/user-guide/alerts/alerting-telegram-config-conditions.png
new file mode 100644
index 00000000..3729de21
Binary files /dev/null and b/docs/user-guide/alerts/alerting-telegram-config-conditions.png differ
diff --git a/docs/user-guide/alerts/alerting-telegram-config.png b/docs/user-guide/alerts/alerting-telegram-config.png
new file mode 100644
index 00000000..7e7034c0
Binary files /dev/null and b/docs/user-guide/alerts/alerting-telegram-config.png differ
diff --git a/docs/user-guide/alerts/alerting-telegram-destination.png b/docs/user-guide/alerts/alerting-telegram-destination.png
new file mode 100644
index 00000000..743ceb95
Binary files /dev/null and b/docs/user-guide/alerts/alerting-telegram-destination.png differ
diff --git a/docs/user-guide/alerts/alerting-telegram-template.png b/docs/user-guide/alerts/alerting-telegram-template.png
new file mode 100644
index 00000000..6096274b
Binary files /dev/null and b/docs/user-guide/alerts/alerting-telegram-template.png differ
diff --git a/docs/user-guide/alerts/index.md b/docs/user-guide/alerts/index.md
index ef178196..96f72138 100644
--- a/docs/user-guide/alerts/index.md
+++ b/docs/user-guide/alerts/index.md
@@ -8,5 +8,5 @@ Alerts enable continuous monitoring of log, metric, or trace data to detect crit
- [Templates](../management/templates/)
- [Import and Export Alerts](../alerts/import-export-alerts/)
- [Alert Folders](../alerts/alert-folders/)
-- [Multi-window Selector in Scheduled Alerts (SQL Mode)](../alerts/]multi-window-selector-scheduled-alerts-concept)
+- [Multi-window Selector in Scheduled Alerts (SQL Mode)](../alerts/multi-window-selector-scheduled-alerts-concept)
- [Use Multi-window Selector in Scheduled Alerts](../alerts/how-to-access-multi-window-selector-scheduled-alerts)
diff --git a/docs/user-guide/identity-and-access-management/.pages b/docs/user-guide/identity-and-access-management/.pages
index 2b1b5d54..0d27be06 100644
--- a/docs/user-guide/identity-and-access-management/.pages
+++ b/docs/user-guide/identity-and-access-management/.pages
@@ -4,4 +4,5 @@ nav:
- Enable Role-Based Access Control (RBAC) in Enterprise Edition: enable-rbac-in-openobserve-enterprise.md
- Single Sign-On (SSO): sso.md
- Organizations: organizations.md
- - Quotas: quotas
\ No newline at end of file
+ - Quotas: quotas
+ - Manage Users & Passwords: update-password.md
\ No newline at end of file
diff --git a/docs/user-guide/identity-and-access-management/images/enable-change-password.png b/docs/user-guide/identity-and-access-management/images/enable-change-password.png
new file mode 100644
index 00000000..81f46402
Binary files /dev/null and b/docs/user-guide/identity-and-access-management/images/enable-change-password.png differ
diff --git a/docs/user-guide/identity-and-access-management/images/users.png b/docs/user-guide/identity-and-access-management/images/users.png
new file mode 100644
index 00000000..be33beec
Binary files /dev/null and b/docs/user-guide/identity-and-access-management/images/users.png differ
diff --git a/docs/user-guide/identity-and-access-management/index.md b/docs/user-guide/identity-and-access-management/index.md
index bcb61d77..cea4cc4b 100644
--- a/docs/user-guide/identity-and-access-management/index.md
+++ b/docs/user-guide/identity-and-access-management/index.md
@@ -4,4 +4,5 @@ The following guides provide details on managing user identities and controlling
- [Enable Role-Based Access Control (RBAC) in Enterprise Edition](../identity-and-access-management/enable-rbac-in-openobserve-enterprise/)
- [Single Sign-On (SSO)](../identity-and-access-management/sso/)
- [Organizations](../identity-and-access-management/organizations/)
-- [Quotas](../identity-and-access-management/quotas/)
\ No newline at end of file
+- [Quotas](../identity-and-access-management/quotas/)
+- [Manage Users & Passwords](../identity-and-access-management/update-password.md)
\ No newline at end of file
diff --git a/docs/user-guide/identity-and-access-management/update-password.md b/docs/user-guide/identity-and-access-management/update-password.md
new file mode 100644
index 00000000..eb46f388
--- /dev/null
+++ b/docs/user-guide/identity-and-access-management/update-password.md
@@ -0,0 +1,69 @@
+---
+title: Updating Usernames and Passwords in OpenObserve
+description: >-
+ Learn how to update usernames and passwords in OpenObserve via the UI or CLI. Includes steps for root password reset, best practices for credential rotation, and secure account management.
+---
+
+# Updating Usernames and Passwords in OpenObserve
+
+Managing credentials in OpenObserve is critical for securing your observability platform. Incorrect or outdated credentials can block access, cause downtime, or expose your system to security risks. This page explains how to update usernames and passwords through the UI or CLI, and provides best practices for secure credential management.
+
+
+## Overview
+
+OpenObserve provides multiple ways to manage user credentials:
+
+* [UI-based](#updating-passwords-via-the-openobserve-ui) updates for users and roles
+* [CLI-based](#resetting-the-root-password-via-cli) root password reset if locked out
+
+## Updating Passwords via the OpenObserve UI
+
+Use the OpenObserve UI to manage users easily.
+
+**Steps:**
+
+1. Log in as an administrator.
+2. Navigate to **IAM → Users**. Click the **Edit** icon under **Actions** for the user you want to update.
+ 
+3. Enable **Change Password** and enter the new password.
+ {:style="height:300px"}
+4. Click **Save Changes**.
+5. Log out and verify that the updated credentials work.
+
+> **Tip:** You can also update user roles at the same time to enforce correct permissions.
+
+
+## Resetting the Root Password via CLI
+
+If you are locked out of the root account, you can reset the root password from the CLI.
+
+**Steps:**
+
+1. Set environment variables for the new root credentials:
+ ```bash
+ export ZO_ROOT_USER_EMAIL="root@example.com"
+ export ZO_ROOT_USER_PASSWORD="NewStrongPassword123"
+ ```
+
+2. Run the reset command from your OpenObserve installation directory:
+ ```bash
+ ./openobserve reset -c root
+ ```
+
+3. After the reset completes, log in with the updated root credentials.
+
+> **Note:** For Docker or Kubernetes deployments, set the environment variables inside the container or pod before running the reset command.
+
+
+## Best Practices
+
+* Update usernames, passwords, or roles via the UI whenever possible.
+* Update root and user passwords periodically; rotate API keys or service accounts.
+* Use long, complex, and unique passwords. Avoid reusing passwords across environments.
+* Back up your metadata database, especially before manual or DB-level changes.
+* Use dedicated users with least privilege; reserve root for emergencies.
+
+## Next Steps
+
+* Set up [alerts](../alerts/alerts.md) for failed logins to detect potential security issues.
+* Review [RBAC and role assignments](../identity-and-access-management/enable-rbac-in-openobserve-enterprise.md) to ensure least-privilege access.
diff --git a/docs/user-guide/management/query-management.md b/docs/user-guide/management/query-management.md
index 8171f596..8eb92233 100644
--- a/docs/user-guide/management/query-management.md
+++ b/docs/user-guide/management/query-management.md
@@ -3,127 +3,134 @@ description: >-
Monitor and cancel live queries across dashboards, alerts, and logs; inspect
execution time, range, user, and more in HA deployments.
---
-The **Query Management** page provides **real-time visibility and control** over all currently running queries across dashboards, alerts, logs, and reports within an OpenObserve instance. Using the **Query Management page**, you can decide whether to cancel a query or leave it running.
+This page explains what Query Management is and shows how to use it.
-## Availability
+> This feature is available only in [high-availability (HA)](../../openobserve-enterprise-edition-installation-guide.md) deployments.
-The Query Management feature is available only in high-availability (HA) deployments.
+=== "Overview"
+ ## What is Query Management?
+ The Query Management feature provides real-time visibility and control over all currently running queries across dashboards, alerts, logs, and reports within an OpenObserve instance. Using the Query Management page, you can decide whether to cancel a query or leave it running.
-## Access
+ !!! note "Who can use it"
+ By default, `root` users and any other user who has access to the `_meta` org can access the Query Management page.
-By default, `root` users and any predefined user roles (`Admin`,`Editor`,`Viewer`, or `User`) with access to the `_meta` organization can access the **Query Management** page. RBAC cannot grant access to other custom roles.
+ !!! note "Where to find it"
+ To access the Query Management page:
-**To access the Query Management page:**
+ 1. Select `_meta` organization from the top right corner.
+ 2. Go to **Management**.
+ 3. In the side panel, select **Query Management**.
+ You will be taken to the **Running Queries** section.
+ 
-1. Select `_meta` organization from the top right corner.
-2. Go to **Management**.
-3. In the side panel, select **Query Management**.
- You will be taken to the **Running Queries** section.
-
+ ## Viewing Modes
-## Viewing Modes
+ You can toggle between:
-You can toggle between:
+ - **User Summary**: Groups all queries by user and displays their combined activity.
+ - **All Queries**: Displays each query individually with full details and filtering options.
-- **User Summary**: Groups all queries by user and displays their combined activity.
-- **All Queries**: Displays each query individually with full details and filtering options.
+ Use **User Summary** for high-level monitoring. Switch to **All Queries** when you need to investigate specific query behavior.
-Use **User Summary** for high-level monitoring. Switch to **All Queries** when you need to investigate specific query behavior.
+ ## Page Layout and Field Descriptions
-## Page Layout and Field Descriptions
+ The **Running Queries** table displays the following fields:
-The **Running Queries** table displays the following fields:
+ - **Email**: The email ID of the user who initiated the queries.
+ - **Search Type**: The origin of the query (for example, dashboards, alerts, or others).
+ - **Number of Queries**: Total active queries for that user.
+ - **Total Exec. Duration**: Combined time spent executing all active queries.
+ - **Total Query Range**: Total log duration the queries are scanning.
+ - **Actions**: Cancel queries initiated by a user.
+ 
-- **Email**: The email ID of the user who initiated the queries.
-- **Search Type**: The origin of the query (for example, dashboards, alerts, or others).
-- **Number of Queries**: Total active queries for that user.
-- **Total Exec. Duration**: Combined time spent executing all active queries.
-- **Total Query Range**: Total log duration the queries are scanning.
-- **Actions**: Cancel queries initiated by a user.
-
+ The **All Queries** table displays the following fields:
-The **All Queries** table displays the following fields:
+ - **Email:** The email of the user who triggered the query.
+ - **Organization ID:** The organization context.
+ - **Search Type:** The source of the query, such as dashboards, UI, or alerts.
+ - **Execution Duration:** The total time the query has been running.
+ - **Query Range:** The time range being queried.
+ - **Query Type:** Whether the system classifies the query as Short or Long.
+ - **Status:** The current status of the query, whether it is still processing or waiting.
+ - **Stream Type:** The type of data stream being queried, such as logs.
+ - **Actions:** Two actions available:
-- **Email:** The email of the user who triggered the query.
-- **Organization ID:** The organization context.
-- **Search Type:** The source of the query, such as dashboards, UI, or alerts.
-- **Execution Duration:** The total time the query has been running.
-- **Query Range:** The time range being queried.
-- **Query Type:** Whether the system classifies the query as Short or Long.
-- **Status:** The current status of the query, whether it is still processing or waiting.
-- **Stream Type:** The type of data stream being queried, such as logs.
-- **Actions:** Two actions available:
+ - **View Details** to inspect the query details.
+ - **Cancel** to stop the query immediately.
- - **View Details** to inspect the query details.
- - **Cancel** to stop the query immediately.
+ 
-
+ ## Filters and Searches
-## Filters and Searches
+ - **Search Bar**: Enter an email or keyword to filter queries.
+ - **All Fields Dropdown**: The **All Fields dropdown** lets you filter queries based on either **Execution Duration** or **Query Range**. Range.
+ - **Source Filter**: Filter queries by source. Select one of the following:
-- **Search Bar**: Enter an email or keyword to filter queries.
-- **All Fields Dropdown**: The **All Fields dropdown** lets you filter queries based on either **Execution Duration** or **Query Range**. Range.
-- **Source Filter**: Filter queries by source. Select one of the following:
+ - **Dashboards**: Queries coming from Dashboards.
+ - **UI**: Queries run manually by users from the Logs interface.
+ - **Others**: Queries triggered by Alerts or Reports.
+
+ 
- - **Dashboards**: Queries coming from Dashboards.
- - **UI**: Queries run manually by users from the Logs interface.
- - **Others**: Queries triggered by Alerts or Reports.
-
-
+ - **Refresh Query Button**: Click to reload the page with the latest query data. Refer to the **Last Data Refresh Time** section to confirm whether the query results are up to date before refreshing.
-- **Refresh Query Button**: Click to reload the page with the latest query data. Refer to the **Last Data Refresh Time** section to confirm whether the query results are up to date before refreshing.
+=== "How to"
+ ## How to View Query Details
-## How to View Query Details
+ To inspect a running query:
-To inspect a running query:
+ 1. In the **All Queries** view, locate the query you want to examine.
+ 2. In the **Actions** column, click the icon to **view details**.
-1. In the **All Queries** view, locate the query you want to examine.
-2. In the **Actions** column, click the icon to **view details**.
+ 
-
+ You will see a pop-up with full information about the query:
-You will see a pop-up with full information about the query:
+ - Unique Trace ID.
+ - Current status (e.g., waiting, processing).
+ - User email and organization ID.
+ - Stream type (e.g., logs).
+ - The complete SQL query.
+ - The start time and end time selected by the user. This defines the **Query Range**.
+ - The **Execution Duration** and final **Query Range** calculated.
+ - Additional technical metrics, including the number of records scanned within the selected time range, the original size of the scanned files, and their compressed size in Parquet format.
+ 
-- Unique Trace ID.
-- Current status (e.g., waiting, processing).
-- User email and organization ID.
-- Stream type (e.g., logs).
-- The complete SQL query.
-- The start time and end time selected by the user. This defines the **Query Range**.
-- The **Execution Duration** and final **Query Range** calculated.
-- Additional technical metrics, including the number of records scanned within the selected time range, the original size of the scanned files, and their compressed size in Parquet format.
+ ## How to Cancel a Query
-
+ Before you begin:
-## How to Cancel a Query
+ Canceling a query may interrupt active investigations. Confirm the impact before proceeding.
-You can cancel a query from either view:
+ !!! note "When should you cancel a query"
+ You should cancel a query if any of the following are true:
-**To cancel from User Summary**:
+ - The execution time has exceeded acceptable limits.
+ - The time range being queried is too wide.
+ - The system is under strain, and this query appears in a long or waiting state.
-1. Locate the user whose queries you want to stop.
-2. Either select the checkbox and click **Cancel Query** at the bottom of the page, or click the red **X** icon in the **Actions** column.
+ !!! note "When should you not cancel a query"
+ The query is from a critical source.
-
+ You can cancel a query from the **User Summary** page as well as the **All Queries** view.
+
+ **To cancel from User Summary**:
-**To cancel from All Queries**:
+ 1. Locate the user whose queries you want to stop.
+ 2. Either select the checkbox and click **Cancel Query** at the bottom of the page, or click the red **X** icon in the **Actions** column.
+ 
-1. Find the query you want to cancel.
-2. In the **Actions** column, click the red `X` icon.
+
+ **To cancel from All Queries**:
-After you confirm, the query is terminated immediately.
+ 1. Find the query you want to cancel.
+ 2. In the **Actions** column, click the red `X` icon.
-## When Should You Cancel a Query
+ After you confirm, the query is terminated immediately.
-You should cancel a query if any of the following are true:
-- The execution time has exceeded acceptable limits.
-- The time range being queried is too wide.
-- The system is under strain, and this query appears in a long or waiting state.
-Avoid canceling if:
-- The query is from a critical source.
-> **Note:** Canceling a query may interrupt active investigations. Confirm the impact before proceeding.
diff --git a/input.css b/input.css
index 76f76b60..2fe164b6 100644
--- a/input.css
+++ b/input.css
@@ -1,4 +1,6 @@
-@import "tailwindcss";
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
@layer utilities {
.hover\:text-\[\#7782FF\]:hover {
@@ -7,7 +9,7 @@
}
.hero-gradient {
- @apply bg-gradient-to-r from-[#6A76E3] to-[#45A4F3];
+ background: linear-gradient(to right, #6a76e3, #45a4f3);
}
input {
@@ -107,101 +109,3 @@ main {
-webkit-text-fill-color: transparent;
background-clip: text;
}
-
-.md-header {
- position: fixed !important;
- top: 70px !important;
-}
-
-.md-main__inner {
- margin-top: 70px !important;
-}
-
-.md-sidebar {
- top: 75px !important;
- /* height: calc(100vh - 105px) !important; */
-}
-
-@media (min-width: 640px) and (max-width: 1023px) {
- .md-sidebar {
- top: 70px !important;
- }
-}
-@media (min-width: 1024px) {
- .md-sidebar {
- top: 70px !important;
- height: calc(100vh - 70px) !important;
- }
-}
-
-/* @media screen and (min-width: 60em) {
- .md-sidebar--secondary:not([hidden]) {
- display: none !important;
- }
-} */
-
-/* @media (min-width: 768px) {
- .md-sidebar__scrollwrap {
- display: none !important;
- }
-
-} */
-nav.md-grid {
- max-width: 100%;
- margin-left: auto;
- margin-right: auto;
- padding-left: 1rem; /* default (base) = px-4 */
- padding-right: 1rem;
-}
-
-@media (min-width: 640px) {
- nav.md-grid {
- padding-left: 1.5rem; /* sm:px-6 */
- padding-right: 1.5rem;
- }
-}
-
-@media (min-width: 1024px) {
- nav.md-grid {
- padding-left: 2rem; /* lg:px-8 */
- padding-right: 2rem;
- }
-}
-
-@media (min-width: 1280px) {
- nav.md-grid {
- padding-left: 2.5rem; /* xl:px-10 */
- padding-right: 2.5rem;
- }
-}
-.md-search__inner {
- width: 20rem;
-}
-@media (max-width: 768px) {
- .md-search__inner {
- top: 80px !important;
- }
-
- .md-search__input {
- pointer-events: auto !important;
- color: black !important;
- }
-}
-
- .md-header__title {
- margin-left: 0.1rem;
- width: 100px;
- }
-
-@media (min-width: 1025px) {
- .md-header__title {
- flex-grow: 0;
- flex-basis: auto;
- max-width: 400px;
- }
- .md-header__inner {
- display: flex;
- align-items: center;
- justify-content: space-between;
- }
-}
diff --git a/mkdocs.yml b/mkdocs.yml
index eeb3b937..0b7c8eb1 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -23,6 +23,7 @@ extra_javascript:
- js/vector_co.js
- js/search-close-minimal.js
- js/search-tracking.js
+ # - js/toc-highlight.js
- https://buttons.github.io/buttons.js
- js/reo.js
- js/landing-individual-card-ms-tracking.js
diff --git a/overrides/css/landing-page.css b/overrides/css/landing-page.css
index a2caa437..cbd67943 100644
--- a/overrides/css/landing-page.css
+++ b/overrides/css/landing-page.css
@@ -155,7 +155,7 @@ body:has(.landing-page) .md-sidebar--secondary {
.landing-main-content {
width: 100%;
padding: 0 var(--spacing-xl) var(--spacing-xl) var(--spacing-xl);
- margin-top: 0 !important;
+ margin-top: 1rem !important;
padding-top: 0 !important;
}
@@ -244,7 +244,7 @@ body:has(.landing-page) .md-sidebar--secondary {
}
/* Primary Button Styles */
-.primary-button {
+.primary-button-hero {
position: relative;
border: none;
color: white !important;
@@ -255,34 +255,37 @@ body:has(.landing-page) .md-sidebar--secondary {
transition: all 0.3s ease;
background-color: rgb(107, 118, 226);
border: 1px solid transparent;
- padding: 5px 14px !important;
+ padding: 8px 16px !important;
text-decoration: none;
font-weight: 500;
display: inline-flex;
align-items: center;
+ justify-content: center;
gap: var(--spacing-xs);
font-size: var(--font-size-md);
white-space: nowrap;
+ min-height: 36px;
+ line-height: 1.2;
}
-.primary-button:hover {
+.primary-button-hero:hover {
background-color: var(--color-hover-card);
color: white !important;
text-decoration: none;
}
-.primary-button:visited,
-.primary-button:focus {
+.primary-button-hero:visited,
+.primary-button-hero:focus {
color: white !important;
text-decoration: none;
}
-.primary-button *,
-.primary-button:hover * {
+.primary-button-hero *,
+.primary-button-hero:hover * {
color: white !important;
}
-.primary-button:disabled {
+.primary-button-hero:disabled {
opacity: 0.6;
cursor: not-allowed;
background-image: linear-gradient(180deg, #8cc7ff 0%, #7ab7ff 100%),
@@ -294,18 +297,48 @@ body:has(.landing-page) .md-sidebar--secondary {
.landing-btn-content {
display: flex;
align-items: center;
- gap: 0.5em;
+ justify-content: center;
+ gap: 6px;
white-space: nowrap;
+ line-height: 1.2;
}
.landing-play-icon {
display: flex;
align-items: center;
- font-size: 1.15em;
- margin-right: 0.1em;
+ justify-content: center;
+ width: 16px;
+ height: 16px;
flex-shrink: 0;
}
+.landing-play-icon img {
+ width: 16px;
+ height: 16px;
+ display: block;
+}
+
+/* Additional button text containment rules */
+.primary-button-hero span {
+ display: flex;
+ align-items: center;
+ height: 100%;
+ line-height: 1.2;
+}
+
+.landing-btn-content span:last-child {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* Ensure buttons maintain consistent height */
+.landing-hero-buttons .primary-button-hero {
+ min-height: 36px;
+ height: auto;
+ box-sizing: border-box;
+}
+
/* Section Styles */
.landing-section {
margin-bottom: 15px;
@@ -653,7 +686,8 @@ body:has(.landing-page) .md-sidebar--secondary {
.landing-community-support-item {
border-radius: var(--radius-lg);
- padding: var(--spacing-md) var(--spacing-lg);
+ padding: var(--spacing-md) calc(var(--spacing-lg) + 30px) var(--spacing-md)
+ var(--spacing-lg);
border: 1px solid var(--border-color);
display: flex;
align-items: center;
@@ -665,6 +699,7 @@ body:has(.landing-page) .md-sidebar--secondary {
text-decoration: none;
color: inherit;
min-height: 80px;
+ overflow: hidden;
}
.landing-community-support-item:hover {
@@ -685,6 +720,13 @@ body:has(.landing-page) .md-sidebar--secondary {
opacity: 0;
transition: all 0.2s ease;
color: var(--text-primary);
+ z-index: 1;
+ pointer-events: none;
+ width: 20px;
+ height: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
[data-md-color-scheme="default"] .landing-community-support-arrow {
@@ -915,6 +957,49 @@ body:has(.landing-page) .md-sidebar--secondary {
}
/* Responsive Design */
+@media (max-width: 1024px) {
+ /* Hero section - column layout for tablets and small laptops */
+ .landing-hero-content {
+ flex-direction: column;
+ align-items: center;
+ gap: var(--spacing-lg);
+ text-align: center;
+ }
+
+ .landing-hero-buttons {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: var(--spacing-md);
+ flex-wrap: wrap;
+ }
+
+ /* Three column layout for integration grid on tablets and small laptops */
+ .landing-integration-grid {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ /* Two column layout for community support on medium to large tablets */
+ .landing-community-support-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: var(--spacing-md);
+ }
+}
+
+@media (max-width: 992px) {
+ /* Reduce arrow size and adjust position for medium screens */
+ .landing-community-support-arrow {
+ font-size: 16px;
+ right: var(--spacing-md);
+ }
+
+ /* Reduce extra padding on medium screens */
+ .landing-community-support-item {
+ padding: var(--spacing-md) calc(var(--spacing-md) + 25px) var(--spacing-md)
+ var(--spacing-md);
+ }
+}
+
@media (max-width: 768px) {
.landing-tutorial-row {
flex-direction: column;
@@ -929,8 +1014,9 @@ body:has(.landing-page) .md-sidebar--secondary {
grid-template-columns: repeat(2, 1fr);
}
+ /* Keep two column layout for community support */
.landing-community-support-grid {
- grid-template-columns: 1fr;
+ grid-template-columns: repeat(2, 1fr);
}
.landing-hero-content {
@@ -942,5 +1028,49 @@ body:has(.landing-page) .md-sidebar--secondary {
.landing-hero-buttons {
align-self: stretch;
justify-content: center;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: var(--spacing-sm);
+ }
+
+ /* Hide arrow on mobile to prevent overlap */
+ .landing-community-support-arrow {
+ display: none !important;
+ }
+
+ /* Adjust community support item padding for mobile - remove extra right padding when arrow is hidden */
+ .landing-community-support-item {
+ padding: var(--spacing-md) var(--spacing-lg) var(--spacing-md)
+ var(--spacing-lg);
+ }
+}
+
+@media (max-width: 480px) {
+ .landing-features-list {
+ grid-template-columns: 1fr;
+ }
+
+ .landing-integration-grid {
+ grid-template-columns: 1fr;
+ }
+
+ /* Switch to single column only on very small screens */
+ .landing-community-support-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .landing-main-content {
+ padding: 0 var(--spacing-md) var(--spacing-xl) var(--spacing-md);
+ }
+
+ /* Ensure no arrow interference on very small screens */
+ .landing-community-support-arrow {
+ display: none !important;
+ }
+
+ /* Compact padding for very small screens */
+ .landing-community-support-item {
+ padding: var(--spacing-sm) var(--spacing-md);
+ min-height: 60px;
}
}
diff --git a/overrides/css/output.css b/overrides/css/output.css
index 6c533f36..5d868a97 100644
--- a/overrides/css/output.css
+++ b/overrides/css/output.css
@@ -1,1119 +1,1267 @@
-/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
-@layer properties;
-@layer theme, base, components, utilities;
-@layer theme {
- :root, :host {
- --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
- "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
- "Courier New", monospace;
- --color-red-400: oklch(70.4% 0.191 22.216);
- --color-yellow-300: oklch(90.5% 0.182 98.111);
- --color-blue-50: oklch(97% 0.014 254.604);
- --color-blue-600: oklch(54.6% 0.245 262.881);
- --color-gray-100: oklch(96.7% 0.003 264.542);
- --color-gray-200: oklch(92.8% 0.006 264.531);
- --color-gray-300: oklch(87.2% 0.01 258.338);
- --color-gray-500: oklch(55.1% 0.027 264.364);
- --color-gray-700: oklch(37.3% 0.034 259.733);
- --color-black: #000;
- --color-white: #fff;
- --spacing: 0.25rem;
- --text-xs: 0.75rem;
- --text-xs--line-height: calc(1 / 0.75);
- --text-sm: 0.875rem;
- --text-sm--line-height: calc(1.25 / 0.875);
- --text-base: 1rem;
- --text-base--line-height: calc(1.5 / 1);
- --text-lg: 1.125rem;
- --text-lg--line-height: calc(1.75 / 1.125);
- --font-weight-medium: 500;
- --font-weight-semibold: 600;
- --font-weight-bold: 700;
- --radius-sm: 0.25rem;
- --radius-md: 0.375rem;
- --radius-lg: 0.5rem;
- --radius-xl: 0.75rem;
- --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
- --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
- --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
- --blur-md: 12px;
- --default-transition-duration: 150ms;
- --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- --default-font-family: var(--font-sans);
- --default-mono-font-family: var(--font-mono);
- }
+*, ::before, ::after {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+::backdrop {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+/*
+! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+ /* 1 */
+ border-width: 0;
+ /* 2 */
+ border-style: solid;
+ /* 2 */
+ border-color: #e5e7eb;
+ /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings by default.
+7. Disable tap highlights on iOS
+*/
+
+html,
+:host {
+ line-height: 1.5;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+ -moz-tab-size: 4;
+ /* 3 */
+ -o-tab-size: 4;
+ tab-size: 4;
+ /* 3 */
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ /* 4 */
+ font-feature-settings: normal;
+ /* 5 */
+ font-variation-settings: normal;
+ /* 6 */
+ -webkit-tap-highlight-color: transparent;
+ /* 7 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0;
+ /* 1 */
+ line-height: inherit;
+ /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ border-top-width: 1px;
+ /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font-family by default.
+2. Use the user's configured `mono` font-feature-settings by default.
+3. Use the user's configured `mono` font-variation-settings by default.
+4. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ /* 1 */
+ font-feature-settings: normal;
+ /* 2 */
+ font-variation-settings: normal;
+ /* 3 */
+ font-size: 1em;
+ /* 4 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0;
+ /* 1 */
+ border-color: inherit;
+ /* 2 */
+ border-collapse: collapse;
+ /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-feature-settings: inherit;
+ /* 1 */
+ font-variation-settings: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ font-weight: inherit;
+ /* 1 */
+ line-height: inherit;
+ /* 1 */
+ letter-spacing: inherit;
+ /* 1 */
+ color: inherit;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+ padding: 0;
+ /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ /* 1 */
+ background-color: transparent;
+ /* 2 */
+ background-image: none;
+ /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
}
-@layer base {
- *, ::after, ::before, ::backdrop, ::file-selector-button {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
- border: 0 solid;
- }
- html, :host {
- line-height: 1.5;
- -webkit-text-size-adjust: 100%;
- tab-size: 4;
- font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
- font-feature-settings: var(--default-font-feature-settings, normal);
- font-variation-settings: var(--default-font-variation-settings, normal);
- -webkit-tap-highlight-color: transparent;
- }
- hr {
- height: 0;
- color: inherit;
- border-top-width: 1px;
- }
- abbr:where([title]) {
- -webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
- }
- h1, h2, h3, h4, h5, h6 {
- font-size: inherit;
- font-weight: inherit;
- }
- a {
- color: inherit;
- -webkit-text-decoration: inherit;
- text-decoration: inherit;
- }
- b, strong {
- font-weight: bolder;
- }
- code, kbd, samp, pre {
- font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);
- font-feature-settings: var(--default-mono-font-feature-settings, normal);
- font-variation-settings: var(--default-mono-font-variation-settings, normal);
- font-size: 1em;
- }
- small {
- font-size: 80%;
- }
- sub, sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
- }
- sub {
- bottom: -0.25em;
- }
- sup {
- top: -0.5em;
- }
- table {
- text-indent: 0;
- border-color: inherit;
- border-collapse: collapse;
- }
- :-moz-focusring {
- outline: auto;
- }
- progress {
- vertical-align: baseline;
- }
- summary {
- display: list-item;
- }
- ul, menu {
- list-style: none;
- }
- img, svg, video, canvas, audio, iframe, embed, object {
- display: block;
- vertical-align: middle;
- }
- img, video {
- max-width: 100%;
- height: auto;
- }
- button, input, select, optgroup, textarea, ::file-selector-button {
- font: inherit;
- font-feature-settings: inherit;
- font-variation-settings: inherit;
- letter-spacing: inherit;
- color: inherit;
- border-radius: 0;
- background-color: transparent;
- opacity: 1;
- }
- :where(select:is([multiple], [size])) optgroup {
- font-weight: bolder;
- }
- :where(select:is([multiple], [size])) optgroup option {
- padding-inline-start: 20px;
- }
- ::file-selector-button {
- margin-inline-end: 4px;
- }
- ::placeholder {
- opacity: 1;
- }
- @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
- ::placeholder {
- color: currentcolor;
- @supports (color: color-mix(in lab, red, red)) {
- color: color-mix(in oklab, currentcolor 50%, transparent);
- }
- }
- }
- textarea {
- resize: vertical;
- }
- ::-webkit-search-decoration {
- -webkit-appearance: none;
- }
- ::-webkit-date-and-time-value {
- min-height: 1lh;
- text-align: inherit;
- }
- ::-webkit-datetime-edit {
- display: inline-flex;
- }
- ::-webkit-datetime-edit-fields-wrapper {
- padding: 0;
- }
- ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {
- padding-block: 0;
- }
- :-moz-ui-invalid {
- box-shadow: none;
- }
- button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button {
- appearance: button;
- }
- ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {
- height: auto;
- }
- [hidden]:where(:not([hidden="until-found"])) {
- display: none !important;
- }
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
}
-@layer utilities {
- .pointer-events-auto {
- pointer-events: auto;
- }
- .visible {
- visibility: visible;
- }
- .absolute {
- position: absolute;
- }
- .fixed {
- position: fixed;
- }
- .relative {
- position: relative;
- }
- .static {
- position: static;
- }
- .sticky {
- position: sticky;
- }
- .inset-0 {
- inset: calc(var(--spacing) * 0);
- }
- .top-0 {
- top: calc(var(--spacing) * 0);
- }
- .top-\[120px\] {
- top: 120px;
- }
- .top-full {
- top: 100%;
- }
- .right-2 {
- right: calc(var(--spacing) * 2);
- }
- .bottom-5 {
- bottom: calc(var(--spacing) * 5);
- }
- .bottom-\[-5px\] {
- bottom: -5px;
- }
- .left-0 {
- left: calc(var(--spacing) * 0);
- }
- .left-1 {
- left: calc(var(--spacing) * 1);
- }
- .left-1\/2 {
- left: calc(1/2 * 100%);
- }
- .isolate {
- isolation: isolate;
- }
- .z-50 {
- z-index: 50;
- }
- .container {
- width: 100%;
- @media (width >= 40rem) {
- max-width: 40rem;
- }
- @media (width >= 48rem) {
- max-width: 48rem;
- }
- @media (width >= 64rem) {
- max-width: 64rem;
- }
- @media (width >= 80rem) {
- max-width: 80rem;
- }
- @media (width >= 96rem) {
- max-width: 96rem;
- }
- }
- .mx-auto {
- margin-inline: auto;
- }
- .mt-1 {
- margin-top: calc(var(--spacing) * 1);
- }
- .mt-2 {
- margin-top: calc(var(--spacing) * 2);
- }
- .mt-10 {
- margin-top: calc(var(--spacing) * 10);
- }
- .mb-2 {
- margin-bottom: calc(var(--spacing) * 2);
- }
- .mb-3 {
- margin-bottom: calc(var(--spacing) * 3);
- }
- .mb-4 {
- margin-bottom: calc(var(--spacing) * 4);
- }
- .mb-6 {
- margin-bottom: calc(var(--spacing) * 6);
- }
- .ml-1 {
- margin-left: calc(var(--spacing) * 1);
- }
- .ml-2 {
- margin-left: calc(var(--spacing) * 2);
- }
- .block {
- display: block;
- }
- .contents {
- display: contents;
- }
- .flex {
- display: flex;
- }
- .grid {
- display: grid;
- }
- .hidden {
- display: none;
- }
- .inline {
- display: inline;
- }
- .inline-block {
- display: inline-block;
- }
- .inline-flex {
- display: inline-flex;
- }
- .table {
- display: table;
- }
- .h-0 {
- height: calc(var(--spacing) * 0);
- }
- .h-0\.5 {
- height: calc(var(--spacing) * 0.5);
- }
- .h-4 {
- height: calc(var(--spacing) * 4);
- }
- .h-5 {
- height: calc(var(--spacing) * 5);
- }
- .h-6 {
- height: calc(var(--spacing) * 6);
- }
- .h-7 {
- height: calc(var(--spacing) * 7);
- }
- .h-11 {
- height: calc(var(--spacing) * 11);
- }
- .h-12 {
- height: calc(var(--spacing) * 12);
- }
- .h-\[calc\(100vh-120px\)\] {
- height: calc(100vh - 120px);
- }
- .h-full {
- height: 100%;
- }
- .w-4 {
- width: calc(var(--spacing) * 4);
- }
- .w-5 {
- width: calc(var(--spacing) * 5);
- }
- .w-7 {
- width: calc(var(--spacing) * 7);
- }
- .w-12 {
- width: calc(var(--spacing) * 12);
- }
- .w-40 {
- width: calc(var(--spacing) * 40);
- }
- .w-\[430px\] {
- width: 430px;
- }
- .w-\[450px\] {
- width: 450px;
- }
- .w-\[660px\] {
- width: 660px;
- }
- .w-full {
- width: 100%;
- }
- .flex-1 {
- flex: 1;
- }
- .flex-shrink {
- flex-shrink: 1;
- }
- .flex-shrink-0 {
- flex-shrink: 0;
- }
- .shrink-0 {
- flex-shrink: 0;
- }
- .flex-grow {
- flex-grow: 1;
- }
- .border-collapse {
- border-collapse: collapse;
- }
- .-translate-x-1 {
- --tw-translate-x: calc(var(--spacing) * -1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
- .-translate-x-1\/2 {
- --tw-translate-x: calc(calc(1/2 * 100%) * -1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
- .rotate-90 {
- rotate: 90deg;
- }
- .transform {
- transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
- }
- .cursor-pointer {
- cursor: pointer;
- }
- .resize {
- resize: both;
- }
- .grid-cols-2 {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
- .grid-cols-3 {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
- .flex-col {
- flex-direction: column;
- }
- .flex-wrap {
- flex-wrap: wrap;
- }
- .items-center {
- align-items: center;
- }
- .justify-between {
- justify-content: space-between;
- }
- .justify-center {
- justify-content: center;
- }
- .gap-1 {
- gap: calc(var(--spacing) * 1);
- }
- .gap-2 {
- gap: calc(var(--spacing) * 2);
- }
- .gap-2\.5 {
- gap: calc(var(--spacing) * 2.5);
- }
- .gap-4 {
- gap: calc(var(--spacing) * 4);
- }
- .gap-6 {
- gap: calc(var(--spacing) * 6);
- }
- .space-y-1 {
- :where(& > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));
- }
- }
- .space-y-2 {
- :where(& > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
- }
- }
- .space-y-4 {
- :where(& > :not(:last-child)) {
- --tw-space-y-reverse: 0;
- margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));
- margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));
- }
- }
- .space-x-0 {
- :where(& > :not(:last-child)) {
- --tw-space-x-reverse: 0;
- margin-inline-start: calc(calc(var(--spacing) * 0) * var(--tw-space-x-reverse));
- margin-inline-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-x-reverse)));
- }
- }
- .space-x-0\.5 {
- :where(& > :not(:last-child)) {
- --tw-space-x-reverse: 0;
- margin-inline-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-x-reverse));
- margin-inline-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-x-reverse)));
- }
- }
- .space-x-1 {
- :where(& > :not(:last-child)) {
- --tw-space-x-reverse: 0;
- margin-inline-start: calc(calc(var(--spacing) * 1) * var(--tw-space-x-reverse));
- margin-inline-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-x-reverse)));
- }
- }
- .space-x-2 {
- :where(& > :not(:last-child)) {
- --tw-space-x-reverse: 0;
- margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));
- margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)));
- }
- }
- .overflow-y-auto {
- overflow-y: auto;
- }
- .rounded-full {
- border-radius: calc(infinity * 1px);
- }
- .rounded-lg {
- border-radius: var(--radius-lg);
- }
- .rounded-md {
- border-radius: var(--radius-md);
- }
- .border {
- border-style: var(--tw-border-style);
- border-width: 1px;
- }
- .border-2 {
- border-style: var(--tw-border-style);
- border-width: 2px;
- }
- .border-t {
- border-top-style: var(--tw-border-style);
- border-top-width: 1px;
- }
- .\!border-gray-200 {
- border-color: var(--color-gray-200) !important;
- }
- .border-\[\#4a90e2\] {
- border-color: #4a90e2;
- }
- .border-black {
- border-color: var(--color-black);
- }
- .border-gray-300 {
- border-color: var(--color-gray-300);
- }
- .border-gray-700 {
- border-color: var(--color-gray-700);
- }
- .bg-\[\#7782FF\] {
- background-color: #7782FF;
- }
- .bg-\[\#121212\] {
- background-color: #121212;
- }
- .bg-transparent {
- background-color: transparent;
- }
- .bg-white {
- background-color: var(--color-white);
- }
- .object-contain {
- object-fit: contain;
- }
- .p-2 {
- padding: calc(var(--spacing) * 2);
- }
- .p-3 {
- padding: calc(var(--spacing) * 3);
- }
- .p-4 {
- padding: calc(var(--spacing) * 4);
- }
- .p-5 {
- padding: calc(var(--spacing) * 5);
- }
- .p-6 {
- padding: calc(var(--spacing) * 6);
- }
- .px-1 {
- padding-inline: calc(var(--spacing) * 1);
- }
- .px-1\.5 {
- padding-inline: calc(var(--spacing) * 1.5);
- }
- .px-3 {
- padding-inline: calc(var(--spacing) * 3);
- }
- .px-4 {
- padding-inline: calc(var(--spacing) * 4);
- }
- .px-6 {
- padding-inline: calc(var(--spacing) * 6);
- }
- .px-10 {
- padding-inline: calc(var(--spacing) * 10);
- }
- .py-1 {
- padding-block: calc(var(--spacing) * 1);
- }
- .py-1\.5 {
- padding-block: calc(var(--spacing) * 1.5);
- }
- .py-2 {
- padding-block: calc(var(--spacing) * 2);
- }
- .py-10 {
- padding-block: calc(var(--spacing) * 10);
- }
- .pt-4 {
- padding-top: calc(var(--spacing) * 4);
- }
- .pt-5 {
- padding-top: calc(var(--spacing) * 5);
- }
- .text-center {
- text-align: center;
- }
- .text-left {
- text-align: left;
- }
- .text-base {
- font-size: var(--text-base);
- line-height: var(--tw-leading, var(--text-base--line-height));
- }
- .text-lg {
- font-size: var(--text-lg);
- line-height: var(--tw-leading, var(--text-lg--line-height));
- }
- .text-sm {
- font-size: var(--text-sm);
- line-height: var(--tw-leading, var(--text-sm--line-height));
- }
- .text-xs {
- font-size: var(--text-xs);
- line-height: var(--tw-leading, var(--text-xs--line-height));
- }
- .text-\[14px\] {
- font-size: 14px;
- }
- .text-\[15px\] {
- font-size: 15px;
- }
- .text-\[17px\] {
- font-size: 17px;
- }
- .font-bold {
- --tw-font-weight: var(--font-weight-bold);
- font-weight: var(--font-weight-bold);
- }
- .font-medium {
- --tw-font-weight: var(--font-weight-medium);
- font-weight: var(--font-weight-medium);
- }
- .font-semibold {
- --tw-font-weight: var(--font-weight-semibold);
- font-weight: var(--font-weight-semibold);
- }
- .text-nowrap {
- text-wrap: nowrap;
- }
- .text-wrap {
- text-wrap: wrap;
- }
- .whitespace-nowrap {
- white-space: nowrap;
- }
- .\!text-white {
- color: var(--color-white) !important;
- }
- .text-\[rgba\(255\,255\,255\,0\.6\)\] {
- color: rgba(255,255,255,0.6);
- }
- .text-black {
- color: var(--color-black);
- }
- .text-blue-600 {
- color: var(--color-blue-600);
- }
- .text-gray-300 {
- color: var(--color-gray-300);
- }
- .text-gray-500 {
- color: var(--color-gray-500);
- }
- .text-red-400 {
- color: var(--color-red-400);
- }
- .text-white {
- color: var(--color-white);
- }
- .text-white\/90 {
- color: color-mix(in srgb, #fff 90%, transparent);
- @supports (color: color-mix(in lab, red, red)) {
- color: color-mix(in oklab, var(--color-white) 90%, transparent);
- }
- }
- .text-yellow-300 {
- color: var(--color-yellow-300);
- }
- .capitalize {
- text-transform: capitalize;
- }
- .lowercase {
- text-transform: lowercase;
- }
- .uppercase {
- text-transform: uppercase;
- }
- .underline {
- text-decoration-line: underline;
- }
- .placeholder-\[rgba\(255\,255\,255\,0\.6\)\] {
- &::placeholder {
- color: rgba(255,255,255,0.6);
- }
- }
- .caret-white {
- caret-color: var(--color-white);
- }
- .opacity-100 {
- opacity: 100%;
- }
- .shadow-lg {
- --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
- .ring {
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
- .outline {
- outline-style: var(--tw-outline-style);
- outline-width: 1px;
- }
- .grayscale {
- --tw-grayscale: grayscale(100%);
- filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
- }
- .filter {
- filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
- }
- .backdrop-blur-md {
- --tw-backdrop-blur: blur(var(--blur-md));
- -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
- backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
- }
- .backdrop-filter {
- -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
- backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
- }
- .transition {
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
- .transition-all {
- transition-property: all;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
- .transition-opacity {
- transition-property: opacity;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
- .transition-transform {
- transition-property: transform, translate, scale, rotate;
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
- transition-duration: var(--tw-duration, var(--default-transition-duration));
- }
- .duration-200 {
- --tw-duration: 200ms;
- transition-duration: 200ms;
- }
- .duration-300 {
- --tw-duration: 300ms;
- transition-duration: 300ms;
- }
- .duration-500 {
- --tw-duration: 500ms;
- transition-duration: 500ms;
- }
- .ease-in-out {
- --tw-ease: var(--ease-in-out);
- transition-timing-function: var(--ease-in-out);
- }
- .outline-none {
- --tw-outline-style: none;
- outline-style: none;
- }
- .group-hover\:flex {
- &:is(:where(.group):hover *) {
- @media (hover: hover) {
- display: flex;
- }
- }
- }
- .group-hover\:translate-x-1 {
- &:is(:where(.group):hover *) {
- @media (hover: hover) {
- --tw-translate-x: calc(var(--spacing) * 1);
- translate: var(--tw-translate-x) var(--tw-translate-y);
- }
- }
- }
- .group-hover\:flex-wrap {
- &:is(:where(.group):hover *) {
- @media (hover: hover) {
- flex-wrap: wrap;
- }
- }
- }
- .group-hover\:gap-x-8 {
- &:is(:where(.group):hover *) {
- @media (hover: hover) {
- column-gap: calc(var(--spacing) * 8);
- }
- }
- }
- .group-hover\:gap-y-4 {
- &:is(:where(.group):hover *) {
- @media (hover: hover) {
- row-gap: calc(var(--spacing) * 4);
- }
- }
- }
- .hover\:bg-\[\#6672fa\] {
- &:hover {
- @media (hover: hover) {
- background-color: #6672fa;
- }
- }
- }
- .hover\:bg-blue-50 {
- &:hover {
- @media (hover: hover) {
- background-color: var(--color-blue-50);
- }
- }
- }
- .hover\:bg-gray-100 {
- &:hover {
- @media (hover: hover) {
- background-color: var(--color-gray-100);
- }
- }
- }
- .hover\:bg-white {
- &:hover {
- @media (hover: hover) {
- background-color: var(--color-white);
- }
- }
- }
- .hover\:text-\[\#6b76e3\] {
- &:hover {
- @media (hover: hover) {
- color: #6b76e3;
- }
- }
- }
- .hover\:text-\[\#7782FF\] {
- &:hover {
- @media (hover: hover) {
- color: #7782FF;
- }
- }
- }
- .hover\:text-black {
- &:hover {
- @media (hover: hover) {
- color: var(--color-black);
- }
- }
- }
- .hover\:shadow-xl {
- &:hover {
- @media (hover: hover) {
- --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
- }
- }
- .focus-visible\:ring-2 {
- &:focus-visible {
- --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
- }
- }
- .focus-visible\:ring-offset-2 {
- &:focus-visible {
- --tw-ring-offset-width: 2px;
- --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- }
- }
- .focus-visible\:outline-none {
- &:focus-visible {
- --tw-outline-style: none;
- outline-style: none;
- }
- }
- .active\:scale-98 {
- &:active {
- --tw-scale-x: 98%;
- --tw-scale-y: 98%;
- --tw-scale-z: 98%;
- scale: var(--tw-scale-x) var(--tw-scale-y);
- }
- }
- .disabled\:pointer-events-none {
- &:disabled {
- pointer-events: none;
- }
- }
- .disabled\:opacity-50 {
- &:disabled {
- opacity: 50%;
- }
- }
- .sm\:grid-cols-3 {
- @media (width >= 40rem) {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
- }
- .sm\:px-6 {
- @media (width >= 40rem) {
- padding-inline: calc(var(--spacing) * 6);
- }
- }
- .md\:mt-0 {
- @media (width >= 48rem) {
- margin-top: calc(var(--spacing) * 0);
- }
- }
- .md\:h-4 {
- @media (width >= 48rem) {
- height: calc(var(--spacing) * 4);
- }
- }
- .md\:h-7 {
- @media (width >= 48rem) {
- height: calc(var(--spacing) * 7);
- }
- }
- .md\:w-4 {
- @media (width >= 48rem) {
- width: calc(var(--spacing) * 4);
- }
- }
- .md\:w-52 {
- @media (width >= 48rem) {
- width: calc(var(--spacing) * 52);
- }
- }
- .md\:max-w-fit {
- @media (width >= 48rem) {
- max-width: fit-content;
- }
- }
- .md\:flex-row {
- @media (width >= 48rem) {
- flex-direction: row;
- }
- }
- .md\:items-center {
- @media (width >= 48rem) {
- align-items: center;
- }
- }
- .md\:items-start {
- @media (width >= 48rem) {
- align-items: flex-start;
- }
- }
- .md\:justify-between {
- @media (width >= 48rem) {
- justify-content: space-between;
- }
- }
- .md\:justify-start {
- @media (width >= 48rem) {
- justify-content: flex-start;
- }
- }
- .md\:gap-1 {
- @media (width >= 48rem) {
- gap: calc(var(--spacing) * 1);
- }
- }
- .md\:gap-2 {
- @media (width >= 48rem) {
- gap: calc(var(--spacing) * 2);
- }
- }
- .md\:gap-3 {
- @media (width >= 48rem) {
- gap: calc(var(--spacing) * 3);
- }
- }
- .md\:px-5 {
- @media (width >= 48rem) {
- padding-inline: calc(var(--spacing) * 5);
- }
- }
- .md\:font-semibold {
- @media (width >= 48rem) {
- --tw-font-weight: var(--font-weight-semibold);
- font-weight: var(--font-weight-semibold);
- }
- }
- .md\:text-white {
- @media (width >= 48rem) {
- color: var(--color-white);
- }
- }
- .lg\:block {
- @media (width >= 64rem) {
- display: block;
- }
- }
- .lg\:flex {
- @media (width >= 64rem) {
- display: flex;
- }
- }
- .lg\:hidden {
- @media (width >= 64rem) {
- display: none;
- }
- }
- .lg\:w-\[75\%\] {
- @media (width >= 64rem) {
- width: 75%;
- }
- }
- .lg\:flex-grow {
- @media (width >= 64rem) {
- flex-grow: 1;
- }
- }
- .lg\:grid-cols-4 {
- @media (width >= 64rem) {
- grid-template-columns: repeat(4, minmax(0, 1fr));
- }
- }
- .lg\:flex-row {
- @media (width >= 64rem) {
- flex-direction: row;
- }
- }
- .lg\:items-center {
- @media (width >= 64rem) {
- align-items: center;
- }
- }
- .lg\:justify-between {
- @media (width >= 64rem) {
- justify-content: space-between;
- }
- }
- .lg\:justify-end {
- @media (width >= 64rem) {
- justify-content: flex-end;
- }
- }
- .lg\:gap-4 {
- @media (width >= 64rem) {
- gap: calc(var(--spacing) * 4);
- }
- }
- .lg\:px-8 {
- @media (width >= 64rem) {
- padding-inline: calc(var(--spacing) * 8);
- }
- }
- .lg\:text-left {
- @media (width >= 64rem) {
- text-align: left;
- }
- }
- .xl\:px-10 {
- @media (width >= 80rem) {
- padding-inline: calc(var(--spacing) * 10);
- }
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+Reset default styling for dialogs.
+*/
+
+dialog {
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ /* 1 */
+ vertical-align: middle;
+ /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+
+[hidden]:where(:not([hidden="until-found"])) {
+ display: none;
+}
+
+.tw-container {
+ width: 100%;
+}
+
+@media (min-width: 30rem) {
+ .tw-container {
+ max-width: 30rem;
}
- .xl\:px-12 {
- @media (width >= 80rem) {
- padding-inline: calc(var(--spacing) * 12);
- }
+}
+
+@media (min-width: 44rem) {
+ .tw-container {
+ max-width: 44rem;
}
- .\[\&_svg\]\:size-4 {
- & svg {
- width: calc(var(--spacing) * 4);
- height: calc(var(--spacing) * 4);
- }
+}
+
+@media (min-width: 52rem) {
+ .tw-container {
+ max-width: 52rem;
}
- .\[\&_svg\]\:shrink-0 {
- & svg {
- flex-shrink: 0;
- }
+}
+
+@media (min-width: 68rem) {
+ .tw-container {
+ max-width: 68rem;
}
}
-@layer utilities {
- .hover\:text-\[\#7782FF\]:hover {
- color: #7782ff;
+
+@media (min-width: 86rem) {
+ .tw-container {
+ max-width: 86rem;
}
}
+
+.tw-pointer-events-auto {
+ pointer-events: auto;
+}
+
+.tw-visible {
+ visibility: visible;
+}
+
+.tw-fixed {
+ position: fixed;
+}
+
+.tw-absolute {
+ position: absolute;
+}
+
+.tw-relative {
+ position: relative;
+}
+
+.tw-sticky {
+ position: sticky;
+}
+
+.tw-inset-0 {
+ inset: 0px;
+}
+
+.tw-bottom-5 {
+ bottom: 1.25rem;
+}
+
+.tw-bottom-\[-5px\] {
+ bottom: -5px;
+}
+
+.tw-left-0 {
+ left: 0px;
+}
+
+.tw-left-1\/2 {
+ left: 50%;
+}
+
+.tw-right-2 {
+ right: 0.5rem;
+}
+
+.tw-top-0 {
+ top: 0px;
+}
+
+.tw-top-\[120px\] {
+ top: 120px;
+}
+
+.tw-top-full {
+ top: 100%;
+}
+
+.tw-z-50 {
+ z-index: 50;
+}
+
+.tw-mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.tw-mb-2 {
+ margin-bottom: 0.5rem;
+}
+
+.tw-mb-3 {
+ margin-bottom: 0.75rem;
+}
+
+.tw-mb-4 {
+ margin-bottom: 1rem;
+}
+
+.tw-mb-6 {
+ margin-bottom: 1.5rem;
+}
+
+.tw-ml-1 {
+ margin-left: 0.25rem;
+}
+
+.tw-ml-2 {
+ margin-left: 0.5rem;
+}
+
+.tw-mt-1 {
+ margin-top: 0.25rem;
+}
+
+.tw-mt-2 {
+ margin-top: 0.5rem;
+}
+
+.tw-mt-5 {
+ margin-top: 1.25rem;
+}
+
+.tw-block {
+ display: block;
+}
+
+.tw-inline-block {
+ display: inline-block;
+}
+
+.tw-flex {
+ display: flex;
+}
+
+.tw-inline-flex {
+ display: inline-flex;
+}
+
+.tw-grid {
+ display: grid;
+}
+
+.tw-hidden {
+ display: none;
+}
+
+.tw-h-0\.5 {
+ height: 0.125rem;
+}
+
+.tw-h-12 {
+ height: 3rem;
+}
+
+.tw-h-4 {
+ height: 1rem;
+}
+
+.tw-h-5 {
+ height: 1.25rem;
+}
+
+.tw-h-6 {
+ height: 1.5rem;
+}
+
+.tw-h-7 {
+ height: 1.75rem;
+}
+
+.tw-h-\[calc\(100vh-120px\)\] {
+ height: calc(100vh - 120px);
+}
+
+.tw-h-full {
+ height: 100%;
+}
+
+.tw-w-12 {
+ width: 3rem;
+}
+
+.tw-w-4 {
+ width: 1rem;
+}
+
+.tw-w-40 {
+ width: 10rem;
+}
+
+.tw-w-5 {
+ width: 1.25rem;
+}
+
+.tw-w-7 {
+ width: 1.75rem;
+}
+
+.tw-w-\[430px\] {
+ width: 430px;
+}
+
+.tw-w-\[450px\] {
+ width: 450px;
+}
+
+.tw-w-\[660px\] {
+ width: 660px;
+}
+
+.tw-w-full {
+ width: 100%;
+}
+
+.tw-flex-1 {
+ flex: 1 1 0%;
+}
+
+.tw-flex-shrink-0 {
+ flex-shrink: 0;
+}
+
+.tw-shrink-0 {
+ flex-shrink: 0;
+}
+
+.tw--translate-x-1\/2 {
+ --tw-translate-x: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.tw-rotate-90 {
+ --tw-rotate: 90deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.tw-transform {
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.tw-cursor-pointer {
+ cursor: pointer;
+}
+
+.tw-grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+.tw-grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.tw-flex-col {
+ flex-direction: column;
+}
+
+.tw-flex-wrap {
+ flex-wrap: wrap;
+}
+
+.tw-items-center {
+ align-items: center;
+}
+
+.tw-justify-center {
+ justify-content: center;
+}
+
+.tw-justify-between {
+ justify-content: space-between;
+}
+
+.tw-gap-1 {
+ gap: 0.25rem;
+}
+
+.tw-gap-2 {
+ gap: 0.5rem;
+}
+
+.tw-gap-2\.5 {
+ gap: 0.625rem;
+}
+
+.tw-gap-4 {
+ gap: 1rem;
+}
+
+.tw-gap-6 {
+ gap: 1.5rem;
+}
+
+.tw-space-x-0\.5 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.125rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.tw-space-x-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.tw-space-x-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.tw-space-y-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
+}
+
+.tw-space-y-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
+}
+
+.tw-space-y-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
+}
+
+.tw-overflow-y-auto {
+ overflow-y: auto;
+}
+
+.tw-whitespace-nowrap {
+ white-space: nowrap;
+}
+
+.tw-text-nowrap {
+ text-wrap: nowrap;
+}
+
+.tw-rounded-full {
+ border-radius: 9999px;
+}
+
+.tw-rounded-lg {
+ border-radius: 0.5rem;
+}
+
+.tw-rounded-md {
+ border-radius: 0.375rem;
+}
+
+.tw-border {
+ border-width: 1px;
+}
+
+.tw-border-2 {
+ border-width: 2px;
+}
+
+.tw-border-t {
+ border-top-width: 1px;
+}
+
+.\!tw-border-gray-200 {
+ --tw-border-opacity: 1 !important;
+ border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)) !important;
+}
+
+.tw-border-\[\#4a90e2\] {
+ --tw-border-opacity: 1;
+ border-color: rgb(74 144 226 / var(--tw-border-opacity, 1));
+}
+
+.tw-border-black {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 0 0 / var(--tw-border-opacity, 1));
+}
+
+.tw-border-gray-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));
+}
+
+.tw-border-gray-700 {
+ --tw-border-opacity: 1;
+ border-color: rgb(55 65 81 / var(--tw-border-opacity, 1));
+}
+
+.tw-bg-\[\#121212\] {
+ --tw-bg-opacity: 1;
+ background-color: rgb(18 18 18 / var(--tw-bg-opacity, 1));
+}
+
+.tw-bg-\[\#7782FF\] {
+ --tw-bg-opacity: 1;
+ background-color: rgb(119 130 255 / var(--tw-bg-opacity, 1));
+}
+
+.tw-bg-transparent {
+ background-color: transparent;
+}
+
+.tw-bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
+}
+
+.tw-object-contain {
+ -o-object-fit: contain;
+ object-fit: contain;
+}
+
+.tw-p-2 {
+ padding: 0.5rem;
+}
+
+.tw-p-3 {
+ padding: 0.75rem;
+}
+
+.tw-p-4 {
+ padding: 1rem;
+}
+
+.tw-p-5 {
+ padding: 1.25rem;
+}
+
+.tw-p-6 {
+ padding: 1.5rem;
+}
+
+.tw-px-1\.5 {
+ padding-left: 0.375rem;
+ padding-right: 0.375rem;
+}
+
+.tw-px-10 {
+ padding-left: 2.5rem;
+ padding-right: 2.5rem;
+}
+
+.tw-px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.tw-px-4 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.tw-px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+.tw-py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.tw-py-1\.5 {
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+}
+
+.tw-py-10 {
+ padding-top: 2.5rem;
+ padding-bottom: 2.5rem;
+}
+
+.tw-py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.tw-pt-4 {
+ padding-top: 1rem;
+}
+
+.tw-pt-5 {
+ padding-top: 1.25rem;
+}
+
+.tw-text-left {
+ text-align: left;
+}
+
+.tw-text-center {
+ text-align: center;
+}
+
+.tw-text-\[14px\] {
+ font-size: 14px;
+}
+
+.tw-text-\[15px\] {
+ font-size: 15px;
+}
+
+.tw-text-\[17px\] {
+ font-size: 17px;
+}
+
+.tw-text-base {
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+
+.tw-text-lg {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}
+
+.tw-text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.tw-text-xs {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.tw-font-bold {
+ font-weight: 700;
+}
+
+.tw-font-medium {
+ font-weight: 500;
+}
+
+.tw-font-semibold {
+ font-weight: 600;
+}
+
+.tw-capitalize {
+ text-transform: capitalize;
+}
+
+.\!tw-text-white {
+ --tw-text-opacity: 1 !important;
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1)) !important;
+}
+
+.tw-text-\[rgba\(255\,255\,255\,0\.6\)\] {
+ color: rgba(255,255,255,0.6);
+}
+
+.tw-text-black {
+ --tw-text-opacity: 1;
+ color: rgb(0 0 0 / var(--tw-text-opacity, 1));
+}
+
+.tw-text-blue-600 {
+ --tw-text-opacity: 1;
+ color: rgb(37 99 235 / var(--tw-text-opacity, 1));
+}
+
+.tw-text-gray-300 {
+ --tw-text-opacity: 1;
+ color: rgb(209 213 219 / var(--tw-text-opacity, 1));
+}
+
+.tw-text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity, 1));
+}
+
+.tw-text-red-400 {
+ --tw-text-opacity: 1;
+ color: rgb(248 113 113 / var(--tw-text-opacity, 1));
+}
+
+.tw-text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1));
+}
+
+.tw-text-white\/90 {
+ color: rgb(255 255 255 / 0.9);
+}
+
+.tw-text-yellow-300 {
+ --tw-text-opacity: 1;
+ color: rgb(253 224 71 / var(--tw-text-opacity, 1));
+}
+
+.tw-underline {
+ text-decoration-line: underline;
+}
+
+.tw-placeholder-\[rgba\(255\,255\,255\,0\.6\)\]::-moz-placeholder {
+ color: rgba(255,255,255,0.6);
+}
+
+.tw-placeholder-\[rgba\(255\,255\,255\,0\.6\)\]::placeholder {
+ color: rgba(255,255,255,0.6);
+}
+
+.tw-caret-white {
+ caret-color: #fff;
+}
+
+.tw-opacity-100 {
+ opacity: 1;
+}
+
+.tw-shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.tw-outline-none {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.tw-grayscale {
+ --tw-grayscale: grayscale(100%);
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+}
+
+.tw-backdrop-blur-md {
+ --tw-backdrop-blur: blur(12px);
+ -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+}
+
+.tw-transition {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.tw-transition-all {
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.tw-transition-opacity {
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.tw-transition-transform {
+ transition-property: transform;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.tw-duration-200 {
+ transition-duration: 200ms;
+}
+
+.tw-duration-300 {
+ transition-duration: 300ms;
+}
+
+.tw-duration-500 {
+ transition-duration: 500ms;
+}
+
+.tw-ease-in-out {
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
.hero-gradient {
- --tw-gradient-position: to right in oklab;
- background-image: linear-gradient(var(--tw-gradient-stops));
- --tw-gradient-from: #6A76E3;
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
- --tw-gradient-to: #45A4F3;
- --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
+ background: linear-gradient(to right, #6a76e3, #45a4f3);
}
+
input {
color: #ffffff;
}
+
.custom-gradient {
- background: linear-gradient( 180deg, rgba(255, 255, 255, 0.75) 0%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0.3) 100% );
-}
+ background: linear-gradient(
+ 180deg,
+ rgba(255, 255, 255, 0.75) 0%,
+ rgba(255, 255, 255, 0.5) 60%,
+ rgba(255, 255, 255, 0.3) 100%
+ );
+}
+
.theme-purple {
--color-primary-purple: rgba(107, 118, 227);
color: var(--color-primary-purple);
@@ -1122,18 +1270,21 @@ input {
--color-tabs-background: rgba(107, 118, 227);
--color-tabs-title-text: rgba(107, 118, 227);
}
-html, body {
+
+html {
margin: 0;
width: 100%;
- height: 100%;
font-family: "Inter", sans-serif;
scroll-behavior: smooth;
scroll-padding-top: 8rem;
+ /* height: 100%; removed to prevent extra space at the bottom */
}
+
main {
min-height: calc(100vh - 8rem);
padding-top: 3rem;
}
+
.primary-button {
position: relative;
border: none;
@@ -1144,18 +1295,23 @@ main {
background-clip: padding-box, border-box;
transition: all 0.3s ease;
background-color: rgba(107, 118, 227);
+ /* Creates a 2px border that matches the button color initially */
border: 1px solid transparent;
font-size: 12px;
}
+
.primary-button:hover {
background-color: hsl(233 53% 53%);
}
+
.primary-button:disabled {
opacity: 0.6;
cursor: not-allowed;
- background-image: linear-gradient(180deg, #8cc7ff 0%, #7ab7ff 100%), linear-gradient(180deg, #8cc7ff 0%, #7ab7ff 100%);
+ background-image: linear-gradient(180deg, #8cc7ff 0%, #7ab7ff 100%),
+ linear-gradient(180deg, #8cc7ff 0%, #7ab7ff 100%);
box-shadow: none;
}
+
.secondary-button {
position: relative;
border: none;
@@ -1169,440 +1325,274 @@ main {
border: 1px solid transparent;
font-size: 12px;
}
+
.secondary-button:hover {
+ /* Transparent border to show gradient */
background-color: #f3f4f6;
}
+
.secondary-button:disabled {
opacity: 0.6;
cursor: not-allowed;
border-color: #cccccc;
+ /* Light gray border for disabled state */
background: transparent;
box-shadow: none;
}
+
.gradient-hover {
background: linear-gradient(to left, #6a76e3, #45a4f3);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
-.md-header {
- position: fixed !important;
- top: 70px !important;
-}
-.md-main__inner {
- margin-top: 70px !important;
-}
-.md-sidebar {
- top: 75px !important;
-}
-@media (min-width: 640px) and (max-width: 1023px) {
- .md-sidebar {
- top: 70px !important;
- }
-}
-@media (min-width: 1024px) {
- .md-sidebar {
- top: 70px !important;
- height: calc(100vh - 70px) !important;
- }
-}
-nav.md-grid {
- max-width: 100%;
- margin-left: auto;
- margin-right: auto;
- padding-left: 1rem;
- padding-right: 1rem;
-}
+
+.hover\:tw-bg-\[\#6672fa\]:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(102 114 250 / var(--tw-bg-opacity, 1));
+}
+
+.hover\:tw-bg-blue-50:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1));
+}
+
+.hover\:tw-bg-gray-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));
+}
+
+.hover\:tw-bg-white:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
+}
+
+.hover\:tw-bg-opacity-10:hover {
+ --tw-bg-opacity: 0.1;
+}
+
+.hover\:tw-text-\[\#6b76e3\]:hover {
+ --tw-text-opacity: 1;
+ color: rgb(107 118 227 / var(--tw-text-opacity, 1));
+}
+
+.hover\:tw-text-\[\#7782FF\]:hover {
+ --tw-text-opacity: 1;
+ color: rgb(119 130 255 / var(--tw-text-opacity, 1));
+}
+
+.hover\:tw-text-black:hover {
+ --tw-text-opacity: 1;
+ color: rgb(0 0 0 / var(--tw-text-opacity, 1));
+}
+
+.hover\:tw-shadow-xl:hover {
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.focus-visible\:tw-outline-none:focus-visible {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus-visible\:tw-ring-2:focus-visible {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus-visible\:tw-ring-offset-2:focus-visible {
+ --tw-ring-offset-width: 2px;
+}
+
+.disabled\:tw-pointer-events-none:disabled {
+ pointer-events: none;
+}
+
+.disabled\:tw-opacity-50:disabled {
+ opacity: 0.5;
+}
+
+.tw-group:hover .group-hover\:tw-flex {
+ display: flex;
+}
+
+.tw-group:hover .group-hover\:tw-translate-x-1 {
+ --tw-translate-x: 0.25rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.tw-group:hover .group-hover\:tw-flex-wrap {
+ flex-wrap: wrap;
+}
+
+.tw-group:hover .group-hover\:tw-gap-x-8 {
+ -moz-column-gap: 2rem;
+ column-gap: 2rem;
+}
+
+.tw-group:hover .group-hover\:tw-gap-y-4 {
+ row-gap: 1rem;
+}
+
@media (min-width: 640px) {
- nav.md-grid {
+ .sm\:tw-grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .sm\:tw-px-6 {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
-@media (min-width: 1024px) {
- nav.md-grid {
- padding-left: 2rem;
- padding-right: 2rem;
+
+@media (min-width: 768px) {
+ .md\:tw-mt-0 {
+ margin-top: 0px;
}
-}
-@media (min-width: 1280px) {
- nav.md-grid {
- padding-left: 2.5rem;
- padding-right: 2.5rem;
+
+ .md\:tw-h-4 {
+ height: 1rem;
}
-}
-.md-search__inner {
- width: 20rem;
-}
-@media (max-width: 768px) {
- .md-search__inner {
- top: 80px !important;
+
+ .md\:tw-h-7 {
+ height: 1.75rem;
}
- .md-search__input {
- pointer-events: auto !important;
- color: black !important;
+
+ .md\:tw-w-4 {
+ width: 1rem;
+ }
+
+ .md\:tw-w-52 {
+ width: 13rem;
+ }
+
+ .md\:tw-max-w-fit {
+ max-width: -moz-fit-content;
+ max-width: fit-content;
+ }
+
+ .md\:tw-flex-row {
+ flex-direction: row;
+ }
+
+ .md\:tw-items-start {
+ align-items: flex-start;
+ }
+
+ .md\:tw-items-center {
+ align-items: center;
+ }
+
+ .md\:tw-justify-start {
+ justify-content: flex-start;
+ }
+
+ .md\:tw-justify-between {
+ justify-content: space-between;
+ }
+
+ .md\:tw-gap-1 {
+ gap: 0.25rem;
+ }
+
+ .md\:tw-gap-2 {
+ gap: 0.5rem;
+ }
+
+ .md\:tw-gap-3 {
+ gap: 0.75rem;
+ }
+
+ .md\:tw-px-5 {
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+ }
+
+ .md\:tw-font-semibold {
+ font-weight: 600;
+ }
+
+ .md\:tw-text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1));
}
}
-.md-header__title {
- margin-left: 0.1rem;
- width: 100px;
-}
-@media (min-width: 1025px) {
- .md-header__title {
- flex-grow: 0;
- flex-basis: auto;
- max-width: 400px;
+
+@media (min-width: 1024px) {
+ .lg\:tw-block {
+ display: block;
}
- .md-header__inner {
+
+ .lg\:tw-flex {
display: flex;
+ }
+
+ .lg\:tw-hidden {
+ display: none;
+ }
+
+ .lg\:tw-w-\[75\%\] {
+ width: 75%;
+ }
+
+ .lg\:tw-flex-grow {
+ flex-grow: 1;
+ }
+
+ .lg\:tw-grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+
+ .lg\:tw-flex-row {
+ flex-direction: row;
+ }
+
+ .lg\:tw-items-center {
align-items: center;
+ }
+
+ .lg\:tw-justify-end {
+ justify-content: flex-end;
+ }
+
+ .lg\:tw-justify-between {
justify-content: space-between;
}
+
+ .lg\:tw-gap-4 {
+ gap: 1rem;
+ }
+
+ .lg\:tw-px-8 {
+ padding-left: 2rem;
+ padding-right: 2rem;
+ }
+
+ .lg\:tw-text-left {
+ text-align: left;
+ }
}
-@property --tw-translate-x {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-@property --tw-translate-y {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-@property --tw-translate-z {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-@property --tw-rotate-x {
- syntax: "*";
- inherits: false;
-}
-@property --tw-rotate-y {
- syntax: "*";
- inherits: false;
-}
-@property --tw-rotate-z {
- syntax: "*";
- inherits: false;
-}
-@property --tw-skew-x {
- syntax: "*";
- inherits: false;
-}
-@property --tw-skew-y {
- syntax: "*";
- inherits: false;
-}
-@property --tw-space-y-reverse {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-@property --tw-space-x-reverse {
- syntax: "*";
- inherits: false;
- initial-value: 0;
-}
-@property --tw-border-style {
- syntax: "*";
- inherits: false;
- initial-value: solid;
-}
-@property --tw-font-weight {
- syntax: "*";
- inherits: false;
-}
-@property --tw-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-@property --tw-shadow-color {
- syntax: "*";
- inherits: false;
-}
-@property --tw-shadow-alpha {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-@property --tw-inset-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-@property --tw-inset-shadow-color {
- syntax: "*";
- inherits: false;
-}
-@property --tw-inset-shadow-alpha {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-@property --tw-ring-color {
- syntax: "*";
- inherits: false;
-}
-@property --tw-ring-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-@property --tw-inset-ring-color {
- syntax: "*";
- inherits: false;
-}
-@property --tw-inset-ring-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-@property --tw-ring-inset {
- syntax: "*";
- inherits: false;
-}
-@property --tw-ring-offset-width {
- syntax: "";
- inherits: false;
- initial-value: 0px;
-}
-@property --tw-ring-offset-color {
- syntax: "*";
- inherits: false;
- initial-value: #fff;
-}
-@property --tw-ring-offset-shadow {
- syntax: "*";
- inherits: false;
- initial-value: 0 0 #0000;
-}
-@property --tw-outline-style {
- syntax: "*";
- inherits: false;
- initial-value: solid;
-}
-@property --tw-blur {
- syntax: "*";
- inherits: false;
-}
-@property --tw-brightness {
- syntax: "*";
- inherits: false;
-}
-@property --tw-contrast {
- syntax: "*";
- inherits: false;
-}
-@property --tw-grayscale {
- syntax: "*";
- inherits: false;
-}
-@property --tw-hue-rotate {
- syntax: "*";
- inherits: false;
-}
-@property --tw-invert {
- syntax: "*";
- inherits: false;
-}
-@property --tw-opacity {
- syntax: "*";
- inherits: false;
-}
-@property --tw-saturate {
- syntax: "*";
- inherits: false;
-}
-@property --tw-sepia {
- syntax: "*";
- inherits: false;
-}
-@property --tw-drop-shadow {
- syntax: "*";
- inherits: false;
-}
-@property --tw-drop-shadow-color {
- syntax: "*";
- inherits: false;
-}
-@property --tw-drop-shadow-alpha {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-@property --tw-drop-shadow-size {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-blur {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-brightness {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-contrast {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-grayscale {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-hue-rotate {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-invert {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-opacity {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-saturate {
- syntax: "*";
- inherits: false;
-}
-@property --tw-backdrop-sepia {
- syntax: "*";
- inherits: false;
-}
-@property --tw-duration {
- syntax: "*";
- inherits: false;
-}
-@property --tw-ease {
- syntax: "*";
- inherits: false;
-}
-@property --tw-scale-x {
- syntax: "*";
- inherits: false;
- initial-value: 1;
-}
-@property --tw-scale-y {
- syntax: "*";
- inherits: false;
- initial-value: 1;
-}
-@property --tw-scale-z {
- syntax: "*";
- inherits: false;
- initial-value: 1;
-}
-@property --tw-gradient-position {
- syntax: "*";
- inherits: false;
-}
-@property --tw-gradient-from {
- syntax: "";
- inherits: false;
- initial-value: #0000;
-}
-@property --tw-gradient-via {
- syntax: "";
- inherits: false;
- initial-value: #0000;
-}
-@property --tw-gradient-to {
- syntax: "";
- inherits: false;
- initial-value: #0000;
-}
-@property --tw-gradient-stops {
- syntax: "*";
- inherits: false;
-}
-@property --tw-gradient-via-stops {
- syntax: "*";
- inherits: false;
-}
-@property --tw-gradient-from-position {
- syntax: "";
- inherits: false;
- initial-value: 0%;
-}
-@property --tw-gradient-via-position {
- syntax: "";
- inherits: false;
- initial-value: 50%;
-}
-@property --tw-gradient-to-position {
- syntax: "";
- inherits: false;
- initial-value: 100%;
-}
-@layer properties {
- @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
- *, ::before, ::after, ::backdrop {
- --tw-translate-x: 0;
- --tw-translate-y: 0;
- --tw-translate-z: 0;
- --tw-rotate-x: initial;
- --tw-rotate-y: initial;
- --tw-rotate-z: initial;
- --tw-skew-x: initial;
- --tw-skew-y: initial;
- --tw-space-y-reverse: 0;
- --tw-space-x-reverse: 0;
- --tw-border-style: solid;
- --tw-font-weight: initial;
- --tw-shadow: 0 0 #0000;
- --tw-shadow-color: initial;
- --tw-shadow-alpha: 100%;
- --tw-inset-shadow: 0 0 #0000;
- --tw-inset-shadow-color: initial;
- --tw-inset-shadow-alpha: 100%;
- --tw-ring-color: initial;
- --tw-ring-shadow: 0 0 #0000;
- --tw-inset-ring-color: initial;
- --tw-inset-ring-shadow: 0 0 #0000;
- --tw-ring-inset: initial;
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-offset-shadow: 0 0 #0000;
- --tw-outline-style: solid;
- --tw-blur: initial;
- --tw-brightness: initial;
- --tw-contrast: initial;
- --tw-grayscale: initial;
- --tw-hue-rotate: initial;
- --tw-invert: initial;
- --tw-opacity: initial;
- --tw-saturate: initial;
- --tw-sepia: initial;
- --tw-drop-shadow: initial;
- --tw-drop-shadow-color: initial;
- --tw-drop-shadow-alpha: 100%;
- --tw-drop-shadow-size: initial;
- --tw-backdrop-blur: initial;
- --tw-backdrop-brightness: initial;
- --tw-backdrop-contrast: initial;
- --tw-backdrop-grayscale: initial;
- --tw-backdrop-hue-rotate: initial;
- --tw-backdrop-invert: initial;
- --tw-backdrop-opacity: initial;
- --tw-backdrop-saturate: initial;
- --tw-backdrop-sepia: initial;
- --tw-duration: initial;
- --tw-ease: initial;
- --tw-scale-x: 1;
- --tw-scale-y: 1;
- --tw-scale-z: 1;
- --tw-gradient-position: initial;
- --tw-gradient-from: #0000;
- --tw-gradient-via: #0000;
- --tw-gradient-to: #0000;
- --tw-gradient-stops: initial;
- --tw-gradient-via-stops: initial;
- --tw-gradient-from-position: 0%;
- --tw-gradient-via-position: 50%;
- --tw-gradient-to-position: 100%;
- }
+
+@media (min-width: 1280px) {
+ .xl\:tw-px-10 {
+ padding-left: 2.5rem;
+ padding-right: 2.5rem;
}
+
+ .xl\:tw-px-12 {
+ padding-left: 3rem;
+ padding-right: 3rem;
+ }
+}
+
+.\[\&_svg\]\:tw-size-4 svg {
+ width: 1rem;
+ height: 1rem;
+}
+
+.\[\&_svg\]\:tw-shrink-0 svg {
+ flex-shrink: 0;
}
diff --git a/overrides/partials/footer.html b/overrides/partials/footer.html
index 7a9db5f6..04982aa1 100644
--- a/overrides/partials/footer.html
+++ b/overrides/partials/footer.html
@@ -21,10 +21,10 @@
IN THE SOFTWARE.
-->
-