βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User Interface β
β (app/pages/nexus.vue) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββββββββββ β
β β Search β ββββ emits βββββ β handleSearch() β β
β β Component β (query+category) β Filter & Display β β
β ββββββββββββββββ ββββββββββββββββββββββββ β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Filtered Results Array β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Results Grid (v-for) β β
β β ββ SearchResultCard β β
β β ββ SearchResultCard β β
β β ββ SearchResultCard β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. DATA SOURCES (Static Files) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββ΄ββββββββββββββββββββ
β β
ββββββββββββββββββββ ββββββββββββββββββββ
β Pipelines CSV β β Trainings CSV β
β /content/ β β /content/ β
β pipelines/ β β trainings/ β
ββββββββββββββββββββ ββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2. DATA LOADING (useAsyncData + queryCollection) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββ ββββββββββββββββββββ
β pipelinesData β β trainingsData β
β (Raw CSV) β β (Raw CSV) β
ββββββββββββββββββββ ββββββββββββββββββββ
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3. DATA TRANSFORMATION β
β transformPipelineData() transformTrainingData() β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
ββββββββββββββββββββ ββββββββββββββββββββ
β SearchResultItem β β SearchResultItem β
β (Standardized) β β (Standardized) β
ββββββββββββββββββββ ββββββββββββββββββββ
β β
ββββββββββββββββββ¬ββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4. UNIFIED RESULTS ARRAY β
β allResults = [...pipelines, ...trainings, ...] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 5. SEARCH & FILTER β
β β’ createSearchableText() β
β β’ matchesCategory() β
β β’ Filter by query β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 6. FILTERED RESULTS β
β filteredResults (displayed to user) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β nexus.vue β
β (Parent Component) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Data: allResults[], filteredResults[] β
β State: searchTerm, selectedCategory β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Search Component β β
β β Props: items, placeholder β β
β β Emits: @search(query, category) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β @search event β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β handleSearch(query, category) β β
β β 1. Set searchTerm & selectedCategory β β
β β 2. Filter allResults β β
β β 3. Update filteredResults β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β v-for="result in filteredResults" β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β SearchResultCard Component β β β
β β β Props: item (SearchResultItem) β β β
β β β Displays: name, url, description, keywords, etc. β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
User Types β "genomics"
β
ββββββββββββββββββββββββ
β handleSearch() β
β query: "genomics" β
β category: "all" β
ββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββββββββββββ
β For each item in allResults: β
β β
β 1. matchesCategory(item, "all") β
β β Check if item belongs to β
β selected category β
β β
β 2. createSearchableText(item) β
β β Combine all searchable fields β
β β Convert to lowercase β
β β
β 3. Check if "genomics" is in text β
β β item.includes("genomics") β
β β
β 4. If match β Add to results β
ββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββ
β filteredResults[] β
β [match1, match2...] β
ββββββββββββββββββββββββ
β
Display in Results Grid
STEP 1: Create Data Source
βββββββββββββββββββββββββββ
/content/
βββ tools/
βββ tools.csv
ββ Header Row
ββ Data Rows
STEP 2: Define Interface
βββββββββββββββββββββββββ
interface ToolRawData {
tool_name: string
tool_url: string
tool_description: string
...
}
STEP 3: Add to Categories Dropdown
βββββββββββββββββββββββββββββββββββ
searchCategories = [
{ label: 'Pipelines', value: 'pipelines' },
{ label: 'Tools', value: 'tools' } β NEW
]
STEP 4: Load Data
βββββββββββββββββ
const { data: toolsData } =
await useAsyncData('tools', async () => {
return await queryCollection('tools').all()
})
STEP 5: Transform Data
ββββββββββββββββββββββ
const transformToolData = (raw) => ({
name: raw.tool_name,
url: raw.tool_url,
description: raw.tool_description,
category: 'Tools',
...
})
STEP 6: Merge into Results
βββββββββββββββββββββββββββ
allResults.value = [
...pipelinesData.map(transformPipelineData),
...toolsData.map(transformToolData) β NEW
]
RESULT: Category Available!
ββββββββββββββββββββββββββββ
Search Dropdown now shows "Tools"
Data is searchable
Results display automatically
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SearchResultItem β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β name: string β Display Title β
β ββ Required β
β ββ Shown in card header β
β β
β url: string β Resource Link β
β ββ Required β
β ββ Opens in new tab β
β β
β description: string β Brief Description β
β ββ Required β
β ββ Main card content β
β β
β category: string β Category Name β
β ββ Required β
β ββ Must match dropdown value β
β ββ Shown as badge β
β β
β language?: string β Tech/Language/Format β
β ββ Optional β
β ββ Shown with code icon β
β β
β ownership?: string β Owner/Provider/Org β
β ββ Optional β
β ββ Shown with people icon β
β β
β keywords?: string[] β Searchable Tags β
β ββ Optional β
β ββ Array of strings β
β ββ Shown as tag pills β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
staphb-rework/
βββ app/
β βββ pages/
β β βββ nexus.vue βββββββββββββ
β β β Main search page
β β β β’ Data loading
β β β β’ Transformation
β β β β’ Search logic
β β β
β βββ components/ β
β βββ Search.vue βββββββββββββ€ Search input + dropdown
β β β β’ Category selector
β β β β’ Text input
β β β β’ Emits search events
β β β
β βββ SearchResultCard.vue βββ€ Individual result card
β β β’ Displays one result
β β β’ Keywords, meta, link
β β
βββ content/ βββββββββββββββββββββββ€ Data sources
β βββ pipelines/ β
β β βββ piplines.csv β Pipeline data
β β β
β βββ trainings/ β
β β βββ trainings.csv β Training data (future)
β β β
β βββ [new-category]/ β
β βββ [data-file].csv β Your new category
β β
βββ docs/ ββββββββββββββββββββββββββ€ Documentation
βββ NEXUS_SEARCH_GUIDE.md β Complete guide
βββ NEXUS_QUICK_REF.md β Quick reference
βββ NEXUS_DIAGRAMS.md β This file!
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β parseKeywords(keywords: string | string[]) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Input: "tag1, tag2, tag3" OR ["tag1", "tag2", "tag3"] β
β Output: ["tag1", "tag2", "tag3"] β
β Purpose: Normalize keyword format β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β transformPipelineData(raw: PipelineRawData) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Input: { pipeline_name: "X", pipeline_url: "Y", ... } β
β Output: { name: "X", url: "Y", category: "Pipelines", ...} β
β Purpose: Convert raw CSV to SearchResultItem β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β createSearchableText(item: SearchResultItem) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Input: SearchResultItem object β
β Output: "name description language keywords..." (lowercase) β
β Purpose: Create single searchable text from all fields β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β matchesCategory(item: SearchResultItem, category: string) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Input: Item and category filter β
β Output: true/false β
β Purpose: Check if item belongs to selected category β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β handleSearch(query: string, category: string) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β Input: Search query and category from user β
β Output: Updates filteredResults array β
β Purpose: Main search logic - filter and display results β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Initial State (No search yet) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β’ Search bar visible β
β β’ No results shown β
β β’ Waiting for user input β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Searching State (User typing) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β’ Search term populated β
β β’ Real-time filtering β
β β’ Results update instantly β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Results Found β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β’ Results grid visible β
β β’ Cards displayed β
β β’ All matched items shown β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β No Results Found β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β’ Empty state message β
β β’ Helpful icon β
β β’ Suggestion to adjust search β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Visual Guide v1.0 | For developers adding content to Nexus search