UNPKG

@yamada-ui/tabs

Version:

Yamada UI tabs component

1 lines 7.79 kB
{"version":3,"sources":["../src/tabs.tsx"],"sourcesContent":["import type { CSSUIObject, HTMLUIProps, ThemeProps } from \"@yamada-ui/core\"\nimport type { LazyMode } from \"@yamada-ui/use-disclosure\"\nimport type { TabListProps } from \"./tab-list\"\nimport type { TabPanelsProps } from \"./tab-panels\"\nimport {\n forwardRef,\n omitThemeProps,\n ui,\n useComponentMultiStyle,\n} from \"@yamada-ui/core\"\nimport { useControllableState } from \"@yamada-ui/use-controllable-state\"\nimport { cx, findChild, getValidChildren, pickChildren } from \"@yamada-ui/utils\"\nimport { useEffect, useState } from \"react\"\nimport { Tab } from \"./tab\"\nimport { TabList } from \"./tab-list\"\nimport { TabPanel } from \"./tab-panel\"\nimport { TabPanels } from \"./tab-panels\"\nimport {\n TabDescendantsContextProvider,\n TabPanelDescendantsContextProvider,\n TabsProvider,\n useTabDescendants,\n useTabPanelDescendants,\n} from \"./tabs-context\"\n\nexport interface TabsOptions {\n /**\n * The alignment of the tabs.\n */\n align?: \"center\" | \"end\" | \"start\"\n /**\n * The index of the selected tab.\n */\n defaultIndex?: number\n /**\n * If `true`, disable ripple effects when pressing the tab.\n *\n * @default false\n */\n disableRipple?: boolean\n /**\n * If `true`, tabs will stretch to width of the tablist.\n *\n * @default false\n */\n fitted?: boolean\n /**\n * The index of the selected tab.\n */\n index?: number\n /**\n * If `true`, tabs will stretch to width of the tablist.\n *\n * @default false\n *\n * @deprecated Use `fitted` instead.\n */\n isFitted?: boolean\n /**\n * If `true`, rendering of the tab panel's will be deferred until it is selected.\n *\n * @default true\n *\n * @deprecated Use `lazy` instead.\n */\n isLazy?: boolean\n /**\n * If `true`, the tabs will be manually activated and display its panel by pressing Space or Enter.\n *\n * If `false`, the tabs will be automatically activated and their panel is displayed when they receive focus.\n *\n * @default false\n *\n * @deprecated Use `manual` instead.\n */\n isManual?: boolean\n /**\n * If `true`, rendering of the tab panel's will be deferred until it is selected.\n *\n * @default true\n */\n lazy?: boolean\n /**\n * The lazy behavior of tab panels' content when not active. Only works when `isLazy={true}`.\n *\n * - `unmount`: The content of inactive tab panels are always unmounted.\n * - `keepMounted`: The content of inactive tab panels is initially unmounted, but stays mounted when selected.\n *\n * @default 'unmount'\n */\n lazyBehavior?: LazyMode\n /**\n * If `true`, the tabs will be manually activated and display its panel by pressing Space or Enter.\n *\n * If `false`, the tabs will be automatically activated and their panel is displayed when they receive focus.\n *\n * @default false\n */\n manual?: boolean\n /**\n * The orientation of the tab list.\n *\n * @default 'horizontal'\n */\n orientation?: \"horizontal\" | \"vertical\"\n /**\n * Props for tab list component.\n */\n tabListProps?: TabListProps\n /**\n * Props for tab panels components.\n */\n tabPanelsProps?: TabPanelsProps\n /**\n * The callback invoked when the index changes.\n */\n onChange?: (index: number) => void\n}\n\nexport interface TabsProps\n extends Omit<HTMLUIProps, \"onChange\">,\n ThemeProps<\"Tabs\">,\n TabsOptions {}\n\n/**\n * `Tabs` is a component for switching between different display areas.\n *\n * @see Docs https://yamada-ui.com/components/disclosure/tabs\n */\nexport const Tabs = forwardRef<TabsProps, \"div\">(\n ({ align = \"start\", isFitted, fitted = isFitted, ...props }, ref) => {\n const [styles, mergedProps] = useComponentMultiStyle(\"Tabs\", {\n align,\n fitted,\n ...props,\n })\n const {\n className,\n children,\n defaultIndex = 0,\n disableRipple = false,\n index,\n isLazy = true,\n isManual,\n lazy = isLazy,\n lazyBehavior = \"keepMounted\",\n manual = isManual,\n orientation = \"horizontal\",\n tabListProps,\n tabPanelsProps,\n onChange,\n ...rest\n } = omitThemeProps(mergedProps)\n const [focusedIndex, setFocusedIndex] = useState<number>(defaultIndex)\n const [selectedIndex, setSelectedIndex] = useControllableState({\n defaultValue: defaultIndex,\n value: index,\n onChange,\n })\n const tabDescendants = useTabDescendants()\n const tabPanelDescendants = useTabPanelDescendants()\n const validChildren = getValidChildren(children)\n const customTabList = findChild(validChildren, TabList)\n const customTabPanels = findChild(validChildren, TabPanels)\n const cloneTabs = pickChildren(validChildren, Tab)\n const cloneTabPanels = pickChildren(validChildren, TabPanel)\n\n const css: CSSUIObject = { w: \"100%\", ...styles.container }\n\n useEffect(() => {\n if (index != null) setFocusedIndex(index)\n }, [index])\n\n return (\n <TabDescendantsContextProvider value={tabDescendants}>\n <TabPanelDescendantsContextProvider value={tabPanelDescendants}>\n <TabsProvider\n value={{\n align,\n disableRipple,\n fitted,\n focusedIndex,\n lazy,\n lazyBehavior,\n manual,\n orientation,\n selectedIndex,\n setFocusedIndex,\n setSelectedIndex,\n styles,\n tabListProps,\n tabPanelsProps,\n }}\n >\n <ui.div\n ref={ref}\n className={cx(\"ui-tabs\", className)}\n __css={css}\n {...rest}\n >\n {customTabList ?? <TabList>{cloneTabs}</TabList>}\n {customTabPanels ?? <TabPanels>{cloneTabPanels}</TabPanels>}\n </ui.div>\n </TabsProvider>\n </TabPanelDescendantsContextProvider>\n </TabDescendantsContextProvider>\n )\n },\n)\n\nTabs.displayName = \"Tabs\"\nTabs.__ui__ = \"Tabs\"\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AACrC,SAAS,IAAI,WAAW,kBAAkB,oBAAoB;AAC9D,SAAS,WAAW,gBAAgB;AAsLxB,SAMoB,KANpB;AAjEL,IAAM,OAAO;AAAA,EAClB,CAAC,EAAE,QAAQ,SAAS,UAAU,SAAS,UAAU,GAAG,MAAM,GAAG,QAAQ;AACnE,UAAM,CAAC,QAAQ,WAAW,IAAI,uBAAuB,QAAQ;AAAA,MAC3D;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AACD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,eAAe;AAAA,MACf,SAAS;AAAA,MACT,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI,eAAe,WAAW;AAC9B,UAAM,CAAC,cAAc,eAAe,IAAI,SAAiB,YAAY;AACrE,UAAM,CAAC,eAAe,gBAAgB,IAAI,qBAAqB;AAAA,MAC7D,cAAc;AAAA,MACd,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AACD,UAAM,iBAAiB,kBAAkB;AACzC,UAAM,sBAAsB,uBAAuB;AACnD,UAAM,gBAAgB,iBAAiB,QAAQ;AAC/C,UAAM,gBAAgB,UAAU,eAAe,OAAO;AACtD,UAAM,kBAAkB,UAAU,eAAe,SAAS;AAC1D,UAAM,YAAY,aAAa,eAAe,GAAG;AACjD,UAAM,iBAAiB,aAAa,eAAe,QAAQ;AAE3D,UAAM,MAAmB,EAAE,GAAG,QAAQ,GAAG,OAAO,UAAU;AAE1D,cAAU,MAAM;AACd,UAAI,SAAS,KAAM,iBAAgB,KAAK;AAAA,IAC1C,GAAG,CAAC,KAAK,CAAC;AAEV,WACE,oBAAC,iCAA8B,OAAO,gBACpC,8BAAC,sCAAmC,OAAO,qBACzC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAEA;AAAA,UAAC,GAAG;AAAA,UAAH;AAAA,YACC;AAAA,YACA,WAAW,GAAG,WAAW,SAAS;AAAA,YAClC,OAAO;AAAA,YACN,GAAG;AAAA,YAEH;AAAA,sDAAiB,oBAAC,WAAS,qBAAU;AAAA,cACrC,4CAAmB,oBAAC,aAAW,0BAAe;AAAA;AAAA;AAAA,QACjD;AAAA;AAAA,IACF,GACF,GACF;AAAA,EAEJ;AACF;AAEA,KAAK,cAAc;AACnB,KAAK,SAAS;","names":[]}