-import { ref } from 'vue'
+import { onBeforeUnmount, onMounted, ref } from 'vue'
import AppSidebar from '@/components/AppSidebar.vue'
import BottomDrawer from '@/components/BottomDrawer.vue'
import {
@@ -15,6 +15,9 @@ import { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/s
const route = useRoute()
const { breadcrumbs: customBreadcrumbs } = useBreadcrumbs()
+const drawerBounds = useState('bottomDrawerBounds', () => ({ left: 0, width: 0 }))
+const insetRef = ref
(null)
+let resizeObserver: ResizeObserver | null = null
const breadcrumbs = computed(() => {
// If custom breadcrumbs are set by the page, use those
@@ -30,12 +33,47 @@ const breadcrumbs = computed(() => {
isLast: index === paths.length - 1,
}))
})
+
+const resolveInsetEl = (): HTMLElement | null => {
+ const maybeComponent = insetRef.value as any
+ if (!maybeComponent) return null
+ return maybeComponent.$el ? maybeComponent.$el as HTMLElement : (maybeComponent as HTMLElement)
+}
+
+const updateBounds = () => {
+ const el = resolveInsetEl()
+ if (!el || typeof el.getBoundingClientRect !== 'function') return
+ const rect = el.getBoundingClientRect()
+ drawerBounds.value = {
+ left: rect.left,
+ width: rect.width,
+ }
+}
+
+onMounted(() => {
+ updateBounds()
+ const el = resolveInsetEl()
+ if (el && 'ResizeObserver' in window) {
+ resizeObserver = new ResizeObserver(updateBounds)
+ resizeObserver.observe(el)
+ }
+ window.addEventListener('resize', updateBounds)
+})
+
+onBeforeUnmount(() => {
+ const el = resolveInsetEl()
+ if (resizeObserver && el) {
+ resizeObserver.unobserve(el)
+ }
+ resizeObserver = null
+ window.removeEventListener('resize', updateBounds)
+})
-
+