diff --git a/packages/frontend-2/components/viewer/controls/Left.vue b/packages/frontend-2/components/viewer/controls/Left.vue
index 9e77dd420..4440740d3 100644
--- a/packages/frontend-2/components/viewer/controls/Left.vue
+++ b/packages/frontend-2/components/viewer/controls/Left.vue
@@ -166,9 +166,15 @@
@@ -212,49 +218,7 @@ const emit = defineEmits<{
forceClosePanels: []
}>()
-const width = ref(264)
-const scrollableControlsContainer = ref(null as Nullable)
-const height = ref(scrollableControlsContainer.value?.clientHeight)
-const isResizing = ref(false)
-const resizeHandle = ref(null)
const { width: windowWidth } = useWindowSize()
-let startWidth = 0
-let startX = 0
-
-const startResizing = (event: MouseEvent) => {
- if (isMobile.value) return
- event.preventDefault()
- isResizing.value = true
- startX = event.clientX
- startWidth = width.value
-}
-
-const throttledHandleMouseMove = useThrottleFn((event: MouseEvent) => {
- if (isResizing.value) {
- const diffX = event.clientX - startX
- const newWidth = Math.max(
- 240,
- Math.min(startWidth + diffX, Math.min(440, windowWidth.value * 0.5 - 60))
- )
- width.value = newWidth
- }
-}, 150)
-
-if (import.meta.client) {
- useResizeObserver(scrollableControlsContainer, (entries) => {
- const { height: newHeight } = entries[0].contentRect
- height.value = newHeight
- })
- useEventListener(resizeHandle, 'mousedown', startResizing)
-
- useEventListener(document, 'mousemove', throttledHandleMouseMove)
-
- useEventListener(document, 'mouseup', () => {
- if (isResizing.value) {
- isResizing.value = false
- }
- })
-}
const { isIntercomEnabled } = useIntercomEnabled()
const { resourceItems, modelsAndVersionIds } = useInjectedViewerLoadedResources()
@@ -263,6 +227,7 @@ const { isEnabled: isEmbedEnabled } = useEmbed()
const breakpoints = useBreakpoints(TailwindBreakpoints)
const isMobile = breakpoints.smaller('sm')
const isTablet = breakpoints.smaller('lg')
+const isLargerThanLg = breakpoints.greater('lg')
const { getTooltipProps } = useSmartTooltipDelay()
const isSavedViewsEnabled = useAreSavedViewsEnabled()
const isWorkspacesEnabled = useIsWorkspacesEnabled()
@@ -278,6 +243,74 @@ const {
const { onPanelButtonClick } = useViewerPanelsUtilities()
+const width = ref(264)
+const panelExtensionWidth = ref(isMobile.value ? 200 : isLargerThanLg.value ? 300 : 256)
+const scrollableControlsContainer = ref(null as Nullable)
+const height = ref(scrollableControlsContainer.value?.clientHeight)
+const isResizing = ref(false)
+const isPanelExtensionResizing = ref(false)
+const resizeHandle = ref(null)
+const panelExtensionResizeHandle = ref(null)
+
+let startWidth = 0
+let startX = 0
+let startPanelExtensionWidth = 0
+let startPanelExtensionX = 0
+
+const startResizing = (event: MouseEvent) => {
+ if (isMobile.value) return
+ event.preventDefault()
+ isResizing.value = true
+ startX = event.clientX
+ startWidth = width.value
+}
+
+const startPanelExtensionResizing = (event: MouseEvent) => {
+ if (isMobile.value) return
+ event.preventDefault()
+ isPanelExtensionResizing.value = true
+ startPanelExtensionX = event.clientX
+ startPanelExtensionWidth = panelExtensionWidth.value
+}
+
+const throttledHandleMouseMove = useThrottleFn((event: MouseEvent) => {
+ if (isResizing.value) {
+ const diffX = event.clientX - startX
+ const newWidth = Math.max(
+ 240,
+ Math.min(startWidth + diffX, Math.min(440, windowWidth.value * 0.5 - 60))
+ )
+ width.value = newWidth
+ } else if (isPanelExtensionResizing.value) {
+ const diffX = event.clientX - startPanelExtensionX
+ const newWidth = Math.max(
+ 200,
+ Math.min(startPanelExtensionWidth + diffX, Math.min(400, windowWidth.value * 0.4))
+ )
+ panelExtensionWidth.value = newWidth
+ }
+}, 150)
+
+if (import.meta.client) {
+ useResizeObserver(scrollableControlsContainer, (entries) => {
+ const { height: newHeight } = entries[0].contentRect
+ height.value = newHeight
+ })
+ useEventListener(resizeHandle, 'mousedown', startResizing)
+ useEventListener(panelExtensionResizeHandle, 'mousedown', startPanelExtensionResizing)
+
+ useEventListener(document, 'mousemove', throttledHandleMouseMove)
+
+ useEventListener(document, 'mouseup', () => {
+ if (isResizing.value) {
+ isResizing.value = false
+ }
+ if (isPanelExtensionResizing.value) {
+ isPanelExtensionResizing.value = false
+ }
+ })
+}
+
const hasActivePanel = computed(() => activePanel.value !== 'none')
const allAutomationRuns = computed(() => {
diff --git a/packages/frontend-2/components/viewer/filters/property-selection/Panel.vue b/packages/frontend-2/components/viewer/filters/property-selection/Panel.vue
index cba5f61d0..c0dc23446 100644
--- a/packages/frontend-2/components/viewer/filters/property-selection/Panel.vue
+++ b/packages/frontend-2/components/viewer/filters/property-selection/Panel.vue
@@ -1,5 +1,5 @@
-