
    i>                     T   d Z ddlZddlZddlmZ ddlmZ ddlmZ  ee	      j                  dz  ZdZdg d	g d
ddddgg dddg dg dddg dg dddg dg dddg dg dddg dg dddg d g d!dd"g d#g ddd$g d#g ddd%g d&g d'dd(Zi d)d*d+id,d*d-id.d*d/id0d*d1id2d*d3id4d*d5id6d*d7id8d*d9id:d*d;id<d*d=id>d*d?id@d*dAidBd*dCidDd*dEidFd*dGidHd*dIiZg dJg dKdLZ eej#                               Z G dM dN      ZdO ZdP ZdQ ZdefdRZefdSZy)Tz@
Design Search Core - BM25 search engine for UI/UX style guides
    N)defaultdict)log)Pathdata   z
styles.csv)Style CategoryKeywordsBest ForTypeAI Prompt Keywords)r   r   r	   zPrimary ColorszEffects & Animationr
   u   Light Mode ✓u   Dark Mode ✓PerformanceAccessibilityzFramework Compatibility
Complexityr   zCSS/Technical KeywordszImplementation ChecklistzDesign System Variables)filesearch_colsoutput_colsz
colors.csvProduct TypeNotes)r   Primaryz
On Primary	SecondaryzOn SecondaryAccentz	On Accent
Background
ForegroundCardzCard ForegroundMutedzMuted ForegroundBorderDestructivezOn DestructiveRingr   z
charts.csv)	Data Typer	   Best Chart TypeWhen to UseWhen NOT to UseAccessibility Notes)r   r	   r    zSecondary Optionsr!   r"   zData Volume ThresholdzColor GuidancezAccessibility Grader#   zA11y FallbackzLibrary RecommendationzInteractive Levelzlanding.csv)Pattern Namer	   Conversion OptimizationSection Order)r$   r	   r&   zPrimary CTA PlacementzColor Strategyr%   zproducts.csv)r   r	   Primary Style RecommendationzKey Considerations)r   r	   r'   zSecondary StyleszLanding Page PatternzDashboard Style (if applicable)zColor Palette Focuszux-guidelines.csv)CategoryIssueDescriptionPlatform)	r(   r)   r+   r*   DoDon'tzCode Example GoodzCode Example BadSeverityztypography.csv)Font Pairing Namer(   Mood/Style Keywordsr
   Heading Font	Body Font)
r/   r(   r1   r2   r0   r
   Google Fonts URLz
CSS ImportzTailwind Configr   z	icons.csv)r(   	Icon Namer	   r
   )r(   r4   r	   LibraryzImport CodeUsager
   Stylezreact-performance.csv)r(   r)   r	   r*   zapp-interface.csvzgoogle-fonts.csv)Familyr(   StrokeClassificationsr	   Subsets	Designers)
