11'use client'
22
33import type React from 'react'
4+ import type { SizeMode } from '@/lib/treemap-layout'
5+
46import { useEffect , useMemo , useState } from 'react'
57import useSWR from 'swr'
68import { ErrorState } from '@/components/error-state'
@@ -69,6 +71,7 @@ export default function Home() {
6971 client ?: boolean
7072 } | null > ( null )
7173 const [ searchQuery , setSearchQuery ] = useState ( '' )
74+ const [ sizeMode , setSizeMode ] = useState < SizeMode > ( 'compressed' )
7275
7376 useEffect ( ( ) => {
7477 const handleKeyDown = ( e : KeyboardEvent ) => {
@@ -100,7 +103,7 @@ export default function Home() {
100103 } , [ modulesData , analyzeData ] )
101104
102105 const filterSource = useMemo ( ( ) => {
103- if ( ! analyzeData ) return undefined
106+ if ( ! analyzeData ) return ( ) => true
104107
105108 return ( sourceIndex : number ) => {
106109 const flags = analyzeData . getSourceFlags ( sourceIndex )
@@ -157,12 +160,27 @@ export default function Home() {
157160 />
158161 </ div >
159162
160- < div className = "basis-2/3 flex justify-end" >
163+ < div className = "basis-2/3 flex justify-end items-center space-x-4 " >
161164 { analyzeData && (
162165 < >
163166 < ToggleGroup
164167 type = "single"
165- className = "mr-4"
168+ value = { sizeMode }
169+ onValueChange = { ( value ) => {
170+ if ( value ) setSizeMode ( value as SizeMode )
171+ } }
172+ size = "sm"
173+ >
174+ < ToggleGroupItem value = "uncompressed" >
175+ Uncompressed
176+ </ ToggleGroupItem >
177+ < ToggleGroupItem value = "compressed" > Compressed</ ToggleGroupItem >
178+ </ ToggleGroup >
179+
180+ < ControlDivider />
181+
182+ < ToggleGroup
183+ type = "single"
166184 value = { environmentFilter }
167185 onValueChange = { ( value ) => {
168186 if ( value ) setEnvironmentFilter ( value as 'client' | 'server' )
@@ -173,9 +191,10 @@ export default function Home() {
173191 < ToggleGroupItem value = "server" > Server</ ToggleGroupItem >
174192 </ ToggleGroup >
175193
194+ < ControlDivider />
195+
176196 < ToggleGroup
177197 type = "multiple"
178- className = "mr-4"
179198 value = { typeFilter }
180199 onValueChange = { ( value ) => {
181200 if ( value . length > 0 ) setTypeFilter ( value )
@@ -188,6 +207,8 @@ export default function Home() {
188207 < ToggleGroupItem value = "asset" > Asset</ ToggleGroupItem >
189208 </ ToggleGroup >
190209
210+ < ControlDivider />
211+
191212 < FileSearch value = { searchQuery } onChange = { setSearchQuery } />
192213 </ >
193214 ) }
@@ -235,6 +256,7 @@ export default function Home() {
235256 onHoveredNodeChange = { setHoveredNodeInfo }
236257 searchQuery = { searchQuery }
237258 filterSource = { filterSource }
259+ sizeMode = { sizeMode }
238260 />
239261 </ div >
240262
@@ -252,6 +274,7 @@ export default function Home() {
252274 selectedSourceIndex = { selectedSourceIndex }
253275 moduleDepthMap = { moduleDepthMap }
254276 environmentFilter = { environmentFilter }
277+ filterSource = { filterSource }
255278 />
256279 </ >
257280 ) : null }
@@ -266,7 +289,9 @@ export default function Home() {
266289 { hoveredNodeInfo . name }
267290 </ span >
268291 < span className = "ml-2 text-muted-foreground" >
269- { formatBytes ( hoveredNodeInfo . size ) }
292+ { `${ formatBytes ( hoveredNodeInfo . size ) } ${
293+ sizeMode === 'compressed' ? 'compressed' : 'uncompressed'
294+ } `}
270295 </ span >
271296 { ( hoveredNodeInfo . server || hoveredNodeInfo . client ) && (
272297 < span className = "ml-2 inline-flex gap-1" >
@@ -289,6 +314,10 @@ export default function Home() {
289314 )
290315}
291316
317+ function ControlDivider ( ) {
318+ return < span className = "h-6 w-px bg-muted-foreground/30" />
319+ }
320+
292321function getRootSourceIndex ( analyzeData : AnalyzeData | undefined ) : number {
293322 if ( ! analyzeData ) return 0
294323 const sourceRoots = analyzeData . sourceRoots ( )
0 commit comments