diff --git a/.github/workflows/deploy-docs-staging.yaml b/.github/workflows/deploy-docs-staging.yaml new file mode 100644 index 00000000..0142e235 --- /dev/null +++ b/.github/workflows/deploy-docs-staging.yaml @@ -0,0 +1,54 @@ +name: Deploy MkDocs Site to S3 + +on: + push: + branches: + - dev # Change this to your deployment branch + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout source code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install Python dependencies + run: | + pip install -r requirements.txt + + - name: Install AWS CLI + run: | + if ! command -v aws &> /dev/null; then + echo "AWS CLI not found. Installing..." + curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" + unzip awscliv2.zip + sudo ./aws/install + else + echo "AWS CLI already installed." + fi + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v2 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-east-2 # or your preferred region + + - name: Build MkDocs site + run: | + rm -rf site + mkdocs build + + - name: Deploy to S3 + run: | + aws s3 sync ./site s3://openobserve-website-staging/docs --exclude=".git/*" + + - name: Invalidate CloudFront cache + run: | + aws cloudfront create-invalidation --distribution-id E2GZJM0TJIDFRM --paths "/docs/*" \ No newline at end of file diff --git a/docs/.pages b/docs/.pages index 1ae56698..de9b90c0 100644 --- a/docs/.pages +++ b/docs/.pages @@ -16,7 +16,7 @@ nav: - API Reference: api - Ingestion: ingestion - Integrations: integration -- Migration: migration +- Migration: migration.md - Monitoring OpenObserve: expose-metrics.md - Telemetry: telemetry.md - zPlane: zplane.md diff --git a/docs/assets/Support.svg b/docs/assets/Support.svg new file mode 100644 index 00000000..aefcc434 --- /dev/null +++ b/docs/assets/Support.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/assets/close.svg b/docs/assets/close.svg new file mode 100644 index 00000000..d903e5ce --- /dev/null +++ b/docs/assets/close.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/assets/community-support/community.svg b/docs/assets/community-support/community.svg new file mode 100644 index 00000000..d02ac502 --- /dev/null +++ b/docs/assets/community-support/community.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/assets/community-support/contact-dark.svg b/docs/assets/community-support/contact-dark.svg new file mode 100644 index 00000000..ca191a03 --- /dev/null +++ b/docs/assets/community-support/contact-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/community-support/contact-white.svg b/docs/assets/community-support/contact-white.svg new file mode 100644 index 00000000..bb747ffa --- /dev/null +++ b/docs/assets/community-support/contact-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/community-support/github-icon-2.svg b/docs/assets/community-support/github-icon-2.svg new file mode 100644 index 00000000..2a528821 --- /dev/null +++ b/docs/assets/community-support/github-icon-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/community-support/resources.svg b/docs/assets/community-support/resources.svg new file mode 100644 index 00000000..aa8b71be --- /dev/null +++ b/docs/assets/community-support/resources.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/assets/docker-4.svg b/docs/assets/docker-4.svg new file mode 100644 index 00000000..2e59ee72 --- /dev/null +++ b/docs/assets/docker-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/docs-dark.svg b/docs/assets/docs-dark.svg new file mode 100644 index 00000000..133d03f8 --- /dev/null +++ b/docs/assets/docs-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/docs-light.svg b/docs/assets/docs-light.svg new file mode 100644 index 00000000..e4eee46f --- /dev/null +++ b/docs/assets/docs-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/download.svg b/docs/assets/download.svg new file mode 100644 index 00000000..be006c2e --- /dev/null +++ b/docs/assets/download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/assets/github-dark.svg b/docs/assets/github-dark.svg new file mode 100644 index 00000000..bfab3a80 --- /dev/null +++ b/docs/assets/github-dark.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/assets/github_White.svg b/docs/assets/github_White.svg new file mode 100644 index 00000000..505346aa --- /dev/null +++ b/docs/assets/github_White.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/grafana.svg b/docs/assets/grafana.svg new file mode 100644 index 00000000..7dd09038 --- /dev/null +++ b/docs/assets/grafana.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/linkdin-icon.svg b/docs/assets/linkdin-icon.svg new file mode 100644 index 00000000..9914eb87 --- /dev/null +++ b/docs/assets/linkdin-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/assets/logo_horizontal.svg b/docs/assets/logo_horizontal.svg new file mode 100644 index 00000000..83d63dbd --- /dev/null +++ b/docs/assets/logo_horizontal.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/moon.svg b/docs/assets/moon.svg new file mode 100644 index 00000000..6bd2db16 --- /dev/null +++ b/docs/assets/moon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/assets/navmenu.svg b/docs/assets/navmenu.svg new file mode 100644 index 00000000..076f1d20 --- /dev/null +++ b/docs/assets/navmenu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/assets/o2-logo-readme.svg b/docs/assets/o2-logo-readme.svg new file mode 100644 index 00000000..e0a71dfb --- /dev/null +++ b/docs/assets/o2-logo-readme.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/popular-integration/aws-dark.svg b/docs/assets/popular-integration/aws-dark.svg new file mode 100644 index 00000000..3f47b716 --- /dev/null +++ b/docs/assets/popular-integration/aws-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/assets/popular-integration/aws.svg b/docs/assets/popular-integration/aws.svg new file mode 100644 index 00000000..c30fa007 --- /dev/null +++ b/docs/assets/popular-integration/aws.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/assets/popular-integration/db-dark.svg b/docs/assets/popular-integration/db-dark.svg new file mode 100644 index 00000000..a9ac7873 --- /dev/null +++ b/docs/assets/popular-integration/db-dark.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/assets/popular-integration/db.svg b/docs/assets/popular-integration/db.svg new file mode 100644 index 00000000..1dc91b80 --- /dev/null +++ b/docs/assets/popular-integration/db.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/assets/popular-integration/devops-2 1.svg b/docs/assets/popular-integration/devops-2 1.svg new file mode 100644 index 00000000..b61bd38b --- /dev/null +++ b/docs/assets/popular-integration/devops-2 1.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/popular-integration/kubernets.svg b/docs/assets/popular-integration/kubernets.svg new file mode 100644 index 00000000..97cd6bc4 --- /dev/null +++ b/docs/assets/popular-integration/kubernets.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/popular-integration/linux.svg b/docs/assets/popular-integration/linux.svg new file mode 100644 index 00000000..9a543dc9 --- /dev/null +++ b/docs/assets/popular-integration/linux.svg @@ -0,0 +1,1726 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/assets/popular-integration/nginx.svg b/docs/assets/popular-integration/nginx.svg new file mode 100644 index 00000000..49ac842a --- /dev/null +++ b/docs/assets/popular-integration/nginx.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/assets/popular-integration/windows.svg b/docs/assets/popular-integration/windows.svg new file mode 100644 index 00000000..41f42183 --- /dev/null +++ b/docs/assets/popular-integration/windows.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/assets/prometheus.svg b/docs/assets/prometheus.svg new file mode 100644 index 00000000..4c444886 --- /dev/null +++ b/docs/assets/prometheus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/slack-icon.svg b/docs/assets/slack-icon.svg new file mode 100644 index 00000000..0ce81ac1 --- /dev/null +++ b/docs/assets/slack-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/assets/soc.webp b/docs/assets/soc.webp new file mode 100644 index 00000000..bad274e9 Binary files /dev/null and b/docs/assets/soc.webp differ diff --git a/docs/assets/submenu-icon.svg b/docs/assets/submenu-icon.svg new file mode 100644 index 00000000..64e46f2a --- /dev/null +++ b/docs/assets/submenu-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/sun.svg b/docs/assets/sun.svg new file mode 100644 index 00000000..4d5a9d74 --- /dev/null +++ b/docs/assets/sun.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/assets/twitter-icon.svg b/docs/assets/twitter-icon.svg new file mode 100644 index 00000000..5487ae47 --- /dev/null +++ b/docs/assets/twitter-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/assets/user-guides/Log Search.svg b/docs/assets/user-guides/Log Search.svg new file mode 100644 index 00000000..0020f0b4 --- /dev/null +++ b/docs/assets/user-guides/Log Search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/assets/user-guides/action.svg b/docs/assets/user-guides/action.svg new file mode 100644 index 00000000..eb53db40 --- /dev/null +++ b/docs/assets/user-guides/action.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/assets/user-guides/alerts.svg b/docs/assets/user-guides/alerts.svg new file mode 100644 index 00000000..f879809f --- /dev/null +++ b/docs/assets/user-guides/alerts.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/user-guides/dashboard.svg b/docs/assets/user-guides/dashboard.svg new file mode 100644 index 00000000..b9058bbd --- /dev/null +++ b/docs/assets/user-guides/dashboard.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/assets/user-guides/env-variable.svg b/docs/assets/user-guides/env-variable.svg new file mode 100644 index 00000000..b676b036 --- /dev/null +++ b/docs/assets/user-guides/env-variable.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/user-guides/iam.svg b/docs/assets/user-guides/iam.svg new file mode 100644 index 00000000..800ba8ab --- /dev/null +++ b/docs/assets/user-guides/iam.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/user-guides/ingestion.svg b/docs/assets/user-guides/ingestion.svg new file mode 100644 index 00000000..d35995f8 --- /dev/null +++ b/docs/assets/user-guides/ingestion.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/user-guides/pipeline.svg b/docs/assets/user-guides/pipeline.svg new file mode 100644 index 00000000..adae6ace --- /dev/null +++ b/docs/assets/user-guides/pipeline.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/assets/user-guides/rum.svg b/docs/assets/user-guides/rum.svg new file mode 100644 index 00000000..596993ab --- /dev/null +++ b/docs/assets/user-guides/rum.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/user-guides/status-up.svg b/docs/assets/user-guides/status-up.svg new file mode 100644 index 00000000..4ec1ea95 --- /dev/null +++ b/docs/assets/user-guides/status-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/assets/user-guides/storage-management.svg b/docs/assets/user-guides/storage-management.svg new file mode 100644 index 00000000..544befd8 --- /dev/null +++ b/docs/assets/user-guides/storage-management.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/assets/user-guides/stream.svg b/docs/assets/user-guides/stream.svg new file mode 100644 index 00000000..4e71551c --- /dev/null +++ b/docs/assets/user-guides/stream.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/assets/view.svg b/docs/assets/view.svg new file mode 100644 index 00000000..b104f4de --- /dev/null +++ b/docs/assets/view.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/assets/youtube-icon.svg b/docs/assets/youtube-icon.svg new file mode 100644 index 00000000..c7a145ae --- /dev/null +++ b/docs/assets/youtube-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/index.md b/docs/index.md index 67269954..a8b25fab 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,8 +1,7 @@ --- -description: >- - OpenObserve Technical Documentation--cloud-native observability for logs, - metrics, and traces +template: /partials/index.html --- + # OpenObserve: Introduction ## What is OpenObserve? diff --git a/docs/js/search-close-minimal.js b/docs/js/search-close-minimal.js new file mode 100644 index 00000000..d5e44bd1 --- /dev/null +++ b/docs/js/search-close-minimal.js @@ -0,0 +1,72 @@ +/** + * Minimal Search Close Functionality + * Adds click handler to the close icon in the search input + */ + +document.addEventListener("DOMContentLoaded", function () { + // Add click handler to search input when close icon area is clicked + document.addEventListener("click", function (e) { + const searchInput = document.querySelector(".md-search__input"); + if (!searchInput) return; + + // Check if click is in the close icon area (right side of input) + const inputRect = searchInput.getBoundingClientRect(); + const clickX = e.clientX; + const closeIconArea = inputRect.right - 50; // 50px from the right edge + + if ( + clickX >= closeIconArea && + clickX <= inputRect.right && + e.clientY >= inputRect.top && + e.clientY <= inputRect.bottom && + (searchInput.value !== "" || searchInput === document.activeElement) + ) { + // Clear the search + searchInput.value = ""; + searchInput.blur(); + + // Close search overlay + const searchContainer = document.querySelector(".md-search"); + if (searchContainer) { + searchContainer.classList.remove("md-search--active"); + } + + // Close mobile search + const searchToggle = document.querySelector("#__search"); + if (searchToggle && searchToggle.checked) { + searchToggle.checked = false; + } + + // Trigger input event to clear results + searchInput.dispatchEvent(new Event("input", { bubbles: true })); + + e.preventDefault(); + e.stopPropagation(); + } + }); + + // Add escape key handler + document.addEventListener("keydown", function (e) { + if (e.key === "Escape") { + const searchInput = document.querySelector(".md-search__input"); + const searchContainer = document.querySelector(".md-search"); + + if ( + searchInput && + searchContainer && + searchContainer.classList.contains("md-search--active") + ) { + searchInput.value = ""; + searchInput.blur(); + searchContainer.classList.remove("md-search--active"); + + const searchToggle = document.querySelector("#__search"); + if (searchToggle && searchToggle.checked) { + searchToggle.checked = false; + } + + searchInput.dispatchEvent(new Event("input", { bubbles: true })); + } + } + }); +}); diff --git a/docs/js/search-tracking.js b/docs/js/search-tracking.js new file mode 100644 index 00000000..b2f556bb --- /dev/null +++ b/docs/js/search-tracking.js @@ -0,0 +1,508 @@ +/** + * MkDocs Search Tracking Analytics + * Simple implementation matching Vue.js reference exactly + */ + +(function () { + "use strict"; + + // Configuration - matching Vue.js reference + const ANALYTICS_CONFIG = { + API_ENDPOINT: + "https://introspection.dev.zinclabs.dev/api/328BSXphtxxMrgN41UUYA7Ll9ie/website_search/_json", + USERNAME: "vaidehi@openobserve.ai", + PASSWORD: "vaidehikiaratechx", + ENABLED: true, + }; + + // Tracking state - matching Vue.js reference variables + let originatingPage = ""; // page path where search started + let navigationUrl = ""; // full URL + let pageType = "unknown"; // docs/blog/marketing + let lastSearchQuery = ""; + let totalResults = 0; + + /** + * Check if analytics is disabled via cookie + */ + function isAnalyticsDisabled() { + try { + return ( + document.cookie + .split("; ") + .find((row) => row.startsWith("internal_user=")) + ?.split("=")[1] === "1" + ); + } catch { + return false; + } + } + + /** + * Infer page type from pathname - matching Vue.js reference + */ + function inferPageType(pathname) { + try { + if (/\/docs(\/|$)|\/documentation(\/|$)/i.test(pathname)) return "docs"; + if (/\/guides?(\/|$)/i.test(pathname)) return "docs"; + if (/\/blog(\/|$)/i.test(pathname)) return "blog"; + if (/\/articles(\/|$)/i.test(pathname)) return "articles"; + return "marketing"; + } catch { + return "unknown"; + } + } + + /** + * Initialize tracking context when page loads - enhanced to match Vue.js reference + */ + function initializeContext() { + try { + const urlObj = new URL(window.location.href); + originatingPage = urlObj.pathname; // page path + navigationUrl = urlObj.href; // full URL + pageType = inferPageType(urlObj.pathname); // infer docs/blog/marketing + } catch (e) { + console.warn("Failed to initialize search tracking context:", e); + originatingPage = ""; + navigationUrl = ""; + pageType = "unknown"; + } + } + + /** + * Send analytics event - enhanced to match Vue.js reference exactly + */ + async function sendAnalyticsEvent(eventType, payload) { + // Check if analytics is disabled for internal users + if (isAnalyticsDisabled()) { + console.log( + "Analytics disabled for internal user, skipping:", + eventType, + payload + ); + return; + } + + if (!ANALYTICS_CONFIG.ENABLED || !ANALYTICS_CONFIG.API_ENDPOINT) { + console.log("Search Analytics (Demo Mode):", eventType, payload); + return; + } + + try { + const now = new Date(); + await fetch(ANALYTICS_CONFIG.API_ENDPOINT, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: + "Basic " + + btoa(`${ANALYTICS_CONFIG.USERNAME}:${ANALYTICS_CONFIG.PASSWORD}`), + }, + body: JSON.stringify({ + url: navigationUrl, // full URL + path: originatingPage, // where search started + domain: window.location.hostname, + type: eventType, // search / result_click + // pageType, // docs / blog / marketing (uncomment if needed) + ...payload, + }), + }); + + console.log("Search analytics event sent:", eventType, payload); + } catch (error) { + console.warn("Analytics API error:", error); + } + } + + /** + * Track search query - enhanced to match Vue.js reference exactly + */ + function trackSearchQuery(query, resultCount = 0) { + if (!query || query.trim() === "") return; + + const _q = query.trim(); + lastSearchQuery = _q; + totalResults = resultCount; + + // Send search event exactly like Vue.js reference + sendAnalyticsEvent("search", { + search_query: _q, + result_count: resultCount, + }); + + // Also send analytics for zero results (like Vue.js reference) + if (resultCount === 0) { + sendAnalyticsEvent("search", { + search_query: _q, + result_count: resultCount, + }); + } + } + + /** + * Track result click - enhanced to match Vue.js reference exactly + */ + function trackResultClick(resultUrl, resultTitle, resultRank) { + const _q = lastSearchQuery.trim(); + + console.log("trackResultClick called:", { + resultUrl, + resultTitle, + resultRank, + lastSearchQuery: _q, + totalResults, + }); + + // Send result_click event exactly like Vue.js reference + sendAnalyticsEvent("result_click", { + result_url: resultUrl, + result_rank: resultRank, + result_title: resultTitle, + search_query: _q, + result_count: totalResults, + }); + } + + /** + * Track page feedback (thumbs up/down) - new functionality + */ + function trackPageFeedback(feedbackValue, pageUrl, pageTitle) { + console.log("trackPageFeedback called:", { + feedbackValue, + pageUrl, + pageTitle, + }); + + // Send feedback event to same analytics endpoint + sendAnalyticsEvent("reaction", { + feedback_value: feedbackValue === 1 ? "like" : "dislike", // 1 for thumbs up, 0 for thumbs down + // feedback_type: "reaction", + page_url: pageUrl, + }); + } + + /** + * Get result count from search results + */ + function getSearchResultCount() { + const results = document.querySelectorAll(".md-search-result__item"); + return results.length; + } + + /** + * Extract result information from clicked element + */ + function extractResultInfo(clickedElement) { + // Find the search result item - try multiple selectors + let resultItem = + clickedElement.closest(".md-search-result__item") || + clickedElement.closest(".md-search-result") || + clickedElement.closest("[data-md-component='search-result']"); + + if (!resultItem) { + console.warn("Could not find result item for:", clickedElement); + return null; + } + + // Get result URL - try multiple ways + let linkElement = + resultItem.querySelector("a") || + clickedElement.querySelector("a") || + clickedElement; + if (clickedElement.tagName === "A") { + linkElement = clickedElement; + } + + const resultUrl = linkElement && linkElement.href ? linkElement.href : ""; + + // Get result title - try multiple selectors + let titleElement = + resultItem.querySelector(".md-search-result__title") || + resultItem.querySelector("[data-md-component='search-result-title']") || + resultItem.querySelector("h1, h2, h3, h4, h5, h6") || + linkElement; + + const resultTitle = titleElement + ? titleElement.textContent.trim() + : "Unknown"; + + // Calculate result rank - try multiple selectors for all results + const allResults = document.querySelectorAll( + ".md-search-result__item, .md-search-result, [data-md-component='search-result']" + ); + const resultRank = Array.from(allResults).indexOf(resultItem) + 1; + + console.log("Extracted result info:", { + url: resultUrl, + title: resultTitle, + rank: resultRank, + resultItem: resultItem, + linkElement: linkElement, + titleElement: titleElement, + }); + + return { + url: resultUrl, + title: resultTitle, + rank: resultRank, + }; + } + + /** + * Initialize search tracking - enhanced to match Vue.js reference behavior + */ + function initializeSearchTracking() { + let searchTimeout; + let lastTrackedQuery = ""; + + console.log("Initializing MkDocs search tracking..."); + + // Update context when search becomes active (like Vue.js modal opening) + const updateContextOnSearchActivation = () => { + try { + const urlObj = new URL(window.location.href); + originatingPage = urlObj.pathname; // page path where search started + navigationUrl = urlObj.href; // full URL + pageType = inferPageType(urlObj.pathname); // infer docs/blog/marketing + } catch { + originatingPage = ""; + navigationUrl = ""; + pageType = "unknown"; + } + }; + + // Track search input changes with enhanced debouncing + document.addEventListener("input", function (e) { + const searchInput = e.target; + + // Check if this is the MkDocs search input + if (!searchInput.matches(".md-search__input")) return; + + // Update context when user starts searching + updateContextOnSearchActivation(); + + const query = searchInput.value.trim(); + + // Clear existing timeout + if (searchTimeout) { + clearTimeout(searchTimeout); + } + + // Debounce search tracking (500ms like Vue.js reference) + if (query && query !== lastTrackedQuery) { + searchTimeout = setTimeout(() => { + const resultCount = getSearchResultCount(); + trackSearchQuery(query, resultCount); + lastTrackedQuery = query; + }, 500); // Matching Vue.js 500ms debounce + } + + // Clear tracking when input is cleared + if (!query && lastTrackedQuery) { + lastTrackedQuery = ""; + lastSearchQuery = ""; + totalResults = 0; + } + }); + + // Track search result clicks with enhanced logic + document.addEventListener("click", function (e) { + console.log("Click detected on:", e.target); + + // Multiple ways to detect search result clicks + const isSearchResult = + e.target.closest(".md-search-result__item") || + e.target.closest(".md-search-result") || + e.target.closest("[data-md-component='search-result']"); + + // Also check if clicked element has search-related classes + const isSearchLink = + e.target.matches("a") && + (e.target.closest(".md-search-result__item") || + e.target.closest(".md-search-result") || + (e.target.href && document.querySelector(".md-search--active"))); + + if (!isSearchResult && !isSearchLink) { + console.log("Not a search result click, ignoring"); + return; + } + + console.log("Search result clicked!", { + isSearchResult: !!isSearchResult, + isSearchLink: !!isSearchLink, + targetElement: e.target, + closestResult: e.target.closest(".md-search-result__item"), + }); + + // Check if search is active (more lenient check) + const searchContainer = document.querySelector(".md-search"); + const searchInput = document.querySelector(".md-search__input"); + const hasSearchValue = searchInput && searchInput.value.trim().length > 0; + + if ( + !searchContainer || + (!searchContainer.classList.contains("md-search--active") && + !hasSearchValue) + ) { + console.log("Search not active and no search value, ignoring click"); + return; + } + + // Update context right before tracking click (ensure fresh data) + updateContextOnSearchActivation(); + + const resultInfo = extractResultInfo(e.target); + console.log("Result info extracted:", resultInfo); + + if (resultInfo && resultInfo.url) { + console.log("Calling trackResultClick with:", resultInfo); + trackResultClick(resultInfo.url, resultInfo.title, resultInfo.rank); + } else { + console.warn("Could not extract result info from clicked element"); + } + }); + + console.log("MkDocs search tracking initialized"); + } + + /** + * Initialize feedback tracking - new functionality for page feedback + */ + function initializeFeedbackTracking() { + console.log("Initializing MkDocs feedback tracking..."); + + // Track feedback button clicks + document.addEventListener("click", function (e) { + // Check if clicked element is a feedback button + const feedbackButton = e.target.closest(".md-feedback__icon"); + + if (!feedbackButton) { + return; + } + + console.log("Feedback button clicked:", feedbackButton); + + // Get feedback value from data-md-value attribute + const feedbackValue = feedbackButton.getAttribute("data-md-value"); + + if (feedbackValue === null) { + console.warn("No feedback value found on button"); + return; + } + + // Get current page information + const pageUrl = window.location.href; + const pageTitle = document.title || "Unknown Page"; + + // Convert feedback value to number + const feedbackValueNum = parseInt(feedbackValue, 10); + + console.log("Tracking feedback:", { + value: feedbackValueNum, + url: pageUrl, + title: pageTitle, + }); + + // Track the feedback + trackPageFeedback(feedbackValueNum, pageUrl, pageTitle); + }); + + console.log("MkDocs feedback tracking initialized"); + } + + /** + * Initialize when DOM is ready + */ + function init() { + initializeContext(); + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", function () { + initializeSearchTracking(); + initializeFeedbackTracking(); + }); + } else { + initializeSearchTracking(); + initializeFeedbackTracking(); + } + } + + // Start initialization + init(); + + // Expose for manual testing - enhanced interface + window.SearchTracking = { + updateConfig: function (newConfig) { + Object.assign(ANALYTICS_CONFIG, newConfig); + }, + getConfig: function () { + return { ...ANALYTICS_CONFIG }; + }, + getState: function () { + return { + originatingPage, + navigationUrl, + pageType, + lastSearchQuery, + totalResults, + }; + }, + sendEvent: sendAnalyticsEvent, + trackSearch: trackSearchQuery, + trackClick: trackResultClick, + trackFeedback: trackPageFeedback, + updateContext: function () { + initializeContext(); + }, + // Debug helpers + testClickDetection: function () { + const searchResults = document.querySelectorAll( + ".md-search-result__item, .md-search-result, [data-md-component='search-result']" + ); + console.log("Found search results:", searchResults); + return searchResults; + }, + testFeedbackDetection: function () { + const feedbackButtons = document.querySelectorAll(".md-feedback__icon"); + console.log("Found feedback buttons:", feedbackButtons); + return feedbackButtons; + }, + getCurrentSearchState: function () { + const searchContainer = document.querySelector(".md-search"); + const searchInput = document.querySelector(".md-search__input"); + const isActive = searchContainer?.classList.contains("md-search--active"); + const hasValue = searchInput?.value.trim().length > 0; + + return { + searchContainer: !!searchContainer, + isActive, + hasValue, + searchValue: searchInput?.value || "", + lastSearchQuery, + totalResults, + }; + }, + simulateResultClick: function (index = 0) { + const results = document.querySelectorAll( + ".md-search-result__item, .md-search-result" + ); + if (results[index]) { + const link = results[index].querySelector("a"); + if (link) { + console.log("Simulating click on:", link); + link.click(); + } + } + }, + simulateFeedbackClick: function (value = 1) { + const feedbackButton = document.querySelector( + `.md-feedback__icon[data-md-value="${value}"]` + ); + if (feedbackButton) { + console.log("Simulating feedback click:", feedbackButton); + feedbackButton.click(); + } + }, + }; +})(); diff --git a/docs/js/zinc.js b/docs/js/zinc.js index 544b76a5..fc140536 100644 --- a/docs/js/zinc.js +++ b/docs/js/zinc.js @@ -149,3 +149,71 @@ // Initial track when the script loads handleTracking(); })(); + +// Simple theme persistence - leverages MkDocs Material's built-in theme system +(function() { + // Apply saved theme immediately to prevent flash + function applySavedTheme() { + const savedScheme = localStorage.getItem('theme-preference'); + if (savedScheme) { + document.documentElement.setAttribute('data-md-color-scheme', savedScheme); + // Set the correct radio button as checked + var paletteForm = document.querySelector('form[data-md-component="palette"]'); + if (paletteForm) { + var inputs = paletteForm.querySelectorAll('input[name="__palette"]'); + inputs.forEach(function(input) { + if (input.getAttribute('data-md-color-scheme') === savedScheme) { + input.checked = true; + } else { + input.checked = false; + } + }); + } + } + } + + // Save theme preference when changed + function observeThemeChanges() { + // Attach change event to theme radio buttons + var paletteForm = document.querySelector('form[data-md-component="palette"]'); + if (paletteForm) { + var inputs = paletteForm.querySelectorAll('input[name="__palette"]'); + inputs.forEach(function(input) { + input.addEventListener('change', function() { + if (this.checked) { + var scheme = this.getAttribute('data-md-color-scheme'); + document.documentElement.setAttribute('data-md-color-scheme', scheme); + localStorage.setItem('theme-preference', scheme); + } + }); + }); + } + // Also keep the MutationObserver for manual changes + const observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.attributeName === 'data-md-color-scheme') { + const scheme = document.documentElement.getAttribute('data-md-color-scheme'); + if (scheme) { + localStorage.setItem('theme-preference', scheme); + } + } + }); + }); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-md-color-scheme'] + }); + } + + // Setup theme persistence (apply + observe) + function setupThemePersistence() { + applySavedTheme(); + observeThemeChanges(); + } + + // Initial setup + setupThemePersistence(); + + // Re-apply on every DOMContentLoaded (instant navigation) + document.addEventListener('DOMContentLoaded', setupThemePersistence); +})(); diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 151d92a9..2ce80a1b 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -1,7 +1,7 @@ [data-md-color-scheme="openobserve"] { --md-primary-fg-color: #ffffff; - --md-primary-fg-color--light: #ECB7B7; - --md-primary-fg-color--dark: #90030C; + --md-primary-fg-color--light: #ecb7b7; + --md-primary-fg-color--dark: #90030c; } @media only screen and (min-width: 76.25em) { @@ -27,4 +27,580 @@ html { font-size: 125%; -} \ No newline at end of file +} +/* --- Sidebar overlap fix -------------------------------------------------- + Issue: Bottom of left navigation sidebar links were being hidden by a white + overlay/section when scrolling the page body. In Material for MkDocs this + is commonly caused by the main content (or footer) layering above the + sidebar, or by the sidebar losing its own scroll context causing the fade + pseudo-element to cover final items. + + Fix: + 1. Reassert a dedicated scroll container + full height for primary sidebar. + 2. Remove bottom/top gradient (pseudo elements) that can mask final items. + 3. Raise z-index so main content/footer can't visually overlap it. + 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 { + padding-bottom: 0.5rem; + } + .md-footer { + z-index: 0; + } + /* Give room so last items can scroll fully into view */ + .md-sidebar--primary .md-sidebar__scrollwrap { + flex: 1; + overflow-y: auto; + padding: 0.25rem 0 2.25rem; /* trim top, moderate bottom */ + overscroll-behavior: contain; + } + /* Remove bottom fade/overlay that appeared as white block */ + .md-sidebar--primary .md-sidebar__scrollwrap:after { + display: none !important; + } + /* Also disable any other potential masking pseudo-elements */ + .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; + } + /* Tighter default nav spacing */ + .md-sidebar--primary .md-nav { + margin-top: 0; + } + .md-sidebar--primary .md-nav__list { + padding-bottom: 0; + } + /* Ensure main/content layers don't cover sidebar */ + .md-main, + .md-main__inner, + .md-content, + .md-content__inner { + position: relative; + z-index: 0; + } +} + +[data-md-color-scheme="slate"] .md-search__input { + background-color: #7c3aed !important; + border: 2px solid #7c3aed !important; + border-radius: 999px !important; + color: #fff !important; +} + +[data-md_color_scheme="slate"] .md-search__icon { + color: #fff !important; +} + +/* Search dropdown styling for dark theme */ +[data-md_color_scheme="slate"] .md-search__suggest { + background: #222 !important; + color: #fff !important; + border: 1px solid rgba(255, 255, 255, 0.18) !important; +} + +/* Cursor pointer only on search elements */ +.md-header__button[for="__search"], +.md-search__input, +.md-search__icon { + cursor: pointer !important; +} + +.md-header, +.md-header__inner, +.md-header__title, +.md-header__ellipsis { + cursor: default !important; +} + +/* Theme-specific full screen backgrounds */ +[data-md-color-scheme="default"] body { + background-color: rgb(255, 255, 255) !important; +} + +[data-md-color-scheme="slate"] body { + background-color: rgb(18, 18, 18) !important; +} + +[data-md-color-scheme="openobserve"] body { + 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; +} + +.md-search__icon { + color: #000 !important; /* black icon for light theme */ + /* transition: color 0.2s; */ + padding-top: 10px; +} + +/* Dark theme overrides */ + +[data-md-color-scheme="slate"] .md-search__input { + background-color: rgb(29, 22, 40) !important; + color: #fff !important; + border-radius: 8px !important; + box-shadow: none !important; + padding: 0.75em 2.5em 0.75em 3.2em !important; + font-size: 1.5em !important; + min-width: 16em !important; +} +.md-search__output { + border: 2px solid #7c3aed !important; + border-radius: 8px !important; + margin-top: 1em !important; +} + +[data-md_color-scheme="slate"] .md-search__icon { + color: #fff !important; /* white icon for dark theme */ +} + +/* --- Improved Search Bar Styles: Always Override --- */ +.md-search__form { + background: transparent !important; + border: none !important; + box-shadow: none !important; + border-radius: 8px !important; + padding: 0 !important; +} + +/* Direct approach: Add close button to search input */ +.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.2em 3.2em 0.2em 3.2em !important; /* Remove extra right padding for desktop */ + font-size: 1.5em !important; + min-width: 20em !important; + height: 3em !important; + /* Remove background image for desktop - will be added for mobile only */ +} +.md-search__input::placeholder { + color: #7c3aed !important; + opacity: 1 !important; + font-size: 1.25em !important; + font-weight: 500 !important; + letter-spacing: 0.02em; +} + +.md-search__icon { + color: #000 !important; + /* transition: color 0.2s; */ + position: absolute !important; + right: 1.5em !important; + top: 50% !important; + transform: translateY(-50%) !important; + font-size: 1.25em !important; + pointer-events: auto; + display: flex; + align-items: center; + cursor: pointer; +} + +[data-md-color-scheme="slate"] .md-search__form { + background: transparent !important; + border: none !important; + box-shadow: none !important; + border-radius: 999px !important; + padding: 0 !important; +} + +[data-md_color-scheme="slate"] .md-search__input { + background-color: #7c3aed !important; + color: #fff !important; + border-radius: 999px !important; + box-shadow: none !important; + padding: 0.85em 3.2em 0.85em 3.2em !important; /* Remove extra right padding for desktop */ + font-size: 1.5em !important; + min-width: 20em !important; + height: 3em !important; + /* 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 { + color: #fff !important; + position: absolute !important; + right: 1.2em !important; + top: 50% !important; + transform: translateY(-50%) !important; + font-size: 1.5em !important; + pointer-events: none; +} + +/* --- FINAL: Sidebar Custom Design --- */ +.md-sidebar--primary { + background: rgb(245, 243, 254) !important; + 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; + /* allow the active indicator to sit inside the rounded border */ + overflow: visible !important; +} + +@media (min-width: 1024px) { + .md-sidebar--primary { + margin-left: 12px; + } +} +[data-md-color-scheme="slate"] .md-sidebar--primary { + background: rgb(23, 20, 29) !important; + 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; + overflow: hidden !important; +} + +.md-sidebar__title, +.md-sidebar__title:before, +.md-sidebar__title:after { + box-shadow: none !important; + background: transparent !important; +} + +/* Highlight selected nav item with purple bar on left */ +.md-sidebar--primary .md-nav__item--active > .md-nav__link { + position: relative !important; + background: transparent !important; + border-radius: 5px !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; +} +.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) */ + left: 0; + top: 50%; + transform: translateY(-50%); + width: 4px; + height: 25px; + 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; +} + +/* --- Remove white shadow from sidebar title --- */ +.md-sidebar__title { + box-shadow: none !important; + background: transparent !important; +} + +.md-sidebar__title, +.md-sidebar__title:before, +.md-sidebar__title:after { + box-shadow: none !important; + background: transparent !important; +} + +/* --- Ensure sidebar scrollbar thumb is flush with right border --- */ +.md-sidebar--primary { + padding-right: 0 !important; + border-right: 2px solid #7c3aed !important; + box-sizing: border-box !important; +} +.md-sidebar--primary .md-sidebar__scrollwrap { + padding-right: 0 !important; + margin-right: 0 !important; + 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 { + padding-right: 0 !important; + border-right: 2px solid #7c3aed !important; + box-sizing: border-box !important; + border-radius: 8px !important; + background-clip: padding-box !important; +} +.md-sidebar--primary .md-sidebar__scrollwrap { + width: 100% !important; + padding-right: 0 !important; + margin-right: 0 !important; + border-right: none !important; + box-sizing: border-box !important; + overflow-y: scroll !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; +} + +/* Outer-sidebar active indicator: render a single highlight bar inside the + sidebar scroll container so the marker visually sits against the sidebar + inner border (outer div). */ +.md-sidebar--primary > .o-active-indicator { + /* indicator rendered as a direct child of the outer sidebar so it can + visually sit flush against the sidebar inner border */ + position: absolute; + right: 2px; /* aligns with the 2px sidebar inner border; tweak if needed */ + width: 6px; + background: #4b237a; + border-radius: 3px; + z-index: 220; /* above sidebar content but below header overlays */ + transition: top 180ms ease, height 180ms ease, opacity 160ms ease; + opacity: 0; + pointer-events: none; +} + +/* 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, +.md-sidebar--primary .md-nav__title:after { + background: transparent !important; + box-shadow: none !important; + border: none !important; +} + +.md-nav__title { + font-weight: 700 !important; + /* Ensure the nav title is not sticky — override any theme "sticky" rules */ + position: static !important; +} + +/* Default (light) theme: make nav title dark for contrast */ +.md-nav__title { + color: #111111 !important; +} + +/* Dark theme overrides: ensure title stays readable on dark backgrounds */ +[data-md-color-scheme="slate"] .md-nav__title, +[data-md-color-scheme="openobserve"] .md-nav__title { + color: #ffffff !important; +} + +/* Hide md-search__options element */ +.md-search__options { + display: none !important; +} + +/* Reset any conflicting styles */ + +/* Reset any conflicting styles */ + +/* --- Responsive Search Bar Visibility --- */ +@media (max-width: 1440px) { + .md-header .md-search__input { + min-width: 14em !important; + font-size: 1.5em !important; + } +} + +@media (max-width: 1024px) { + /* Hide search input only in the header navbar, not in search overlay */ + .md-header .md-search__input { + display: none !important; + } + .md-header .md-search__icon { + display: inline-flex !important; + margin-left: 10px; + pointer-events: auto !important; + cursor: pointer !important; + } + + /* Ensure search input is visible and functional in search overlay */ + .md-search .md-search__input { + display: block !important; + 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 */ + font-size: 1.2em !important; + border-radius: 8px !important; + pointer-events: auto !important; + -webkit-appearance: none !important; + appearance: none !important; + /* Add close button background image for mobile only */ + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%237c3aed' stroke-width='2'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E") !important; + background-repeat: no-repeat !important; + background-position: calc(100% - 1em) center !important; + background-size: 1.2em !important; + } + + /* Dark theme close button for mobile */ + [data-md-color-scheme="slate"] .md-search .md-search__input { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2'%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3C/svg%3E") !important; + } + + /* Ensure search overlay icon doesn't interfere */ + .md-search .md-search__icon { + pointer-events: none !important; + display: none !important; + } + + /* Mobile search overlay styling */ + .md-search__output { + max-height: 75vh !important; + overflow-y: auto !important; + } + + /* Ensure search form is properly styled on mobile */ + .md-search .md-search__form { + position: relative !important; + display: block !important; + width: 100% !important; + } + + /* Mobile close button positioning */ + .md-search .md-search__close { + display: flex !important; + right: 1em !important; + color: #7c3aed !important; + } + + /* Mobile close button hover */ + .md-search .md-search__close:hover { + background-color: rgba(124, 58, 237, 0.1) !important; + } + + /* Dark theme mobile close button */ + [data-md-color-scheme="slate"] .md-search .md-search__close { + color: #fff !important; + } +} + +@media (min-width: 1025px) { + .md-search__input { + display: inline-block !important; + } +} + +@media (min-width: 1441px) { + .md-search__input { + min-width: 20em !important; + font-size: 1.5em !important; + display: inline-block !important; + } +} diff --git a/docs/stylesheets/landing-page.css b/docs/stylesheets/landing-page.css new file mode 100644 index 00000000..4b5810a6 --- /dev/null +++ b/docs/stylesheets/landing-page.css @@ -0,0 +1,18 @@ +/* OpenObserve Landing Page Custom Styles */ + +/* Only keep custom colors for icons */ +.landing-tutorial-icon--blue { + background-color: #3b82f6; +} +.landing-tutorial-icon--red { + background-color: #ef4444; +} +.landing-tutorial-icon--purple { + background-color: #8b5cf6; +} +.landing-tutorial-icon--green { + background-color: #10b981; +} +.landing-tutorial-icon--orange { + background-color: #f59e42; +} diff --git a/input.css b/input.css new file mode 100644 index 00000000..76f76b60 --- /dev/null +++ b/input.css @@ -0,0 +1,207 @@ +@import "tailwindcss"; + +@layer utilities { + .hover\:text-\[\#7782FF\]:hover { + color: #7782ff; + } +} + +.hero-gradient { + @apply bg-gradient-to-r from-[#6A76E3] to-[#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% + ); +} + +.theme-purple { + --color-primary-purple: rgba(107, 118, 227); + color: var(--color-primary-purple); + --color-card: rgba(107, 118, 227, 0.2); + --color-hover-card: rgba(126, 34, 206); + --color-tabs-background: rgba(107, 118, 227); + --color-tabs-title-text: rgba(107, 118, 227); +} + +html { + margin: 0; + width: 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; + color: white; + cursor: pointer; + border-radius: 6px; + background-origin: border-box; + 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%); + box-shadow: none; +} + +.secondary-button { + position: relative; + border: none; + color: #5764d9; + cursor: pointer; + border-radius: 6px; + background-origin: border-box; + background-clip: padding-box, border-box; + transition: all 0.3s ease; + background-color: white; + 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; + /* 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 4aacf0e0..e722b27a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,4 @@ -site_name: OpenObserve Documentation +site_name: Documentation site_url: https://openobserve.ai/docs # https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin required for nav plugins: @@ -14,30 +14,36 @@ plugins: extra_css: - stylesheets/extra.css - stylesheets/feedback.css + - css/output.css + - css/landing-page.css extra_javascript: - https://unpkg.com/openapi-explorer@0/dist/browser/openapi-explorer.min.js - js/ms-clarity.js - js/zinc.js - js/vector_co.js + - js/search-close-minimal.js + - js/search-tracking.js + - https://buttons.github.io/buttons.js - js/reo.js extra: - social: - - icon: fontawesome/brands/linkedin - link: https://www.linkedin.com/company/zinclabsinc - - icon: fontawesome/brands/github - link: https://github.com/openobserve/openobserve - - icon: fontawesome/brands/docker - link: https://gallery.ecr.aws/zinclabs/openobserve - - icon: fontawesome/brands/slack - link: https://short.openobserve.ai/community + # social: + # - icon: fontawesome/brands/linkedin + # link: https://www.linkedin.com/company/zinclabsinc + # - icon: fontawesome/brands/github + # link: https://github.com/openobserve/openobserve + # - icon: fontawesome/brands/docker + # link: https://gallery.ecr.aws/zinclabs/openobserve + # - icon: fontawesome/brands/slack + # link: https://short.openobserve.ai/community alternate: # - name: English - # link: /en/ + # link: /en/ # lang: en # - name: Chinese # link: /cn/ # lang: zh generator: false + default_color_scheme: default version: provider: mike analytics: @@ -71,40 +77,37 @@ extra: # Thanks for your feedback! Help us improve this page by # using our feedback form. theme: - logo: images/logo_circle.png favicon: images/logo_circle.png name: material custom_dir: overrides features: # - navigation.expand # - navigation.tabs - - navigation.tabs.sticky + # - navigation.tabs.sticky - navigation.instant - navigation.tracking - content.code.copy - content.code.select palette: - - media: "(prefers-color-scheme: light)" - scheme: default + - scheme: default primary: white toggle: icon: material/weather-sunny name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate + - scheme: slate primary: black toggle: icon: material/weather-night name: Switch to light mode -repo_url: https://github.com/openobserve/openobserve -repo_name: openobserve/openobserve -edit_uri: https://github.com/openobserve/openobserve-docs/edit/main/docs/ +# repo_url: https://github.com/openobserve/openobserve +# repo_name: openobserve/openobserve +# edit_uri: https://github.com/openobserve/openobserve-docs/edit/main/docs/ markdown_extensions: - admonition - tables - attr_list - pymdownx.tabbed: - alternate_style: true + alternate_style: true - pymdownx.highlight: anchor_linenums: true - pymdownx.inlinehilite @@ -112,7 +115,3 @@ markdown_extensions: - pymdownx.superfences - pymdownx.details - meta - - - - diff --git a/overrides/css/landing-page.css b/overrides/css/landing-page.css new file mode 100644 index 00000000..968c8a04 --- /dev/null +++ b/overrides/css/landing-page.css @@ -0,0 +1,945 @@ +/* Consistent vertical spacing for headings and paragraphs in landing page */ +.landing-main-content h1, +.landing-main-content h3, +.landing-main-content h4, +.landing-main-content h5, +.landing-main-content h6, +.landing-main-content p { + margin-bottom: 1px; +} +/* Proper spacing for section headings */ +.landing-main-content h2 { + margin-top: 15px !important; + margin-bottom: 8px !important; +} +/* First section heading should not have top margin */ +.landing-main-content h2:first-of-type { + margin-top: 0 !important; +} + +/* OpenObserve Landing Page Custom Styles */ +body > .landing-page { + margin-top: 0 !important; + padding-top: 0 !important; +} +.landing-page:first-child { + margin-top: 0 !important; + padding-top: 0 !important; +} + +:root { + /* Color Variables */ + --primary-blue: #6366f1; + --border-color: #787878; + --text-primary: #ffffff; + --text-secondary: #474747; + + /* Button Colors */ + --color-primary-purple: #8b5cf6; + --color-hover-card: #7c3aed; + + /* Feature Colors */ + --feature-blue: #3b82f6; + --feature-red: #ef4444; + --feature-purple: #8b5cf6; + --feature-green: #10b981; + --feature-orange: #f97316; + --feature-pink: #ec4899; + --feature-navy: #1e40af; + --feature-forest: #059669; + + /* Spacing Variables */ + --spacing-xs: 4px; + --spacing-sm: 8px; + --spacing-md: 12px; + --spacing-lg: 16px; + --spacing-xl: 20px; + + /* Border Radius */ + --radius-sm: 6px; + --radius-lg: 12px; + --radius-xl: 16px; + --radius-full: 50%; + + /* Typography */ + --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + sans-serif; + --font-size-sm: 12px; + --font-size-base: 13px; + --font-size-md: 14px; + --font-size-lg: 15px; + + /* Transitions */ + --transition-base: all 0.2s ease; +} + +/* Base Styles */ +.landing-page { + font-family: var(--font-family); + line-height: 1.5; + padding-top: 0 !important; + margin-top: 0 !important; +} + +/* Heading styles */ +.landing-page h1 { + font-size: 20px !important; + font-weight: bold; + margin: 0; + line-height: 1.3; + color: var(--primary-blue) !important; +} + +.landing-page h2 { + font-size: 20px !important; + font-weight: 700; + font-family: "Inter", "Segoe UI", -apple-system, BlinkMacSystemFont, + sans-serif; + margin: 0; + line-height: 1.3; + color: var(--text-primary) !important; +} + +.landing-page h3 { + font-size: var(--font-size-md) !important; + font-weight: 600; + margin: 0 0 var(--spacing-sm) 0; + line-height: 1.3; + color: var(--text-primary) !important; +} + +/* Theme-specific heading colors */ +[data-md-color-scheme="slate"] .landing-page h1 { + color: var(--primary-blue) !important; +} + +[data-md-color-scheme="slate"] .landing-page h2, +[data-md-color-scheme="slate"] .landing-page h3 { + color: #ffffff !important; +} + +[data-md-color-scheme="default"] .landing-page h1 { + color: var(--primary-blue) !important; +} + +[data-md-color-scheme="default"] .landing-page h2, +[data-md-color-scheme="default"] .landing-page h3 { + color: #1f2937 !important; +} + +/* Hide TOC for landing page */ +.landing-page ~ .md-sidebar--secondary { + display: none !important; +} + +body:has(.landing-page) .md-sidebar--secondary { + display: none !important; +} + +.md-main .landing-page { + margin-right: 0 !important; +} + +.md-content__inner.landing-page { + margin-right: 0 !important; + max-width: none !important; +} + +.landing-container { + width: 100%; + min-height: 100vh; + padding-top: 0 !important; + margin-top: 0 !important; +} + +.landing-main-content { + width: 100%; + padding: 0 var(--spacing-xl) var(--spacing-xl) var(--spacing-xl); + margin-top: 0 !important; + padding-top: 0 !important; +} + +/* Hero Section */ +.landing-hero-card { + border: 2px solid transparent; + background-image: linear-gradient(rgb(247, 247, 247), rgb(247, 247, 247)), + linear-gradient( + 135deg, + rgba(99, 102, 241, 0.3) 0%, + rgba(139, 92, 246, 0.3) 50%, + rgba(6, 182, 212, 0.3) 100% + ); + background-origin: border-box; + background-clip: padding-box, border-box; + border-radius: var(--radius-xl); + padding: 6px 24px; + margin-bottom: 12px; + position: relative; + overflow: hidden; +} + +/* Dark theme hero card background */ +[data-md-color-scheme="slate"] .landing-hero-card { + background-image: linear-gradient(rgb(10, 8, 19), rgb(10, 8, 19)), + linear-gradient( + 135deg, + rgba(99, 102, 241, 0.3) 0%, + rgba(139, 92, 246, 0.3) 50%, + rgba(6, 182, 212, 0.3) 100% + ); +} + +/* Light theme hero card background */ +[data-md-color-scheme="default"] .landing-hero-card { + background-image: linear-gradient(rgb(247, 247, 247), rgb(247, 247, 247)), + linear-gradient( + 135deg, + rgba(99, 102, 241, 0.3) 0%, + rgba(139, 92, 246, 0.3) 50%, + rgba(6, 182, 212, 0.3) 100% + ); +} + +.landing-hero-card::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; +} + +.landing-hero-content { + position: relative; + z-index: 1; + padding: 2px 0; + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--spacing-lg); +} + +.landing-hero-description { + font-size: var(--font-size-lg); + margin-bottom: var(--spacing-md); + color: #333333 !important; + font-weight: 400; + line-height: 1.5; + opacity: 0.95; +} + +[data-md-color-scheme="slate"] .landing-hero-description { + color: #e5e7eb !important; +} + +[data-md-color-scheme="default"] .landing-hero-description { + color: #333333 !important; +} + +.landing-hero-buttons { + display: flex; + gap: var(--spacing-sm); +} + +/* Primary Button Styles */ +.primary-button { + position: relative; + border: none; + color: white !important; + cursor: pointer; + border-radius: 6px; + background-origin: border-box; + background-clip: padding-box, border-box; + transition: all 0.3s ease; + background-color: rgb(107, 118, 226); + border: 1px solid transparent; + padding: 5px 14px !important; + text-decoration: none; + font-weight: 500; + display: inline-flex; + align-items: center; + gap: var(--spacing-xs); + font-size: var(--font-size-md); + white-space: nowrap; +} + +.primary-button:hover { + background-color: var(--color-hover-card); + color: white !important; + text-decoration: none; +} + +.primary-button:visited, +.primary-button:focus { + color: white !important; + text-decoration: none; +} + +.primary-button *, +.primary-button:hover * { + color: white !important; +} + +.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%); + box-shadow: none; + color: white !important; +} + +.landing-btn-content { + display: flex; + align-items: center; + gap: 0.5em; + white-space: nowrap; +} + +.landing-play-icon { + display: flex; + align-items: center; + font-size: 1.15em; + margin-right: 0.1em; + flex-shrink: 0; +} + +/* Section Styles */ +.landing-section { + margin-bottom: 15px; +} + +.landing-section-title { + font-size: 20px !important; + font-weight: 700; + font-family: "Inter", "Segoe UI", -apple-system, BlinkMacSystemFont, + sans-serif; + margin: 0 0 8px 0 !important; + color: var(--text-primary); + text-align: center; +} + +/* Tutorial Grid */ +.landing-tutorial-rows { + display: flex; + flex-direction: column; + gap: var(--spacing-md); + align-items: center; +} + +.landing-tutorial-row { + display: flex; + justify-content: center; + text-align: center; + gap: var(--spacing-md); +} + +.landing-tutorial-row .landing-tutorial-card { + flex: 1 1 0; + min-width: 220px; + max-width: 320px; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + background: none; + box-shadow: none; + margin: 0; +} + +.landing-tutorial-card { + border-radius: var(--radius-lg); + padding: var(--spacing-md) var(--spacing-lg); + border: 1px solid var(--border-color); + transition: var(--transition-base); + position: relative; + cursor: pointer; + text-decoration: none; + color: inherit; + display: flex; + flex-direction: column; + flex: 1 1 0; + min-height: 80px; + box-sizing: border-box; +} + +.landing-tutorial-card:hover { + border-color: #6b7280; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); + text-decoration: none; + color: inherit; +} + +/* Dark theme tutorial card hover effects */ +[data-md-color-scheme="slate"] .landing-tutorial-card:hover { + border-color: #9ca3af !important; + box-shadow: 0 4px 12px rgba(255, 255, 255, 0.1) !important; + background-color: rgba(255, 255, 255, 0.02) !important; +} + +/* Light theme tutorial card hover effects */ +[data-md-color-scheme="default"] .landing-tutorial-card:hover { + border-color: #9ca3af !important; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1) !important; + background-color: rgba(0, 0, 0, 0.02) !important; +} + +.landing-tutorial-title { + font-size: var(--font-size-md); + font-weight: 600; + color: var(--text-primary); + line-height: 1.3; +} + +.landing-tutorial-description { + color: var(--text-secondary); + font-size: var(--font-size-base); + margin-bottom: var(--spacing-xs); + line-height: 1.4; + margin-top: 0; +} + +/* Dark theme description text colors */ +[data-md-color-scheme="slate"] .landing-tutorial-description { + color: #d1d5db !important; +} + +[data-md-color-scheme="slate"] .landing-feature-text p { + color: #d1d5db !important; +} + +[data-md-color-scheme="slate"] .landing-community-support-text p { + color: #d1d5db !important; +} + +/* Light theme description text colors */ +[data-md-color-scheme="default"] .landing-tutorial-description { + color: #6b7280 !important; +} + +[data-md-color-scheme="default"] .landing-feature-text p { + color: #6b7280 !important; +} + +[data-md-color-scheme="default"] .landing-community-support-text p { + color: #6b7280 !important; +} + +/* Features List */ +.landing-features-list { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-md); + margin-bottom: 0; +} + +.landing-feature-item { + border-radius: var(--radius-lg); + padding: var(--spacing-xs) var(--spacing-md); + border: 1px solid var(--border-color); + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + text-align: center; + transition: var(--transition-base); + position: relative; + cursor: pointer; + text-decoration: none; + color: inherit; + min-height: 100px; +} + +.landing-feature-item:hover { + border-color: #6b7280; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); + text-decoration: none; + color: inherit; +} + +/* Feature item hover effects with icon-specific colors */ +.landing-feature-item:has(.landing-tutorial-icon--blue):hover { + border-color: var(--feature-blue); +} + +.landing-feature-item:has(.landing-tutorial-icon--red):hover { + border-color: var(--feature-red); +} + +.landing-feature-item:has(.landing-tutorial-icon--purple):hover { + border-color: var(--feature-purple); +} + +.landing-feature-item:has(.landing-tutorial-icon--green):hover { + border-color: var(--feature-green); +} + +.landing-feature-item:has(.landing-tutorial-icon--orange):hover { + border-color: var(--feature-orange); +} + +.landing-feature-item:has(.landing-tutorial-icon--pink):hover { + border-color: var(--feature-pink); +} + +.landing-feature-item:has(.landing-tutorial-icon--navy):hover { + border-color: var(--feature-navy); +} + +.landing-feature-item:has(.landing-tutorial-icon--forest):hover { + border-color: var(--feature-forest); +} + +.landing-feature-left { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-sm); + width: 100%; +} + +.landing-feature-icon { + width: 40px; + height: 40px; + border-radius: var(--radius-full); + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + color: var(--text-primary); + position: relative; +} + +/* Icon background colors with opacity */ +.landing-feature-icon.landing-tutorial-icon--blue { + background-color: rgba(59, 130, 246, 0.15); +} + +.landing-feature-icon.landing-tutorial-icon--red { + background-color: rgba(239, 68, 68, 0.15); +} + +.landing-feature-icon.landing-tutorial-icon--purple { + background-color: rgba(139, 92, 246, 0.15); +} + +.landing-feature-icon.landing-tutorial-icon--green { + background-color: rgba(16, 185, 129, 0.15); +} + +.landing-feature-icon.landing-tutorial-icon--orange { + background-color: rgba(249, 115, 22, 0.15); +} + +.landing-feature-icon.landing-tutorial-icon--pink { + background-color: rgba(236, 72, 153, 0.15); +} + +.landing-feature-icon.landing-tutorial-icon--navy { + background-color: rgba(30, 64, 175, 0.15); +} + +.landing-feature-icon.landing-tutorial-icon--forest { + background-color: rgba(5, 150, 105, 0.15); +} + +.landing-feature-text h3 { + font-size: var(--font-size-lg) !important; + font-weight: 600; + margin: 0 0 var(--spacing-xs) 0; + text-align: center; +} + +.landing-feature-text p { + font-size: var(--font-size-sm) !important; + font-weight: 400; + margin: 0; + text-align: center; + line-height: 1.4; + color: var(--text-secondary); +} + +/* Integration Grid */ +.landing-integration-grid { + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: var(--spacing-md); + margin-bottom: 0; +} + +.landing-integration-item { + border-radius: var(--radius-lg); + padding: var(--spacing-md); + border: 1px solid var(--border-color); + display: flex; + align-items: center; + justify-content: flex-start; + gap: var(--spacing-sm); + transition: var(--transition-base); + text-decoration: none; + color: inherit; + min-height: 50px; +} + +.landing-integration-item:hover { + border-color: #6b7280; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); +} + +/* Integration item hover effects with icon-specific colors and background */ +.landing-integration-item:has(.landing-tutorial-icon--orange):hover { + border-color: var(--feature-orange); + background-color: rgba(249, 115, 22, 0.1); +} + +.landing-integration-item:has(.landing-tutorial-icon--blue):hover { + border-color: var(--feature-blue); + background-color: rgba(59, 130, 246, 0.1); +} + +.landing-integration-item:has(.landing-tutorial-icon--purple):hover { + border-color: var(--feature-purple); + background-color: rgba(139, 92, 246, 0.1); +} + +.landing-integration-item:has(.landing-tutorial-icon--green):hover { + border-color: var(--feature-green); + background-color: rgba(16, 185, 129, 0.1); +} + +.landing-integration-item:has(.landing-tutorial-icon--navy):hover { + border-color: var(--feature-navy); + background-color: rgba(30, 64, 175, 0.1); +} + +.landing-integration-item:has(.landing-tutorial-icon--red):hover { + border-color: var(--feature-red); + background-color: rgba(239, 68, 68, 0.1); +} + +.landing-integration-icon { + width: 25px; + height: 25px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + +/* Ensure images inside integration icons are centered and scaled */ +.landing-integration-icon img { + display: block; + width: 100%; + height: 100%; + object-fit: contain; +} + +.landing-integration-text h3 { + font-size: var(--font-size-md) !important; + font-weight: 600; + margin: 0; + text-align: center; +} + +/* Community Support Section */ +.landing-community-support-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-md); + margin-bottom: 0; +} + +.landing-community-support-item { + border-radius: var(--radius-lg); + padding: var(--spacing-md) var(--spacing-lg); + border: 1px solid var(--border-color); + display: flex; + align-items: center; + justify-content: flex-start; + gap: var(--spacing-md); + transition: var(--transition-base); + position: relative; + cursor: pointer; + text-decoration: none; + color: inherit; + min-height: 80px; +} + +.landing-community-support-item:hover { + border-color: #6b7280; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); + text-decoration: none; + color: inherit; +} + +/* Community support arrow styling */ +.landing-community-support-arrow { + position: absolute; + top: 50%; + right: var(--spacing-lg); + transform: translateY(-50%); + font-size: 18px; + font-weight: bold; + opacity: 0; + transition: all 0.2s ease; + color: var(--text-primary); +} + +[data-md-color-scheme="default"] .landing-community-support-arrow { + color: #374151 !important; +} + +[data-md-color-scheme="slate"] .landing-community-support-arrow { + color: #ffffff !important; +} + +.landing-community-support-item:hover .landing-community-support-arrow { + opacity: 1; + transform: translateY(-50%) translateX(0); +} + +/* Community support item hover effects with icon-specific colors and background */ +.landing-community-support-item:has(.landing-tutorial-icon--pink):hover { + border-color: var(--feature-pink); + background-color: rgba(236, 72, 153, 0.1); +} + +.landing-community-support-item:has(.landing-tutorial-icon--purple):hover { + border-color: var(--feature-purple); + background-color: rgba(139, 92, 246, 0.1); +} + +.landing-community-support-item:has(.landing-tutorial-icon--blue):hover { + border-color: var(--feature-blue); + background-color: rgba(59, 130, 246, 0.1); +} + +.landing-community-support-icon { + width: 30px; + height: 30px; + border-radius: var(--radius-full); + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + color: var(--text-primary); + position: relative; +} + +.landing-community-support-text { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; +} + +.landing-community-support-text h3 { + font-size: var(--font-size-lg) !important; + font-weight: 600; + margin: 0; + text-align: left; +} + +.landing-community-support-text p { + font-size: var(--font-size-sm) !important; + font-weight: 400; + margin: 0; + text-align: left; + line-height: 1.4; + color: var(--text-secondary); +} + +/* Light theme feature item hover effects with icon-specific colors */ +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--blue):hover { + border-color: var(--feature-blue) !important; +} + +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--red):hover { + border-color: var(--feature-red) !important; +} + +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--purple):hover { + border-color: var(--feature-purple) !important; +} + +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--green):hover { + border-color: var(--feature-green) !important; +} + +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--orange):hover { + border-color: var(--feature-orange) !important; +} + +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--pink):hover { + border-color: var(--feature-pink) !important; +} + +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--navy):hover { + border-color: var(--feature-navy) !important; +} + +[data-md-color-scheme="default"] + .landing-feature-item:has(.landing-tutorial-icon--forest):hover { + border-color: var(--feature-forest) !important; +} + +/* Light theme integration item hover effects with icon-specific colors and background */ +[data-md-color-scheme="default"] + .landing-integration-item:has(.landing-tutorial-icon--orange):hover { + border-color: var(--feature-orange) !important; + background-color: rgba(249, 115, 22, 0.05) !important; +} + +[data-md-color-scheme="default"] + .landing-integration-item:has(.landing-tutorial-icon--blue):hover { + border-color: var(--feature-blue) !important; + background-color: rgba(59, 130, 246, 0.05) !important; +} + +[data-md-color-scheme="default"] + .landing-integration-item:has(.landing-tutorial-icon--purple):hover { + border-color: var(--feature-purple) !important; + background-color: rgba(139, 92, 246, 0.05) !important; +} + +[data-md-color-scheme="default"] + .landing-integration-item:has(.landing-tutorial-icon--green):hover { + border-color: var(--feature-green) !important; + background-color: rgba(16, 185, 129, 0.05) !important; +} + +[data-md-color-scheme="default"] + .landing-integration-item:has(.landing-tutorial-icon--navy):hover { + border-color: var(--feature-navy) !important; + background-color: rgba(30, 64, 175, 0.05) !important; +} + +[data-md-color-scheme="default"] + .landing-integration-item:has(.landing-tutorial-icon--red):hover { + border-color: var(--feature-red) !important; + background-color: rgba(239, 68, 68, 0.05) !important; +} + +/* Light theme community support item hover effects with icon-specific colors and background */ +[data-md-color-scheme="default"] + .landing-community-support-item:has(.landing-tutorial-icon--pink):hover { + border-color: var(--feature-pink) !important; + background-color: rgba(236, 72, 153, 0.05) !important; +} + +[data-md-color-scheme="default"] + .landing-community-support-item:has(.landing-tutorial-icon--purple):hover { + border-color: var(--feature-purple) !important; + background-color: rgba(139, 92, 246, 0.05) !important; +} + +[data-md-color-scheme="default"] + .landing-community-support-item:has(.landing-tutorial-icon--blue):hover { + border-color: var(--feature-blue) !important; + background-color: rgba(59, 130, 246, 0.05) !important; +} + +/* Light theme border colors for sections */ +[data-md-color-scheme="default"] .landing-feature-item, +[data-md-color-scheme="default"] .landing-integration-item, +[data-md-color-scheme="default"] .landing-tutorial-card, +[data-md-color-scheme="default"] .landing-community-support-item { + border-color: #bebebe !important; +} + +/* Light theme icon background colors */ +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--blue { + background-color: rgb(236, 246, 255); +} + +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--red { + background-color: rgb(254, 242, 242); +} + +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--purple { + background-color: rgb(245, 243, 255); +} + +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--green { + background-color: rgb(236, 253, 245); +} + +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--orange { + background-color: rgb(255, 247, 237); +} + +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--pink { + background-color: rgb(253, 242, 248); +} + +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--navy { + background-color: rgb(239, 246, 255); +} + +[data-md-color-scheme="default"] + .landing-feature-icon.landing-tutorial-icon--forest { + background-color: rgb(240, 253, 250); +} + +/* Theme-specific icon visibility */ +[data-md-color-scheme="default"] .light-theme-icon { + display: block; +} + +[data-md-color-scheme="default"] .dark-theme-icon { + display: none; +} + +[data-md-color-scheme="slate"] .light-theme-icon { + display: none; +} + +[data-md-color-scheme="slate"] .dark-theme-icon { + display: block; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .landing-tutorial-row { + flex-direction: column; + gap: var(--spacing-sm); + } + + .landing-features-list { + grid-template-columns: repeat(2, 1fr); + } + + .landing-integration-grid { + grid-template-columns: repeat(2, 1fr); + } + + .landing-community-support-grid { + grid-template-columns: 1fr; + } + + .landing-hero-content { + flex-direction: column; + align-items: flex-start; + gap: var(--spacing-md); + } + + .landing-hero-buttons { + align-self: stretch; + justify-content: center; + } +} diff --git a/overrides/css/output.css b/overrides/css/output.css new file mode 100644 index 00000000..ee15b8c8 --- /dev/null +++ b/overrides/css/output.css @@ -0,0 +1,1608 @@ +/*! 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); + } +} +@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; + } + ol, 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; + } +} +@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); + } + } + .xl\:px-12 { + @media (width >= 80rem) { + padding-inline: calc(var(--spacing) * 12); + } + } + .\[\&_svg\]\:size-4 { + & svg { + width: calc(var(--spacing) * 4); + height: calc(var(--spacing) * 4); + } + } + .\[\&_svg\]\:shrink-0 { + & svg { + flex-shrink: 0; + } + } +} +@layer utilities { + .hover\:text-\[\#7782FF\]:hover { + color: #7782ff; + } +} +.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)); +} +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% ); +} +.theme-purple { + --color-primary-purple: rgba(107, 118, 227); + color: var(--color-primary-purple); + --color-card: rgba(107, 118, 227, 0.2); + --color-hover-card: rgba(126, 34, 206); + --color-tabs-background: rgba(107, 118, 227); + --color-tabs-title-text: rgba(107, 118, 227); +} +html, body { + margin: 0; + width: 100%; + height: 100%; + font-family: "Inter", sans-serif; + scroll-behavior: smooth; + scroll-padding-top: 8rem; +} +main { + min-height: calc(100vh - 8rem); + padding-top: 3rem; +} +.primary-button { + position: relative; + border: none; + color: white; + cursor: pointer; + border-radius: 6px; + background-origin: border-box; + background-clip: padding-box, border-box; + transition: all 0.3s ease; + background-color: rgba(107, 118, 227); + 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%); + box-shadow: none; +} +.secondary-button { + position: relative; + border: none; + color: #5764d9; + cursor: pointer; + border-radius: 6px; + background-origin: border-box; + background-clip: padding-box, border-box; + transition: all 0.3s ease; + background-color: white; + border: 1px solid transparent; + font-size: 12px; +} +.secondary-button:hover { + background-color: #f3f4f6; +} +.secondary-button:disabled { + opacity: 0.6; + cursor: not-allowed; + border-color: #cccccc; + 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; +} +@media (min-width: 640px) { + nav.md-grid { + padding-left: 1.5rem; + padding-right: 1.5rem; + } +} +@media (min-width: 1024px) { + nav.md-grid { + padding-left: 2rem; + padding-right: 2rem; + } +} +@media (min-width: 1280px) { + nav.md-grid { + padding-left: 2.5rem; + 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; + } +} +@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%; + } + } +} diff --git a/overrides/main.html b/overrides/main.html index 5de0874d..dd86cd45 100644 --- a/overrides/main.html +++ b/overrides/main.html @@ -2,4 +2,20 @@ {% block extrahead %} {{ super() }} +{% block htmltitle %} + OpenObserve Documentation +{% endblock %} +{% if page and page.meta and page.meta.description %} + +{% endif %} + + + {% endblock %} \ No newline at end of file diff --git a/overrides/partials/footer.html b/overrides/partials/footer.html new file mode 100644 index 00000000..7a9db5f6 --- /dev/null +++ b/overrides/partials/footer.html @@ -0,0 +1,561 @@ + + + + diff --git a/overrides/partials/header.html b/overrides/partials/header.html index 8d09d5a3..bc943c83 100644 --- a/overrides/partials/header.html +++ b/overrides/partials/header.html @@ -1,165 +1,545 @@ - - - -{% set class = "md-header" %} -{% if "navigation.tabs.sticky" in features %} - {% set class = class ~ " md-header--shadow md-header--lifted" %} -{% elif "navigation.tabs" not in features %} - {% set class = class ~ " md-header--shadow" %} -{% endif %} - - - - - - - - {% include "partials/logo.html" %} - - - - - - - - - - {% include ".icons/material/menu" ~ ".svg" %} - - - - - - - - {{ config.site_name }} - - - - - {% if page.meta and page.meta.title %} - {{ page.meta.title }} - {% else %} - {{ page.title }} - {% endif %} - - - - - - - {% if config.theme.palette %} - {% if not config.theme.palette is mapping %} - - {% for option in config.theme.palette %} - {% set scheme = option.scheme | d("default", true) %} - {% set primary = option.primary | d("indigo", true) %} - {% set accent = option.accent | d("indigo", true) %} - - {% if option.toggle %} - - {% include ".icons/" ~ option.toggle.icon ~ ".svg" %} - - {% endif %} - {% endfor %} - - {% endif %} - {% endif %} - - - {% if config.extra.alternate %} - - - {% set icon = config.theme.icon.alternate or "material/translate" %} - + + + + + + + - {% include ".icons/" ~ icon ~ ".svg" %} - - - - {% for alt in config.extra.alternate %} - + + + + + + + + + Platform + + + + + Logs + + + Metrics + + + Traces + + + Frontend Monitoring + + + Pipelines + + + Alerts + + + Visualization & Dashboards + + + + + + + + + Solutions + + + + + AWS Monitoring + + + Azure Monitoring + + + GCP Monitoring + + + Kubernetes Monitoring + + + Database Monitoring + + + OpenTelemetry + + + + + + + + + Resources + + + + + Documentation + + + Customer Stories + + + Blog + + + Freqently Asked Questions + + + Webinar and Videos + + + Partners + + + Events + + + Downloads + + + + + + + Pricing - {{ alt.name }} - - {% endfor %} - + + + + + Get Demo + + + Log In + + + Star + + - + - {% endif %} - - - {% if "material/search" in config.plugins %} - - {% include ".icons/material/magnify.svg" %} - - - - {% include "partials/search.html" %} - {% endif %} - - - {% if config.repo_url %} - - {% include "partials/source.html" %} + + + + + + + + + + + + + Get Demo + + Star + + + + + + + + + + + + + + + + + + Platform + + + + + + Full Stack Observability Platform + + View Platform + + + + Logs + + + Metrics + + + Traces + + + Frontend Monitoring + + + Pipelines + + + Alerts + + + Visualization & Dashboards + + + + + + + + + + Solutions + + + + + + Full Stack Observability Solutions + + View Solutions + + + + AWS Monitoring + + + Azure Monitoring + + + GCP Monitoring + + + Kubernetes Monitoring + + + Database Monitoring + + + OpenTelemetry + + + + + + + + + + Resources + + + + + + Full Stack Observability Resources + + View Resources + + + + Documentation + + + Customer Stories + + Blog + Freqently Asked Questions + + Webinar and Videos + + Partners + Events + Downloads + + + + + + + + + Pricing + + + + + - {% endif %} - - - - {% if "navigation.tabs.sticky" in features %} - {% if "navigation.tabs" in features %} - {% include "partials/tabs.html" %} - {% endif %} - {% endif %} - \ No newline at end of file + + {% include "partials/navbar.html" %} + + + + diff --git a/overrides/partials/index.html b/overrides/partials/index.html new file mode 100644 index 00000000..d961682d --- /dev/null +++ b/overrides/partials/index.html @@ -0,0 +1,408 @@ +{% extends "base.html" %} + + +{% block content_nav %}{% endblock %} {% block content %} + + + + + + + + + + + OpenObserve (O2) is a cloud-native observability platform that + unifies logs, metrics, and traces into one solution. + + + + + + + + + Overview + + + + + + + + Download + + + + + + + + + Quick Guides + + + + Getting Started + + Get OpenObserve running locally in under 2 minutes with Docker + + + + + Create Your First Dashboard + + + Build dashboards and visualizations easily + + + + + + Advanced Log Queries + + Master SQL for powerful log analysis + + + + Production Deployment + + Deploy OpenObserve with high availability + + + + Set Up Alerts + + Configure alerts and notifications + + + + + + + + + User Guides + + + + + + + + Log Search + View and filter logs, run SQL queries, transform logs + + + + + + + + + + Metrics + Analyze file access times and system performance + + + + + + + + + + Streams + Define how data is ingested, stored, indexed, and queried + + + + + + + + + + Ingestion + Ingest logs, metrics, and traces from various sources + + + + + + + + + + Pipelines + Configure data processing workflows during ingestion + + + + + + + + + + Alerts + Set continuous monitoring to detect critical issues + + + + + + + + + + Dashboards + Visualize and monitor real-time and historical data + + + + + + + + + + RUM + + Set performance monitoring, error tracking, and session replay + + + + + + + + + + + Actions + + Create Python scripts to support custom automation workflows + + + + + + + + + + + IAM + Manage user identities and control access to resource + + + + + + + + + + Storage Management + + Configure how ingested stream data and metadata are stored + + + + + + + + + + + Environment Variables + Configure threshold or dynamic value variables in O2 + + + + + + + + + Popular Integrations + + + + + + + + + + AWS + + + + + + + + + + + DATABASES + + + + + + + + KUBERNETES + + + + + + + + DEVOPS + + + + + + + + LINUX + + + + + + + + WINDOWS + + + + + + + + Community & Support + + + + + + + Community + Join our discussions + + → + + + + + + + + + + GitHub + Report issues & contribute + + → + + + + + + + Resources + Resources to learn, grow and master + + → + + + + + + + + + + Contact Sales + Get in touch with our sales team + + → + + + + + + +{% endblock %} diff --git a/overrides/partials/logo.html b/overrides/partials/logo.html new file mode 100644 index 00000000..3cb8dc0b --- /dev/null +++ b/overrides/partials/logo.html @@ -0,0 +1,3 @@ +{% block logo %} +{# Do nothing – completely removes the logo link element and its space #} +{% endblock %} \ No newline at end of file diff --git a/overrides/partials/navbar.html b/overrides/partials/navbar.html new file mode 100644 index 00000000..14170fbe --- /dev/null +++ b/overrides/partials/navbar.html @@ -0,0 +1,272 @@ + + + +{% set class = "md-header" %} {% if "navigation.tabs.sticky" in features %} {% +set class = class ~ " md-header--shadow md-header--lifted" %} {% elif +"navigation.tabs" not in features %} {% set class = class ~ " md-header--shadow" +%} {% endif %} + + + + + + + + + {% include ".icons/material/menu.svg" %} + + + + + + + + + Documentation + + + + + + + + + + + {% if "material/search" in config.plugins %} + + {% include ".icons/material/magnify.svg" %} + + {% include "partials/search.html" %} {% endif %} + + + + + {% if config.theme.palette %} {% if not config.theme.palette is mapping %} + + {% for option in config.theme.palette %} {% set scheme = option.scheme | + d("default", true) %} {% set primary = option.primary | d("indigo", + true) %} {% set accent = option.accent | d("indigo", true) %} + + {% if option.toggle %} + + {% if option.scheme == "slate" or option.scheme == "dark" %} + + + {% else %} + + + {% endif %} + + {% endif %} {% endfor %} + + {% endif %} {% endif %} {% if config.extra.alternate %} + + + {% set icon = config.theme.icon.alternate or "material/translate" %} + + {% include ".icons/" ~ icon ~ ".svg" %} + + + + {% for alt in config.extra.alternate %} + + + {{ alt.name }} + + + {% endfor %} + + + + + {% endif %} + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..4abc3f35 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1136 @@ +{ + "name": "openobserve-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@tailwindcss/cli": "^4.1.11", + "tailwindcss": "^4.1.11" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/cli": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.11.tgz", + "integrity": "sha512-7RAFOrVaXCFz5ooEG36Kbh+sMJiI2j4+Ozp71smgjnLfBRu7DTfoq8DsTvzse2/6nDeo2M3vS/FGaxfDgr3rtQ==", + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "enhanced-resolve": "^5.18.1", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.1.11" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.11", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..59aeb296 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "@tailwindcss/cli": "^4.1.11", + "tailwindcss": "^4.1.11" + } +}
+ OpenObserve (O2) is a cloud-native observability platform that + unifies logs, metrics, and traces into one solution. +
+ Get OpenObserve running locally in under 2 minutes with Docker +
+ Build dashboards and visualizations easily +
+ Master SQL for powerful log analysis +
+ Deploy OpenObserve with high availability +
+ Configure alerts and notifications +
View and filter logs, run SQL queries, transform logs
Analyze file access times and system performance
Define how data is ingested, stored, indexed, and queried
Ingest logs, metrics, and traces from various sources
Configure data processing workflows during ingestion
Set continuous monitoring to detect critical issues
Visualize and monitor real-time and historical data
+ Set performance monitoring, error tracking, and session replay +
+ Create Python scripts to support custom automation workflows +
Manage user identities and control access to resource
+ Configure how ingested stream data and metadata are stored +
Configure threshold or dynamic value variables in O2
Join our discussions
Report issues & contribute
Resources to learn, grow and master
Get in touch with our sales team