r8   r(   r9   r:   StyleszVariable Axesr;   r<   zPopularity Rankr3   )stylecolorchartlandingproductux
typographyiconsreactwebgoogle-fontsrF   r   zstacks/react.csvnextjszstacks/nextjs.csvvuezstacks/vue.csvsveltezstacks/svelte.csvastrozstacks/astro.csvswiftuizstacks/swiftui.csvzreact-nativezstacks/react-native.csvflutterzstacks/flutter.csvnuxtjszstacks/nuxtjs.csvznuxt-uizstacks/nuxt-ui.csvzhtml-tailwindzstacks/html-tailwind.csvshadcnzstacks/shadcn.csvzjetpack-composezstacks/jetpack-compose.csvthreejszstacks/threejs.csvangularzstacks/angular.csvlaravelzstacks/laravel.csv)r(   	Guideliner*   r,   r-   )	r(   rT   r*   r,   r-   z	Code GoodzCode Badr.   zDocs URL)r   r   c                   *    e Zd ZdZddZd Zd Zd Zy)BM25z&BM25 ranking algorithm for text searchc                     || _         || _        g | _        g | _        d| _        i | _        t        t              | _        d| _	        y )Nr   )
k1bcorpusdoc_lengthsavgdlidfr   int	doc_freqsN)selfrX   rY   s      I/home/jay/workspace/.worktrees/task-2116-dev1/tools/design-search/core.py__init__zBM25.__init__   s@    
$S)    c                     t        j                  ddt        |      j                               }|j	                         D cg c]  }t        |      dkD  s| c}S c c}w )z8Lowercase, split, remove punctuation, filter short wordsz[^\w\s]    )resubstrlowersplitlen)ra   textws      rb   tokenizezBM25.tokenize  sC    vvj#s4y'89::<6a3q6A:666s   AAc                    |D cg c]  }| j                  |       c}| _        t        | j                        | _        | j                  dk(  ry| j                  D cg c]  }t        |       c}| _        t        | j                        | j                  z  | _        | j                  D ]@  }t               }|D ]/  }||vs| j                  |xx   dz  cc<   |j                  |       1 B | j                  j                         D ]6  \  }}t        | j                  |z
  dz   |dz   z  dz         | j                  |<   8 yc c}w c c}w )zBuild BM25 index from documentsr   N   g      ?)rp   rZ   rm   r`   r[   sumr\   setr_   additemsr   r]   )ra   	documentsdocseenwordfreqs         rb   fitzBM25.fit  s   5>?ct}}S)?T[[!66Q;04<CH<))*TVV3
;; 	#C5D #t#NN4(A-(HHTN#	# ....0 	KJD$ $&&4-#"5$*!E!IJDHHTN	K @ =s   EEc                    | j                  |      }g }t        | j                        D ]  \  }}d}| j                  |   }t	        t
              }|D ]  }	||	xx   dz  cc<    |D ]~  }
|
| j                  v s||
   }| j                  |
   }|| j                  dz   z  }|| j                  d| j                  z
  | j                  |z  | j                  z  z   z  z   }|||z  |z  z  } |j                  ||f        t        |d d      S )z!Score all documents against queryr   rr   c                     | d   S )Nrr    )xs    rb   <lambda>zBM25.score.<locals>.<lambda>0  s
    AaD rd   T)keyreverse)rp   	enumeraterZ   r[   r   r^   r]   rX   rY   r\   appendsorted)ra   queryquery_tokensscoresidxrx   scoredoc_len
term_freqsrz   tokentfr]   	numeratordenominators                  rb   r   z
BM25.score  s    }}U+!$++. 	(HCE&&s+G$S)J &4 A% & & ;DHH$#E*B((5/C "dggk 2I"$tww!dff*tvv?ORVR\R\?\2\']"]KS9_{::E; MM3,'	(" f.$??rd   N)g      ?g      ?)__name__
__module____qualname____doc__rc   rp   r|   r   r   rd   rb   rV   rV      s    07
K&@rd   rV   c                     t        | dd      5 }t        t        j                  |            cddd       S # 1 sw Y   yxY w)z!Load CSV and return list of dictsrzutf-8)encodingN)openlistcsv
DictReader)filepathfs     rb   	_load_csvr   4  s6    	hg	. '!CNN1%&' ' 's	   7A c                    | j                         sg S t        |       }|D cg c]  dj                  fd|D               }}t               }|j	                  |       |j                  |      }	g }
|	d| D ]E  \  }}|dkD  s||   |
j                  |D ci c]  }|v s|j                  |d       c}       G |
S c c}w c c}w )zCore search function using BM25rf   c              3   T   K   | ]  }t        j                  |d              ! yw) N)rj   get).0colrows     rb   	<genexpr>z_search_csv.<locals>.<genexpr>B  s!     GC#cggc2./Gs   %(Nr   r   )existsr   joinrV   r|   r   r   r   )r   r   r   r   max_resultsr   r   rw   bm25rankedresultsr   r   r   s         `       rb   _search_csvr   :  s    ??	XD TXXCG;GGXIX 6DHHYZZF G\k* Y
U19s)CNN[WcCSVJCb!11WXY
 N Y Xs   !C	C	
$C	
c                    | j                         g dg dg dg dg dg dg dg dg d	g d
g dd}|j                         D ci c]  \  }}|t        fd|D               c}}t        fd      }|   dkD  r|S dS c c}}w )z/Auto-detect the most relevant domain from query)r?   palettehex#rgbr   semanticaccentdestructivemuted
foreground)	r@   graphvisualizationtrendbarpiescatterheatmapfunnel)rA   pagecta
conversionherotestimonialpricingsection)Rsaas	ecommercez
e-commercefintech
healthcaregaming	portfoliocrypto	dashboardfitness
restauranthoteltravelmusic	educationlearninglegal	insurancemedicalbeautypharmacydentalpetdatingweddingrecipedeliveryridebookingcalendartimertrackerdiarynotechat	messengercrminvoiceparkingtransitvpnalarmweathersleep
meditationfastinghabitgrocerymemewardrobez
plant carereading	flashcardpuzzletriviaarcadephotography	streamingpodcast
newslettermarketplace
freelancer	coworkingairlinemuseumtheaterchurchz
non-profitcharitykindergartendaycarezsenior care
veterinaryfloristbakerybreweryconstruction
automotivezreal estate	logisticsagriculturezcoding bootcamp)r>   designui
minimalismglassmorphismneumorphism	brutalismz	dark modeflataurorapromptcssimplementationvariable	checklisttailwind)
rC   	usabilityaccessibilitywcagtouchscroll	animationkeyboard
navigationmobile)zfont pairingztypography pairingzheading fontz	body font)zgoogle fontzfont familyzfont weightz
font stylezvariable fontnotozfont forz	find fontzfont subsetzfont languagezmonospace fontz
serif fontzsans serif fontzdisplay fontzhandwriting fontfontrD   serifsans)iconrE   lucide	heroiconssymbolglyph	pictogramzsvg icon)rF   znext.jsrI   suspensememousecallback	useeffectrerenderbundle	waterfallbarrelzdynamic importrsczserver component)	ariafocusoutliner   
virtualizeautocompleteformz
input type
preconnect)r?   r@   rA   rB   r>   rC   rD   rH   rE   rF   rG   c              3      K   | ]6  }t        j                  d t        j                  |      z   d z         s3d 8 yw)z\brr   N)rh   searchescape)r   kwquery_lowers     rb   r   z detect_domain.<locals>.<genexpr>  s1     b"BIIebiim6Ke6SU`,aAbs   4??c                     |    S )Nr   )r   r   s    rb   r   zdetect_domain.<locals>.<lambda>  s    VAY rd   )r   r   r>   )rk   rv   rs   max)r   domain_keywordsdomainkeywordsbestrI  r   s        @@rb   detect_domainrP  S  s    ++-K
 lhS
