@@ -21,17 +21,15 @@ import {Button} from "@/components/ui/button";
2121import { cn } from "@/lib/utils" ;
2222
2323
24- export type OpenInContentProps = ComponentProps < typeof DropdownMenuContent >
25- & ComponentProps < typeof DropdownMenuTrigger > ;
26-
2724type OpenUiElement = {
2825 hideSvg ?: boolean
2926}
3027type OpenUiAnchorElement = React . AnchorHTMLAttributes < HTMLAnchorElement > & OpenUiElement
3128export type OpenUiInExternalAnchor = OpenUiAnchorElement & {
3229 query ?: string
3330}
34-
31+ export type OpenInContentProps = ComponentProps < typeof DropdownMenuContent >
32+ & ComponentProps < typeof DropdownMenuTrigger >
3533export const OpenInContent = ( { className, ...props } : OpenInContentProps ) => {
3634 if ( className == null ) {
3735 className = "w-full"
@@ -57,7 +55,7 @@ export type OpenContextProps = {
5755 children : React . ReactNode ,
5856} ;
5957
60- export const OpenContext = ( { query : localQuery , children} : OpenContextProps ) => {
58+ export const PageButtonContext = ( { query : localQuery , children} : OpenContextProps ) => {
6159 const [ query , setQuery ] = useState ( localQuery ) ;
6260
6361 // Client component runs also on the server
@@ -282,7 +280,12 @@ export const OpenInT3Anchor = ({query: localQuery, hideSvg = false, children, ..
282280 </ a >
283281 ) ;
284282} ;
285- export const OpenInCursor = ( { query : localQuery , hideSvg = false , children, ...props } : OpenUiInExternalAnchor ) => {
283+ export const OpenInCursorAnchor = ( {
284+ query : localQuery ,
285+ hideSvg = false ,
286+ children,
287+ ...props
288+ } : OpenUiInExternalAnchor ) => {
286289 const { query} = useOpenInContext ( ) ;
287290 let finalQuery = query ;
288291 if ( ! finalQuery ) {
@@ -394,21 +397,53 @@ export const OpenAsPdfAnchor = ({children, href, hideSvg = false, ...props}: Ope
394397} ;
395398
396399
397- export function OpenButton ( { children, render, ...props } : OpenInContentProps ) {
398- let triggerRender = render ;
399- if ( triggerRender == null ) {
400- triggerRender =
401- < Button type = "button" variant = "outline" > Open As / Open In < ChevronDown className = "size-4" /> </ Button >
400+ // noinspection JSUnusedGlobalSymbols
401+ export function PageMenuButton ( { children, variant = "default" , query, render, ...props } : OpenInContentProps &
402+ {
403+ render ?: RenderNodeType ,
404+ variant ?: 'default' | 'split' ,
405+ query ?: string ,
406+ } ) {
407+
408+
409+ if ( variant == "default" ) {
410+ if ( render == null ) {
411+ render = (
412+ < Button type = "button" variant = "outline" >
413+ Copy / Open < ChevronDown className = "size-4" />
414+ </ Button >
415+ )
416+ }
417+ return (
418+ < PageButtonContext query = { query } >
419+ < PageMenuDropDown render = { render as any } { ...props } >
420+ { children }
421+ </ PageMenuDropDown >
422+ </ PageButtonContext >
423+ )
402424 }
425+ if ( render == null ) {
426+ render = < CopyAsMarkdownButton />
427+ }
428+
429+ let styledButton = React . cloneElement ( render , {
430+ className : cn ( "group/button inline-flex shrink-0 px-2 items-center justify-center rounded-lg no-underline h-8 text-black border rounded-r-none border-r-0" , render . props . className ) ,
431+ hideSvg : true
432+ } as any )
433+
434+ let leftRender = ( < Button type = "button" variant = { "outline" } className = { "rounded-l-none px-2" } >
435+ < ChevronDown className = "size-4" />
436+ </ Button > )
437+
403438 return (
404- < OpenContext >
405- < DropdownMenu >
406- < DropdownMenuTrigger render = { triggerRender } />
407- < OpenInContent { ... props } >
439+ < PageButtonContext query = { query } >
440+ < div className = "flex" >
441+ { styledButton }
442+ < PageMenuDropDown render = { leftRender } >
408443 { children }
409- </ OpenInContent >
410- </ DropdownMenu >
411- </ OpenContext >
444+ </ PageMenuDropDown >
445+ </ div >
446+ </ PageButtonContext >
412447 )
413448}
414449
@@ -472,8 +507,9 @@ export function CopyAsMarkdownButton({
472507 )
473508}
474509
475- export function OpenSplitButtonMenu ( { children} : {
510+ function PageMenuDropDown ( { children, render } : {
476511 children : React . ReactNode ,
512+ render ?: RenderNodeType ;
477513} ) {
478514 /**
479515 * Children are expected to be an anchor or a button with a svg and a span
@@ -522,41 +558,24 @@ export function OpenSplitButtonMenu({children}: {
522558 </ DropdownMenuItem >
523559 )
524560 } )
525- let triggerRender = (
526- < Button type = "button" variant = { "outline" } className = { "rounded-l-none px-2" } >
527- < ChevronDown className = "size-4" />
528- </ Button > ) ;
561+ if ( render == null ) {
562+ render = (
563+ < Button type = "button" variant = { "outline" } >
564+ < ChevronDown className = "size-4" />
565+ </ Button >
566+ ) ;
567+ }
529568 return (
530569 < DropdownMenu >
531- < DropdownMenuTrigger render = { triggerRender } />
570+ < DropdownMenuTrigger render = { render } />
532571 < OpenInContent >
533572 { styledChildren }
534573 </ OpenInContent >
535574 </ DropdownMenu >
536575 )
537576}
538577
539- export function OpenSplitButton ( { children, render} : {
540- children : React . ReactNode ,
541- render ?: React . ReactElement <
542- React . HTMLAttributes < HTMLElement > & { children ?: React . ReactNode }
543- > ;
544- } ) {
545- if ( render == null ) {
546- render = < CopyAsMarkdownButton />
547- }
548-
549- let styledButton = React . cloneElement ( render , {
550- className : cn ( "group/button inline-flex shrink-0 px-2 items-center justify-center rounded-lg no-underline h-8 text-black border rounded-r-none border-r-0" , render . props . className ) ,
551- hideSvg : true
552- } as any )
578+ type RenderNodeType = React . ReactElement <
579+ React . HTMLAttributes < HTMLElement > & { children ?: React . ReactNode }
580+ >
553581
554- return (
555- < OpenContext >
556- < div className = "flex" >
557- { styledButton }
558- { children }
559- </ div >
560- </ OpenContext >
561- )
562- }
0 commit comments