11'use client'
22
33import type React from 'react'
4+ import { SizeMode } from '@/lib/treemap-layout'
5+
46import { useEffect , useMemo , useState } from 'react'
57import useSWR from 'swr'
68import { ErrorState } from '@/components/error-state'
@@ -17,12 +19,17 @@ import { computeActiveEntries, computeModuleDepthMap } from '@/lib/module-graph'
1719import { fetchStrict } from '@/lib/utils'
1820import { formatBytes } from '@/lib/utils'
1921
22+ enum Environment {
23+ Client = 'client' ,
24+ Server = 'server' ,
25+ }
26+
2027export default function Home ( ) {
2128 const [ selectedRoute , setSelectedRoute ] = useState < string | null > ( null )
22- const [ environmentFilter , setEnvironmentFilter ] = useState <
23- 'client' | 'server'
24- > ( 'client' )
25- const [ typeFilter , setTypeFilter ] = useState < string [ ] > ( [ 'js' , 'css' , 'json' ] )
29+ const [ environmentFilter , setEnvironmentFilter ] = useState < Environment > (
30+ Environment . Client
31+ )
32+ const [ typeFilter , setTypeFilter ] = useState ( [ 'js' , 'css' , 'json' ] )
2633 const [ selectedSourceIndex , setSelectedSourceIndex ] = useState < number | null > (
2734 null
2835 )
@@ -69,6 +76,7 @@ export default function Home() {
6976 client ?: boolean
7077 } | null > ( null )
7178 const [ searchQuery , setSearchQuery ] = useState ( '' )
79+ const [ sizeMode , setSizeMode ] = useState ( SizeMode . Compressed )
7280
7381 useEffect ( ( ) => {
7482 const handleKeyDown = ( e : KeyboardEvent ) => {
@@ -100,15 +108,15 @@ export default function Home() {
100108 } , [ modulesData , analyzeData ] )
101109
102110 const filterSource = useMemo ( ( ) => {
103- if ( ! analyzeData ) return undefined
111+ if ( ! analyzeData ) return ( ) => true
104112
105113 return ( sourceIndex : number ) => {
106114 const flags = analyzeData . getSourceFlags ( sourceIndex )
107115
108116 // Check environment filter
109117 const hasEnvironment =
110- ( environmentFilter === 'client' && flags . client ) ||
111- ( environmentFilter === 'server' && flags . server )
118+ ( environmentFilter === Environment . Client && flags . client ) ||
119+ ( environmentFilter === Environment . Server && flags . server )
112120
113121 // Check type filter
114122 const hasType =
@@ -157,25 +165,47 @@ export default function Home() {
157165 />
158166 </ div >
159167
160- < div className = "basis-2/3 flex justify-end" >
168+ < div className = "basis-2/3 flex justify-end items-center space-x-4 " >
161169 { analyzeData && (
162170 < >
163171 < ToggleGroup
164172 type = "single"
165- className = "mr-4"
173+ value = { sizeMode }
174+ onValueChange = { ( value ) => {
175+ if ( value ) setSizeMode ( value as SizeMode )
176+ } }
177+ size = "sm"
178+ >
179+ < ToggleGroupItem value = { SizeMode . Uncompressed } >
180+ Uncompressed
181+ </ ToggleGroupItem >
182+ < ToggleGroupItem value = { SizeMode . Compressed } >
183+ Compressed
184+ </ ToggleGroupItem >
185+ </ ToggleGroup >
186+
187+ < ControlDivider />
188+
189+ < ToggleGroup
190+ type = "single"
166191 value = { environmentFilter }
167192 onValueChange = { ( value ) => {
168- if ( value ) setEnvironmentFilter ( value as 'client' | 'server' )
193+ if ( value ) setEnvironmentFilter ( value as Environment )
169194 } }
170195 size = "sm"
171196 >
172- < ToggleGroupItem value = "client" > Client</ ToggleGroupItem >
173- < ToggleGroupItem value = "server" > Server</ ToggleGroupItem >
197+ < ToggleGroupItem value = { Environment . Client } >
198+ Client
199+ </ ToggleGroupItem >
200+ < ToggleGroupItem value = { Environment . Server } >
201+ Server
202+ </ ToggleGroupItem >
174203 </ ToggleGroup >
175204
205+ < ControlDivider />
206+
176207 < ToggleGroup
177208 type = "multiple"
178- className = "mr-4"
179209 value = { typeFilter }
180210 onValueChange = { ( value ) => {
181211 if ( value . length > 0 ) setTypeFilter ( value )
@@ -188,6 +218,8 @@ export default function Home() {
188218 < ToggleGroupItem value = "asset" > Asset</ ToggleGroupItem >
189219 </ ToggleGroup >
190220
221+ < ControlDivider />
222+
191223 < FileSearch value = { searchQuery } onChange = { setSearchQuery } />
192224 </ >
193225 ) }
@@ -235,6 +267,7 @@ export default function Home() {
235267 onHoveredNodeChange = { setHoveredNodeInfo }
236268 searchQuery = { searchQuery }
237269 filterSource = { filterSource }
270+ sizeMode = { sizeMode }
238271 />
239272 </ div >
240273
@@ -252,6 +285,7 @@ export default function Home() {
252285 selectedSourceIndex = { selectedSourceIndex }
253286 moduleDepthMap = { moduleDepthMap }
254287 environmentFilter = { environmentFilter }
288+ filterSource = { filterSource }
255289 />
256290 </ >
257291 ) : null }
@@ -266,7 +300,7 @@ export default function Home() {
266300 { hoveredNodeInfo . name }
267301 </ span >
268302 < span className = "ml-2 text-muted-foreground" >
269- { formatBytes ( hoveredNodeInfo . size ) }
303+ { ` ${ formatBytes ( hoveredNodeInfo . size ) } ${ sizeMode } ` }
270304 </ span >
271305 { ( hoveredNodeInfo . server || hoveredNodeInfo . client ) && (
272306 < span className = "ml-2 inline-flex gap-1" >
@@ -289,6 +323,10 @@ export default function Home() {
289323 )
290324}
291325
326+ function ControlDivider ( ) {
327+ return < span className = "h-6 w-px bg-muted-foreground/30" />
328+ }
329+
292330function getRootSourceIndex ( analyzeData : AnalyzeData | undefined ) : number {
293331 if ( ! analyzeData ) return 0
294332 const sourceRoots = analyzeData . sourceRoots ( )
0 commit comments