{"version":3,"file":"tabs.mjs","sources":["../../../../../../packages/components/tabs/src/tabs.tsx"],"sourcesContent":["import {\n  computed,\n  createVNode,\n  defineComponent,\n  getCurrentInstance,\n  nextTick,\n  provide,\n  ref,\n  renderSlot,\n  watch,\n} from 'vue'\nimport {\n  buildProps,\n  definePropType,\n  isNumber,\n  isString,\n  isUndefined,\n} from '@lit-element/utils'\nimport { EVENT_CODE, UPDATE_MODEL_EVENT } from '@lit-element/constants'\nimport LtIcon from '@lit-element/components/icon'\nimport { useNamespace, useOrderedChildren } from '@lit-element/hooks'\nimport { Plus } from '@inte-cloud/icons-vue'\nimport { tabsRootContextKey } from './constants'\nimport TabNav from './tab-nav'\n\nimport type { TabNavInstance } from './tab-nav'\nimport type { TabsPaneContext } from './constants'\nimport type { ExtractPropTypes, FunctionalComponent, VNode } from 'vue'\nimport type { Awaitable } from '@lit-element/utils'\n\nexport type TabPaneName = string | number\n\nexport const tabsProps = buildProps({\n  /**\n   * @description type of Tab\n   */\n  type: {\n    type: String,\n    values: ['card', 'border-card', ''],\n    default: '',\n  },\n  /**\n   * @description whether Tab is closable\n   */\n  closable: Boolean,\n  /**\n   * @description whether Tab is addable\n   */\n  addable: Boolean,\n  /**\n   * @description binding value, name of the selected tab\n   */\n  modelValue: {\n    type: [String, Number],\n  },\n  /**\n   * @description whether Tab is addable and closable\n   */\n  editable: Boolean,\n  /**\n   * @description position of tabs\n   */\n  tabPosition: {\n    type: String,\n    values: ['top', 'right', 'bottom', 'left'],\n    default: 'top',\n  },\n  /**\n   * @description hook function before switching tab. If `false` is returned or a `Promise` is returned and then is rejected, switching will be prevented\n   */\n  beforeLeave: {\n    type: definePropType<\n      (newName: TabPaneName, oldName: TabPaneName) => Awaitable<void | boolean>\n    >(Function),\n    default: () => true,\n  },\n  /**\n   * @description whether width of tab automatically fits its container\n   */\n  stretch: Boolean,\n} as const)\nexport type TabsProps = ExtractPropTypes<typeof tabsProps>\n\nconst isPaneName = (value: unknown): value is string | number =>\n  isString(value) || isNumber(value)\n\nexport const tabsEmits = {\n  [UPDATE_MODEL_EVENT]: (name: TabPaneName) => isPaneName(name),\n  tabClick: (pane: TabsPaneContext, ev: Event) => ev instanceof Event,\n  tabChange: (name: TabPaneName) => isPaneName(name),\n  edit: (paneName: TabPaneName | undefined, action: 'remove' | 'add') =>\n    ['remove', 'add'].includes(action),\n  tabRemove: (name: TabPaneName) => isPaneName(name),\n  tabAdd: () => true,\n}\nexport type TabsEmits = typeof tabsEmits\n\nexport type TabsPanes = Record<number, TabsPaneContext>\n\nconst Tabs = defineComponent({\n  name: 'LtTabs',\n\n  props: tabsProps,\n  emits: tabsEmits,\n\n  setup(props, { emit, slots, expose }) {\n    const ns = useNamespace('tabs')\n\n    const isVertical = computed(() =>\n      ['left', 'right'].includes(props.tabPosition)\n    )\n\n    const {\n      children: panes,\n      addChild: sortPane,\n      removeChild: unregisterPane,\n    } = useOrderedChildren<TabsPaneContext>(getCurrentInstance()!, 'LtTabPane')\n\n    const nav$ = ref<TabNavInstance>()\n    const currentName = ref<TabPaneName>(props.modelValue ?? '0')\n\n    const setCurrentName = async (value?: TabPaneName, trigger = false) => {\n      // should do nothing.\n      if (currentName.value === value || isUndefined(value)) return\n\n      try {\n        const canLeave = await props.beforeLeave?.(value, currentName.value)\n        if (canLeave !== false) {\n          currentName.value = value\n          if (trigger) {\n            emit(UPDATE_MODEL_EVENT, value)\n            emit('tabChange', value)\n          }\n\n          nav$.value?.removeFocus?.()\n        }\n      } catch {}\n    }\n\n    const handleTabClick = (\n      tab: TabsPaneContext,\n      tabName: TabPaneName,\n      event: Event\n    ) => {\n      if (tab.props.disabled) return\n      setCurrentName(tabName, true)\n      emit('tabClick', tab, event)\n    }\n\n    const handleTabRemove = (pane: TabsPaneContext, ev: Event) => {\n      if (pane.props.disabled || isUndefined(pane.props.name)) return\n      ev.stopPropagation()\n      emit('edit', pane.props.name, 'remove')\n      emit('tabRemove', pane.props.name)\n    }\n\n    const handleTabAdd = () => {\n      emit('edit', undefined, 'add')\n      emit('tabAdd')\n    }\n\n    watch(\n      () => props.modelValue,\n      (modelValue) => setCurrentName(modelValue)\n    )\n\n    watch(currentName, async () => {\n      await nextTick()\n      nav$.value?.scrollToActiveTab()\n    })\n\n    provide(tabsRootContextKey, {\n      props,\n      currentName,\n      registerPane: (pane: TabsPaneContext) => {\n        panes.value.push(pane)\n      },\n      sortPane,\n      unregisterPane,\n    })\n\n    expose({\n      currentName,\n    })\n    const TabNavRenderer: FunctionalComponent<{ render: () => VNode }> = ({\n      render,\n    }) => {\n      return render()\n    }\n    return () => {\n      const addSlot = slots['add-icon']\n      const newButton =\n        props.editable || props.addable ? (\n          <div\n            class={[\n              ns.e('new-tab'),\n              isVertical.value && ns.e('new-tab-vertical'),\n            ]}\n            tabindex=\"0\"\n            onClick={handleTabAdd}\n            onKeydown={(ev: KeyboardEvent) => {\n              if (ev.code === EVENT_CODE.enter) handleTabAdd()\n            }}\n          >\n            {addSlot ? (\n              renderSlot(slots, 'add-icon')\n            ) : (\n              <LtIcon class={ns.is('icon-plus')}>\n                <Plus />\n              </LtIcon>\n            )}\n          </div>\n        ) : null\n\n      const header = (\n        <div\n          class={[\n            ns.e('header'),\n            isVertical.value && ns.e('header-vertical'),\n            ns.is(props.tabPosition),\n          ]}\n        >\n          <TabNavRenderer\n            render={() => {\n              const hasLabelSlot = panes.value.some((pane) => pane.slots.label)\n              return createVNode(\n                TabNav,\n                {\n                  ref: nav$,\n                  currentName: currentName.value,\n                  editable: props.editable,\n                  type: props.type,\n                  panes: panes.value,\n                  stretch: props.stretch,\n                  onTabClick: handleTabClick,\n                  onTabRemove: handleTabRemove,\n                },\n                { $stable: !hasLabelSlot }\n              )\n            }}\n          />\n          {newButton}\n        </div>\n      )\n\n      const panels = (\n        <div class={ns.e('content')}>{renderSlot(slots, 'default')}</div>\n      )\n\n      return (\n        <div\n          class={[\n            ns.b(),\n            ns.m(props.tabPosition),\n            {\n              [ns.m('card')]: props.type === 'card',\n              [ns.m('border-card')]: props.type === 'border-card',\n            },\n          ]}\n        >\n          {panels}\n          {header}\n        </div>\n      )\n    }\n  },\n})\n\nexport type TabsInstance = InstanceType<typeof Tabs> & {\n  currentName: TabPaneName\n}\n\nexport default Tabs\n"],"names":["tabsProps","buildProps","type","values","default","closable","addable","modelValue","String","editable","Boolean","tabPosition","beforeLeave","definePropType","stretch","isPaneName","value","name","ev","Event","tabChange","edit","action","tabRemove","Tabs","defineComponent","props","emits","expose","useNamespace","children","addChild","removeChild","getCurrentInstance","nav$","currentName","setCurrentName","trigger","canLeave","emit","UPDATE_MODEL_EVENT","removeFocus","handleTabClick","tab","isUndefined","handleTabAdd","watch","nextTick","tabsRootContextKey","_createVNode","pane","panes","unregisterPane","TabNavRenderer","render","newButton","e","code","EVENT_CODE","addSlot","renderSlot","header","createVNode","TabNav","ref","onTabClick","onTabRemove"],"mappings":";;;;;;;;;;;;;;;;AAgCaA,MAAAA,SAAS,GAAGC,UAAU,CAAC;AAClC,EAAA,IAAA,EAAA;AACF,IAAA,IAAA,EAAA,MAAA;AACA,IAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA;AACEC,IAAAA,OAAM,EAAA,EAAA;AACJA,GAAAA;AACAC,EAAAA,QAAM,EAAE,OAAO;AACfC,EAAAA,OAAAA,EAAO,OAAE;EACX,UAAC,EAAA;AACD,IAAA,IAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA;AACF,GAAA;AACA,EAAA,QAAA,EAAA,OAAA;AACEC,EAAAA,WAAiB,EAAA;AACjB,IAAA,IAAA,EAAA,MAAA;AACF,IAAA,MAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,CAAA;AACA,IAAA,OAAA,EAAA,KAAA;AACEC,GAAAA;AACA,EAAA,WAAA,EAAA;AACF,IAAA,IAAA,EAAA,cAAA,CAAA,QAAA,CAAA;AACA,IAAA,OAAA,EAAA,MAAA,IAAA;AACEC,GAAAA;AACEL,EAAAA,OAAM,EAACM,OAAM;GACd;AACD,MAAA,UAAA,GAAA,CAAA,KAAA,KAAA,QAAA,CAAA,KAAA,CAAA,IAAA,QAAA,CAAA,KAAA,CAAA,CAAA;AACF,MAAA,SAAA,GAAA;AACA,EAAA,CAAA,kBAAA,GAAA,CAAA,IAAA,KAAA,UAAA,CAAA,IAAA,CAAA;AACEC,EAAAA,QAAQ,EAAEC,CAAO,IAAA,EAAA,EAAA,KAAA,EAAA,YAAA,KAAA;AACjB,EAAA,SAAA,EAAA,CAAA,IAAA,KAAA,UAAA,CAAA,IAAA,CAAA;AACF,EAAA,IAAA,EAAA,CAAA,QAAA,EAAA,MAAA,KAAA,CAAA,QAAA,EAAA,KAAA,CAAA,CAAA,QAAA,CAAA,MAAA,CAAA;AACA,EAAA,SAAA,EAAA,CAAA,IAAA,KAAA,UAAA,CAAA,IAAA,CAAA;AACEC,EAAAA,MAAAA,EAAAA,MAAa,IAAA;AACXT,EAAAA;AACM,MAAA,IAAA,GAAG,eAAgB,CAAA;AACzBE,EAAAA,IAAAA,EAAAA,QAAS;EACX,KAAC,EAAA,SAAA;AACD,EAAA,KAAA,EAAA,SAAA;AACF,EAAA,KAAA,CAAA,KAAA,EAAA;AACA,IAAA,IAAA;AACEQ,IAAAA,KAAAA;AACEV,IAAAA,MAAMW;KAGC;IACR,IAAA,EAAA,CAAA;AACD,IAAA,MAAA,EAAA,GAAA,YAAA,CAAA,MAAA,CAAA,CAAA;AACF,IAAA,MAAA,UAAA,GAAA,QAAA,CAAA,MAAA,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,QAAA,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA;AACA,IAAA,MAAA;AACEC,MAAAA,QAASJ,EAAAA,KAAAA;AACX,MAAW,QAAA,EAAA,QAAA;AAGX,MAAMK,WAAU,EAAIC,cACV;AAEV,KAAO,GAAA,kBAAkB,CAAA,kBAAA,EAAA,EAAA,WAAA,CAAA,CAAA;AACvB,sBAAuBC,CAAAA;IACf,MAAA,WAAmC,GAAKC,GAAAA,CAAE,YAAYC,UAAK,KAAA,IAAA,GAAA,EAAA,GAAA,GAAA,CAAA,CAAA;AACnEC,IAAAA,MAAAA,cAA4C,GAAA,YAAM,EAAA,OAAA,GAAA,KAAA,KAAA;AAClDC,MAAI,IAAoC,GAAA,EAAA,EAAA,EAAEC;AAE1CC,MAAAA,IAAAA,WAAkCR,CAAU,KAAA,KAACE,KAAK,IAAA,WAAA,CAAA,KAAA,CAAA;QAC5C,OAAQ;AAChB,MAAC,IAAA;AAKD,QAAMO,MAAOC,QAAAA,GAAAA,OAAgB,CAAA,GAAA,GAAA,KAAA,CAAA,WAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,KAAA,EAAA,KAAA,EAAA,WAAA,CAAA,KAAA,CAAA,CAAA,CAAA;AAC3BR,QAAM,IAAQ,QAAA,KAAA,KAAA,EAAA;AAEdS,UAAgB,WAAA,CAAA,KAAA,GAAA,KAAA,CAAA;AAChBC,UAAgB,IAAA,OAAA,EAAA;gBAEH,CAAA,kBAAA,EAAA,KAAA,CAAA,CAAA;YAAM,IAAA,CAAA,WAAA,EAAA,KAAA,CAAA,CAAA;WAAO;AAAEC,UAAAA,CAAAA,EAAAA,GAAAA,CAAAA,EAAAA,GAAAA,IAAAA,CAAAA,KAAAA,KAAAA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,EAAAA,CAAAA,WAAAA,KAAAA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,EAAAA,CAAAA,IAAAA,CAAAA,EAAAA,CAAAA,CAAAA;AAAO,SAAG;AACpC,OAAA,CAAA,OAAWC,CAAY,EAAA;AAEvB,OAAA;KAIM,CAAA;AACJC,IAAAA,MAAAA,cAAe,GAAA,CAAA,GAAA,EAAA,OAAA,EAAA,KAAA,KAAA;AACfC,MAAAA,IAAAA,GAAAA,CAAQ,KAAU,CAAA,QAAA;AAClBC,QAAAA,OAAAA;MACD,sBAAuCC,EAAAA,IAAAA,CAAAA,CAAAA;AAExC,MAAA,IAAMC,CAAI,UAAuB,EAAC,GAAA,EAAA,KAAA,CAAA,CAAA;KAC5BC,CAAAA;IAEN,MAAMC,kBAAiBA,CAAAA,IAAAA,SAA4BC;AACjD,MAAA,IAAA,IAAA,CAAA,KAAA,CAAA,QAAA,IAAA,WAAA,CAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA;QACIF,OAAAA;MAEJ,EAAI,CAAA,eAAA,EAAA,CAAA;AACF,MAAA,IAAA,CAAA,MAAc,EAAA,IAAA,CAAA,KAAST,CAAAA,IAAAA,EAAK,QAACd,CAAAA,CAAAA;UACzB0B,CAAAA,WAAa,EAAA,IAAA,CAAA,KAAO,CAAA,IAAA,CAAA,CAAA;;AAEtB,IAAA,MAAA,YAAa,GAAA,MAAA;AACXC,MAAAA,IAAAA,CAAAA,MAAKC,EAAAA,KAAAA,CAAAA,EAAAA,KAAAA,CAAAA,CAAAA;AACLD,MAAAA,IAAAA,CAAAA,QAAK,CAAA,CAAA;AACP,KAAA,CAAA;AAEAL,IAAAA,KAAAA,CAAAA,MAAKlB,KAAOyB,CAAAA,UAAAA,aAAe,KAAA,cAAA,CAAA,UAAA,CAAA,CAAA,CAAA;AAC7B,IAAA,KAAA,CAAA,WAAA,EAAA,YAAA;MACF,QAAQ;MACT,MAAA,QAAA,EAAA,CAAA;MAEKC,CAAAA,GAAAA,GAAAA,IAAAA,CAAAA,KAAAA,KACJC,OACoB,KAAA,CAAA,MACR,CACT,iBAAA,EAAA,CAAA;AACH,KAAA,CAAA,CAAA;AACAP,IAAAA,OAAAA,CAAAA,kBAAwB,EAAA;AACxBG,MAAAA,KAAK;MACN,WAAA;AAED,MAAA,mBAAqB,KAAyB;AAC5C,QAAA,KAAQ,CAAA,KAAM,CAAA,SAAS,CAAIK,CAAAA;OACzB;MACFL,QAAW;MACXA;KACD,CAAA,CAAA;IAED,MAAMM,CAAAA;AACJN,MAAAA,WAAW;MACXA,CAAI;IACN,MAAC,cAAA,GAAA,CAAA;AAEDO,MAAAA,MACE;KAIG,KAACX;MACJ,OAAMY,MAAAA,EAAS,CAAC;AAChBb,KAAAA,CAAAA;AACF,IAAA,OAAE,MAAA;MAEK,MAACc,0BAAoB,CAAA,CAAA;MAC1BtB,MAAK,SAAA,GAAA,KAAA,CAAA,QAAA,IAAA,KAAA,CAAA,OAAA,GAAAuB,WAAA,CAAA,KAAA,EAAA;QACM,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA,CAAA,SAAA,CAAA,EAAA,UAAA,CAAA,KAAA,IAAA,EAAA,CAAA,CAAA,CAAA,kBAAA,CAAA,CAAA;QACC,UAAA,EAAGC;AACbC,QAAAA,SAAW,EAAA,YAAW;QACvB,WAAA,EAAA,CAAA,EAAA,KAAA;UACO,IAAA,EAAA,CAAA,IAAA,KAAA,UAAA,CAAA,KAAA;AACRC,YAAAA,YAAAA,EAAAA,CAAAA;AACF,SAAE;AAEFxB,OAAAA,EAAAA,CAAM,OAAC,GAAA,UAAA,CAAA,KAAA,EAAA,UAAA,CAAA,GAAAqB,WAAA,CAAA,MAAA,EAAA;AACLd,QAAAA,OAAAA,EAAAA,EAAAA,CAAAA,EAAAA,CAAAA,WAAAA,CAAAA;AACF,OAAE,EAAA;QACIkB,OAAAA,EAAAA,MAAAA,CAA4DJ,WAAI,CAAA,IAAA,EAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AACpEK,OAAAA,CAAAA,CAAAA,CAAAA,GAAAA,IAAAA,CAAAA;AACF,MAAM,MAAA,MAAA,GAAAL,WAAA,CAAA,KAAA,EAAA;QACGK,OAAAA,EAAAA,CAAAA,EAAO,CAAC,CAAA,CAAA,QAAA,CAAA,EAAA,UAAA,CAAA,KAAA,IAAA,EAAA,CAAA,CAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,CAAA,EAAA,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA;OAChB,EAAA,CAAAL,WAAA,CAAA,cAAA,EAAA;AACD,QAAA,QAAa,EAAA,MAAA;AACX,UAAA,MAAa,YAAS,cAAW,CAAA,IAAA,CAAA,CAAA,IAAA,KAAA,IAAA,CAAA,KAAA,CAAA,KAAA,CAAA,CAAA;UAC3BM,OAAAA,WACJ7B,CAAK,MAACjB,EAAAA;AAAyB,YAAA,GAAA,EAEpB,IACF+C;AAEJ,YAAA,WAAA,EAAA,WAAA,CAAA,KAAA;AAAA,YAAA,QAEoB,EAAA,KAAA,CAAA,QAAA;AAAA,YAAA,IAAA,EAAA,KACQ,CAAK,IAAA;YAC5BtC,KAAGuC,EAAAA,KAASC,CAAAA,KAAAA;AAClB,YAAA,OAAA,EAAA,KAAA,CAAA,OAAA;YAECC,UACCC,EAAAA,cAAkB;AAAW,YAAA,WAER,EAAW,eAAA;AAAC,WAAA,EAAA;AAAAxD,YAAAA,OAAA6C,EAAAA,CAAAA,YAAAA;AAAA,aAKnC;SAEAY;SAEK,IAAA,CAAA,EAAA,SACQ,CAAA,CAAA,CAAA;MAGd,MAAAZ,MAAAA,GAAAA,WAAA,CAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAAA,EAGS,CAAM,CAAA,CAAA,SAAA,CAAA;AACZ,OAAA,EAAA,CAAA,UAAkB,CAAA,KAAA,EAAA,SAASjC;aACpB8C,WAAAA,CAAAA,KACLC,EAAAA;AAEEC,QAAAA,OAAG,EAAE9B,CAAI,EAAA,CAAA,CAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,KAAA,CAAA,WAAA,CAAA,EAAA;aACE,CAAA,CAAA,CAAA,MAAA,CAAA,GAAa,KAAA,CAAA,IAAA,KAAM,MAAA;aACtB,CAAA,CAAA,CAAA,aAAgB,CAAA,GAAA,KAAA,CAAA,IAAA,KAAA,aAAA;;gBAEnB,EAAA,MAAO,CAAClB,CAAK,CAAA;;AAElBiD,GAAAA;AACAC,CAAAA;;;;"}