@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
1 lines • 3.37 kB
Source Map (JSON)
{"version":3,"file":"SplitButton.mjs","names":[],"sources":["../../../src/base-ui/Button/SplitButton.tsx"],"sourcesContent":["'use client';\n\nimport { createStaticStyles, cx } from 'antd-style';\nimport { ChevronDownIcon } from 'lucide-react';\nimport { createContext, type CSSProperties, type ReactNode, use, useMemo } from 'react';\n\nimport { DropdownMenu, type DropdownMenuProps } from '@/base-ui/DropdownMenu';\n\nimport Button from './Button';\nimport type { ButtonProps } from './type';\n\ninterface SharedVisualProps {\n danger?: boolean;\n disabled?: boolean;\n loading?: boolean;\n size?: ButtonProps['size'];\n type?: ButtonProps['type'];\n}\n\ninterface SplitButtonProps extends SharedVisualProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nconst SplitButtonContext = createContext<SharedVisualProps>({});\n\nconst styles = createStaticStyles(({ css }) => ({\n splitButton: css`\n display: inline-flex;\n flex-direction: row;\n\n & > :where(button, a):first-of-type {\n border-start-end-radius: 0;\n border-end-end-radius: 0;\n }\n\n & > :where(button, a):last-of-type {\n margin-inline-start: -1px;\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n }\n `,\n}));\n\nconst SplitButton = ({\n children,\n className,\n style,\n danger,\n disabled,\n loading,\n size,\n type,\n}: SplitButtonProps) => {\n const shared = useMemo<SharedVisualProps>(\n () => ({ danger, disabled, loading, size, type }),\n [danger, disabled, loading, size, type],\n );\n return (\n <SplitButtonContext value={shared}>\n <div className={cx(styles.splitButton, className)} style={style}>\n {children}\n </div>\n </SplitButtonContext>\n );\n};\n\nconst SplitButtonMain = (props: ButtonProps) => {\n const shared = use(SplitButtonContext);\n return <Button {...shared} {...props} />;\n};\n\ninterface SplitButtonMenuProps extends Omit<DropdownMenuProps, 'children'> {\n icon?: ReactNode;\n}\n\nconst SplitButtonMenu = ({\n icon = <ChevronDownIcon size={14} />,\n ...menuProps\n}: SplitButtonMenuProps) => {\n const shared = use(SplitButtonContext);\n return (\n <DropdownMenu {...menuProps}>\n <Button {...shared} icon={icon} />\n </DropdownMenu>\n );\n};\n\ntype SplitButtonComponent = typeof SplitButton & {\n Main: typeof SplitButtonMain;\n Menu: typeof SplitButtonMenu;\n};\n\n(SplitButton as SplitButtonComponent).Main = SplitButtonMain;\n(SplitButton as SplitButtonComponent).Menu = SplitButtonMenu;\n\nexport type { SplitButtonMenuProps, SplitButtonProps };\nexport default SplitButton as SplitButtonComponent;\n"],"mappings":";;;;;;;;AAyBA,MAAM,qBAAqB,cAAiC,EAAE,CAAC;AAE/D,MAAM,SAAS,oBAAoB,EAAE,WAAW,EAC9C,aAAa,GAAG;;;;;;;;;;;;;;KAejB,EAAE;AAEH,MAAM,eAAe,EACnB,UACA,WACA,OACA,QACA,UACA,SACA,MACA,WACsB;AAKtB,QACE,oBAAC,oBAAD;EAAoB,OALP,eACN;GAAE;GAAQ;GAAU;GAAS;GAAM;GAAM,GAChD;GAAC;GAAQ;GAAU;GAAS;GAAM;GAAK,CAGN;YAC/B,oBAAC,OAAD;GAAK,WAAW,GAAG,OAAO,aAAa,UAAU;GAAS;GACvD;GACG,CAAA;EACa,CAAA;;AAIzB,MAAM,mBAAmB,UAAuB;AAE9C,QAAO,oBAAC,QAAD;EAAQ,GADA,IAAI,mBACM;EAAE,GAAI;EAAS,CAAA;;AAO1C,MAAM,mBAAmB,EACvB,OAAO,oBAAC,iBAAD,EAAiB,MAAM,IAAM,CAAA,EACpC,GAAG,gBACuB;CAC1B,MAAM,SAAS,IAAI,mBAAmB;AACtC,QACE,oBAAC,cAAD;EAAc,GAAI;YAChB,oBAAC,QAAD;GAAQ,GAAI;GAAc;GAAQ,CAAA;EACrB,CAAA;;AASnB,YAAsC,OAAO;AAC7C,YAAsC,OAAO"}