@@ -10,31 +10,56 @@ import {
1010 Subtitle2 ,
1111 Body2 ,
1212 Switch ,
13- Slider
13+ Slider ,
14+ TabList ,
15+ Tab ,
16+ SelectTabEvent ,
17+ SelectTabData
1418} from '@fluentui/react-components' ;
1519import { PortalCompatProvider } from '@fluentui/react-portal-compat' ;
1620import { ChartWrapper } from './components/ChartWrapper' ;
21+ import { VegaChartWrapper } from './components/VegaChartWrapper' ;
1722import { getSelection , saveSelection } from './components/utils' ;
1823import { setRTL } from '@fluentui/react/lib/Utilities' ;
1924import { SliderOnChangeData } from '@fluentui/react-components' ;
2025
26+ type AppView = 'plotly' | 'vega' ;
27+
28+ function getInitialView ( ) : AppView {
29+ const hash = window . location . hash . replace ( '#' , '' ) ;
30+ if ( hash === 'vega' ) return 'vega' ;
31+ return 'plotly' ;
32+ }
33+
2134const App : React . FC = ( ) => {
35+ const [ activeView , setActiveView ] = React . useState < AppView > ( getInitialView ) ;
2236 const [ value , setValue ] = React . useState ( getSelection ( "Theme" , "Light" ) ) ;
2337 const [ isRTL , setisRTL ] = React . useState ( getSelection ( "RTL" , "false" ) === "true" ) ;
2438 const [ isDimensionSlidersEnabled , setIsDimensionSlidersEnabled ] = React . useState ( getSelection ( "DimensionSlidersEnabled" , "true" ) === "true" ) ;
25- const [ isV9ChartFirst , setIsV9ChartFirst ] = React . useState ( getSelection ( "isV9ChartFirst" , "false" ) === "true" ) ;
2639 const [ labelRTLMode , setLabelRTLMode ] = React . useState ( "Enable RTL" ) ;
2740 const [ labelDimensionSwitch , setLabelDimensionSwitch ] = React . useState ( "Disable Dimension sliders" ) ;
28- const [ labelChartOrderSwitch ] = React . useState ( "Show v9 first" ) ;
2941 const [ chartWidth , setChartWidth ] = React . useState < number > ( Number ( getSelection ( "ChartWidth" , window . innerWidth . toString ( ) ) ) ) ;
3042 const [ chartHeight , setChartHeight ] = React . useState < number > ( Number ( getSelection ( "ChartHeight" , "400" ) ) ) ;
3143
44+ React . useEffect ( ( ) => {
45+ const onHashChange = ( ) => setActiveView ( getInitialView ( ) ) ;
46+ window . addEventListener ( 'hashchange' , onHashChange ) ;
47+ return ( ) => window . removeEventListener ( 'hashchange' , onHashChange ) ;
48+ } , [ ] ) ;
49+
3250 setRTL ( isRTL ) ;
51+
3352 const onOptionSelect = ( event : SelectionEvents , data : OptionOnSelectData ) : void => {
3453 setValue ( data . optionText ?? "Light" ) ;
3554 saveSelection ( "Theme" , data . optionText ?? "Light" ) ;
3655 } ;
3756
57+ const handleTabSelect = ( _event : SelectTabEvent , data : SelectTabData ) => {
58+ const view = data . value as AppView ;
59+ setActiveView ( view ) ;
60+ window . location . hash = view ;
61+ } ;
62+
3863 const handleRTLSwitchChange = ( ) => {
3964 const newIsRTL = ! isRTL ;
4065 setisRTL ( newIsRTL ) ;
@@ -50,12 +75,6 @@ const App: React.FC = () => {
5075 saveSelection ( "DimensionSlidersEnabled" , newIsEnabled . toString ( ) ) ;
5176 } ;
5277
53- const handleChartOrderSwitchChange = ( ) => {
54- const newIsV9ChartFirst = ! isV9ChartFirst ;
55- setIsV9ChartFirst ( newIsV9ChartFirst ) ;
56- saveSelection ( "isV9ChartFirst" , newIsV9ChartFirst . toString ( ) ) ;
57- } ;
58-
5978 const handleSliderChange = ( event : React . ChangeEvent < HTMLInputElement > , data : SliderOnChangeData ) => {
6079 setChartWidth ( Number ( data . value ) ) ;
6180 saveSelection ( "ChartWidth" , data . value . toString ( ) ) ;
@@ -66,41 +85,44 @@ const App: React.FC = () => {
6685 saveSelection ( "ChartHeight" , data . value . toString ( ) ) ;
6786 } ;
6887
88+ const chartWidthProp = isDimensionSlidersEnabled ? chartWidth : undefined ;
89+ const chartHeightProp = isDimensionSlidersEnabled ? chartHeight : undefined ;
90+
6991 return (
7092 < div >
7193 < FluentProvider theme = { value === "Light" ? webLightTheme : webDarkTheme } targetDocument = { document } >
7294 < PortalCompatProvider >
73- < Subtitle2 > Theme: </ Subtitle2 >
74- < Dropdown
75- value = { value }
76- onOptionSelect = { onOptionSelect }
77- >
78- < Option > Light </ Option >
79- < Option > Dark </ Option >
80- </ Dropdown >
81-
82- < Switch
83- data-testid = "rtl_switch"
84- checked = { isRTL }
85- onChange = { handleRTLSwitchChange }
86- label = { labelRTLMode }
87- />
88- < Switch
89- checked = { isDimensionSlidersEnabled }
90- onChange = { handleDimensionSlidersChange }
91- label = { labelDimensionSwitch }
92- />
93- < Switch
94- checked = { isV9ChartFirst }
95- onChange = { handleChartOrderSwitchChange }
96- label = { labelChartOrderSwitch }
97- / >
98-
99- < Body2 > @fluentui/react-charting </ Body2 > < Subtitle2 > v5.25.6</ Subtitle2 >
100- < Body2 > @fluentui/react-charts </ Body2 > < Subtitle2 > 0.0.0-nightly-20260212-0406 .1</ Subtitle2 >
101- < br / >
102- { isDimensionSlidersEnabled && ( < >
103- < div style = { { display : 'flex' , flexDirection : isRTL ? 'row-reverse' : 'row' , alignItems : 'center' , gap : '20px' } } >
95+ < div style = { { display : 'flex' , alignItems : 'center' , flexWrap : 'wrap' , gap : '8px' , padding : '4px 8px' } } >
96+ < TabList selectedValue = { activeView } onTabSelect = { handleTabSelect } >
97+ < Tab value = "plotly" > Plotly Schemas </ Tab >
98+ < Tab value = "vega" > Vega-Lite Schemas </ Tab >
99+ </ TabList >
100+ < Subtitle2 > Theme: </ Subtitle2 >
101+ < Dropdown
102+ value = { value }
103+ onOptionSelect = { onOptionSelect }
104+ >
105+ < Option > Light </ Option >
106+ < Option > Dark </ Option >
107+ </ Dropdown >
108+ < Switch
109+ data-testid = "rtl_switch"
110+ checked = { isRTL }
111+ onChange = { handleRTLSwitchChange }
112+ label = { labelRTLMode }
113+ />
114+ < Switch
115+ checked = { isDimensionSlidersEnabled }
116+ onChange = { handleDimensionSlidersChange }
117+ label = { labelDimensionSwitch }
118+ />
119+ </ div >
120+ < div style = { { padding : '0 8px' } } >
121+ < Body2 > @fluentui/react-charting </ Body2 > < Subtitle2 > v5.25.6</ Subtitle2 >
122+ < Body2 > @fluentui/react-charts </ Body2 > < Subtitle2 > 0.0.0-nightly-20260302-0516 .1</ Subtitle2 >
123+ </ div >
124+ { isDimensionSlidersEnabled && (
125+ < div style = { { display : 'flex' , flexDirection : isRTL ? 'row-reverse' : 'row' , alignItems : 'center' , gap : '20px' , padding : '4px 8px' } } >
104126 < div style = { { display : 'flex' , alignItems : 'center' , gap : '10px' } } >
105127 < Subtitle2 > Chart Width:</ Subtitle2 >
106128 < Slider
@@ -120,13 +142,21 @@ const App: React.FC = () => {
120142 />
121143 </ div >
122144 </ div >
123- </ > ) }
124- < ChartWrapper
125- width = { isDimensionSlidersEnabled ? chartWidth : undefined }
126- height = { isDimensionSlidersEnabled ? chartHeight : undefined }
127- isReversedOrder = { isV9ChartFirst }
128- isRTL = { isRTL }
129- />
145+ ) }
146+ { activeView === 'plotly' ? (
147+ < ChartWrapper
148+ width = { chartWidthProp }
149+ height = { chartHeightProp }
150+ isReversedOrder = { true }
151+ isRTL = { isRTL }
152+ />
153+ ) : (
154+ < VegaChartWrapper
155+ width = { chartWidthProp }
156+ height = { chartHeightProp }
157+ isReversedOrder = { true }
158+ />
159+ ) }
130160 </ PortalCompatProvider >
131161 </ FluentProvider >
132162 </ div >
0 commit comments