h
$
 Z
* f
 

StOp !0 5 5 7FH 	bbbbF v./D$<!#400s   
B	c                     |t        |       }t        j                  |t        d         }t        |d   z  }|j	                         sd| |dS t        ||d   |d   | |      }|| |d   t        |      |dS )z/Main search function with auto-domain detectionr>   r   zFile not found: )errorrM  r   r   )rM  r   r   countr   )rP  
CSV_CONFIGr   DATA_DIRr   r   rm   )r   rM  r   configr   r   s         rb   rF  rF    s    ~u%^^FJw$78F&.(H??+H:6&II(F=$96-;PRWYdeGufVnsSZ|hopprd   c                    |t         vrdd| ddj                  t               iS t        t         |   d   z  }|j	                         sd| |dS t        |t        d   t        d	   | |      }d
|| t         |   d   t        |      |dS )z Search stack-specific guidelinesrR  zUnknown stack: z. Available: z, r   zStack file not found: )rR  stackr   r   rX  )rM  rX  r   r   rS  r   )STACK_CONFIGr   AVAILABLE_STACKSrU  r   r   _STACK_COLSrm   )r   rX  r   r   r   s        rb   search_stackr\  %  s    L ?5'tyyIY?Z>[\]],u-f55H??1(<uMM(K$>M@Z\acnoG U#F+W rd   )r   r   rh   collectionsr   mathr   pathlibr   __file__parentrU  MAX_RESULTSrT  rY  r[  r   keysrZ  rV   r   r   rP  rF  r\  r   rd   rb   <module>rd     s    	 #   >  6) _
. &0
2 

6 _
 i
 $G

  !

0 Ht (G

  $G

  #n
W{
zf()v*+ 
F$% v*+	
 f() ,- V67 ,- v*+ ,- f89 v*+  <= ,- ,-  ,-!* K
 ))+, ;@ ;@~'21D ; q  ,7 rd   