This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new 96128e260e [GH-2791] Add platform tags to docs search results (#2792)
96128e260e is described below

commit 96128e260e156295fff817a0fe072417d3402fe8
Author: Jia Yu <[email protected]>
AuthorDate: Fri Mar 27 08:59:31 2026 -0700

    [GH-2791] Add platform tags to docs search results (#2792)
---
 .../assets/javascripts/components/search-tags.js   | 76 ++++++++++++++++++++++
 docs-overrides/assets/javascripts/main.js          |  2 +
 .../stylesheets/components/_search-tags.scss       | 27 ++++++++
 docs-overrides/assets/stylesheets/extra.scss       |  1 +
 4 files changed, 106 insertions(+)

diff --git a/docs-overrides/assets/javascripts/components/search-tags.js 
b/docs-overrides/assets/javascripts/components/search-tags.js
new file mode 100644
index 0000000000..e3611aa4cd
--- /dev/null
+++ b/docs-overrides/assets/javascripts/components/search-tags.js
@@ -0,0 +1,76 @@
+const PLATFORM_RULES = [
+  {pattern: /\/api\/flink\//, label: 'SedonaFlink', cls: 'flink'},
+  {pattern: /\/api\/snowflake\//, label: 'SedonaSnow', cls: 'snow'},
+  {pattern: /\/setup\/flink\//, label: 'SedonaFlink', cls: 'flink'},
+  {pattern: /\/setup\/snowflake\//, label: 'SedonaSnow', cls: 'snow'},
+  {pattern: /\/tutorial\/flink\//, label: 'SedonaFlink', cls: 'flink'},
+  {pattern: /\/tutorial\/snowflake\//, label: 'SedonaSnow', cls: 'snow'},
+  {pattern: /sedonaflink\/?$/, label: 'SedonaFlink', cls: 'flink'},
+  {pattern: /sedonasnow\/?$/, label: 'SedonaSnow', cls: 'snow'},
+  {pattern: /\/api\/sql\//, label: 'SedonaSpark', cls: 'spark'},
+  {pattern: /\/api\/stats\//, label: 'SedonaSpark', cls: 'spark'},
+  {pattern: /\/api\/viz\//, label: 'SedonaSpark', cls: 'spark'},
+  {pattern: /\/setup\/(?!flink|snowflake)/, label: 'SedonaSpark', cls: 
'spark'},
+  {
+    pattern: /\/tutorial\/(?!flink|snowflake)/,
+    label: 'SedonaSpark',
+    cls: 'spark',
+  },
+  {pattern: /sedonaspark\/?$/, label: 'SedonaSpark', cls: 'spark'},
+];
+
+function getPlatform(href) {
+  for (const rule of PLATFORM_RULES) {
+    if (rule.pattern.test(href)) {
+      return rule;
+    }
+  }
+  return null;
+}
+
+function tagResult(item) {
+  if (item.querySelector('.search-tag')) return;
+
+  const link = item.querySelector('a');
+  if (!link) return;
+
+  const platform = getPlatform(link.getAttribute('href') || '');
+  if (!platform) return;
+
+  const tag = document.createElement('span');
+  tag.className = `search-tag search-tag--${platform.cls}`;
+  tag.textContent = platform.label;
+
+  const title = link.querySelector('h1, h2');
+  if (title) {
+    title.appendChild(tag);
+  }
+}
+
+function handleMutations(mutationsList) {
+  for (const mutation of mutationsList) {
+    for (const node of mutation.addedNodes) {
+      if (!(node instanceof HTMLElement)) continue;
+
+      if (node.matches('.md-search-result__item')) {
+        tagResult(node);
+        continue;
+      }
+
+      const items = node.querySelectorAll
+        ? node.querySelectorAll('.md-search-result__item')
+        : [];
+      items.forEach(tagResult);
+    }
+  }
+}
+
+export const searchTags = () => {
+  const resultList = document.querySelector('.md-search-result__list');
+  if (!resultList) return;
+
+  resultList.querySelectorAll('.md-search-result__item').forEach(tagResult);
+
+  const observer = new MutationObserver(handleMutations);
+  observer.observe(resultList, {childList: true, subtree: true});
+};
diff --git a/docs-overrides/assets/javascripts/main.js 
b/docs-overrides/assets/javascripts/main.js
index 51ef2f0605..cd76fba249 100644
--- a/docs-overrides/assets/javascripts/main.js
+++ b/docs-overrides/assets/javascripts/main.js
@@ -1,11 +1,13 @@
 import {industriesTabs} from './components/industries-tabs';
 import {codeTabs} from './components/code-tabs';
 import {typedAnimation} from './components/typed-animation';
+import {searchTags} from './components/search-tags';
 
 document.addEventListener('DOMContentLoaded', () => {
   industriesTabs();
   codeTabs();
   typedAnimation();
+  searchTags();
 });
 
 document$.subscribe(function () {
diff --git a/docs-overrides/assets/stylesheets/components/_search-tags.scss 
b/docs-overrides/assets/stylesheets/components/_search-tags.scss
new file mode 100644
index 0000000000..5113f73d03
--- /dev/null
+++ b/docs-overrides/assets/stylesheets/components/_search-tags.scss
@@ -0,0 +1,27 @@
+.search-tag {
+  display: inline-block;
+  margin-left: 0.5em;
+  padding: 0.1em 0.5em;
+  border-radius: 3px;
+  font-size: 0.65em;
+  font-weight: 700;
+  line-height: 1.6;
+  vertical-align: middle;
+  white-space: nowrap;
+  letter-spacing: 0.02em;
+
+  &--spark {
+    background-color: #fff3e0;
+    color: #e65100;
+  }
+
+  &--flink {
+    background-color: #e3f2fd;
+    color: #1565c0;
+  }
+
+  &--snow {
+    background-color: #e0f7fa;
+    color: #00695c;
+  }
+}
diff --git a/docs-overrides/assets/stylesheets/extra.scss 
b/docs-overrides/assets/stylesheets/extra.scss
index 6536937b47..632f78effe 100644
--- a/docs-overrides/assets/stylesheets/extra.scss
+++ b/docs-overrides/assets/stylesheets/extra.scss
@@ -12,6 +12,7 @@
 @import "components/buttons";
 @import "components/footer";
 @import "components/sidebar";
+@import "components/search-tags";
 
 // Pages
 @import "pages/page-home";

Reply via email to