unplugin-docubook 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +142 -2
  2. package/dist/astro.cjs +152 -0
  3. package/dist/astro.cjs.map +1 -0
  4. package/dist/astro.js +125 -12
  5. package/dist/astro.js.map +1 -1
  6. package/dist/bun.cjs +140 -0
  7. package/dist/bun.cjs.map +1 -0
  8. package/dist/bun.js +115 -5
  9. package/dist/bun.js.map +1 -1
  10. package/dist/components/index.cjs +829 -0
  11. package/dist/components/index.cjs.map +1 -0
  12. package/dist/components/index.js +720 -512
  13. package/dist/components/index.js.map +1 -1
  14. package/dist/esbuild.cjs +140 -0
  15. package/dist/esbuild.cjs.map +1 -0
  16. package/dist/esbuild.js +115 -5
  17. package/dist/esbuild.js.map +1 -1
  18. package/dist/farm.cjs +140 -0
  19. package/dist/farm.cjs.map +1 -0
  20. package/dist/farm.js +115 -5
  21. package/dist/farm.js.map +1 -1
  22. package/dist/index.cjs +143 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.js +116 -2
  25. package/dist/index.js.map +1 -0
  26. package/dist/next.cjs +140 -0
  27. package/dist/next.cjs.map +1 -0
  28. package/dist/next.js +119 -0
  29. package/dist/next.js.map +1 -0
  30. package/dist/nuxt.cjs +160 -0
  31. package/dist/nuxt.cjs.map +1 -0
  32. package/dist/nuxt.js +134 -16
  33. package/dist/nuxt.js.map +1 -1
  34. package/dist/rolldown.cjs +140 -0
  35. package/dist/rolldown.cjs.map +1 -0
  36. package/dist/rolldown.js +115 -5
  37. package/dist/rolldown.js.map +1 -1
  38. package/dist/rollup.cjs +140 -0
  39. package/dist/rollup.cjs.map +1 -0
  40. package/dist/rollup.js +115 -5
  41. package/dist/rollup.js.map +1 -1
  42. package/dist/rspack.cjs +140 -0
  43. package/dist/rspack.cjs.map +1 -0
  44. package/dist/rspack.js +115 -5
  45. package/dist/rspack.js.map +1 -1
  46. package/dist/types.cjs +19 -0
  47. package/dist/types.cjs.map +1 -0
  48. package/dist/types.js +1 -1
  49. package/dist/types.js.map +1 -0
  50. package/dist/vite.cjs +140 -0
  51. package/dist/vite.cjs.map +1 -0
  52. package/dist/vite.js +115 -5
  53. package/dist/vite.js.map +1 -1
  54. package/dist/webpack.cjs +140 -0
  55. package/dist/webpack.cjs.map +1 -0
  56. package/dist/webpack.js +115 -5
  57. package/dist/webpack.js.map +1 -1
  58. package/package.json +92 -33
  59. package/dist/adapters/next-DNQX7_ln.d.ts +0 -24
  60. package/dist/adapters/next-DNQX7_ln.d.ts.map +0 -1
  61. package/dist/adapters/next.js +0 -38
  62. package/dist/adapters/next.js.map +0 -1
  63. package/dist/adapters/react-C9Vk6aTD.d.ts +0 -24
  64. package/dist/adapters/react-C9Vk6aTD.d.ts.map +0 -1
  65. package/dist/adapters/react.js +0 -39
  66. package/dist/adapters/react.js.map +0 -1
  67. package/dist/adapters/svelte-C-dhzdmU.d.ts +0 -19
  68. package/dist/adapters/svelte-C-dhzdmU.d.ts.map +0 -1
  69. package/dist/adapters/svelte.js +0 -43
  70. package/dist/adapters/svelte.js.map +0 -1
  71. package/dist/adapters/vue-BWv1EZit.d.ts +0 -22
  72. package/dist/adapters/vue-BWv1EZit.d.ts.map +0 -1
  73. package/dist/adapters/vue.js +0 -41
  74. package/dist/adapters/vue.js.map +0 -1
  75. package/dist/astro-BcckVQ-2.d.ts +0 -19
  76. package/dist/astro-BcckVQ-2.d.ts.map +0 -1
  77. package/dist/bun-DYPhytPs.d.ts +0 -7
  78. package/dist/bun-DYPhytPs.d.ts.map +0 -1
  79. package/dist/components/index-LWFtIGRd.d.ts +0 -265
  80. package/dist/components/index-LWFtIGRd.d.ts.map +0 -1
  81. package/dist/context-BKx0jIwX.js +0 -49
  82. package/dist/context-BKx0jIwX.js.map +0 -1
  83. package/dist/esbuild-BD42nX0_.d.ts +0 -8
  84. package/dist/esbuild-BD42nX0_.d.ts.map +0 -1
  85. package/dist/farm-C3XYk4nf.d.ts +0 -7
  86. package/dist/farm-C3XYk4nf.d.ts.map +0 -1
  87. package/dist/framework/index-98dEoo0g.d.ts +0 -11
  88. package/dist/framework/index-98dEoo0g.d.ts.map +0 -1
  89. package/dist/framework/index.js +0 -29
  90. package/dist/framework/index.js.map +0 -1
  91. package/dist/index-2f48-Fxc.d.ts +0 -10
  92. package/dist/index-2f48-Fxc.d.ts.map +0 -1
  93. package/dist/nuxt-BidHgMAG.d.ts +0 -5
  94. package/dist/nuxt-BidHgMAG.d.ts.map +0 -1
  95. package/dist/rolldown-CrcgSKP1.d.ts +0 -8
  96. package/dist/rolldown-CrcgSKP1.d.ts.map +0 -1
  97. package/dist/rollup-DDEc1C_K.d.ts +0 -8
  98. package/dist/rollup-DDEc1C_K.d.ts.map +0 -1
  99. package/dist/rspack-QbbymFlY.d.ts +0 -7
  100. package/dist/rspack-QbbymFlY.d.ts.map +0 -1
  101. package/dist/src-KZV_M01u.js +0 -165
  102. package/dist/src-KZV_M01u.js.map +0 -1
  103. package/dist/types-BQhWL5Qs.d.ts +0 -34
  104. package/dist/types-BQhWL5Qs.d.ts.map +0 -1
  105. package/dist/types-uxY1cMXO.d.ts +0 -28
  106. package/dist/types-uxY1cMXO.d.ts.map +0 -1
  107. package/dist/vite-9CqZQPO-.d.ts +0 -8
  108. package/dist/vite-9CqZQPO-.d.ts.map +0 -1
  109. package/dist/webpack-CBuuXltg.d.ts +0 -7
  110. package/dist/webpack-CBuuXltg.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["FileIcon","ChevronRightIcon","FolderOpenIcon","FolderIcon","CopyIcon"],"sources":["../../src/components/react/Note.tsx","../../src/components/react/Card.tsx","../../src/components/react/CardGroup.tsx","../../src/components/react/AccordionContext.tsx","../../src/components/react/Accordion.tsx","../../src/components/react/AccordionGroup.tsx","../../src/components/react/Stepper.tsx","../../src/components/react/FileTree.tsx","../../src/components/react/Kbd.tsx","../../src/components/react/Tooltip.tsx","../../src/components/react/Youtube.tsx","../../src/components/react/Button.tsx","../../src/components/react/Link.tsx","../../src/components/react/Image.tsx","../../src/components/react/Release.tsx","../../src/components/react/Copy.tsx","../../src/components/react/Pre.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport { Info, AlertTriangle, AlertCircle, CheckCircle } from 'lucide-react'\nimport clsx from 'clsx'\n\nconst noteVariants = {\n note: 'bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800 border-l-blue-500 text-blue-900 dark:text-blue-100',\n danger: 'bg-red-50 dark:bg-red-950/30 border-red-200 dark:border-red-800 border-l-red-500 text-red-900 dark:text-red-100',\n warning: 'bg-orange-50 dark:bg-orange-950/30 border-orange-200 dark:border-orange-800 border-l-orange-500 text-orange-900 dark:text-orange-100',\n success: 'bg-emerald-50 dark:bg-emerald-950/30 border-emerald-200 dark:border-emerald-800 border-l-emerald-500 text-emerald-900 dark:text-emerald-100',\n} as const\n\nconst iconMap = {\n note: Info,\n danger: AlertCircle,\n warning: AlertTriangle,\n success: CheckCircle,\n}\n\ninterface NoteProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string\n type?: 'note' | 'danger' | 'warning' | 'success'\n}\n\nexport function Note({\n className,\n title = 'Note',\n type = 'note',\n children,\n ...props\n}: NoteProps) {\n const Icon = iconMap[type]\n\n return (\n <div\n className={clsx(\n 'relative w-full rounded-lg border border-l-4 p-4 mb-4',\n noteVariants[type],\n className,\n )}\n {...props}\n >\n <div className=\"absolute left-4 top-4\">\n <Icon className=\"w-5 h-5\" />\n </div>\n <div className=\"pl-8\">\n <h5 className=\"mb-1 font-medium leading-none tracking-tight\">{title}</h5>\n <div className=\"text-sm opacity-90\">{children}</div>\n </div>\n </div>\n )\n}\n\nexport default Note\n","import React, { ReactNode } from 'react';\nimport * as Icons from 'lucide-react';\nimport clsx from 'clsx';\nimport { useDocuBook } from './context';\n\ntype IconName = keyof typeof Icons;\n\ninterface CardProps {\n title: string;\n icon?: IconName;\n href?: string;\n horizontal?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport const Card: React.FC<CardProps> = ({ title, icon, href, horizontal, children, className }) => {\n const { Link } = useDocuBook();\n const Icon = icon ? (Icons[icon] as React.FC<{ className?: string }>) : null;\n\n const content = (\n <div\n className={clsx(\n \"border rounded-lg shadow-sm p-4 transition-all duration-200\",\n \"bg-card text-card-foreground border-border\",\n \"hover:bg-accent/5 hover:border-accent/30\",\n \"flex gap-2\",\n horizontal ? \"flex-row items-center gap-1\" : \"flex-col space-y-1\",\n className\n )}\n >\n {Icon && <Icon className=\"w-5 h-5 text-primary flex-shrink-0\" />}\n <div className=\"flex-1 min-w-0 my-auto h-full\">\n <span className=\"text-base font-semibold text-foreground\">{title}</span>\n <div className=\"text-sm text-muted-foreground -mt-3\">{children}</div>\n </div>\n </div>\n );\n\n return href ? <Link className=\"no-underline block\" href={href}>{content}</Link> : content;\n};\n\nexport default Card;\n","import React from 'react'\nimport clsx from 'clsx'\n\ninterface CardGroupProps {\n children: React.ReactNode\n cols?: number\n className?: string\n}\n\nexport function CardGroup({ children, cols = 2, className }: CardGroupProps) {\n const cardsArray = React.Children.toArray(children)\n\n const gridColsClass: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n }\n\n return (\n <div className={clsx('grid gap-4', gridColsClass[cols] || 'grid-cols-1 sm:grid-cols-2', className)}>\n {cardsArray.map((card, index) => (\n <div key={index}>{card}</div>\n ))}\n </div>\n )\n}\n\nexport default CardGroup\n","'use client'\n\nimport { createContext } from 'react'\n\n/**\n * Context that tells child Accordion components they are inside a group.\n */\nexport const AccordionGroupContext = createContext<{ inGroup: boolean }>({\n inGroup: false,\n})\n","import { ReactNode, useState, useContext } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport * as Icons from \"lucide-react\";\nimport clsx from 'clsx';\nimport { AccordionGroupContext } from './AccordionContext';\n\ntype AccordionProps = {\n title: string;\n children?: ReactNode;\n defaultOpen?: boolean;\n icon?: keyof typeof Icons;\n};\n\nconst Accordion: React.FC<AccordionProps> = ({\n title,\n children,\n defaultOpen = false,\n icon,\n}: AccordionProps) => {\n const groupContext = useContext(AccordionGroupContext);\n const isInGroup = groupContext?.inGroup === true;\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const Icon = icon ? (Icons[icon] as React.FC<{ className?: string }>) : null;\n\n return (\n <div\n className={clsx(\n !isInGroup && \"border rounded-lg shadow-sm\",\n isInGroup && \"border-b last:border-b-0 border-border\"\n )}\n >\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"flex items-center gap-2 w-full px-4 py-3 transition-colors bg-muted/40 dark:bg-muted/20 hover:bg-muted/70 dark:hover:bg-muted/70 cursor-pointer text-start\"\n >\n <ChevronRight\n className={clsx(\n \"w-4 h-4 text-muted-foreground transition-transform duration-200 flex-shrink-0\",\n isOpen && \"rotate-90\"\n )}\n />\n {Icon && <Icon className=\"text-foreground w-4 h-4 flex-shrink-0\" />}\n <h3 className=\"font-medium text-base text-foreground !m-0\">{title}</h3>\n </button>\n\n {isOpen && (\n <div className=\"px-4 py-3 dark:bg-muted/10 bg-muted/15\">\n {children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Accordion;\n","import React, { ReactNode } from \"react\";\nimport clsx from \"clsx\";\nimport { AccordionGroupContext } from \"./AccordionContext\";\n\ninterface AccordionGroupProps {\n children: ReactNode;\n className?: string;\n}\n\nconst AccordionGroup: React.FC<AccordionGroupProps> = ({ children, className }) => {\n\n return (\n <AccordionGroupContext.Provider value={{ inGroup: true }}>\n <div\n className={clsx(\n \"border rounded-lg overflow-hidden\",\n className\n )}\n >\n {children}\n </div>\n </AccordionGroupContext.Provider>\n );\n};\n\nexport default AccordionGroup;\n","import React, { Children } from 'react'\nimport clsx from 'clsx'\n\nexport function Stepper({ children }: { children: React.ReactNode }) {\n const length = Children.count(children)\n\n return (\n <div className=\"flex flex-col\">\n {Children.map(children, (child, index) => (\n <div\n className={clsx(\n 'border-l border-gray-200 dark:border-gray-700 pl-9 ml-3 relative',\n index < length - 1 && 'pb-5',\n )}\n >\n <div className=\"bg-gray-100 dark:bg-gray-800 text-gray-500 dark:text-gray-400 w-8 h-8 text-xs font-medium rounded-md border border-gray-300/50 dark:border-gray-600/50 flex items-center justify-center absolute -left-4 font-mono\">\n {index + 1}\n </div>\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nexport function StepperItem({\n children,\n title,\n}: {\n children: React.ReactNode\n title?: string\n}) {\n return (\n <div className=\"pt-0.5\">\n {title && <h4 className=\"mt-0\">{title}</h4>}\n <div>{children}</div>\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, Children, isValidElement, cloneElement } from 'react'\nimport { ChevronRight as ChevronRightIcon, File as FileIcon, Folder as FolderIcon, FolderOpen as FolderOpenIcon } from 'lucide-react'\nimport clsx from 'clsx'\n\n// ──────────────────────────────────────────────\n// FileTree components\n// ──────────────────────────────────────────────\n\ninterface FileTreeProps {\n name: string\n children?: React.ReactNode\n}\n\nconst FileComponent = ({ name }: FileTreeProps) => {\n const [isHovered, setIsHovered] = useState(false)\n const fileExtension = name.split('.').pop()?.toUpperCase()\n\n return (\n <div\n className={clsx(\n 'flex items-center gap-2 py-1.5 pl-7 pr-3 text-sm rounded-md transition-colors duration-150 cursor-default select-none',\n isHovered ? 'bg-blue-50 dark:bg-blue-950/20' : 'hover:bg-gray-100/50 dark:hover:bg-gray-800/50',\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n tabIndex={-1}\n >\n <FileIcon\n className={clsx(\n 'flex-shrink-0 transition-colors',\n isHovered ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500',\n )}\n />\n <span className=\"font-mono text-sm truncate\">{name}</span>\n {isHovered && fileExtension && (\n <span className=\"ml-auto text-xs text-gray-400/80\">{fileExtension}</span>\n )}\n </div>\n )\n}\n\nconst FolderComponent = ({ name, children }: FileTreeProps) => {\n const [isOpen, setIsOpen] = useState(true)\n const [isHovered, setIsHovered] = useState(false)\n const hasChildren = React.Children.count(children) > 0\n\n return (\n <div className=\"relative\">\n <div\n className={clsx(\n 'flex items-center gap-2 py-1.5 pl-4 pr-3 rounded-md transition-colors duration-150 select-none',\n isHovered && 'bg-gray-100/60 dark:bg-gray-800/60',\n isOpen ? 'text-gray-900 dark:text-gray-100' : 'text-gray-700 dark:text-gray-300',\n hasChildren ? 'cursor-pointer' : 'cursor-default',\n )}\n onClick={() => hasChildren && setIsOpen(!isOpen)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n tabIndex={-1}\n onKeyDown={(e) => e.preventDefault()}\n >\n {hasChildren ? (\n <ChevronRightIcon\n className={clsx(\n 'flex-shrink-0 transition-transform duration-200',\n isOpen && 'rotate-90',\n isHovered ? 'text-gray-600 dark:text-gray-400' : 'text-gray-400 dark:text-gray-500',\n )}\n />\n ) : (\n <div className=\"w-3.5\" />\n )}\n {isOpen ? (\n <FolderOpenIcon\n className={clsx(\n 'flex-shrink-0 transition-colors',\n isHovered ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500',\n )}\n />\n ) : (\n <FolderIcon\n className={clsx(\n 'flex-shrink-0 transition-colors',\n isHovered ? 'text-blue-400' : 'text-gray-400/80 dark:text-gray-500/80',\n )}\n />\n )}\n <span\n className={clsx(\n 'font-medium transition-colors duration-150',\n isHovered && 'text-blue-500',\n )}\n >\n {name}\n </span>\n </div>\n {isOpen && hasChildren && (\n <div className=\"ml-5 border-l-2 border-gray-200/50 dark:border-gray-700/50 pl-2\">\n {children}\n </div>\n )}\n </div>\n )\n}\n\nexport function Files({ children }: { children: React.ReactNode }) {\n return (\n <div\n className=\"rounded-xl border border-gray-200/20 dark:border-gray-700/20 bg-white/20 dark:bg-gray-900/20 backdrop-blur-sm shadow-sm overflow-hidden transition-all duration-200 hover:shadow-md hover:border-gray-300/60 dark:hover:border-gray-600/60\"\n onKeyDown={(e) => e.preventDefault()}\n >\n <div className=\"p-2\">\n {Children.map(children, (child, index) => {\n if (isValidElement(child)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return cloneElement(child as any, { key: index })\n }\n return null\n })}\n </div>\n </div>\n )\n}\n\nexport function Folder({ name, children }: FileTreeProps) {\n return <FolderComponent name={name}>{children}</FolderComponent>\n}\n\nexport function File({ name }: FileTreeProps) {\n return <FileComponent name={name} />\n}\n\nexport const FileTreeMdx = { Files, File, Folder }\nexport default FileTreeMdx\n","import React from 'react'\n\nconst macKeyMap: Record<string, string> = {\n command: '⌘', cmd: '⌘', option: '⌥', alt: '⌥',\n shift: '⇧', ctrl: '⌃', control: '⌃', tab: '⇥',\n caps: '⇪', enter: '⏎', return: '⏎', delete: '⌫',\n escape: '⎋', esc: '⎋', up: '↑', down: '↓',\n left: '←', right: '→', space: '␣',\n}\n\nconst windowsKeyMap: Record<string, string> = {\n command: 'Win', cmd: 'Win', option: 'Alt', alt: 'Alt',\n ctrl: 'Ctrl', control: 'Ctrl', delete: 'Del', escape: 'Esc',\n esc: 'Esc', enter: 'Enter', return: 'Enter', tab: 'Tab',\n caps: 'Caps', shift: 'Shift', space: 'Space',\n up: '↑', down: '↓', left: '←', right: '→',\n}\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n show?: string\n type?: 'window' | 'mac'\n children?: React.ReactNode\n}\n\nexport function Kbd({ show: keyProp, type = 'window', children, ...props }: KbdProps) {\n const getKeyDisplay = (): React.ReactNode => {\n if (!keyProp || typeof keyProp !== 'string') return null\n const lowerKey = keyProp.toLowerCase()\n if (type === 'mac') return macKeyMap[lowerKey] || keyProp\n return windowsKeyMap[lowerKey] || (keyProp.charAt(0).toUpperCase() + keyProp.slice(1))\n }\n\n const renderContent = () => {\n if (children !== undefined && children !== null && children !== '') return children\n return getKeyDisplay() || keyProp || ''\n }\n\n return (\n <kbd\n className=\"inline-flex items-center justify-center px-2 py-1 mx-0.5 text-xs font-mono font-medium bg-gray-100 dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-md\"\n {...props}\n >\n {renderContent()}\n </kbd>\n )\n}\n\nexport default Kbd\n","'use client'\n\nimport React, { useState } from 'react'\n\ninterface TooltipProps {\n text: string\n tip: string\n}\n\nexport function Tooltip({ text, tip }: TooltipProps) {\n const [visible, setVisible] = useState(false)\n\n return (\n <span\n className=\"relative inline-flex items-center cursor-help text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300 transition-colors\"\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <span className=\"border-b border-dashed border-blue-500/60 pb-0.5\">\n {text}\n </span>\n {visible && (\n <span className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-3 w-64 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 text-sm p-3 rounded-md shadow-lg border border-gray-200/50 dark:border-gray-700/50 break-words text-left z-50\">\n {tip}\n <span className=\"absolute -bottom-1.5 left-1/2 -translate-x-1/2 w-3 h-3 bg-white dark:bg-gray-800 rotate-45 border-b border-r border-gray-200/50 dark:border-gray-700/50 -z-10\" />\n </span>\n )}\n </span>\n )\n}\n\nexport default Tooltip\n","import React from 'react'\n\ninterface YoutubeProps {\n videoId: string\n className?: string\n}\n\nexport function Youtube({ videoId, className }: YoutubeProps) {\n return (\n <div className={`aspect-video w-full ${className || ''}`}>\n <iframe\n src={`https://www.youtube.com/embed/${videoId}?rel=0&modestbranding=1&showinfo=0&autohide=1&controls=1`}\n title=\"YouTube video player\"\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n className=\"w-full h-full rounded-lg\"\n />\n </div>\n )\n}\n\nexport default Youtube\n","import React from \"react\";\nimport * as Icons from \"lucide-react\";\nimport clsx from \"clsx\";\nimport { useDocuBook } from \"./context\";\n\ntype ButtonProps = {\n icon?: keyof typeof Icons;\n text?: string;\n href: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n size?: \"sm\" | \"md\" | \"lg\";\n variation?: \"primary\" | \"accent\" | \"outline\";\n};\n\nconst Button: React.FC<ButtonProps> = ({\n icon,\n text,\n href,\n target,\n size = \"md\",\n variation = \"primary\",\n}) => {\n const { Link } = useDocuBook();\n\n const baseStyles = \"inline-flex items-center justify-center rounded font-medium focus:outline-none transition no-underline\";\n\n const sizeStyles = {\n sm: \"px-3 py-1 my-6 text-sm\",\n md: \"px-4 py-2 my-6 text-base\",\n lg: \"px-5 py-3 my-6 text-lg\",\n };\n\n const variationStyles = {\n primary: \"bg-primary text-white hover:bg-primary/90\",\n accent: \"bg-accent text-white hover:bg-accent/90\",\n outline: \"border border-accent text-accent hover:bg-accent/10\",\n };\n\n const Icon = icon ? (Icons[icon] as React.FC<{ className?: string }>) : null;\n\n return (\n <Link\n href={href}\n target={target}\n rel={target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n className={clsx(baseStyles, sizeStyles[size], variationStyles[variation])}\n >\n {text && <span>{text}</span>}\n {Icon && <Icon className=\"mr-2 h-5 w-5\" />}\n </Link>\n );\n};\n\nexport default Button;\n","import React from 'react'\nimport { useDocuBook } from './context'\n\ninterface DocuLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string\n}\n\n/**\n * Framework-agnostic Link component.\n * Named `DocuLink` to avoid collision with native HTML `<link>` in MDX.\n */\nexport function DocuLink({ href, ...props }: DocuLinkProps) {\n const { Link } = useDocuBook()\n\n if (!href) return null\n\n return (\n <Link\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...props}\n />\n )\n}\n\nexport default DocuLink\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { Search, X } from 'lucide-react'\nimport { useDocuBook } from './context'\n\ninterface DocuImageProps {\n src: string\n alt?: string\n width?: number | string\n height?: number | string\n className?: string\n}\n\n/**\n * Framework-agnostic Image component with lightbox.\n * Uses useDocuBook().Image for the rendering primitive.\n */\nexport function DocuImage({\n src,\n alt = 'alt',\n width = 800,\n height = 350,\n className,\n ...props\n}: DocuImageProps) {\n const { Image } = useDocuBook()\n const [isOpen, setIsOpen] = useState(false)\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden'\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setIsOpen(false)\n }\n window.addEventListener('keydown', handleEsc)\n return () => {\n document.body.style.overflow = 'auto'\n window.removeEventListener('keydown', handleEsc)\n }\n }\n }, [isOpen])\n\n if (!src) return null\n\n return (\n <>\n <button\n type=\"button\"\n className=\"relative group cursor-zoom-in my-6 w-full flex justify-center rounded-lg\"\n onClick={() => setIsOpen(true)}\n aria-label=\"Zoom image\"\n >\n <span className=\"absolute inset-0 bg-black/0 group-hover:bg-black/5 transition-colors z-10 flex items-center justify-center opacity-0 group-hover:opacity-100 rounded-lg\">\n <Search className=\"w-8 h-8 text-white drop-shadow-md\" />\n </span>\n <Image\n src={src}\n alt={alt}\n width={width}\n height={height}\n className={`w-full h-auto rounded-lg transition-transform duration-300 group-hover:scale-[1.01] ${className || ''}`}\n {...props}\n />\n </button>\n\n {isOpen && (\n <div\n className=\"fixed inset-0 z-[99999] flex items-center justify-center bg-black/90 backdrop-blur-md p-4 md:p-10 cursor-zoom-out\"\n onClick={() => setIsOpen(false)}\n >\n <button\n className=\"absolute top-4 right-4 z-50 p-2 text-white/70 hover:text-white bg-black/20 hover:bg-white/10 rounded-full transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n setIsOpen(false)\n }}\n >\n <X className=\"w-6 h-6\" />\n </button>\n\n <div className=\"relative max-w-7xl w-full h-full flex items-center justify-center\">\n <Image\n src={src}\n alt={alt}\n width={1920}\n height={1080}\n className=\"object-contain max-h-[90vh] w-auto h-auto rounded-md shadow-2xl\"\n />\n </div>\n\n {alt && alt !== 'alt' && (\n <div className=\"absolute bottom-6 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-full text-sm font-medium backdrop-blur-md border border-white/10\">\n {alt}\n </div>\n )}\n </div>\n )}\n </>\n )\n}\n\nexport default DocuImage\n","import React from 'react'\nimport { Plus, Wrench, Zap, AlertTriangle, XCircle } from 'lucide-react'\nimport clsx from 'clsx'\n\ninterface ReleaseProps {\n version: string\n title: string\n date?: string\n children: React.ReactNode\n}\n\nexport function Release({ version, title, date, children }: ReleaseProps) {\n return (\n <div className=\"mb-16 group\">\n <div className=\"flex items-center gap-3 mt-6 mb-2\">\n <div\n id={version}\n className=\"inline-flex items-center rounded-full border border-blue-500/20 bg-blue-500/10 px-3 py-1 text-sm font-semibold text-blue-600 dark:text-blue-400 transition-colors hover:bg-blue-500/15 scroll-m-20 backdrop-blur-sm\"\n >\n v{version}\n </div>\n {date && (\n <div className=\"flex items-center gap-3 text-sm font-medium text-gray-500 dark:text-gray-400\">\n <span className=\"h-1 w-1 rounded-full bg-gray-400/30\" />\n <time dateTime={date}>\n {new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n </time>\n </div>\n )}\n </div>\n <h3 className=\"text-2xl font-bold text-gray-900/90 dark:text-gray-100/90 mb-6 mt-0\">\n {title}\n </h3>\n <div className=\"space-y-8\">{children}</div>\n </div>\n )\n}\n\ninterface ChangesProps {\n type: 'added' | 'fixed' | 'improved' | 'deprecated' | 'removed'\n children: React.ReactNode\n}\n\nconst typeConfig = {\n added: {\n label: 'Added',\n className: 'bg-green-100 dark:bg-green-900/50 text-green-700 dark:text-green-300',\n icon: Plus,\n },\n fixed: {\n label: 'Fixed',\n className: 'bg-yellow-100 dark:bg-yellow-900/50 text-yellow-700 dark:text-yellow-300',\n icon: Wrench,\n },\n improved: {\n label: 'Improved',\n className: 'bg-cyan-100 dark:bg-cyan-900/50 text-cyan-700 dark:text-cyan-300',\n icon: Zap,\n },\n deprecated: {\n label: 'Deprecated',\n className: 'bg-orange-100 dark:bg-orange-900/50 text-orange-700 dark:text-orange-300',\n icon: AlertTriangle,\n },\n removed: {\n label: 'Removed',\n className: 'bg-pink-100 dark:bg-pink-900/50 text-pink-700 dark:text-pink-300',\n icon: XCircle,\n },\n} as const\n\nexport function Changes({ type, children }: ChangesProps) {\n const config = typeConfig[type] || typeConfig.added\n const Icon = config.icon\n\n return (\n <div className=\"space-y-3 mb-8\">\n <div className=\"flex items-center gap-2\">\n <div className={clsx('px-3 py-1 rounded-full text-sm font-medium flex items-center gap-1.5', config.className)}>\n <Icon className=\"w-3.5 h-3.5\" />\n <span>{config.label}</span>\n </div>\n </div>\n <ul className=\"list-none pl-0 space-y-2 text-gray-700 dark:text-gray-300\">\n {React.Children.map(children, (child, index) => {\n const processedChild =\n typeof child === 'string'\n ? child.trim().replace(/^[-*]\\s+/, '')\n : child\n\n return <li key={index} className=\"leading-relaxed\">{processedChild}</li>\n })}\n </ul>\n </div>\n )\n}\n\nexport const ReleaseMdx = { Release, Changes }\nexport default ReleaseMdx\n","import React, { useState } from \"react\";\nimport { Check, Copy as CopyIcon } from \"lucide-react\";\n\ntype CopyProps = {\n content: string;\n};\n\nconst Copy: React.FC<CopyProps> = ({ content }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n async function handleCopy() {\n await navigator.clipboard.writeText(content);\n setIsCopied(true);\n\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n }\n\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center px-2 py-1 text-xs font-medium border rounded transition-colors bg-muted hover:bg-muted/70 border-border cursor-copy\"\n onClick={handleCopy}\n >\n {isCopied ? (\n <Check className=\"w-3 h-3\" />\n ) : (\n <CopyIcon className=\"w-3 h-3\" />\n )}\n </button>\n );\n};\n\nexport default Copy;\n","import React, { type ComponentProps } from 'react'\nimport Copy from './Copy'\n\ntype PreProps = ComponentProps<'pre'> & {\n raw?: string\n 'data-title'?: string\n}\n\nexport function Pre({ children, raw, ...rest }: PreProps) {\n const { 'data-title': title, className, ...restProps } = rest\n const hasTitle = !!title\n\n return (\n <div className=\"relative rounded-lg border border-gray-200 dark:border-gray-700 my-4 overflow-hidden\">\n <div className=\"absolute top-2 right-2 z-10\">\n {raw && <Copy content={raw} />}\n </div>\n {hasTitle && (\n <div className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50\">\n <span>{title}</span>\n </div>\n )}\n <div className=\"overflow-x-auto\">\n <pre className={className} {...restProps}>\n {children}\n </pre>\n </div>\n </div>\n )\n}\n\nexport default Pre\n"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/react/context.tsx","../../src/components/react/Note.tsx","../../src/components/react/Card.tsx","../../src/components/react/CardGroup.tsx","../../src/components/react/Accordion.tsx","../../src/components/react/AccordionContext.tsx","../../src/components/react/AccordionGroup.tsx","../../src/components/react/Stepper.tsx","../../src/components/react/FileTree.tsx","../../src/components/react/Kbd.tsx","../../src/components/react/Tooltip.tsx","../../src/components/react/Youtube.tsx","../../src/components/react/Button.tsx","../../src/components/react/Link.tsx","../../src/components/react/Image.tsx","../../src/components/react/Release.tsx","../../src/components/react/Copy.tsx","../../src/components/react/Pre.tsx"],"sourcesContent":["'use client'\n\nimport React, { createContext, useContext } from 'react'\n\n// ──────────────────────────────────────────────\n// Framework-agnostic primitive interfaces\n// ──────────────────────────────────────────────\n\nexport interface DocuBookLinkProps {\n href: string\n children?: React.ReactNode\n className?: string\n target?: string\n rel?: string\n [key: string]: unknown\n}\n\nexport interface DocuBookImageProps {\n src: string\n alt: string\n width?: number | string\n height?: number | string\n className?: string\n [key: string]: unknown\n}\n\nexport interface DocuBookConfig {\n /**\n * Framework-specific Link component.\n * Default: renders a native `<a>` tag.\n */\n Link: React.ComponentType<DocuBookLinkProps>\n\n /**\n * Framework-specific Image component.\n * Default: renders a native `<img>` tag.\n */\n Image: React.ComponentType<DocuBookImageProps>\n}\n\n// ──────────────────────────────────────────────\n// Defaults — pure HTML, works everywhere\n// ──────────────────────────────────────────────\n\nconst DefaultLink: React.FC<DocuBookLinkProps> = ({\n href,\n children,\n ...props\n}) => (\n <a href={href} {...props}>\n {children}\n </a>\n)\n\nconst DefaultImage: React.FC<DocuBookImageProps> = ({\n src,\n alt,\n ...props\n}) => <img src={src} alt={alt} {...props} />\n\nconst defaults: DocuBookConfig = {\n Link: DefaultLink,\n Image: DefaultImage,\n}\n\n// ──────────────────────────────────────────────\n// Context + hooks\n// ──────────────────────────────────────────────\n\nconst DocuBookContext = createContext<DocuBookConfig>(defaults)\n\n/**\n * Provider to inject framework-specific primitives (Link, Image)\n * into all DocuBook components.\n *\n * @example\n * // With Next.js adapter\n * import { NextAdapter } from 'unplugin-docubook/adapters/next'\n *\n * <NextAdapter>\n * <MDXContent />\n * </NextAdapter>\n *\n * @example\n * // Custom adapter\n * import { DocuBookProvider } from 'unplugin-docubook/components'\n *\n * <DocuBookProvider value={{ Link: MyLink, Image: MyImage }}>\n * <MDXContent />\n * </DocuBookProvider>\n */\nexport const DocuBookProvider = DocuBookContext.Provider\n\n/**\n * Hook to access the current DocuBook framework primitives.\n */\nexport function useDocuBook(): DocuBookConfig {\n return useContext(DocuBookContext)\n}\n","'use client'\n\nimport React from 'react'\nimport { Info, AlertTriangle, AlertCircle, CheckCircle } from 'lucide-react'\nimport clsx from 'clsx'\n\nconst noteVariants = {\n note: 'bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800 border-l-blue-500 text-blue-900 dark:text-blue-100',\n danger: 'bg-red-50 dark:bg-red-950/30 border-red-200 dark:border-red-800 border-l-red-500 text-red-900 dark:text-red-100',\n warning: 'bg-orange-50 dark:bg-orange-950/30 border-orange-200 dark:border-orange-800 border-l-orange-500 text-orange-900 dark:text-orange-100',\n success: 'bg-emerald-50 dark:bg-emerald-950/30 border-emerald-200 dark:border-emerald-800 border-l-emerald-500 text-emerald-900 dark:text-emerald-100',\n} as const\n\nconst iconMap = {\n note: Info,\n danger: AlertCircle,\n warning: AlertTriangle,\n success: CheckCircle,\n}\n\ninterface NoteProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string\n type?: 'note' | 'danger' | 'warning' | 'success'\n}\n\nexport function Note({\n className,\n title = 'Note',\n type = 'note',\n children,\n ...props\n}: NoteProps) {\n const Icon = iconMap[type]\n\n return (\n <div\n className={clsx(\n 'relative w-full rounded-lg border border-l-4 p-4 mb-4',\n noteVariants[type],\n className,\n )}\n {...props}\n >\n <div className=\"absolute left-4 top-4\">\n <Icon className=\"w-5 h-5\" />\n </div>\n <div className=\"pl-8\">\n <h5 className=\"mb-1 font-medium leading-none tracking-tight\">{title}</h5>\n <div className=\"text-sm opacity-90\">{children}</div>\n </div>\n </div>\n )\n}\n\nexport default Note\n","import React, { ReactNode } from 'react';\nimport * as Icons from 'lucide-react';\nimport clsx from 'clsx';\nimport { useDocuBook } from './context';\n\ntype IconName = keyof typeof Icons;\n\ninterface CardProps {\n title: string;\n icon?: IconName;\n href?: string;\n horizontal?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nexport const Card: React.FC<CardProps> = ({ title, icon, href, horizontal, children, className }) => {\n const { Link } = useDocuBook();\n const Icon = icon ? (Icons[icon] as React.FC<{ className?: string }>) : null;\n\n const content = (\n <div\n className={clsx(\n \"border rounded-lg shadow-sm p-4 transition-all duration-200\",\n \"bg-card text-card-foreground border-border\",\n \"hover:bg-accent/5 hover:border-accent/30\",\n \"flex gap-2\",\n horizontal ? \"flex-row items-center gap-1\" : \"flex-col space-y-1\",\n className\n )}\n >\n {Icon && <Icon className=\"w-5 h-5 text-primary flex-shrink-0\" />}\n <div className=\"flex-1 min-w-0 my-auto h-full\">\n <span className=\"text-base font-semibold text-foreground\">{title}</span>\n <div className=\"text-sm text-muted-foreground -mt-3\">{children}</div>\n </div>\n </div>\n );\n\n return href ? <Link className=\"no-underline block\" href={href}>{content}</Link> : content;\n};\n\nexport default Card;\n","import React from 'react'\nimport clsx from 'clsx'\n\ninterface CardGroupProps {\n children: React.ReactNode\n cols?: number\n className?: string\n}\n\nexport function CardGroup({ children, cols = 2, className }: CardGroupProps) {\n const cardsArray = React.Children.toArray(children)\n\n const gridColsClass: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n }\n\n return (\n <div className={clsx('grid gap-4', gridColsClass[cols] || 'grid-cols-1 sm:grid-cols-2', className)}>\n {cardsArray.map((card, index) => (\n <div key={index}>{card}</div>\n ))}\n </div>\n )\n}\n\nexport default CardGroup\n","import { ReactNode, useState, useContext } from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport * as Icons from \"lucide-react\";\nimport clsx from 'clsx';\nimport { AccordionGroupContext } from './AccordionContext';\n\ntype AccordionProps = {\n title: string;\n children?: ReactNode;\n defaultOpen?: boolean;\n icon?: keyof typeof Icons;\n};\n\nconst Accordion: React.FC<AccordionProps> = ({\n title,\n children,\n defaultOpen = false,\n icon,\n}: AccordionProps) => {\n const groupContext = useContext(AccordionGroupContext);\n const isInGroup = groupContext?.inGroup === true;\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const Icon = icon ? (Icons[icon] as React.FC<{ className?: string }>) : null;\n\n return (\n <div\n className={clsx(\n !isInGroup && \"border rounded-lg shadow-sm\",\n isInGroup && \"border-b last:border-b-0 border-border\"\n )}\n >\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n className=\"flex items-center gap-2 w-full px-4 py-3 transition-colors bg-muted/40 dark:bg-muted/20 hover:bg-muted/70 dark:hover:bg-muted/70 cursor-pointer text-start\"\n >\n <ChevronRight\n className={clsx(\n \"w-4 h-4 text-muted-foreground transition-transform duration-200 flex-shrink-0\",\n isOpen && \"rotate-90\"\n )}\n />\n {Icon && <Icon className=\"text-foreground w-4 h-4 flex-shrink-0\" />}\n <h3 className=\"font-medium text-base text-foreground !m-0\">{title}</h3>\n </button>\n\n {isOpen && (\n <div className=\"px-4 py-3 dark:bg-muted/10 bg-muted/15\">\n {children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Accordion;\n","'use client'\n\nimport { createContext } from 'react'\n\n/**\n * Context that tells child Accordion components they are inside a group.\n */\nexport const AccordionGroupContext = createContext<{ inGroup: boolean }>({\n inGroup: false,\n})\n","import React, { ReactNode } from \"react\";\nimport clsx from \"clsx\";\nimport { AccordionGroupContext } from \"./AccordionContext\";\n\ninterface AccordionGroupProps {\n children: ReactNode;\n className?: string;\n}\n\nconst AccordionGroup: React.FC<AccordionGroupProps> = ({ children, className }) => {\n\n return (\n <AccordionGroupContext.Provider value={{ inGroup: true }}>\n <div\n className={clsx(\n \"border rounded-lg overflow-hidden\",\n className\n )}\n >\n {children}\n </div>\n </AccordionGroupContext.Provider>\n );\n};\n\nexport default AccordionGroup;\n","import React, { Children } from 'react'\nimport clsx from 'clsx'\n\nexport function Stepper({ children }: { children: React.ReactNode }) {\n const length = Children.count(children)\n\n return (\n <div className=\"flex flex-col\">\n {Children.map(children, (child, index) => (\n <div\n className={clsx(\n 'border-l border-gray-200 dark:border-gray-700 pl-9 ml-3 relative',\n index < length - 1 && 'pb-5',\n )}\n >\n <div className=\"bg-gray-100 dark:bg-gray-800 text-gray-500 dark:text-gray-400 w-8 h-8 text-xs font-medium rounded-md border border-gray-300/50 dark:border-gray-600/50 flex items-center justify-center absolute -left-4 font-mono\">\n {index + 1}\n </div>\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nexport function StepperItem({\n children,\n title,\n}: {\n children: React.ReactNode\n title?: string\n}) {\n return (\n <div className=\"pt-0.5\">\n {title && <h4 className=\"mt-0\">{title}</h4>}\n <div>{children}</div>\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, Children, isValidElement, cloneElement } from 'react'\nimport { ChevronRight as ChevronRightIcon, File as FileIcon, Folder as FolderIcon, FolderOpen as FolderOpenIcon } from 'lucide-react'\nimport clsx from 'clsx'\n\n// ──────────────────────────────────────────────\n// FileTree components\n// ──────────────────────────────────────────────\n\ninterface FileTreeProps {\n name: string\n children?: React.ReactNode\n}\n\nconst FileComponent = ({ name }: FileTreeProps) => {\n const [isHovered, setIsHovered] = useState(false)\n const fileExtension = name.split('.').pop()?.toUpperCase()\n\n return (\n <div\n className={clsx(\n 'flex items-center gap-2 py-1.5 pl-7 pr-3 text-sm rounded-md transition-colors duration-150 cursor-default select-none',\n isHovered ? 'bg-blue-50 dark:bg-blue-950/20' : 'hover:bg-gray-100/50 dark:hover:bg-gray-800/50',\n )}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n tabIndex={-1}\n >\n <FileIcon\n className={clsx(\n 'flex-shrink-0 transition-colors',\n isHovered ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500',\n )}\n />\n <span className=\"font-mono text-sm truncate\">{name}</span>\n {isHovered && fileExtension && (\n <span className=\"ml-auto text-xs text-gray-400/80\">{fileExtension}</span>\n )}\n </div>\n )\n}\n\nconst FolderComponent = ({ name, children }: FileTreeProps) => {\n const [isOpen, setIsOpen] = useState(true)\n const [isHovered, setIsHovered] = useState(false)\n const hasChildren = React.Children.count(children) > 0\n\n return (\n <div className=\"relative\">\n <div\n className={clsx(\n 'flex items-center gap-2 py-1.5 pl-4 pr-3 rounded-md transition-colors duration-150 select-none',\n isHovered && 'bg-gray-100/60 dark:bg-gray-800/60',\n isOpen ? 'text-gray-900 dark:text-gray-100' : 'text-gray-700 dark:text-gray-300',\n hasChildren ? 'cursor-pointer' : 'cursor-default',\n )}\n onClick={() => hasChildren && setIsOpen(!isOpen)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n tabIndex={-1}\n onKeyDown={(e) => e.preventDefault()}\n >\n {hasChildren ? (\n <ChevronRightIcon\n className={clsx(\n 'flex-shrink-0 transition-transform duration-200',\n isOpen && 'rotate-90',\n isHovered ? 'text-gray-600 dark:text-gray-400' : 'text-gray-400 dark:text-gray-500',\n )}\n />\n ) : (\n <div className=\"w-3.5\" />\n )}\n {isOpen ? (\n <FolderOpenIcon\n className={clsx(\n 'flex-shrink-0 transition-colors',\n isHovered ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500',\n )}\n />\n ) : (\n <FolderIcon\n className={clsx(\n 'flex-shrink-0 transition-colors',\n isHovered ? 'text-blue-400' : 'text-gray-400/80 dark:text-gray-500/80',\n )}\n />\n )}\n <span\n className={clsx(\n 'font-medium transition-colors duration-150',\n isHovered && 'text-blue-500',\n )}\n >\n {name}\n </span>\n </div>\n {isOpen && hasChildren && (\n <div className=\"ml-5 border-l-2 border-gray-200/50 dark:border-gray-700/50 pl-2\">\n {children}\n </div>\n )}\n </div>\n )\n}\n\nexport function Files({ children }: { children: React.ReactNode }) {\n return (\n <div\n className=\"rounded-xl border border-gray-200/20 dark:border-gray-700/20 bg-white/20 dark:bg-gray-900/20 backdrop-blur-sm shadow-sm overflow-hidden transition-all duration-200 hover:shadow-md hover:border-gray-300/60 dark:hover:border-gray-600/60\"\n onKeyDown={(e) => e.preventDefault()}\n >\n <div className=\"p-2\">\n {Children.map(children, (child, index) => {\n if (isValidElement(child)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return cloneElement(child as any, { key: index })\n }\n return null\n })}\n </div>\n </div>\n )\n}\n\nexport function Folder({ name, children }: FileTreeProps) {\n return <FolderComponent name={name}>{children}</FolderComponent>\n}\n\nexport function File({ name }: FileTreeProps) {\n return <FileComponent name={name} />\n}\n\nexport const FileTreeMdx = { Files, File, Folder }\nexport default FileTreeMdx\n","import React from 'react'\n\nconst macKeyMap: Record<string, string> = {\n command: '⌘', cmd: '⌘', option: '⌥', alt: '⌥',\n shift: '⇧', ctrl: '⌃', control: '⌃', tab: '⇥',\n caps: '⇪', enter: '⏎', return: '⏎', delete: '⌫',\n escape: '⎋', esc: '⎋', up: '↑', down: '↓',\n left: '←', right: '→', space: '␣',\n}\n\nconst windowsKeyMap: Record<string, string> = {\n command: 'Win', cmd: 'Win', option: 'Alt', alt: 'Alt',\n ctrl: 'Ctrl', control: 'Ctrl', delete: 'Del', escape: 'Esc',\n esc: 'Esc', enter: 'Enter', return: 'Enter', tab: 'Tab',\n caps: 'Caps', shift: 'Shift', space: 'Space',\n up: '↑', down: '↓', left: '←', right: '→',\n}\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n show?: string\n type?: 'window' | 'mac'\n children?: React.ReactNode\n}\n\nexport function Kbd({ show: keyProp, type = 'window', children, ...props }: KbdProps) {\n const getKeyDisplay = (): React.ReactNode => {\n if (!keyProp || typeof keyProp !== 'string') return null\n const lowerKey = keyProp.toLowerCase()\n if (type === 'mac') return macKeyMap[lowerKey] || keyProp\n return windowsKeyMap[lowerKey] || (keyProp.charAt(0).toUpperCase() + keyProp.slice(1))\n }\n\n const renderContent = () => {\n if (children !== undefined && children !== null && children !== '') return children\n return getKeyDisplay() || keyProp || ''\n }\n\n return (\n <kbd\n className=\"inline-flex items-center justify-center px-2 py-1 mx-0.5 text-xs font-mono font-medium bg-gray-100 dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-md\"\n {...props}\n >\n {renderContent()}\n </kbd>\n )\n}\n\nexport default Kbd\n","'use client'\n\nimport React, { useState } from 'react'\n\ninterface TooltipProps {\n text: string\n tip: string\n}\n\nexport function Tooltip({ text, tip }: TooltipProps) {\n const [visible, setVisible] = useState(false)\n\n return (\n <span\n className=\"relative inline-flex items-center cursor-help text-blue-600 dark:text-blue-400 hover:text-blue-500 dark:hover:text-blue-300 transition-colors\"\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <span className=\"border-b border-dashed border-blue-500/60 pb-0.5\">\n {text}\n </span>\n {visible && (\n <span className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-3 w-64 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 text-sm p-3 rounded-md shadow-lg border border-gray-200/50 dark:border-gray-700/50 break-words text-left z-50\">\n {tip}\n <span className=\"absolute -bottom-1.5 left-1/2 -translate-x-1/2 w-3 h-3 bg-white dark:bg-gray-800 rotate-45 border-b border-r border-gray-200/50 dark:border-gray-700/50 -z-10\" />\n </span>\n )}\n </span>\n )\n}\n\nexport default Tooltip\n","import React from 'react'\n\ninterface YoutubeProps {\n videoId: string\n className?: string\n}\n\nexport function Youtube({ videoId, className }: YoutubeProps) {\n return (\n <div className={`aspect-video w-full ${className || ''}`}>\n <iframe\n src={`https://www.youtube.com/embed/${videoId}?rel=0&modestbranding=1&showinfo=0&autohide=1&controls=1`}\n title=\"YouTube video player\"\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n className=\"w-full h-full rounded-lg\"\n />\n </div>\n )\n}\n\nexport default Youtube\n","import React from \"react\";\nimport * as Icons from \"lucide-react\";\nimport clsx from \"clsx\";\nimport { useDocuBook } from \"./context\";\n\ntype ButtonProps = {\n icon?: keyof typeof Icons;\n text?: string;\n href: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n size?: \"sm\" | \"md\" | \"lg\";\n variation?: \"primary\" | \"accent\" | \"outline\";\n};\n\nconst Button: React.FC<ButtonProps> = ({\n icon,\n text,\n href,\n target,\n size = \"md\",\n variation = \"primary\",\n}) => {\n const { Link } = useDocuBook();\n\n const baseStyles = \"inline-flex items-center justify-center rounded font-medium focus:outline-none transition no-underline\";\n\n const sizeStyles = {\n sm: \"px-3 py-1 my-6 text-sm\",\n md: \"px-4 py-2 my-6 text-base\",\n lg: \"px-5 py-3 my-6 text-lg\",\n };\n\n const variationStyles = {\n primary: \"bg-primary text-white hover:bg-primary/90\",\n accent: \"bg-accent text-white hover:bg-accent/90\",\n outline: \"border border-accent text-accent hover:bg-accent/10\",\n };\n\n const Icon = icon ? (Icons[icon] as React.FC<{ className?: string }>) : null;\n\n return (\n <Link\n href={href}\n target={target}\n rel={target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n className={clsx(baseStyles, sizeStyles[size], variationStyles[variation])}\n >\n {text && <span>{text}</span>}\n {Icon && <Icon className=\"mr-2 h-5 w-5\" />}\n </Link>\n );\n};\n\nexport default Button;\n","import React from 'react'\nimport { useDocuBook } from './context'\n\ninterface DocuLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string\n}\n\n/**\n * Framework-agnostic Link component.\n * Named `DocuLink` to avoid collision with native HTML `<link>` in MDX.\n */\nexport function DocuLink({ href, ...props }: DocuLinkProps) {\n const { Link } = useDocuBook()\n\n if (!href) return null\n\n return (\n <Link\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...props}\n />\n )\n}\n\nexport default DocuLink\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport { Search, X } from 'lucide-react'\nimport { useDocuBook } from './context'\n\ninterface DocuImageProps {\n src: string\n alt?: string\n width?: number | string\n height?: number | string\n className?: string\n}\n\n/**\n * Framework-agnostic Image component with lightbox.\n * Uses useDocuBook().Image for the rendering primitive.\n */\nexport function DocuImage({\n src,\n alt = 'alt',\n width = 800,\n height = 350,\n className,\n ...props\n}: DocuImageProps) {\n const { Image } = useDocuBook()\n const [isOpen, setIsOpen] = useState(false)\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden'\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setIsOpen(false)\n }\n window.addEventListener('keydown', handleEsc)\n return () => {\n document.body.style.overflow = 'auto'\n window.removeEventListener('keydown', handleEsc)\n }\n }\n }, [isOpen])\n\n if (!src) return null\n\n return (\n <>\n <button\n type=\"button\"\n className=\"relative group cursor-zoom-in my-6 w-full flex justify-center rounded-lg\"\n onClick={() => setIsOpen(true)}\n aria-label=\"Zoom image\"\n >\n <span className=\"absolute inset-0 bg-black/0 group-hover:bg-black/5 transition-colors z-10 flex items-center justify-center opacity-0 group-hover:opacity-100 rounded-lg\">\n <Search className=\"w-8 h-8 text-white drop-shadow-md\" />\n </span>\n <Image\n src={src}\n alt={alt}\n width={width}\n height={height}\n className={`w-full h-auto rounded-lg transition-transform duration-300 group-hover:scale-[1.01] ${className || ''}`}\n {...props}\n />\n </button>\n\n {isOpen && (\n <div\n className=\"fixed inset-0 z-[99999] flex items-center justify-center bg-black/90 backdrop-blur-md p-4 md:p-10 cursor-zoom-out\"\n onClick={() => setIsOpen(false)}\n >\n <button\n className=\"absolute top-4 right-4 z-50 p-2 text-white/70 hover:text-white bg-black/20 hover:bg-white/10 rounded-full transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n setIsOpen(false)\n }}\n >\n <X className=\"w-6 h-6\" />\n </button>\n\n <div className=\"relative max-w-7xl w-full h-full flex items-center justify-center\">\n <Image\n src={src}\n alt={alt}\n width={1920}\n height={1080}\n className=\"object-contain max-h-[90vh] w-auto h-auto rounded-md shadow-2xl\"\n />\n </div>\n\n {alt && alt !== 'alt' && (\n <div className=\"absolute bottom-6 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-full text-sm font-medium backdrop-blur-md border border-white/10\">\n {alt}\n </div>\n )}\n </div>\n )}\n </>\n )\n}\n\nexport default DocuImage\n","import React from 'react'\nimport { Plus, Wrench, Zap, AlertTriangle, XCircle } from 'lucide-react'\nimport clsx from 'clsx'\n\ninterface ReleaseProps {\n version: string\n title: string\n date?: string\n children: React.ReactNode\n}\n\nexport function Release({ version, title, date, children }: ReleaseProps) {\n return (\n <div className=\"mb-16 group\">\n <div className=\"flex items-center gap-3 mt-6 mb-2\">\n <div\n id={version}\n className=\"inline-flex items-center rounded-full border border-blue-500/20 bg-blue-500/10 px-3 py-1 text-sm font-semibold text-blue-600 dark:text-blue-400 transition-colors hover:bg-blue-500/15 scroll-m-20 backdrop-blur-sm\"\n >\n v{version}\n </div>\n {date && (\n <div className=\"flex items-center gap-3 text-sm font-medium text-gray-500 dark:text-gray-400\">\n <span className=\"h-1 w-1 rounded-full bg-gray-400/30\" />\n <time dateTime={date}>\n {new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n </time>\n </div>\n )}\n </div>\n <h3 className=\"text-2xl font-bold text-gray-900/90 dark:text-gray-100/90 mb-6 mt-0\">\n {title}\n </h3>\n <div className=\"space-y-8\">{children}</div>\n </div>\n )\n}\n\ninterface ChangesProps {\n type: 'added' | 'fixed' | 'improved' | 'deprecated' | 'removed'\n children: React.ReactNode\n}\n\nconst typeConfig = {\n added: {\n label: 'Added',\n className: 'bg-green-100 dark:bg-green-900/50 text-green-700 dark:text-green-300',\n icon: Plus,\n },\n fixed: {\n label: 'Fixed',\n className: 'bg-yellow-100 dark:bg-yellow-900/50 text-yellow-700 dark:text-yellow-300',\n icon: Wrench,\n },\n improved: {\n label: 'Improved',\n className: 'bg-cyan-100 dark:bg-cyan-900/50 text-cyan-700 dark:text-cyan-300',\n icon: Zap,\n },\n deprecated: {\n label: 'Deprecated',\n className: 'bg-orange-100 dark:bg-orange-900/50 text-orange-700 dark:text-orange-300',\n icon: AlertTriangle,\n },\n removed: {\n label: 'Removed',\n className: 'bg-pink-100 dark:bg-pink-900/50 text-pink-700 dark:text-pink-300',\n icon: XCircle,\n },\n} as const\n\nexport function Changes({ type, children }: ChangesProps) {\n const config = typeConfig[type] || typeConfig.added\n const Icon = config.icon\n\n return (\n <div className=\"space-y-3 mb-8\">\n <div className=\"flex items-center gap-2\">\n <div className={clsx('px-3 py-1 rounded-full text-sm font-medium flex items-center gap-1.5', config.className)}>\n <Icon className=\"w-3.5 h-3.5\" />\n <span>{config.label}</span>\n </div>\n </div>\n <ul className=\"list-none pl-0 space-y-2 text-gray-700 dark:text-gray-300\">\n {React.Children.map(children, (child, index) => {\n const processedChild =\n typeof child === 'string'\n ? child.trim().replace(/^[-*]\\s+/, '')\n : child\n\n return <li key={index} className=\"leading-relaxed\">{processedChild}</li>\n })}\n </ul>\n </div>\n )\n}\n\nexport const ReleaseMdx = { Release, Changes }\nexport default ReleaseMdx\n","import React, { useState } from \"react\";\nimport { Check, Copy as CopyIcon } from \"lucide-react\";\n\ntype CopyProps = {\n content: string;\n};\n\nconst Copy: React.FC<CopyProps> = ({ content }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n async function handleCopy() {\n await navigator.clipboard.writeText(content);\n setIsCopied(true);\n\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n }\n\n return (\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center px-2 py-1 text-xs font-medium border rounded transition-colors bg-muted hover:bg-muted/70 border-border cursor-copy\"\n onClick={handleCopy}\n >\n {isCopied ? (\n <Check className=\"w-3 h-3\" />\n ) : (\n <CopyIcon className=\"w-3 h-3\" />\n )}\n </button>\n );\n};\n\nexport default Copy;\n","import React, { type ComponentProps } from 'react'\nimport Copy from './Copy'\n\ntype PreProps = ComponentProps<'pre'> & {\n raw?: string\n 'data-title'?: string\n}\n\nexport function Pre({ children, raw, ...rest }: PreProps) {\n const { 'data-title': title, className, ...restProps } = rest\n const hasTitle = !!title\n\n return (\n <div className=\"relative rounded-lg border border-gray-200 dark:border-gray-700 my-4 overflow-hidden\">\n <div className=\"absolute top-2 right-2 z-10\">\n {raw && <Copy content={raw} />}\n </div>\n {hasTitle && (\n <div className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50\">\n <span>{title}</span>\n </div>\n )}\n <div className=\"overflow-x-auto\">\n <pre className={className} {...restProps}>\n {children}\n </pre>\n </div>\n </div>\n )\n}\n\nexport default Pre\n"],"mappings":"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","names":["jsx","clsx","jsx","jsxs","clsx","React","clsx","jsx","useContext","Icons","clsx","createContext","jsx","jsxs","useContext","Icons","clsx","clsx","jsx","clsx","clsx","jsx","jsxs","React","useState","Children","clsx","jsx","jsxs","jsx","useState","jsx","jsxs","jsx","Icons","clsx","jsx","jsxs","Icons","clsx","jsx","useState","jsx","jsxs","useState","React","AlertTriangle","clsx","jsx","jsxs","useState","jsx","jsx","jsxs","_a"]}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/esbuild.ts
21
+ var esbuild_exports = {};
22
+ __export(esbuild_exports, {
23
+ default: () => esbuild_default
24
+ });
25
+ module.exports = __toCommonJS(esbuild_exports);
26
+ var import_unplugin2 = require("unplugin");
27
+
28
+ // src/index.ts
29
+ var import_unplugin = require("unplugin");
30
+
31
+ // src/core/registry.ts
32
+ var FRAMEWORK_PATHS = {
33
+ react: "/react",
34
+ vue: "/vue",
35
+ svelte: "/svelte"
36
+ };
37
+ function createRegistry(framework) {
38
+ const basePath = FRAMEWORK_PATHS[framework];
39
+ return {
40
+ Note: { exports: ["Note"], path: basePath },
41
+ Card: { exports: ["Card"], path: basePath },
42
+ CardGroup: { exports: ["CardGroup"], path: basePath },
43
+ Accordion: { exports: ["Accordion"], path: basePath },
44
+ AccordionGroup: { exports: ["AccordionGroup"], path: basePath },
45
+ Stepper: { exports: ["Stepper", "StepperItem"], path: basePath },
46
+ Kbd: { exports: ["Kbd"], path: basePath },
47
+ Tooltip: { exports: ["Tooltip"], path: basePath },
48
+ Youtube: { exports: ["Youtube"], path: basePath },
49
+ Button: { exports: ["Button"], path: basePath },
50
+ DocuLink: { exports: ["DocuLink"], path: basePath },
51
+ DocuImage: { exports: ["DocuImage"], path: basePath },
52
+ Files: { exports: ["Files"], path: basePath },
53
+ Folder: { exports: ["Folder"], path: basePath },
54
+ File: { exports: ["File"], path: basePath },
55
+ Release: { exports: ["Release"], path: basePath },
56
+ Changes: { exports: ["Changes"], path: basePath },
57
+ Pre: { exports: ["Pre"], path: basePath },
58
+ Copy: { exports: ["Copy"], path: basePath },
59
+ DocuBookProvider: { exports: ["DocuBookProvider"], path: basePath }
60
+ };
61
+ }
62
+ function getComponentRegistry(framework = "react") {
63
+ return createRegistry(framework);
64
+ }
65
+ function buildComponentDetectionRegex(framework = "react") {
66
+ const registry = getComponentRegistry(framework);
67
+ const names = Object.keys(registry);
68
+ return new RegExp(`<(${names.join("|")})(?=[\\s/>])`, "g");
69
+ }
70
+
71
+ // src/core/transform.ts
72
+ var DEFAULT_IMPORT_SOURCE = "unplugin-docubook/components";
73
+ var DEFAULT_FRAMEWORK = "react";
74
+ function detectComponents(code, framework = DEFAULT_FRAMEWORK) {
75
+ const regex = buildComponentDetectionRegex(framework);
76
+ const registry = getComponentRegistry(framework);
77
+ const found = /* @__PURE__ */ new Set();
78
+ let match;
79
+ while ((match = regex.exec(code)) !== null) {
80
+ const name = match[1];
81
+ if (name && registry[name]) {
82
+ found.add(name);
83
+ }
84
+ }
85
+ return Array.from(found);
86
+ }
87
+ function generateImports(componentNames, importSource, framework = DEFAULT_FRAMEWORK) {
88
+ const registry = getComponentRegistry(framework);
89
+ const pathToExports = /* @__PURE__ */ new Map();
90
+ for (const name of componentNames) {
91
+ const meta = registry[name];
92
+ if (!meta) continue;
93
+ const fullPath = `${importSource}${meta.path}`;
94
+ if (!pathToExports.has(fullPath)) {
95
+ pathToExports.set(fullPath, /* @__PURE__ */ new Set());
96
+ }
97
+ for (const exp of meta.exports) {
98
+ pathToExports.get(fullPath).add(exp);
99
+ }
100
+ }
101
+ const lines = [];
102
+ for (const [path, exports2] of pathToExports) {
103
+ const names = Array.from(exports2).sort().join(", ");
104
+ lines.push(`import { ${names} } from '${path}'`);
105
+ }
106
+ return lines.join("\n");
107
+ }
108
+ function transformMdx(code, options = {}) {
109
+ var _a, _b;
110
+ const framework = (_a = options.framework) != null ? _a : DEFAULT_FRAMEWORK;
111
+ const usedComponents = detectComponents(code, framework);
112
+ if (usedComponents.length === 0) {
113
+ return { code, hasTransformed: false };
114
+ }
115
+ const importSource = (_b = options.importSource) != null ? _b : DEFAULT_IMPORT_SOURCE;
116
+ const importStatements = generateImports(usedComponents, importSource, framework);
117
+ return {
118
+ code: `${importStatements}
119
+
120
+ ${code}`,
121
+ hasTransformed: true
122
+ };
123
+ }
124
+
125
+ // src/index.ts
126
+ var unpluginFactory = (options) => ({
127
+ name: "unplugin-docubook",
128
+ transformInclude(id) {
129
+ return /\.mdx?$/.test(id);
130
+ },
131
+ transform(code, _id) {
132
+ const result = transformMdx(code, options);
133
+ if (!result.hasTransformed) return;
134
+ return result.code;
135
+ }
136
+ });
137
+
138
+ // src/esbuild.ts
139
+ var esbuild_default = (0, import_unplugin2.createEsbuildPlugin)(unpluginFactory);
140
+ //# sourceMappingURL=esbuild.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/esbuild.ts","../src/index.ts","../src/core/registry.ts","../src/core/transform.ts"],"sourcesContent":["import { createEsbuildPlugin } from 'unplugin'\nimport { unpluginFactory } from '.'\n\nexport default createEsbuildPlugin(unpluginFactory)\n","import type { UnpluginFactory } from 'unplugin'\nimport type { Options } from './types'\nimport { createUnplugin } from 'unplugin'\nimport { transformMdx } from './core/transform'\n\nexport const unpluginFactory: UnpluginFactory<Options | undefined> = (\n options,\n) => ({\n name: 'unplugin-docubook',\n\n transformInclude(id) {\n // Only process .mdx and .md files\n return /\\.mdx?$/.test(id)\n },\n\n transform(code, _id) {\n const result = transformMdx(code, options)\n if (!result.hasTransformed) return\n return result.code\n },\n})\n\nexport const unplugin = /* #__PURE__ */ createUnplugin(unpluginFactory)\n\nexport default unplugin\n","import type { Framework } from '../types'\n\nexport interface ComponentMeta {\n exports: string[]\n path: string\n}\n\nconst FRAMEWORK_PATHS: Record<Framework, string> = {\n react: '/react',\n vue: '/vue',\n svelte: '/svelte',\n}\n\nfunction createRegistry(framework: Framework): Record<string, ComponentMeta> {\n const basePath = FRAMEWORK_PATHS[framework]\n\n return {\n Note: { exports: ['Note'], path: basePath },\n Card: { exports: ['Card'], path: basePath },\n CardGroup: { exports: ['CardGroup'], path: basePath },\n Accordion: { exports: ['Accordion'], path: basePath },\n AccordionGroup: { exports: ['AccordionGroup'], path: basePath },\n Stepper: { exports: ['Stepper', 'StepperItem'], path: basePath },\n Kbd: { exports: ['Kbd'], path: basePath },\n Tooltip: { exports: ['Tooltip'], path: basePath },\n Youtube: { exports: ['Youtube'], path: basePath },\n Button: { exports: ['Button'], path: basePath },\n DocuLink: { exports: ['DocuLink'], path: basePath },\n DocuImage: { exports: ['DocuImage'], path: basePath },\n Files: { exports: ['Files'], path: basePath },\n Folder: { exports: ['Folder'], path: basePath },\n File: { exports: ['File'], path: basePath },\n Release: { exports: ['Release'], path: basePath },\n Changes: { exports: ['Changes'], path: basePath },\n Pre: { exports: ['Pre'], path: basePath },\n Copy: { exports: ['Copy'], path: basePath },\n DocuBookProvider: { exports: ['DocuBookProvider'], path: basePath },\n }\n}\n\nexport function getComponentRegistry(framework: Framework = 'react'): Record<string, ComponentMeta> {\n return createRegistry(framework)\n}\n\nexport function buildComponentDetectionRegex(framework: Framework = 'react'): RegExp {\n const registry = getComponentRegistry(framework)\n const names = Object.keys(registry)\n return new RegExp(`<(${names.join('|')})(?=[\\\\s/>])`, 'g')\n}\n","import type { Options, Framework } from '../types'\nimport { getComponentRegistry, buildComponentDetectionRegex } from './registry'\n\nconst DEFAULT_IMPORT_SOURCE = 'unplugin-docubook/components'\nconst DEFAULT_FRAMEWORK: Framework = 'react'\n\nexport function detectComponents(code: string, framework: Framework = DEFAULT_FRAMEWORK): string[] {\n const regex = buildComponentDetectionRegex(framework)\n const registry = getComponentRegistry(framework)\n const found = new Set<string>()\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(code)) !== null) {\n const name = match[1]\n if (name && registry[name]) {\n found.add(name)\n }\n }\n\n return Array.from(found)\n}\n\nexport function generateImports(\n componentNames: string[],\n importSource: string,\n framework: Framework = DEFAULT_FRAMEWORK,\n): string {\n const registry = getComponentRegistry(framework)\n const pathToExports = new Map<string, Set<string>>()\n\n for (const name of componentNames) {\n const meta = registry[name]\n if (!meta) continue\n\n const fullPath = `${importSource}${meta.path}`\n if (!pathToExports.has(fullPath)) {\n pathToExports.set(fullPath, new Set())\n }\n for (const exp of meta.exports) {\n pathToExports.get(fullPath)!.add(exp)\n }\n }\n\n const lines: string[] = []\n for (const [path, exports] of pathToExports) {\n const names = Array.from(exports).sort().join(', ')\n lines.push(`import { ${names} } from '${path}'`)\n }\n\n return lines.join('\\n')\n}\n\nexport function transformMdx(\n code: string,\n options: Options = {},\n): { code: string; hasTransformed: boolean } {\n const framework = options.framework ?? DEFAULT_FRAMEWORK\n const usedComponents = detectComponents(code, framework)\n\n if (usedComponents.length === 0) {\n return { code, hasTransformed: false }\n }\n\n const importSource = options.importSource ?? DEFAULT_IMPORT_SOURCE\n const importStatements = generateImports(usedComponents, importSource, framework)\n\n return {\n code: `${importStatements}\\n\\n${code}`,\n hasTransformed: true,\n }\n}\n"],"mappings":"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","names":["import_unplugin","exports"]}
package/dist/esbuild.js CHANGED
@@ -1,9 +1,119 @@
1
- import { n as unpluginFactory } from "./src-KZV_M01u.js";
1
+ // src/esbuild.ts
2
2
  import { createEsbuildPlugin } from "unplugin";
3
3
 
4
- //#region src/esbuild.ts
5
- var esbuild_default = createEsbuildPlugin(unpluginFactory);
4
+ // src/index.ts
5
+ import { createUnplugin } from "unplugin";
6
+
7
+ // src/core/registry.ts
8
+ var FRAMEWORK_PATHS = {
9
+ react: "/react",
10
+ vue: "/vue",
11
+ svelte: "/svelte"
12
+ };
13
+ function createRegistry(framework) {
14
+ const basePath = FRAMEWORK_PATHS[framework];
15
+ return {
16
+ Note: { exports: ["Note"], path: basePath },
17
+ Card: { exports: ["Card"], path: basePath },
18
+ CardGroup: { exports: ["CardGroup"], path: basePath },
19
+ Accordion: { exports: ["Accordion"], path: basePath },
20
+ AccordionGroup: { exports: ["AccordionGroup"], path: basePath },
21
+ Stepper: { exports: ["Stepper", "StepperItem"], path: basePath },
22
+ Kbd: { exports: ["Kbd"], path: basePath },
23
+ Tooltip: { exports: ["Tooltip"], path: basePath },
24
+ Youtube: { exports: ["Youtube"], path: basePath },
25
+ Button: { exports: ["Button"], path: basePath },
26
+ DocuLink: { exports: ["DocuLink"], path: basePath },
27
+ DocuImage: { exports: ["DocuImage"], path: basePath },
28
+ Files: { exports: ["Files"], path: basePath },
29
+ Folder: { exports: ["Folder"], path: basePath },
30
+ File: { exports: ["File"], path: basePath },
31
+ Release: { exports: ["Release"], path: basePath },
32
+ Changes: { exports: ["Changes"], path: basePath },
33
+ Pre: { exports: ["Pre"], path: basePath },
34
+ Copy: { exports: ["Copy"], path: basePath },
35
+ DocuBookProvider: { exports: ["DocuBookProvider"], path: basePath }
36
+ };
37
+ }
38
+ function getComponentRegistry(framework = "react") {
39
+ return createRegistry(framework);
40
+ }
41
+ function buildComponentDetectionRegex(framework = "react") {
42
+ const registry = getComponentRegistry(framework);
43
+ const names = Object.keys(registry);
44
+ return new RegExp(`<(${names.join("|")})(?=[\\s/>])`, "g");
45
+ }
46
+
47
+ // src/core/transform.ts
48
+ var DEFAULT_IMPORT_SOURCE = "unplugin-docubook/components";
49
+ var DEFAULT_FRAMEWORK = "react";
50
+ function detectComponents(code, framework = DEFAULT_FRAMEWORK) {
51
+ const regex = buildComponentDetectionRegex(framework);
52
+ const registry = getComponentRegistry(framework);
53
+ const found = /* @__PURE__ */ new Set();
54
+ let match;
55
+ while ((match = regex.exec(code)) !== null) {
56
+ const name = match[1];
57
+ if (name && registry[name]) {
58
+ found.add(name);
59
+ }
60
+ }
61
+ return Array.from(found);
62
+ }
63
+ function generateImports(componentNames, importSource, framework = DEFAULT_FRAMEWORK) {
64
+ const registry = getComponentRegistry(framework);
65
+ const pathToExports = /* @__PURE__ */ new Map();
66
+ for (const name of componentNames) {
67
+ const meta = registry[name];
68
+ if (!meta) continue;
69
+ const fullPath = `${importSource}${meta.path}`;
70
+ if (!pathToExports.has(fullPath)) {
71
+ pathToExports.set(fullPath, /* @__PURE__ */ new Set());
72
+ }
73
+ for (const exp of meta.exports) {
74
+ pathToExports.get(fullPath).add(exp);
75
+ }
76
+ }
77
+ const lines = [];
78
+ for (const [path, exports] of pathToExports) {
79
+ const names = Array.from(exports).sort().join(", ");
80
+ lines.push(`import { ${names} } from '${path}'`);
81
+ }
82
+ return lines.join("\n");
83
+ }
84
+ function transformMdx(code, options = {}) {
85
+ var _a, _b;
86
+ const framework = (_a = options.framework) != null ? _a : DEFAULT_FRAMEWORK;
87
+ const usedComponents = detectComponents(code, framework);
88
+ if (usedComponents.length === 0) {
89
+ return { code, hasTransformed: false };
90
+ }
91
+ const importSource = (_b = options.importSource) != null ? _b : DEFAULT_IMPORT_SOURCE;
92
+ const importStatements = generateImports(usedComponents, importSource, framework);
93
+ return {
94
+ code: `${importStatements}
6
95
 
7
- //#endregion
8
- export { esbuild_default as default };
96
+ ${code}`,
97
+ hasTransformed: true
98
+ };
99
+ }
100
+
101
+ // src/index.ts
102
+ var unpluginFactory = (options) => ({
103
+ name: "unplugin-docubook",
104
+ transformInclude(id) {
105
+ return /\.mdx?$/.test(id);
106
+ },
107
+ transform(code, _id) {
108
+ const result = transformMdx(code, options);
109
+ if (!result.hasTransformed) return;
110
+ return result.code;
111
+ }
112
+ });
113
+
114
+ // src/esbuild.ts
115
+ var esbuild_default = createEsbuildPlugin(unpluginFactory);
116
+ export {
117
+ esbuild_default as default
118
+ };
9
119
  //# sourceMappingURL=esbuild.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"esbuild.js","names":[],"sources":["../src/esbuild.ts"],"sourcesContent":["import { createEsbuildPlugin } from 'unplugin'\nimport { unpluginFactory } from '.'\n\nexport default createEsbuildPlugin(unpluginFactory)\n"],"mappings":";;;;AAGA,sBAAe,oBAAoB,gBAAgB"}
1
+ {"version":3,"sources":["../src/esbuild.ts","../src/index.ts","../src/core/registry.ts","../src/core/transform.ts"],"sourcesContent":["import { createEsbuildPlugin } from 'unplugin'\nimport { unpluginFactory } from '.'\n\nexport default createEsbuildPlugin(unpluginFactory)\n","import type { UnpluginFactory } from 'unplugin'\nimport type { Options } from './types'\nimport { createUnplugin } from 'unplugin'\nimport { transformMdx } from './core/transform'\n\nexport const unpluginFactory: UnpluginFactory<Options | undefined> = (\n options,\n) => ({\n name: 'unplugin-docubook',\n\n transformInclude(id) {\n // Only process .mdx and .md files\n return /\\.mdx?$/.test(id)\n },\n\n transform(code, _id) {\n const result = transformMdx(code, options)\n if (!result.hasTransformed) return\n return result.code\n },\n})\n\nexport const unplugin = /* #__PURE__ */ createUnplugin(unpluginFactory)\n\nexport default unplugin\n","import type { Framework } from '../types'\n\nexport interface ComponentMeta {\n exports: string[]\n path: string\n}\n\nconst FRAMEWORK_PATHS: Record<Framework, string> = {\n react: '/react',\n vue: '/vue',\n svelte: '/svelte',\n}\n\nfunction createRegistry(framework: Framework): Record<string, ComponentMeta> {\n const basePath = FRAMEWORK_PATHS[framework]\n\n return {\n Note: { exports: ['Note'], path: basePath },\n Card: { exports: ['Card'], path: basePath },\n CardGroup: { exports: ['CardGroup'], path: basePath },\n Accordion: { exports: ['Accordion'], path: basePath },\n AccordionGroup: { exports: ['AccordionGroup'], path: basePath },\n Stepper: { exports: ['Stepper', 'StepperItem'], path: basePath },\n Kbd: { exports: ['Kbd'], path: basePath },\n Tooltip: { exports: ['Tooltip'], path: basePath },\n Youtube: { exports: ['Youtube'], path: basePath },\n Button: { exports: ['Button'], path: basePath },\n DocuLink: { exports: ['DocuLink'], path: basePath },\n DocuImage: { exports: ['DocuImage'], path: basePath },\n Files: { exports: ['Files'], path: basePath },\n Folder: { exports: ['Folder'], path: basePath },\n File: { exports: ['File'], path: basePath },\n Release: { exports: ['Release'], path: basePath },\n Changes: { exports: ['Changes'], path: basePath },\n Pre: { exports: ['Pre'], path: basePath },\n Copy: { exports: ['Copy'], path: basePath },\n DocuBookProvider: { exports: ['DocuBookProvider'], path: basePath },\n }\n}\n\nexport function getComponentRegistry(framework: Framework = 'react'): Record<string, ComponentMeta> {\n return createRegistry(framework)\n}\n\nexport function buildComponentDetectionRegex(framework: Framework = 'react'): RegExp {\n const registry = getComponentRegistry(framework)\n const names = Object.keys(registry)\n return new RegExp(`<(${names.join('|')})(?=[\\\\s/>])`, 'g')\n}\n","import type { Options, Framework } from '../types'\nimport { getComponentRegistry, buildComponentDetectionRegex } from './registry'\n\nconst DEFAULT_IMPORT_SOURCE = 'unplugin-docubook/components'\nconst DEFAULT_FRAMEWORK: Framework = 'react'\n\nexport function detectComponents(code: string, framework: Framework = DEFAULT_FRAMEWORK): string[] {\n const regex = buildComponentDetectionRegex(framework)\n const registry = getComponentRegistry(framework)\n const found = new Set<string>()\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(code)) !== null) {\n const name = match[1]\n if (name && registry[name]) {\n found.add(name)\n }\n }\n\n return Array.from(found)\n}\n\nexport function generateImports(\n componentNames: string[],\n importSource: string,\n framework: Framework = DEFAULT_FRAMEWORK,\n): string {\n const registry = getComponentRegistry(framework)\n const pathToExports = new Map<string, Set<string>>()\n\n for (const name of componentNames) {\n const meta = registry[name]\n if (!meta) continue\n\n const fullPath = `${importSource}${meta.path}`\n if (!pathToExports.has(fullPath)) {\n pathToExports.set(fullPath, new Set())\n }\n for (const exp of meta.exports) {\n pathToExports.get(fullPath)!.add(exp)\n }\n }\n\n const lines: string[] = []\n for (const [path, exports] of pathToExports) {\n const names = Array.from(exports).sort().join(', ')\n lines.push(`import { ${names} } from '${path}'`)\n }\n\n return lines.join('\\n')\n}\n\nexport function transformMdx(\n code: string,\n options: Options = {},\n): { code: string; hasTransformed: boolean } {\n const framework = options.framework ?? DEFAULT_FRAMEWORK\n const usedComponents = detectComponents(code, framework)\n\n if (usedComponents.length === 0) {\n return { code, hasTransformed: false }\n }\n\n const importSource = options.importSource ?? DEFAULT_IMPORT_SOURCE\n const importStatements = generateImports(usedComponents, importSource, framework)\n\n return {\n code: `${importStatements}\\n\\n${code}`,\n hasTransformed: true,\n }\n}\n"],"mappings":"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","names":[]}