@blogmcp/mdx-render-vue 0.1.0

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 (249) hide show
  1. package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
  2. package/dist/_virtual/constants.js +4 -0
  3. package/dist/_virtual/index.js +5 -0
  4. package/dist/_virtual/index2.js +4 -0
  5. package/dist/composables/index.d.ts +11 -0
  6. package/dist/composables/index.js +24 -0
  7. package/dist/composables/useAudioPlayer.d.ts +22 -0
  8. package/dist/composables/useAudioPlayer.js +58 -0
  9. package/dist/composables/useCallout.d.ts +43 -0
  10. package/dist/composables/useCallout.js +71 -0
  11. package/dist/composables/useCodeBlock.d.ts +23 -0
  12. package/dist/composables/useCodeBlock.js +67 -0
  13. package/dist/composables/useGallery.d.ts +37 -0
  14. package/dist/composables/useGallery.js +84 -0
  15. package/dist/composables/useMedia.d.ts +18 -0
  16. package/dist/composables/useMedia.js +9 -0
  17. package/dist/composables/useYouTube.d.ts +31 -0
  18. package/dist/composables/useYouTube.js +32 -0
  19. package/dist/edit/AlertEdit.vue.d.ts +12 -0
  20. package/dist/edit/AlertEdit.vue.js +4 -0
  21. package/dist/edit/AlertEdit.vue2.js +18 -0
  22. package/dist/edit/AudioPlayerEdit.vue.d.ts +3 -0
  23. package/dist/edit/AudioPlayerEdit.vue.js +117 -0
  24. package/dist/edit/AudioPlayerEdit.vue2.js +4 -0
  25. package/dist/edit/BadgeEdit.vue.d.ts +2 -0
  26. package/dist/edit/BadgeEdit.vue.js +4 -0
  27. package/dist/edit/BadgeEdit.vue2.js +13 -0
  28. package/dist/edit/ButtonEdit.vue.d.ts +2 -0
  29. package/dist/edit/ButtonEdit.vue.js +4 -0
  30. package/dist/edit/ButtonEdit.vue2.js +13 -0
  31. package/dist/edit/CalloutEdit.vue.d.ts +13 -0
  32. package/dist/edit/CalloutEdit.vue.js +85 -0
  33. package/dist/edit/CalloutEdit.vue2.js +4 -0
  34. package/dist/edit/CardEdit.vue.d.ts +12 -0
  35. package/dist/edit/CardEdit.vue.js +4 -0
  36. package/dist/edit/CardEdit.vue2.js +18 -0
  37. package/dist/edit/CodeBlockEdit.vue.d.ts +12 -0
  38. package/dist/edit/CodeBlockEdit.vue.js +7 -0
  39. package/dist/edit/CodeBlockEdit.vue2.js +89 -0
  40. package/dist/edit/GalleryEdit.vue.d.ts +3 -0
  41. package/dist/edit/GalleryEdit.vue.js +64 -0
  42. package/dist/edit/GalleryEdit.vue2.js +4 -0
  43. package/dist/edit/IconEdit.vue.d.ts +2 -0
  44. package/dist/edit/IconEdit.vue.js +4 -0
  45. package/dist/edit/IconEdit.vue2.js +13 -0
  46. package/dist/edit/TooltipEdit.vue.d.ts +16 -0
  47. package/dist/edit/TooltipEdit.vue.js +4 -0
  48. package/dist/edit/TooltipEdit.vue2.js +24 -0
  49. package/dist/edit/YouTubeEdit.vue.d.ts +3 -0
  50. package/dist/edit/YouTubeEdit.vue.js +41 -0
  51. package/dist/edit/YouTubeEdit.vue2.js +4 -0
  52. package/dist/edit/index.d.ts +29 -0
  53. package/dist/edit/index.js +35 -0
  54. package/dist/index.d.ts +12 -0
  55. package/dist/index.js +75 -0
  56. package/dist/mdx-render-vue.css +31 -0
  57. package/dist/node_modules/@ark-ui/vue/dist/_virtual/_rolldown/runtime.js +13 -0
  58. package/dist/node_modules/@ark-ui/vue/dist/components/factory.js +35 -0
  59. package/dist/node_modules/@ark-ui/vue/dist/components/presence/use-presence-context.js +6 -0
  60. package/dist/node_modules/@ark-ui/vue/dist/components/presence/use-presence.js +40 -0
  61. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-arrow-tip.js +5 -0
  62. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-arrow-tip.vue_vue_type_script_setup_true_lang.js +21 -0
  63. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-arrow.js +5 -0
  64. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-arrow.vue_vue_type_script_setup_true_lang.js +21 -0
  65. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-content.js +5 -0
  66. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-content.vue_vue_type_script_setup_true_lang.js +25 -0
  67. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-context.js +5 -0
  68. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-context.vue_vue_type_script_setup_true_lang.js +14 -0
  69. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-positioner.js +5 -0
  70. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-positioner.vue_vue_type_script_setup_true_lang.js +23 -0
  71. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-root-provider.js +5 -0
  72. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-root-provider.vue_vue_type_script_setup_true_lang.js +38 -0
  73. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-root.js +5 -0
  74. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-root.vue_vue_type_script_setup_true_lang.js +68 -0
  75. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-trigger.js +5 -0
  76. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip-trigger.vue_vue_type_script_setup_true_lang.js +25 -0
  77. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/tooltip.js +22 -0
  78. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/use-tooltip-context.js +6 -0
  79. package/dist/node_modules/@ark-ui/vue/dist/components/tooltip/use-tooltip.js +36 -0
  80. package/dist/node_modules/@ark-ui/vue/dist/providers/environment/use-environment-context.js +13 -0
  81. package/dist/node_modules/@ark-ui/vue/dist/providers/locale/use-locale-context.js +12 -0
  82. package/dist/node_modules/@ark-ui/vue/dist/utils/clean-props.js +8 -0
  83. package/dist/node_modules/@ark-ui/vue/dist/utils/create-context.js +14 -0
  84. package/dist/node_modules/@ark-ui/vue/dist/utils/dynamic.js +34 -0
  85. package/dist/node_modules/@ark-ui/vue/dist/utils/unref-element.js +8 -0
  86. package/dist/node_modules/@ark-ui/vue/dist/utils/use-forward-expose.js +46 -0
  87. package/dist/node_modules/@ark-ui/vue/dist/utils/use-render-strategy.js +5 -0
  88. package/dist/node_modules/@braintree/sanitize-url/dist/constants.js +20 -0
  89. package/dist/node_modules/@braintree/sanitize-url/dist/index.js +75 -0
  90. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js +728 -0
  91. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +629 -0
  92. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +176 -0
  93. package/dist/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +151 -0
  94. package/dist/node_modules/@iconify/vue/dist/iconify.js +1691 -0
  95. package/dist/node_modules/@zag-js/anatomy/dist/create-anatomy.js +29 -0
  96. package/dist/node_modules/@zag-js/core/dist/create-machine.js +28 -0
  97. package/dist/node_modules/@zag-js/core/dist/merge-props.js +55 -0
  98. package/dist/node_modules/@zag-js/core/dist/scope.js +20 -0
  99. package/dist/node_modules/@zag-js/core/dist/state.js +176 -0
  100. package/dist/node_modules/@zag-js/core/dist/types.js +11 -0
  101. package/dist/node_modules/@zag-js/dom-query/dist/chunk-QZ7TP4HQ.js +6 -0
  102. package/dist/node_modules/@zag-js/dom-query/dist/computed-style.js +11 -0
  103. package/dist/node_modules/@zag-js/dom-query/dist/event.js +37 -0
  104. package/dist/node_modules/@zag-js/dom-query/dist/node.js +64 -0
  105. package/dist/node_modules/@zag-js/dom-query/dist/overflow.js +28 -0
  106. package/dist/node_modules/@zag-js/dom-query/dist/platform.js +23 -0
  107. package/dist/node_modules/@zag-js/dom-query/dist/query.js +6 -0
  108. package/dist/node_modules/@zag-js/dom-query/dist/raf.js +52 -0
  109. package/dist/node_modules/@zag-js/dom-query/dist/set.js +22 -0
  110. package/dist/node_modules/@zag-js/dom-query/dist/shared.js +8 -0
  111. package/dist/node_modules/@zag-js/focus-visible/dist/index.js +159 -0
  112. package/dist/node_modules/@zag-js/popper/dist/get-anchor.js +39 -0
  113. package/dist/node_modules/@zag-js/popper/dist/get-placement.js +296 -0
  114. package/dist/node_modules/@zag-js/popper/dist/get-styles.js +47 -0
  115. package/dist/node_modules/@zag-js/popper/dist/middleware.js +79 -0
  116. package/dist/node_modules/@zag-js/popper/dist/placement.js +7 -0
  117. package/dist/node_modules/@zag-js/presence/dist/presence.connect.js +18 -0
  118. package/dist/node_modules/@zag-js/presence/dist/presence.machine.js +175 -0
  119. package/dist/node_modules/@zag-js/tooltip/dist/tooltip.anatomy.js +7 -0
  120. package/dist/node_modules/@zag-js/tooltip/dist/tooltip.connect.js +155 -0
  121. package/dist/node_modules/@zag-js/tooltip/dist/tooltip.dom.js +24 -0
  122. package/dist/node_modules/@zag-js/tooltip/dist/tooltip.machine.js +416 -0
  123. package/dist/node_modules/@zag-js/tooltip/dist/tooltip.store.js +9 -0
  124. package/dist/node_modules/@zag-js/types/dist/prop-types.js +14 -0
  125. package/dist/node_modules/@zag-js/utils/dist/array.js +7 -0
  126. package/dist/node_modules/@zag-js/utils/dist/equal.js +36 -0
  127. package/dist/node_modules/@zag-js/utils/dist/functions.js +11 -0
  128. package/dist/node_modules/@zag-js/utils/dist/guard.js +26 -0
  129. package/dist/node_modules/@zag-js/utils/dist/object.js +16 -0
  130. package/dist/node_modules/@zag-js/utils/dist/store.js +44 -0
  131. package/dist/node_modules/@zag-js/utils/dist/warning.js +31 -0
  132. package/dist/node_modules/@zag-js/vue/dist/bindable.js +48 -0
  133. package/dist/node_modules/@zag-js/vue/dist/machine.js +258 -0
  134. package/dist/node_modules/@zag-js/vue/dist/normalize-props.js +42 -0
  135. package/dist/node_modules/@zag-js/vue/dist/refs.js +14 -0
  136. package/dist/node_modules/@zag-js/vue/dist/track.js +22 -0
  137. package/dist/node_modules/dompurify/dist/purify.es.js +1190 -0
  138. package/dist/registry.d.ts +76 -0
  139. package/dist/registry.js +164 -0
  140. package/dist/render/alert/Alert.vue.d.ts +18 -0
  141. package/dist/render/alert/Alert.vue.js +4 -0
  142. package/dist/render/alert/Alert.vue2.js +43 -0
  143. package/dist/render/alert/index.d.ts +2 -0
  144. package/dist/render/audioplayer/AudioPlayerDefault.vue.d.ts +3 -0
  145. package/dist/render/audioplayer/AudioPlayerDefault.vue.js +116 -0
  146. package/dist/render/audioplayer/AudioPlayerDefault.vue2.js +4 -0
  147. package/dist/render/audioplayer/index.d.ts +5 -0
  148. package/dist/render/audioplayer/index.js +5 -0
  149. package/dist/render/badge/Badge.vue.d.ts +10 -0
  150. package/dist/render/badge/Badge.vue.js +4 -0
  151. package/dist/render/badge/Badge.vue2.js +28 -0
  152. package/dist/render/badge/index.d.ts +2 -0
  153. package/dist/render/button/Button.vue.d.ts +13 -0
  154. package/dist/render/button/Button.vue.js +4 -0
  155. package/dist/render/button/Button.vue2.js +42 -0
  156. package/dist/render/button/index.d.ts +2 -0
  157. package/dist/render/callout/CalloutDefault.vue.d.ts +13 -0
  158. package/dist/render/callout/CalloutDefault.vue.js +86 -0
  159. package/dist/render/callout/CalloutDefault.vue2.js +4 -0
  160. package/dist/render/callout/CalloutMinimal.vue.d.ts +13 -0
  161. package/dist/render/callout/CalloutMinimal.vue.js +27 -0
  162. package/dist/render/callout/CalloutMinimal.vue2.js +4 -0
  163. package/dist/render/callout/index.d.ts +6 -0
  164. package/dist/render/callout/index.js +7 -0
  165. package/dist/render/card/Card.vue.d.ts +15 -0
  166. package/dist/render/card/Card.vue.js +4 -0
  167. package/dist/render/card/Card.vue2.js +29 -0
  168. package/dist/render/card/index.d.ts +2 -0
  169. package/dist/render/codeblock/CodeBlockDefault.vue.d.ts +12 -0
  170. package/dist/render/codeblock/CodeBlockDefault.vue.js +7 -0
  171. package/dist/render/codeblock/CodeBlockDefault.vue2.js +92 -0
  172. package/dist/render/codeblock/index.d.ts +5 -0
  173. package/dist/render/codeblock/index.js +5 -0
  174. package/dist/render/gallery/GalleryGrid.vue.d.ts +3 -0
  175. package/dist/render/gallery/GalleryGrid.vue.js +125 -0
  176. package/dist/render/gallery/GalleryGrid.vue2.js +4 -0
  177. package/dist/render/gallery/GalleryLightbox.vue.d.ts +16 -0
  178. package/dist/render/gallery/GalleryLightbox.vue.js +7 -0
  179. package/dist/render/gallery/GalleryLightbox.vue2.js +170 -0
  180. package/dist/render/gallery/index.d.ts +6 -0
  181. package/dist/render/gallery/index.js +7 -0
  182. package/dist/render/icon/Icon.vue.d.ts +9 -0
  183. package/dist/render/icon/Icon.vue.js +4 -0
  184. package/dist/render/icon/Icon.vue2.js +25 -0
  185. package/dist/render/icon/index.d.ts +2 -0
  186. package/dist/render/index.d.ts +40 -0
  187. package/dist/render/index.js +63 -0
  188. package/dist/render/tooltip/Tooltip.vue.d.ts +18 -0
  189. package/dist/render/tooltip/Tooltip.vue.js +4 -0
  190. package/dist/render/tooltip/Tooltip.vue2.js +58 -0
  191. package/dist/render/tooltip/index.d.ts +2 -0
  192. package/dist/render/youtube/YouTubeDefault.vue.d.ts +3 -0
  193. package/dist/render/youtube/YouTubeDefault.vue.js +79 -0
  194. package/dist/render/youtube/YouTubeDefault.vue2.js +4 -0
  195. package/dist/render/youtube/index.d.ts +5 -0
  196. package/dist/render/youtube/index.js +5 -0
  197. package/dist/useAudioPlayer.d.ts +22 -0
  198. package/dist/useCallout.d.ts +46 -0
  199. package/dist/useCodeBlock.d.ts +25 -0
  200. package/dist/useGallery.d.ts +44 -0
  201. package/dist/useMedia.d.ts +16 -0
  202. package/dist/useYouTube.d.ts +32 -0
  203. package/package.json +125 -0
  204. package/src/composables/index.ts +16 -0
  205. package/src/composables/useAudioPlayer.ts +84 -0
  206. package/src/composables/useCallout.ts +103 -0
  207. package/src/composables/useCodeBlock.ts +90 -0
  208. package/src/composables/useGallery.ts +143 -0
  209. package/src/composables/useMedia.ts +23 -0
  210. package/src/composables/useYouTube.ts +58 -0
  211. package/src/edit/AlertEdit.vue +9 -0
  212. package/src/edit/AudioPlayerEdit.vue +92 -0
  213. package/src/edit/BadgeEdit.vue +7 -0
  214. package/src/edit/ButtonEdit.vue +10 -0
  215. package/src/edit/CalloutEdit.vue +107 -0
  216. package/src/edit/CardEdit.vue +9 -0
  217. package/src/edit/CodeBlockEdit.vue +76 -0
  218. package/src/edit/GalleryEdit.vue +65 -0
  219. package/src/edit/IconEdit.vue +7 -0
  220. package/src/edit/TooltipEdit.vue +15 -0
  221. package/src/edit/YouTubeEdit.vue +33 -0
  222. package/src/edit/index.ts +32 -0
  223. package/src/index.ts +62 -0
  224. package/src/registry.ts +272 -0
  225. package/src/render/alert/Alert.vue +32 -0
  226. package/src/render/alert/index.ts +2 -0
  227. package/src/render/audioplayer/AudioPlayerDefault.vue +89 -0
  228. package/src/render/audioplayer/index.ts +8 -0
  229. package/src/render/badge/Badge.vue +25 -0
  230. package/src/render/badge/index.ts +2 -0
  231. package/src/render/button/Button.vue +41 -0
  232. package/src/render/button/index.ts +2 -0
  233. package/src/render/callout/CalloutDefault.vue +101 -0
  234. package/src/render/callout/CalloutMinimal.vue +31 -0
  235. package/src/render/callout/index.ts +9 -0
  236. package/src/render/card/Card.vue +15 -0
  237. package/src/render/card/index.ts +2 -0
  238. package/src/render/codeblock/CodeBlockDefault.vue +76 -0
  239. package/src/render/codeblock/index.ts +8 -0
  240. package/src/render/gallery/GalleryGrid.vue +162 -0
  241. package/src/render/gallery/GalleryLightbox.vue +162 -0
  242. package/src/render/gallery/index.ts +9 -0
  243. package/src/render/icon/Icon.vue +22 -0
  244. package/src/render/icon/index.ts +2 -0
  245. package/src/render/index.ts +76 -0
  246. package/src/render/tooltip/Tooltip.vue +35 -0
  247. package/src/render/tooltip/index.ts +2 -0
  248. package/src/render/youtube/YouTubeDefault.vue +72 -0
  249. package/src/render/youtube/index.ts +8 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * MDX Component Registry (Vue)
