1
1
import { useStore } from "@nanostores/react" ;
2
2
import {
3
+ ChevronDownIcon ,
3
4
NotebookAndPenIcon ,
4
5
PaintBrushIcon ,
5
6
PlayIcon ,
@@ -12,10 +13,13 @@ import {
12
13
DropdownMenuSeparator ,
13
14
Flex ,
14
15
Kbd ,
16
+ MenuCheckedIcon ,
15
17
menuItemCss ,
16
- styled ,
17
18
theme ,
19
+ ToolbarToggleGroup ,
18
20
ToolbarToggleItem ,
21
+ Tooltip ,
22
+ Text ,
19
23
} from "@webstudio-is/design-system" ;
20
24
import {
21
25
DropdownMenu ,
@@ -29,17 +33,11 @@ import {
29
33
$isDesignModeAllowed ,
30
34
isBuilderMode ,
31
35
setBuilderMode ,
32
- type BuilderMode ,
36
+ toggleBuilderMode ,
33
37
} from "~/shared/nano-states" ;
34
38
import { useState } from "react" ;
35
39
import { isFeatureEnabled } from "@webstudio-is/feature-flags" ;
36
40
37
- const StyledMenuItem = styled ( DropdownMenuRadioItem , {
38
- "&:where([data-state='checked'])" : {
39
- backgroundColor : `oklch(from ${ theme . colors . backgroundItemMenuItemHover } l c h / 0.3)` ,
40
- } ,
41
- } ) ;
42
-
43
41
export const BuilderModeDropDown = ( ) => {
44
42
const builderMode = useStore ( $builderMode ) ;
45
43
const isContentModeAllowed = useStore ( $isContentModeAllowed ) ;
@@ -60,18 +58,13 @@ export const BuilderModeDropDown = () => {
60
58
shortcut : [ "cmd" , "shift" , "c" ] ,
61
59
enabled : isContentModeAllowed && isFeatureEnabled ( "contentEditableMode" ) ,
62
60
} ,
63
- preview : {
64
- icon : < PlayIcon /> ,
65
- description : "View the page as it will appear to users" ,
66
- title : "Preview" ,
67
- shortcut : [ "cmd" , "shift" , "p" ] ,
68
- enabled : true ,
69
- } ,
70
61
} as const ;
71
62
72
- const [ activeMode , setActiveMode ] = useState < BuilderMode | undefined > ( ) ;
63
+ const [ activeMode , setActiveMode ] = useState <
64
+ keyof typeof menuItems | undefined
65
+ > ( ) ;
73
66
74
- const handleFocus = ( mode : BuilderMode ) => ( ) => {
67
+ const handleFocus = ( mode : keyof typeof menuItems ) => ( ) => {
75
68
setActiveMode ( mode ) ;
76
69
} ;
77
70
@@ -80,62 +73,88 @@ export const BuilderModeDropDown = () => {
80
73
} ;
81
74
82
75
return (
83
- < DropdownMenu >
84
- < DropdownMenuTrigger asChild >
85
- < ToolbarToggleItem
86
- value = "preview"
87
- aria-label = "Toggle Preview"
88
- variant = "preview"
89
- tabIndex = { 0 }
90
- >
91
- { menuItems [ builderMode ] . icon }
92
- </ ToolbarToggleItem >
93
- </ DropdownMenuTrigger >
94
-
95
- < DropdownMenuPortal >
96
- < DropdownMenuContent
97
- sideOffset = { 4 }
98
- collisionPadding = { 16 }
99
- side = "bottom"
100
- loop
76
+ < Flex align = "center" >
77
+ < Tooltip
78
+ content = {
79
+ < Flex gap = "1" >
80
+ < Text variant = "regular" > Toggle preview</ Text >
81
+ < Kbd value = { [ "cmd" , "shift" , "p" ] } />
82
+ </ Flex >
83
+ }
84
+ >
85
+ < ToolbarToggleGroup
86
+ type = "single"
87
+ value = { builderMode }
88
+ onValueChange = { ( ) => {
89
+ toggleBuilderMode ( "preview" ) ;
90
+ } }
101
91
>
102
- < DropdownMenuRadioGroup
103
- value = { builderMode }
104
- onValueChange = { ( value ) => {
105
- if ( isBuilderMode ( value ) ) {
106
- setBuilderMode ( value ) ;
107
- }
108
- } }
92
+ < ToolbarToggleItem variant = "preview" value = "preview" >
93
+ < PlayIcon />
94
+ </ ToolbarToggleItem >
95
+ </ ToolbarToggleGroup >
96
+ </ Tooltip >
97
+ < DropdownMenu >
98
+ < Tooltip content = { "Choose mode" } >
99
+ < DropdownMenuTrigger asChild >
100
+ < ToolbarToggleItem
101
+ tabIndex = { 0 }
102
+ aria-label = "Choose mode"
103
+ variant = "chevron"
104
+ value = "chevron"
105
+ >
106
+ < ChevronDownIcon />
107
+ </ ToolbarToggleItem >
108
+ </ DropdownMenuTrigger >
109
+ </ Tooltip >
110
+ < DropdownMenuPortal >
111
+ < DropdownMenuContent
112
+ sideOffset = { 4 }
113
+ collisionPadding = { 16 }
114
+ side = "bottom"
115
+ loop
109
116
>
110
- { Object . entries ( menuItems )
111
- . filter ( ( [ _ , { enabled } ] ) => enabled )
112
- . map ( ( [ mode , { icon, title, shortcut } ] ) => (
113
- < StyledMenuItem
114
- key = { mode }
115
- value = { mode }
116
- onFocus = { handleFocus ( mode as BuilderMode ) }
117
- onBlur = { handleBlur }
118
- >
119
- < Flex css = { { px : theme . spacing [ 3 ] } } gap = { 2 } >
120
- { icon }
121
- < Box > { title } </ Box >
122
- </ Flex >
123
- < DropdownMenuItemRightSlot >
124
- < Kbd value = { shortcut } />
125
- </ DropdownMenuItemRightSlot >
126
-
127
- </ StyledMenuItem >
128
- ) ) }
129
- </ DropdownMenuRadioGroup >
130
- < DropdownMenuSeparator />
117
+ < DropdownMenuRadioGroup
118
+ value = { builderMode }
119
+ onValueChange = { ( value ) => {
120
+ if ( isBuilderMode ( value ) ) {
121
+ setBuilderMode ( value ) ;
122
+ }
123
+ } }
124
+ >
125
+ { Object . entries ( menuItems )
126
+ . filter ( ( [ _ , { enabled } ] ) => enabled )
127
+ . map ( ( [ mode , { icon, title, shortcut } ] ) => (
128
+ < DropdownMenuRadioItem
129
+ key = { mode }
130
+ value = { mode }
131
+ onFocus = { handleFocus ( mode as keyof typeof menuItems ) }
132
+ onBlur = { handleBlur }
133
+ icon = { < MenuCheckedIcon /> }
134
+ >
135
+ < Flex css = { { px : theme . spacing [ 3 ] } } gap = { 2 } >
136
+ { icon }
137
+ < Box > { title } </ Box >
138
+ </ Flex >
139
+ < DropdownMenuItemRightSlot >
140
+ < Kbd value = { shortcut } />
141
+ </ DropdownMenuItemRightSlot >
142
+
143
+ </ DropdownMenuRadioItem >
144
+ ) ) }
145
+ </ DropdownMenuRadioGroup >
146
+ < DropdownMenuSeparator />
131
147
132
- < div className = { menuItemCss ( { hint : true } ) } >
133
- < Box css = { { width : theme . spacing [ 25 ] } } >
134
- { menuItems [ activeMode ?? builderMode ] . description }
135
- </ Box >
136
- </ div >
137
- </ DropdownMenuContent >
138
- </ DropdownMenuPortal >
139
- </ DropdownMenu >
148
+ < div className = { menuItemCss ( { hint : true } ) } >
149
+ < Box css = { { width : theme . spacing [ 25 ] } } >
150
+ { activeMode
151
+ ? menuItems [ activeMode ] . description
152
+ : "Select Design or Content mode" }
153
+ </ Box >
154
+ </ div >
155
+ </ DropdownMenuContent >
156
+ </ DropdownMenuPortal >
157
+ </ DropdownMenu >
158
+ </ Flex >
140
159
) ;
141
160
} ;
0 commit comments