1- import { css } from '@emotion/react'
1+ import { css , keyframes } from '@emotion/react'
22import * as Dialog from '@radix-ui/react-dialog'
33import { XIcon } from 'lucide-react'
44
@@ -8,23 +8,39 @@ import { BrowserEvent } from '@/schemas/recording'
88import { NodeSelector } from '@/schemas/selectors'
99import { RecordingContext } from '@/views/Recorder/RecordingContext'
1010
11+ import { RecorderSettings } from './RecorderSettings'
12+ import { useInBrowserSettings } from './SettingsProvider'
1113import { useStudioClient } from './StudioClientProvider'
14+ import { ToolBoxLogo } from './ToolBox/ToolBoxLogo'
15+
16+ const slideIn = keyframes `
17+ from {
18+ transform : translateX (100% );
19+ }
20+ to {
21+ transform : translateX (0 );
22+ }
23+ `
24+
25+ const slideOut = keyframes `
26+ from {
27+ transform : translateX (0 );
28+ }
29+ to {
30+ transform : translateX (100% );
31+ }
32+ `
1233
1334interface EventDrawerProps {
1435 open : boolean
15- editing : boolean
1636 events : BrowserEvent [ ]
1737 onOpenChange : ( open : boolean ) => void
1838}
1939
20- export function EventDrawer ( {
21- open,
22- editing,
23- events,
24- onOpenChange,
25- } : EventDrawerProps ) {
40+ export function EventDrawer ( { open, events, onOpenChange } : EventDrawerProps ) {
2641 const client = useStudioClient ( )
2742 const container = useContainerElement ( )
43+ const [ settings , setSettings ] = useInBrowserSettings ( )
2844
2945 const handleHighlight = ( selector : NodeSelector | null ) => {
3046 client . send ( {
@@ -42,11 +58,32 @@ export function EventDrawer({
4258
4359 return (
4460 < RecordingContext recording >
45- < Dialog . Root modal = { false } open = { open } onOpenChange = { onOpenChange } >
46- < Dialog . Portal container = { container } forceMount >
47- < Dialog . Overlay />
61+ < Dialog . Root modal = { true } open = { open } onOpenChange = { onOpenChange } >
62+ < Dialog . Portal container = { container } >
63+ < Dialog . Overlay
64+ css = { css `
65+ position : fixed;
66+ inset : 0 ;
67+ z-index : var (--studio-layer-0 );
68+ background : rgb (0 0 0 / 0.28 );
69+ opacity : 0 ;
70+ pointer-events : none;
71+ transition : opacity 0.2s ease-out;
72+
73+ & [data-state = 'open' ] {
74+ opacity : 1 ;
75+ pointer-events : auto;
76+ }
77+
78+ @media (prefers-reduced-motion : reduce) {
79+ transition : none;
80+ }
81+ ` }
82+ onPointerDown = { ( ) => {
83+ onOpenChange ( false )
84+ } }
85+ />
4886 < Dialog . Content
49- forceMount
5087 css = { css `
5188 position : fixed;
5289 top : 0 ;
@@ -66,32 +103,18 @@ export function EventDrawer({
66103 overflow-y : hidden;
67104 overscroll-behavior : contain;
68105
69- /* Default closed state */
70- transform : translateX (100% );
71- transition : transform 0.3s cubic-bezier (0.22 , 1 , 0.36 , 1 );
72-
73106 & [data-state = 'open' ] {
74- transform : translateX ( 0 );
107+ animation : ${ slideIn } 0.3 s cubic-bezier ( 0.22 , 1 , 0.36 , 1 );
75108 }
76109
77110 & [data-state = 'closed' ] {
78- transform : translateX ( 100 % );
111+ animation : ${ slideOut } 0.3 s cubic-bezier ( 0.22 , 1 , 0.36 , 1 );
79112 }
80113
81114 @media (prefers-reduced-motion : reduce) {
82115 transition : none;
83116 }
84117 ` }
85- onEscapeKeyDown = { ( event ) => {
86- // If the user is currently editing something, the escape key should deselect
87- // the tool and not close the drawer.
88- if ( editing ) {
89- event . preventDefault ( )
90- }
91- } }
92- onInteractOutside = { ( event ) => {
93- event . preventDefault ( )
94- } }
95118 >
96119 < div
97120 css = { css `
@@ -108,9 +131,13 @@ export function EventDrawer({
108131 < Dialog . Title
109132 css = { css `
110133 margin : 0 ;
134+ display : flex;
135+ align-items : center;
136+ gap : var (--studio-spacing-2 );
111137 ` }
112138 >
113- Events
139+ < ToolBoxLogo size = { 24 } />
140+ < span > k6 Studio</ span >
114141 </ Dialog . Title >
115142 < Dialog . Close
116143 aria-label = "Close event list"
@@ -137,16 +164,47 @@ export function EventDrawer({
137164 </ div >
138165 < div
139166 css = { css `
140- padding : 0 var (--studio-spacing-4 );
141- overflow-x : auto;
142- overscroll-behavior : contain;
167+ display : flex;
168+ flex-direction : column;
143169 flex : 1 1 0 ;
144170 ` }
145171 >
146- < BrowserEventList
147- events = { events }
148- onNavigate = { handleNavigate }
149- onHighlight = { handleHighlight }
172+ < div
173+ css = { css `
174+ overflow-x : auto;
175+ overflow-y : auto;
176+ overscroll-behavior : contain;
177+ flex : 1 1 0 ;
178+ min-height : 0 ;
179+ ` }
180+ >
181+ < BrowserEventList
182+ events = { events }
183+ onNavigate = { handleNavigate }
184+ onHighlight = { handleHighlight }
185+ />
186+ </ div >
187+ </ div >
188+ < div
189+ css = { css `
190+ flex-shrink : 0 ;
191+ border-top : 1px solid var (--studio-border-color );
192+ padding : var (--studio-spacing-4 );
193+ background-color : inherit;
194+ ` }
195+ >
196+ < h2
197+ css = { css `
198+ margin : 0 0 var (--studio-spacing-3 );
199+ font-size : var (--studio-font-size-3 );
200+ font-weight : 700 ;
201+ ` }
202+ >
203+ Settings
204+ </ h2 >
205+ < RecorderSettings
206+ settings = { settings }
207+ onSettingsChange = { setSettings }
150208 />
151209 </ div >
152210 </ Dialog . Content >
0 commit comments