{"version":3,"file":"useLayout.mjs","sources":["../../../../../../src/components/va-layout/hooks/useLayout.ts"],"sourcesContent":["import { ComputedRef, ExtractPropTypes, InjectionKey, PropType, Ref, computed, inject, onBeforeUnmount, provide, ref, watchEffect } from 'vue'\nimport { AreaName } from './useGridTemplateArea'\n\n// Unwrap type, e.g.: removes name from type alias and returns the type\ntype UnwrapType<T> = true extends boolean ? T : never\n\nexport type AreaConfig = UnwrapType<{\n  absolute?: boolean,\n  order?: number,\n  fixed?: boolean,\n  overlay?: boolean,\n}>\n\nexport const useLayoutProps = {\n  top: {\n    type: Object as PropType<AreaConfig>,\n    default: () => ({ order: 2 }),\n  },\n  right: {\n    type: Object as PropType<AreaConfig>,\n    default: () => ({ order: 1 }),\n  },\n  left: {\n    type: Object as PropType<AreaConfig>,\n    default: () => ({ order: 1 }),\n  },\n  bottom: {\n    type: Object as PropType<AreaConfig>,\n    default: () => ({ order: 2 }),\n  },\n}\n\nexport type LayoutProps = ExtractPropTypes<typeof useLayoutProps>\n\ntype LayoutItem = {\n  sizes: DOMRectReadOnly,\n}\n\nconst VaLayoutKey = 'VaLayout' as unknown as InjectionKey<{\n  items: Ref<Record<AreaName, LayoutItem | null>>,\n  paddings: ComputedRef<Record<AreaName, number>>,\n  orders: ComputedRef<Record<AreaName, number>>,\n}>\n\nexport const useLayout = (props: ExtractPropTypes<typeof useLayoutProps>) => {\n  const items = ref<Record<AreaName, LayoutItem | null>>({\n    top: null,\n    right: null,\n    bottom: null,\n    left: null,\n  })\n\n  const paddings = computed(() => {\n    const { top, right, bottom, left } = items.value\n    const { top: topConfig, right: rightConfig, bottom: bottomConfig, left: leftConfig } = props\n\n    return {\n      top: top && !topConfig.absolute ? top.sizes.height : 0,\n      right: right && !rightConfig.absolute ? right.sizes.width : 0,\n      bottom: bottom && !bottomConfig.absolute ? bottom.sizes.height : 0,\n      left: left && !leftConfig.absolute ? left.sizes.width : 0,\n    }\n  })\n\n  const orders = computed(() => ({\n    top: props.top.order || 0,\n    right: props.right.order || 0,\n    bottom: props.bottom.order || 0,\n    left: props.left.order || 0,\n  }))\n\n  provide(VaLayoutKey, {\n    items,\n    paddings,\n    orders,\n  })\n\n  return {\n    paddings,\n    orders,\n    items,\n  }\n}\n\nexport const useFixedLayoutChild = (area: AreaName, sizes: Ref<DOMRectReadOnly | null>) => {\n  const layout = inject(VaLayoutKey, null)\n\n  if (!layout) {\n    throw new Error('VaLayoutChild must be used inside VaLayout')\n  }\n\n  watchEffect(() => {\n    if (sizes.value) {\n      layout.items.value[area] = {\n        sizes: sizes.value,\n      }\n    } else {\n      layout.items.value[area] = null\n    }\n  })\n\n  onBeforeUnmount(() => {\n    layout.items.value[area] = null\n  })\n\n  return {\n    paddings: computed(() => {\n      return Object\n        .keys(layout.paddings.value)\n        .reduce((acc, key) => {\n          if (layout.orders.value[key as AreaName] > layout.orders.value[area]) {\n            acc[key as AreaName] = layout.paddings.value[key as AreaName]\n          }\n          return acc\n        }, {} as Record<AreaName, number>)\n    }),\n  }\n}\n"],"names":[],"mappings":";AAaO,MAAM,iBAAiB;AAAA,EAC5B,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS,OAAO,EAAE,OAAO;EAC3B;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO,EAAE,OAAO;EAC3B;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS,OAAO,EAAE,OAAO;EAC3B;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS,OAAO,EAAE,OAAO;EAC3B;AACF;AAQA,MAAM,cAAc;AAMP,MAAA,YAAY,CAAC,UAAmD;AAC3E,QAAM,QAAQ,IAAyC;AAAA,IACrD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA,CACP;AAEK,QAAA,WAAW,SAAS,MAAM;AAC9B,UAAM,EAAE,KAAK,OAAO,QAAQ,SAAS,MAAM;AACrC,UAAA,EAAE,KAAK,WAAW,OAAO,aAAa,QAAQ,cAAc,MAAM,WAAe,IAAA;AAEhF,WAAA;AAAA,MACL,KAAK,OAAO,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS;AAAA,MACrD,OAAO,SAAS,CAAC,YAAY,WAAW,MAAM,MAAM,QAAQ;AAAA,MAC5D,QAAQ,UAAU,CAAC,aAAa,WAAW,OAAO,MAAM,SAAS;AAAA,MACjE,MAAM,QAAQ,CAAC,WAAW,WAAW,KAAK,MAAM,QAAQ;AAAA,IAAA;AAAA,EAC1D,CACD;AAEK,QAAA,SAAS,SAAS,OAAO;AAAA,IAC7B,KAAK,MAAM,IAAI,SAAS;AAAA,IACxB,OAAO,MAAM,MAAM,SAAS;AAAA,IAC5B,QAAQ,MAAM,OAAO,SAAS;AAAA,IAC9B,MAAM,MAAM,KAAK,SAAS;AAAA,EAC1B,EAAA;AAEF,UAAQ,aAAa;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAEM,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEa,MAAA,sBAAsB,CAAC,MAAgB,UAAuC;AACnF,QAAA,SAAS,OAAO,aAAa,IAAI;AAEvC,MAAI,CAAC,QAAQ;AACL,UAAA,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,cAAY,MAAM;AAChB,QAAI,MAAM,OAAO;AACR,aAAA,MAAM,MAAM,IAAI,IAAI;AAAA,QACzB,OAAO,MAAM;AAAA,MAAA;AAAA,IACf,OACK;AACE,aAAA,MAAM,MAAM,IAAI,IAAI;AAAA,IAC7B;AAAA,EAAA,CACD;AAED,kBAAgB,MAAM;AACb,WAAA,MAAM,MAAM,IAAI,IAAI;AAAA,EAAA,CAC5B;AAEM,SAAA;AAAA,IACL,UAAU,SAAS,MAAM;AAChB,aAAA,OACJ,KAAK,OAAO,SAAS,KAAK,EAC1B,OAAO,CAAC,KAAK,QAAQ;AAChB,YAAA,OAAO,OAAO,MAAM,GAAe,IAAI,OAAO,OAAO,MAAM,IAAI,GAAG;AACpE,cAAI,GAAe,IAAI,OAAO,SAAS,MAAM,GAAe;AAAA,QAC9D;AACO,eAAA;AAAA,MACT,GAAG,CAA8B,CAAA;AAAA,IAAA,CACpC;AAAA,EAAA;AAEL;"}