3
+ *
4
+ * Attaches Vue-specific render/edit loaders to the framework-agnostic metadata
5
+ * published by @blogmcp/mdx-schema. Schema is the single source of truth for
6
+ * component descriptions, prop shapes, and MCP-facing examples — this file
7
+ * adds only the Vue wiring (dynamic imports of SFCs + editor theming).
8
+ */
9
+ import { type Component } from 'vue';
10
+ import { componentMetadata, getComponentMetadata, getComponentNames, type ComponentMetadata } from '@blogmcp/mdx-schema/metadata';
11
+ export { componentMetadata, getComponentMetadata, getComponentNames };
12
+ /**
13
+ * Sentinel property read by the per-renderer "prepareProps is wired"
14
+ * integration test. Wrapped components carry this with the component's
15
+ * schema name so the test can confirm wrapping end-to-end (vs the
16
+ * historical regex-grep on registry source, which was easily defeated
17
+ * by commented-out code and unused imports).
18
+ */
19
+ export declare const MDX_PREPARED_SENTINEL: "__mdxPreparePropsAppliedFor";
20
+ export interface EditorConfig {
21
+ /** SVG icon name used in MdxBlockView header */
22
+ icon: string;
23
+ /** Primary text/accent color */
24
+ color: string;
25
+ /** Border color */
26
+ borderColor: string;
27
+ /** Background color (typically rgba) */
28
+ bgColor: string;
29
+ }
30
+ export interface ComponentRegistration {
31
+ metadata: ComponentMetadata;
32
+ editor: EditorConfig;
33
+ /** Render variants: variant name → async loader. Must include 'default'. */
34
+ render: Record<string, () => Promise<{
35
+ default: Component;
36
+ }>>;
37
+ /** Edit component (dark theme) for md-editor preview */
38
+ edit: () => Promise<{
39
+ default: Component;
40
+ }>;
41
+ /** Optional custom editor view for complex inline editing (Gallery drag-and-drop, CodeBlock textarea) */
42
+ editorView?: () => Promise<{
43
+ default: Component;
44
+ }>;
45
+ }
46
+ /** Merged registry: schema metadata + Vue wiring, keyed by component name. */
47
+ export declare const componentRegistry: Record<string, ComponentRegistration>;
48
+ /** Get available render variant names for a component */
49
+ export declare function getComponentVariants(name: string): string[];
50
+ /** Async resolver — loads only the requested render component (raw, no shim). */
51
+ export declare function getRenderComponentAsync(name: string, variant?: string): Promise<Component | undefined>;
52
+ /**
53
+ * Wraps an already-resolved Vue component with a `prepareProps`-aware
54
+ * shim. Returned component is sync; works with both sync `Inner` and
55
+ * `defineAsyncComponent(...)` results. Exported (vs inlined into
56
+ * `getWrappedRenderComponent`) so unit tests can pass a spy component
57
+ * and assert prop normalization without touching the real registry.
58
+ */
59
+ export declare function wrapVueComponentForMdx(Inner: Component, metadata: ComponentMetadata, variant?: string): Component;
60
+ /**
61
+ * Returns a Vue component that wraps the lazy-loaded render SFC for
62
+ * `name`/`variant` with a `prepareProps`-aware shim. Returns `undefined`
63
+ * if the component isn't registered.
64
+ *
65
+ * Wrapped components carry `MDX_PREPARED_SENTINEL` on themselves, set
66
+ * to the schema component name — used by the per-renderer integration
67
+ * test to confirm wrapping was applied (instead of the historical
68
+ * brittle regex-grep approach).
69
+ */
70
+ export declare function getWrappedRenderComponent(name: string, variant?: string): Component | undefined;
71
+ /** Test-only — clears the wrapped-component cache between specs. */
72
+ export declare function _resetWrappedRenderCacheForTests(): void;
73
+ /** Async resolver for edit components */
74
+ export declare function getEditComponentAsync(name: string): Promise<Component | undefined>;
75
+ /** Get editor config for a component (icon, colors) */
76
+ export declare function getEditorConfig(name: string): EditorConfig | undefined;
@@ -0,0 +1,164 @@
1
+ import { defineComponent, h, defineAsyncComponent } from "vue";
2
+ import { componentMetadata } from "@blogmcp/mdx-schema/metadata";
3
+ import { componentMetadata as componentMetadata2, getComponentMetadata, getComponentNames } from "@blogmcp/mdx-schema/metadata";
4
+ import { prepareProps } from "@blogmcp/mdx-schema";
5
+ const MDX_PREPARED_SENTINEL = "__mdxPreparePropsAppliedFor";
6
+ const vueWiring = {
7
+ Callout: {
8
+ editor: { icon: "info", color: "#569cd6", borderColor: "#569cd6", bgColor: "rgba(86, 156, 214, 0.08)" },
9
+ render: {
10
+ default: () => import("./render/callout/CalloutDefault.vue2.js"),
11
+ minimal: () => import("./render/callout/CalloutMinimal.vue2.js")
12
+ },
13
+ edit: () => import("./edit/CalloutEdit.vue2.js")
14
+ },
15
+ YouTube: {
16
+ editor: { icon: "play", color: "#ff4444", borderColor: "#ff4444", bgColor: "rgba(255, 68, 68, 0.08)" },
17
+ render: {
18
+ default: () => import("./render/youtube/YouTubeDefault.vue2.js")
19
+ },
20
+ edit: () => import("./edit/YouTubeEdit.vue2.js")
21
+ },
22
+ Gallery: {
23
+ editor: { icon: "image", color: "#4ec9b0", borderColor: "#4ec9b0", bgColor: "rgba(78, 201, 176, 0.08)" },
24
+ render: {
25
+ default: () => import("./render/gallery/GalleryGrid.vue2.js"),
26
+ grid: () => import("./render/gallery/GalleryGrid.vue2.js")
27
+ },
28
+ edit: () => import("./edit/GalleryEdit.vue2.js")
29
+ },
30
+ CodeBlock: {
31
+ editor: { icon: "code", color: "#ce9178", borderColor: "#ce9178", bgColor: "rgba(206, 145, 120, 0.08)" },
32
+ render: {
33
+ default: () => import("./render/codeblock/CodeBlockDefault.vue.js")
34
+ },
35
+ edit: () => import("./edit/CodeBlockEdit.vue.js")
36
+ },
37
+ AudioPlayer: {
38
+ editor: { icon: "audio", color: "#b48ead", borderColor: "#b48ead", bgColor: "rgba(180, 142, 173, 0.08)" },
39
+ render: {
40
+ default: () => import("./render/audioplayer/AudioPlayerDefault.vue2.js")
41
+ },
42
+ edit: () => import("./edit/AudioPlayerEdit.vue2.js")
43
+ },
44
+ Button: {
45
+ editor: { icon: "button", color: "#2563eb", borderColor: "#2563eb", bgColor: "rgba(37, 99, 235, 0.08)" },
46
+ render: {
47
+ default: () => import("./render/button/Button.vue.js")
48
+ },
49
+ edit: () => import("./edit/ButtonEdit.vue.js")
50
+ },
51
+ Card: {
52
+ editor: { icon: "card", color: "#6b7280", borderColor: "#6b7280", bgColor: "rgba(107, 114, 128, 0.08)" },
53
+ render: {
54
+ default: () => import("./render/card/Card.vue.js")
55
+ },
56
+ edit: () => import("./edit/CardEdit.vue.js")
57
+ },
58
+ Alert: {
59
+ editor: { icon: "alert", color: "#d97706", borderColor: "#d97706", bgColor: "rgba(217, 119, 6, 0.08)" },
60
+ render: {
61
+ default: () => import("./render/alert/Alert.vue.js")
62
+ },
63
+ edit: () => import("./edit/AlertEdit.vue.js")
64
+ },
65
+ Badge: {
66
+ editor: { icon: "badge", color: "#059669", borderColor: "#059669", bgColor: "rgba(5, 150, 105, 0.08)" },
67
+ render: {
68
+ default: () => import("./render/badge/Badge.vue.js")
69
+ },
70
+ edit: () => import("./edit/BadgeEdit.vue.js")
71
+ },
72
+ Icon: {
73
+ editor: { icon: "icon", color: "#7c3aed", borderColor: "#7c3aed", bgColor: "rgba(124, 58, 237, 0.08)" },
74
+ render: {
75
+ default: () => import("./render/icon/Icon.vue.js")
76
+ },
77
+ edit: () => import("./edit/IconEdit.vue.js")
78
+ },
79
+ Tooltip: {
80
+ editor: { icon: "tooltip", color: "#0891b2", borderColor: "#0891b2", bgColor: "rgba(8, 145, 178, 0.08)" },
81
+ render: {
82
+ default: () => import("./render/tooltip/Tooltip.vue.js")
83
+ },
84
+ edit: () => import("./edit/TooltipEdit.vue.js")
85
+ }
86
+ };
87
+ const componentRegistry = Object.fromEntries(
88
+ componentMetadata.map((metadata) => {
89
+ const wiring = vueWiring[metadata.name];
90
+ if (!wiring) {
91
+ throw new Error(
92
+ `[mdx-components] No Vue wiring registered for component "${metadata.name}". Add an entry to vueWiring in registry.ts or remove the schema entry.`
93
+ );
94
+ }
95
+ return [metadata.name, { metadata, ...wiring }];
96
+ })
97
+ );
98
+ function getComponentVariants(name) {
99
+ const reg = componentRegistry[name];
100
+ return reg ? Object.keys(reg.render) : [];
101
+ }
102
+ async function getRenderComponentAsync(name, variant = "default") {
103
+ const reg = componentRegistry[name];
104
+ if (!reg) return void 0;
105
+ const loader = reg.render[variant] || reg.render.default;
106
+ if (!loader) return void 0;
107
+ const mod = await loader();
108
+ return mod.default;
109
+ }
110
+ function wrapVueComponentForMdx(Inner, metadata, variant = "default") {
111
+ const wrapped = defineComponent({
112
+ name: `MdxPrepared${metadata.name}${variant === "default" ? "" : `_${variant}`}`,
113
+ inheritAttrs: false,
114
+ setup(_props, { attrs, slots }) {
115
+ return () => h(
116
+ Inner,
117
+ prepareProps(attrs, metadata),
118
+ slots
119
+ );
120
+ }
121
+ });
122
+ wrapped[MDX_PREPARED_SENTINEL] = metadata.name;
123
+ return wrapped;
124
+ }
125
+ const wrappedRenderCache = /* @__PURE__ */ new Map();
126
+ function getWrappedRenderComponent(name, variant = "default") {
127
+ const cacheKey = `${name}:${variant}`;
128
+ const cached = wrappedRenderCache.get(cacheKey);
129
+ if (cached) return cached;
130
+ const reg = componentRegistry[name];
131
+ if (!reg) return void 0;
132
+ const loader = reg.render[variant] || reg.render.default;
133
+ if (!loader) return void 0;
134
+ const Inner = defineAsyncComponent(() => loader().then((m) => m.default));
135
+ const wrapped = wrapVueComponentForMdx(Inner, reg.metadata, variant);
136
+ wrappedRenderCache.set(cacheKey, wrapped);
137
+ return wrapped;
138
+ }
139
+ function _resetWrappedRenderCacheForTests() {
140
+ wrappedRenderCache.clear();
141
+ }
142
+ async function getEditComponentAsync(name) {
143
+ const reg = componentRegistry[name];
144
+ if (!reg) return void 0;
145
+ const mod = await reg.edit();
146
+ return mod.default;
147
+ }
148
+ function getEditorConfig(name) {
149
+ return componentRegistry[name]?.editor;
150
+ }
151
+ export {
152
+ MDX_PREPARED_SENTINEL,
153
+ _resetWrappedRenderCacheForTests,
154
+ componentMetadata2 as componentMetadata,
155
+ componentRegistry,
156
+ getComponentMetadata,
157
+ getComponentNames,
158
+ getComponentVariants,
159
+ getEditComponentAsync,
160
+ getEditorConfig,
161
+ getRenderComponentAsync,
162
+ getWrappedRenderComponent,
163
+ wrapVueComponentForMdx
164
+ };
@@ -0,0 +1,18 @@
1
+ interface Props {
2
+ severity?: 'info' | 'success' | 'warning' | 'error';
3
+ title?: string;
4
+ }
5
+ declare var __VLS_5: {};
6
+ type __VLS_Slots = {} & {
7
+ default?: (props: typeof __VLS_5) => any;
8
+ };
9
+ declare const __VLS_component: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
10
+ severity: "info" | "success" | "warning" | "error";
11
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
13
+ export default _default;
14
+ type __VLS_WithSlots<T, S> = T & {
15
+ new (): {
16
+ $slots: S;
17
+ };
18
+ };
@@ -0,0 +1,4 @@
1
+ import _sfc_main from "./Alert.vue2.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
@@ -0,0 +1,43 @@
1
+ import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, unref, createVNode, createElementVNode, createCommentVNode, toDisplayString, renderSlot } from "vue";
2
+ import { Icon } from "../../node_modules/@iconify/vue/dist/iconify.js";
3
+ import { alertStyles } from "@blogmcp/mdx-schema/styles";
4
+ const _hoisted_1 = { class: "min-w-0 flex-1" };
5
+ const _hoisted_2 = {
6
+ key: 0,
7
+ class: "mb-0.5 font-semibold"
8
+ };
9
+ const _hoisted_3 = { class: "prose-sm" };
10
+ const _sfc_main = /* @__PURE__ */ defineComponent({
11
+ __name: "Alert",
12
+ props: {
13
+ severity: { default: "info" },
14
+ title: {}
15
+ },
16
+ setup(__props) {
17
+ const props = __props;
18
+ const cfg = computed(() => alertStyles.severity[props.severity]);
19
+ return (_ctx, _cache) => {
20
+ return openBlock(), createElementBlock("div", {
21
+ class: normalizeClass([unref(alertStyles).base, cfg.value.wrap]),
22
+ role: "alert",
23
+ "data-mdx-component": "Alert"
24
+ }, [
25
+ createVNode(unref(Icon), {
26
+ icon: cfg.value.icon,
27
+ class: normalizeClass(["mt-0.5 shrink-0", cfg.value.iconClass]),
28
+ width: 18,
29
+ height: 18
30
+ }, null, 8, ["icon", "class"]),
31
+ createElementVNode("div", _hoisted_1, [
32
+ __props.title ? (openBlock(), createElementBlock("div", _hoisted_2, toDisplayString(__props.title), 1)) : createCommentVNode("", true),
33
+ createElementVNode("div", _hoisted_3, [
34
+ renderSlot(_ctx.$slots, "default")
35
+ ])
36
+ ])
37
+ ], 2);
38
+ };
39
+ }
40
+ });
41
+ export {
42
+ _sfc_main as default
43
+ };
@@ -0,0 +1,2 @@
1
+ export { default as Alert } from './Alert.vue';
2
+ export { default } from './Alert.vue';
@@ -0,0 +1,3 @@
1
+ import type { AudioPlayerProps } from '@blogmcp/mdx-schema';
2
+ declare const _default: import("vue").DefineComponent<AudioPlayerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<AudioPlayerProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
+ export default _default;
@@ -0,0 +1,116 @@
1
+ import { defineComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, unref, toDisplayString, createTextVNode, normalizeClass, Fragment } from "vue";
2
+ import { useAudioPlayer } from "../../composables/useAudioPlayer.js";
3
+ const _hoisted_1 = {
4
+ class: "audio-player my-6 rounded-lg bg-gray-50 p-5 border border-gray-200",
5
+ "data-mdx-component": "AudioPlayer"
6
+ };
7
+ const _hoisted_2 = { class: "flex items-center gap-3 mb-3" };
8
+ const _hoisted_3 = {
9
+ key: 0,
10
+ class: "text-base font-semibold text-gray-800 m-0"
11
+ };
12
+ const _hoisted_4 = ["src"];
13
+ const _hoisted_5 = {
14
+ key: 0,
15
+ class: "mt-4"
16
+ };
17
+ const _hoisted_6 = {
18
+ key: 0,
19
+ class: "mt-2 p-3 bg-white rounded border border-gray-200 text-sm text-gray-700 leading-relaxed max-h-64 overflow-y-auto"
20
+ };
21
+ const _hoisted_7 = {
22
+ key: 0,
23
+ class: "text-gray-400 italic"
24
+ };
25
+ const _hoisted_8 = {
26
+ key: 1,
27
+ class: "text-gray-400 italic"
28
+ };
29
+ const _hoisted_9 = {
30
+ key: 0,
31
+ class: "mb-3 pb-3 border-b border-gray-200"
32
+ };
33
+ const _hoisted_10 = { class: "text-gray-800" };
34
+ const _hoisted_11 = { class: "whitespace-pre-wrap" };
35
+ const _sfc_main = /* @__PURE__ */ defineComponent({
36
+ __name: "AudioPlayerDefault",
37
+ props: {
38
+ slug: {},
39
+ title: {},
40
+ showTranscription: { type: Boolean }
41
+ },
42
+ setup(__props) {
43
+ const props = __props;
44
+ const {
45
+ audioUrl,
46
+ displayTitle,
47
+ hasTitle,
48
+ showTranscription,
49
+ transcriptionText,
50
+ transcriptionSummary,
51
+ transcriptionLoading,
52
+ transcriptionExpanded,
53
+ toggleTranscription
54
+ } = useAudioPlayer(props);
55
+ return (_ctx, _cache) => {
56
+ return openBlock(), createElementBlock("div", _hoisted_1, [
57
+ createElementVNode("div", _hoisted_2, [
58
+ _cache[1] || (_cache[1] = createElementVNode("svg", {
59
+ class: "w-5 h-5 text-gray-500 flex-shrink-0",
60
+ fill: "none",
61
+ stroke: "currentColor",
62
+ viewBox: "0 0 24 24"
63
+ }, [
64
+ createElementVNode("path", {
65
+ "stroke-linecap": "round",
66
+ "stroke-linejoin": "round",
67
+ "stroke-width": "2",
68
+ d: "M15.536 8.464a5 5 0 010 7.072m2.828-9.9a9 9 0 010 12.728M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z"
69
+ })
70
+ ], -1)),
71
+ unref(hasTitle) ? (openBlock(), createElementBlock("h3", _hoisted_3, toDisplayString(unref(displayTitle)), 1)) : createCommentVNode("", true)
72
+ ]),
73
+ createElementVNode("audio", {
74
+ src: unref(audioUrl),
75
+ controls: "",
76
+ preload: "metadata",
77
+ class: "w-full"
78
+ }, null, 8, _hoisted_4),
79
+ unref(showTranscription) ? (openBlock(), createElementBlock("div", _hoisted_5, [
80
+ createElementVNode("button", {
81
+ class: "flex items-center gap-2 text-sm text-gray-600 hover:text-gray-900 transition-colors cursor-pointer bg-transparent border-0 p-0",
82
+ onClick: _cache[0] || (_cache[0] = //@ts-ignore
83
+ (...args) => unref(toggleTranscription) && unref(toggleTranscription)(...args))
84
+ }, [
85
+ (openBlock(), createElementBlock("svg", {
86
+ class: normalizeClass(["w-4 h-4 transition-transform", { "rotate-90": unref(transcriptionExpanded) }]),
87
+ fill: "none",
88
+ stroke: "currentColor",
89
+ viewBox: "0 0 24 24"
90
+ }, [..._cache[2] || (_cache[2] = [
91
+ createElementVNode("path", {
92
+ "stroke-linecap": "round",
93
+ "stroke-linejoin": "round",
94
+ "stroke-width": "2",
95
+ d: "M9 5l7 7-7 7"
96
+ }, null, -1)
97
+ ])], 2)),
98
+ _cache[3] || (_cache[3] = createTextVNode(" Transcription ", -1))
99
+ ]),
100
+ unref(transcriptionExpanded) ? (openBlock(), createElementBlock("div", _hoisted_6, [
101
+ unref(transcriptionLoading) ? (openBlock(), createElementBlock("p", _hoisted_7, "Loading transcription...")) : !unref(transcriptionText) ? (openBlock(), createElementBlock("p", _hoisted_8, "No transcription available.")) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [
102
+ unref(transcriptionSummary) ? (openBlock(), createElementBlock("div", _hoisted_9, [
103
+ _cache[4] || (_cache[4] = createElementVNode("div", { class: "text-xs uppercase tracking-wide text-gray-400 mb-1" }, "Summary", -1)),
104
+ createElementVNode("div", _hoisted_10, toDisplayString(unref(transcriptionSummary)), 1)
105
+ ])) : createCommentVNode("", true),
106
+ createElementVNode("div", _hoisted_11, toDisplayString(unref(transcriptionText)), 1)
107
+ ], 64))
108
+ ])) : createCommentVNode("", true)
109
+ ])) : createCommentVNode("", true)
110
+ ]);
111
+ };
112
+ }
113
+ });
114
+ export {
115
+ _sfc_main as default
116
+ };
@@ -0,0 +1,4 @@
1
+ import _sfc_main from "./AudioPlayerDefault.vue.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * AudioPlayer Render Component Variants
3
+ */
4
+ export { default as AudioPlayerDefault } from './AudioPlayerDefault.vue';
5
+ export { default } from './AudioPlayerDefault.vue';
@@ -0,0 +1,5 @@
1
+ import { default as default2, default as default3 } from "./AudioPlayerDefault.vue.js";
2
+ export {
3
+ default2 as AudioPlayerDefault,
4
+ default3 as default
5
+ };
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ label: string;
3
+ color?: 'primary' | 'neutral' | 'success' | 'warning' | 'error';
4
+ variant?: 'solid' | 'soft' | 'outline';
5
+ }
6
+ declare const _default: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
7
+ variant: "solid" | "soft" | "outline";
8
+ color: "primary" | "neutral" | "success" | "warning" | "error";
9
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import _sfc_main from "./Badge.vue2.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
@@ -0,0 +1,28 @@
1
+ import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, toDisplayString } from "vue";
2
+ import { badgeStyles } from "@blogmcp/mdx-schema/styles";
3
+ const _sfc_main = /* @__PURE__ */ defineComponent({
4
+ __name: "Badge",
5
+ props: {
6
+ label: {},
7
+ color: { default: "neutral" },
8
+ variant: { default: "soft" }
9
+ },
10
+ setup(__props) {
11
+ const props = __props;
12
+ const classes = computed(
13
+ () => [
14
+ badgeStyles.base,
15
+ badgeStyles.variantColor[props.variant][props.color]
16
+ ].join(" ")
17
+ );
18
+ return (_ctx, _cache) => {
19
+ return openBlock(), createElementBlock("span", {
20
+ class: normalizeClass(classes.value),
21
+ "data-mdx-component": "Badge"
22
+ }, toDisplayString(__props.label), 3);
23
+ };
24
+ }
25
+ });
26
+ export {
27
+ _sfc_main as default
28
+ };
@@ -0,0 +1,2 @@
1
+ export { default as Badge } from './Badge.vue';
2
+ export { default } from './Badge.vue';
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ label: string;
3
+ to?: string;
4
+ variant?: 'solid' | 'outline' | 'soft' | 'ghost' | 'link';
5
+ color?: 'primary' | 'neutral' | 'success' | 'warning' | 'error';
6
+ size?: 'sm' | 'md' | 'lg';
7
+ }
8
+ declare const _default: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
9
+ variant: "solid" | "outline" | "soft" | "ghost" | "link";
10
+ color: "primary" | "neutral" | "success" | "warning" | "error";
11
+ size: "sm" | "md" | "lg";
12
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import _sfc_main from "./Button.vue2.js";
2
+ export {
3
+ _sfc_main as default
4
+ };
@@ -0,0 +1,42 @@
1
+ import { defineComponent, computed, createElementBlock, openBlock, normalizeClass, toDisplayString } from "vue";
2
+ import { buttonStyles } from "@blogmcp/mdx-schema/styles";
3
+ import "../../node_modules/dompurify/dist/purify.es.js";
4
+ import { d as distExports } from "../../_virtual/index.js";
5
+ const _hoisted_1 = ["href"];
6
+ const _sfc_main = /* @__PURE__ */ defineComponent({
7
+ __name: "Button",
8
+ props: {
9
+ label: {},
10
+ to: {},
11
+ variant: { default: "solid" },
12
+ color: { default: "primary" },
13
+ size: { default: "md" }
14
+ },
15
+ setup(__props) {
16
+ const props = __props;
17
+ const safeHref = computed(() => props.to ? distExports.sanitizeUrl(props.to) : void 0);
18
+ const classes = computed(
19
+ () => [
20
+ buttonStyles.base,
21
+ buttonStyles.size[props.size],
22
+ buttonStyles.variantColor[props.variant][props.color]
23
+ ].join(" ")
24
+ );
25
+ return (_ctx, _cache) => {
26
+ return safeHref.value ? (openBlock(), createElementBlock("a", {
27
+ key: 0,
28
+ href: safeHref.value,
29
+ class: normalizeClass(classes.value),
30
+ "data-mdx-component": "Button"
31
+ }, toDisplayString(__props.label), 11, _hoisted_1)) : (openBlock(), createElementBlock("button", {
32
+ key: 1,
33
+ type: "button",
34
+ class: normalizeClass(classes.value),
35
+ "data-mdx-component": "Button"
36
+ }, toDisplayString(__props.label), 3));
37
+ };
38
+ }
39
+ });
40
+ export {
41
+ _sfc_main as default
42
+ };
@@ -0,0 +1,2 @@
1
+ export { default as Button } from './Button.vue';
2
+ export { default } from './Button.vue';
@@ -0,0 +1,13 @@
1
+ import type { CalloutProps } from '@blogmcp/mdx-schema';
2
+ declare var __VLS_1: {};
3
+ type __VLS_Slots = {} & {
4
+ default?: (props: typeof __VLS_1) => any;
5
+ };
6
+ declare const __VLS_component: import("vue").DefineComponent<CalloutProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<CalloutProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
8
+ export default _default;
9
+ type __VLS_WithSlots<T, S> = T & {
10
+ new (): {
11
+ $slots: S;
12
+ };
13
+ };