@seed-ship/mcp-ui-solid 6.19.1 → 6.21.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.
- package/CHANGELOG.md +663 -0
- package/README.md +911 -4
- package/dist/adapters/connector.cjs +15 -4
- package/dist/adapters/connector.cjs.map +1 -1
- package/dist/adapters/connector.d.ts +38 -0
- package/dist/adapters/connector.d.ts.map +1 -1
- package/dist/adapters/connector.js +15 -4
- package/dist/adapters/connector.js.map +1 -1
- package/dist/adapters/index.d.ts +4 -3
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/macro-run.cjs +25 -13
- package/dist/adapters/macro-run.cjs.map +1 -1
- package/dist/adapters/macro-run.d.ts +37 -2
- package/dist/adapters/macro-run.d.ts.map +1 -1
- package/dist/adapters/macro-run.js +25 -13
- package/dist/adapters/macro-run.js.map +1 -1
- package/dist/adapters.cjs +2 -0
- package/dist/adapters.cjs.map +1 -1
- package/dist/adapters.js +4 -2
- package/dist/components/ActionGroupRenderer.cjs +3 -1
- package/dist/components/ActionGroupRenderer.cjs.map +1 -1
- package/dist/components/ActionGroupRenderer.d.ts.map +1 -1
- package/dist/components/ActionGroupRenderer.js +3 -1
- package/dist/components/ActionGroupRenderer.js.map +1 -1
- package/dist/components/AgentCard.cjs +11 -8
- package/dist/components/AgentCard.cjs.map +1 -1
- package/dist/components/AgentCard.d.ts.map +1 -1
- package/dist/components/AgentCard.js +11 -8
- package/dist/components/AgentCard.js.map +1 -1
- package/dist/components/AgentHandoff.cjs +6 -1
- package/dist/components/AgentHandoff.cjs.map +1 -1
- package/dist/components/AgentHandoff.d.ts.map +1 -1
- package/dist/components/AgentHandoff.js +6 -1
- package/dist/components/AgentHandoff.js.map +1 -1
- package/dist/components/ArtifactRenderer.cjs +25 -6
- package/dist/components/ArtifactRenderer.cjs.map +1 -1
- package/dist/components/ArtifactRenderer.d.ts.map +1 -1
- package/dist/components/ArtifactRenderer.js +25 -6
- package/dist/components/ArtifactRenderer.js.map +1 -1
- package/dist/components/AutocompleteDropdown.cjs +30 -24
- package/dist/components/AutocompleteDropdown.cjs.map +1 -1
- package/dist/components/AutocompleteDropdown.d.ts.map +1 -1
- package/dist/components/AutocompleteDropdown.js +30 -24
- package/dist/components/AutocompleteDropdown.js.map +1 -1
- package/dist/components/AutocompleteFormField.cjs +3 -1
- package/dist/components/AutocompleteFormField.cjs.map +1 -1
- package/dist/components/AutocompleteFormField.d.ts.map +1 -1
- package/dist/components/AutocompleteFormField.js +4 -2
- package/dist/components/AutocompleteFormField.js.map +1 -1
- package/dist/components/BriefingDiff.cjs +45 -39
- package/dist/components/BriefingDiff.cjs.map +1 -1
- package/dist/components/BriefingDiff.d.ts.map +1 -1
- package/dist/components/BriefingDiff.js +45 -39
- package/dist/components/BriefingDiff.js.map +1 -1
- package/dist/components/CarouselRenderer.cjs +8 -2
- package/dist/components/CarouselRenderer.cjs.map +1 -1
- package/dist/components/CarouselRenderer.d.ts.map +1 -1
- package/dist/components/CarouselRenderer.js +8 -2
- package/dist/components/CarouselRenderer.js.map +1 -1
- package/dist/components/ChartJSRenderer.cjs +60 -36
- package/dist/components/ChartJSRenderer.cjs.map +1 -1
- package/dist/components/ChartJSRenderer.d.ts.map +1 -1
- package/dist/components/ChartJSRenderer.js +61 -37
- package/dist/components/ChartJSRenderer.js.map +1 -1
- package/dist/components/ChatPrompt.cjs +15 -9
- package/dist/components/ChatPrompt.cjs.map +1 -1
- package/dist/components/ChatPrompt.d.ts.map +1 -1
- package/dist/components/ChatPrompt.js +15 -9
- package/dist/components/ChatPrompt.js.map +1 -1
- package/dist/components/CodeBlockRenderer.cjs +34 -16
- package/dist/components/CodeBlockRenderer.cjs.map +1 -1
- package/dist/components/CodeBlockRenderer.d.ts.map +1 -1
- package/dist/components/CodeBlockRenderer.js +34 -16
- package/dist/components/CodeBlockRenderer.js.map +1 -1
- package/dist/components/DataPreviewSection.cjs +91 -44
- package/dist/components/DataPreviewSection.cjs.map +1 -1
- package/dist/components/DataPreviewSection.d.ts.map +1 -1
- package/dist/components/DataPreviewSection.js +92 -45
- package/dist/components/DataPreviewSection.js.map +1 -1
- package/dist/components/DegradedFallback.cjs +20 -16
- package/dist/components/DegradedFallback.cjs.map +1 -1
- package/dist/components/DegradedFallback.d.ts.map +1 -1
- package/dist/components/DegradedFallback.js +20 -16
- package/dist/components/DegradedFallback.js.map +1 -1
- package/dist/components/FooterRenderer.cjs +21 -17
- package/dist/components/FooterRenderer.cjs.map +1 -1
- package/dist/components/FooterRenderer.d.ts.map +1 -1
- package/dist/components/FooterRenderer.js +21 -17
- package/dist/components/FooterRenderer.js.map +1 -1
- package/dist/components/FormFieldRenderer.cjs +116 -93
- package/dist/components/FormFieldRenderer.cjs.map +1 -1
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +116 -93
- package/dist/components/FormFieldRenderer.js.map +1 -1
- package/dist/components/FormRenderer.cjs +55 -31
- package/dist/components/FormRenderer.cjs.map +1 -1
- package/dist/components/FormRenderer.d.ts.map +1 -1
- package/dist/components/FormRenderer.js +55 -31
- package/dist/components/FormRenderer.js.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.cjs +20 -15
- package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.d.ts.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.js +20 -15
- package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
- package/dist/components/GraphRenderer.cjs +56 -33
- package/dist/components/GraphRenderer.cjs.map +1 -1
- package/dist/components/GraphRenderer.d.ts.map +1 -1
- package/dist/components/GraphRenderer.js +56 -33
- package/dist/components/GraphRenderer.js.map +1 -1
- package/dist/components/IframeFallbackLink.cjs +37 -0
- package/dist/components/IframeFallbackLink.cjs.map +1 -0
- package/dist/components/IframeFallbackLink.d.ts +23 -0
- package/dist/components/IframeFallbackLink.d.ts.map +1 -0
- package/dist/components/IframeFallbackLink.js +37 -0
- package/dist/components/IframeFallbackLink.js.map +1 -0
- package/dist/components/ImageGalleryRenderer.cjs +13 -4
- package/dist/components/ImageGalleryRenderer.cjs.map +1 -1
- package/dist/components/ImageGalleryRenderer.d.ts.map +1 -1
- package/dist/components/ImageGalleryRenderer.js +13 -4
- package/dist/components/ImageGalleryRenderer.js.map +1 -1
- package/dist/components/LightboxOverlay.cjs +16 -8
- package/dist/components/LightboxOverlay.cjs.map +1 -1
- package/dist/components/LightboxOverlay.d.ts.map +1 -1
- package/dist/components/LightboxOverlay.js +17 -9
- package/dist/components/LightboxOverlay.js.map +1 -1
- package/dist/components/MapRenderer.cjs +59 -29
- package/dist/components/MapRenderer.cjs.map +1 -1
- package/dist/components/MapRenderer.d.ts +10 -2
- package/dist/components/MapRenderer.d.ts.map +1 -1
- package/dist/components/MapRenderer.js +60 -30
- package/dist/components/MapRenderer.js.map +1 -1
- package/dist/components/ModalRenderer.cjs +4 -1
- package/dist/components/ModalRenderer.cjs.map +1 -1
- package/dist/components/ModalRenderer.d.ts.map +1 -1
- package/dist/components/ModalRenderer.js +5 -2
- package/dist/components/ModalRenderer.js.map +1 -1
- package/dist/components/ScratchpadPanel.cjs +578 -535
- package/dist/components/ScratchpadPanel.cjs.map +1 -1
- package/dist/components/ScratchpadPanel.d.ts.map +1 -1
- package/dist/components/ScratchpadPanel.js +578 -535
- package/dist/components/ScratchpadPanel.js.map +1 -1
- package/dist/components/StreamingUIRenderer.cjs +92 -28
- package/dist/components/StreamingUIRenderer.cjs.map +1 -1
- package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
- package/dist/components/StreamingUIRenderer.js +92 -28
- package/dist/components/StreamingUIRenderer.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +481 -365
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts +21 -0
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +484 -368
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/components/VerifiedText.cjs +39 -20
- package/dist/components/VerifiedText.cjs.map +1 -1
- package/dist/components/VerifiedText.d.ts +2 -1
- package/dist/components/VerifiedText.d.ts.map +1 -1
- package/dist/components/VerifiedText.js +39 -20
- package/dist/components/VerifiedText.js.map +1 -1
- package/dist/components/VideoRenderer.cjs +51 -20
- package/dist/components/VideoRenderer.cjs.map +1 -1
- package/dist/components/VideoRenderer.d.ts.map +1 -1
- package/dist/components/VideoRenderer.js +51 -20
- package/dist/components/VideoRenderer.js.map +1 -1
- package/dist/components/chart-data-table.cjs +38 -17
- package/dist/components/chart-data-table.cjs.map +1 -1
- package/dist/components/chart-data-table.d.ts +30 -1
- package/dist/components/chart-data-table.d.ts.map +1 -1
- package/dist/components/chart-data-table.js +38 -17
- package/dist/components/chart-data-table.js.map +1 -1
- package/dist/context/MCPActionContext.cjs +3 -1
- package/dist/context/MCPActionContext.cjs.map +1 -1
- package/dist/context/MCPActionContext.d.ts.map +1 -1
- package/dist/context/MCPActionContext.js +3 -1
- package/dist/context/MCPActionContext.js.map +1 -1
- package/dist/context/MCPUIConfigContext.cjs +29 -0
- package/dist/context/MCPUIConfigContext.cjs.map +1 -0
- package/dist/context/MCPUIConfigContext.d.ts +124 -0
- package/dist/context/MCPUIConfigContext.d.ts.map +1 -0
- package/dist/context/MCPUIConfigContext.js +29 -0
- package/dist/context/MCPUIConfigContext.js.map +1 -0
- package/dist/context/MCPUIStringsContext.cjs +287 -2
- package/dist/context/MCPUIStringsContext.cjs.map +1 -1
- package/dist/context/MCPUIStringsContext.d.ts +607 -3
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
- package/dist/context/MCPUIStringsContext.js +287 -2
- package/dist/context/MCPUIStringsContext.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useStreamingUI.cjs +28 -10
- package/dist/hooks/useStreamingUI.cjs.map +1 -1
- package/dist/hooks/useStreamingUI.d.ts +37 -0
- package/dist/hooks/useStreamingUI.d.ts.map +1 -1
- package/dist/hooks/useStreamingUI.js +28 -10
- package/dist/hooks/useStreamingUI.js.map +1 -1
- package/dist/hooks.cjs +1 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.js +2 -1
- package/dist/index.cjs +29 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -4
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/validation.cjs +52 -26
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts +67 -2
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +52 -26
- package/dist/services/validation.js.map +1 -1
- package/dist/utils/degraded-projections.cjs +37 -12
- package/dist/utils/degraded-projections.cjs.map +1 -1
- package/dist/utils/degraded-projections.d.ts +39 -3
- package/dist/utils/degraded-projections.d.ts.map +1 -1
- package/dist/utils/degraded-projections.js +37 -12
- package/dist/utils/degraded-projections.js.map +1 -1
- package/dist/utils/format-string.cjs +10 -0
- package/dist/utils/format-string.cjs.map +1 -0
- package/dist/utils/format-string.d.ts +26 -0
- package/dist/utils/format-string.d.ts.map +1 -0
- package/dist/utils/format-string.js +10 -0
- package/dist/utils/format-string.js.map +1 -0
- package/dist/utils/iframe-coep.cjs +30 -0
- package/dist/utils/iframe-coep.cjs.map +1 -0
- package/dist/utils/iframe-coep.d.ts +46 -0
- package/dist/utils/iframe-coep.d.ts.map +1 -0
- package/dist/utils/iframe-coep.js +30 -0
- package/dist/utils/iframe-coep.js.map +1 -0
- package/dist/validation.cjs +5 -0
- package/dist/validation.cjs.map +1 -1
- package/dist/validation.d.cts +2 -1
- package/dist/validation.d.ts +2 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +6 -1
- package/package.json +1 -1
- package/src/adapters/connector.ts +58 -4
- package/src/adapters/index.ts +12 -2
- package/src/adapters/macro-run.ts +71 -11
- package/src/components/ActionGroupRenderer.tsx +3 -1
- package/src/components/AgentCard.tsx +27 -9
- package/src/components/AgentHandoff.tsx +4 -1
- package/src/components/ArtifactRenderer.tsx +17 -5
- package/src/components/AutocompleteDropdown.tsx +8 -6
- package/src/components/AutocompleteFormField.tsx +5 -1
- package/src/components/BriefingDiff.tsx +11 -3
- package/src/components/CarouselRenderer.tsx +4 -2
- package/src/components/ChartJSRenderer.tsx +18 -9
- package/src/components/ChatPrompt.tsx +13 -8
- package/src/components/CodeBlockRenderer.tsx +12 -10
- package/src/components/DataPreviewSection.tsx +92 -26
- package/src/components/DegradedFallback.tsx +4 -2
- package/src/components/FooterRenderer.tsx +3 -1
- package/src/components/FormFieldRenderer.tsx +34 -19
- package/src/components/FormRenderer.tsx +38 -10
- package/src/components/GenerativeUIErrorBoundary.tsx +8 -3
- package/src/components/GraphRenderer.tsx +31 -16
- package/src/components/IframeFallbackLink.tsx +57 -0
- package/src/components/ImageGalleryRenderer.tsx +8 -4
- package/src/components/LightboxOverlay.tsx +6 -4
- package/src/components/MapRenderer.tsx +57 -20
- package/src/components/ModalRenderer.tsx +3 -1
- package/src/components/ScratchpadPanel.tsx +95 -44
- package/src/components/StreamingUIRenderer.tsx +41 -11
- package/src/components/UIResourceRenderer.tsx +176 -67
- package/src/components/VerifiedText.tsx +19 -9
- package/src/components/VideoRenderer.tsx +26 -4
- package/src/components/chart-data-table.ts +68 -14
- package/src/context/MCPActionContext.tsx +4 -1
- package/src/context/MCPUIConfigContext.tsx +151 -0
- package/src/context/MCPUIStringsContext.tsx +1014 -1
- package/src/hooks/index.ts +2 -1
- package/src/hooks/useStreamingUI.ts +64 -10
- package/src/index.ts +38 -0
- package/src/services/index.ts +1 -0
- package/src/services/validation.ts +131 -32
- package/src/solid-jsx-attrs.d.ts +24 -0
- package/src/utils/degraded-projections.ts +75 -12
- package/src/utils/format-string.ts +33 -0
- package/src/utils/iframe-coep.ts +74 -0
- package/src/validation.ts +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselRenderer.cjs","sources":["../../src/components/CarouselRenderer.tsx"],"sourcesContent":["import { Component, For, createSignal } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport { useRenderContext } from './RenderContext'\nimport type { UIComponent } from '../types'\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper'\n\nexport interface CarouselRendererProps {\n items: UIComponent[]\n height?: string\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible'\n}\n\nexport const CarouselRenderer: Component<CarouselRendererProps> = (props) => {\n let scrollContainer: HTMLDivElement | undefined\n const [canScrollLeft, setCanScrollLeft] = createSignal(false)\n const [canScrollRight, setCanScrollRight] = createSignal(true)\n const isExpanded = useExpanded()\n\n // Use render context to avoid circular dependency\n const { renderComponent } = useRenderContext()\n\n const checkScroll = () => {\n if (isServer || !scrollContainer) return\n setCanScrollLeft(scrollContainer.scrollLeft > 0)\n setCanScrollRight(\n scrollContainer.scrollLeft < scrollContainer.scrollWidth - scrollContainer.clientWidth - 10\n )\n }\n\n const scroll = (direction: 'left' | 'right') => {\n if (isServer || !scrollContainer) return\n const scrollAmount = scrollContainer.clientWidth * 0.8\n scrollContainer.scrollBy({\n left: direction === 'left' ? -scrollAmount : scrollAmount,\n behavior: 'smooth'\n })\n }\n\n return (\n <ExpandableWrapper\n title={
|
|
1
|
+
{"version":3,"file":"CarouselRenderer.cjs","sources":["../../src/components/CarouselRenderer.tsx"],"sourcesContent":["import { Component, For, createSignal } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport { useRenderContext } from './RenderContext'\nimport type { UIComponent } from '../types'\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface CarouselRendererProps {\n items: UIComponent[]\n height?: string\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible'\n}\n\nexport const CarouselRenderer: Component<CarouselRendererProps> = (props) => {\n const strings = useMCPUIStrings()\n let scrollContainer: HTMLDivElement | undefined\n const [canScrollLeft, setCanScrollLeft] = createSignal(false)\n const [canScrollRight, setCanScrollRight] = createSignal(true)\n const isExpanded = useExpanded()\n\n // Use render context to avoid circular dependency\n const { renderComponent } = useRenderContext()\n\n const checkScroll = () => {\n if (isServer || !scrollContainer) return\n setCanScrollLeft(scrollContainer.scrollLeft > 0)\n setCanScrollRight(\n scrollContainer.scrollLeft < scrollContainer.scrollWidth - scrollContainer.clientWidth - 10\n )\n }\n\n const scroll = (direction: 'left' | 'right') => {\n if (isServer || !scrollContainer) return\n const scrollAmount = scrollContainer.clientWidth * 0.8\n scrollContainer.scrollBy({\n left: direction === 'left' ? -scrollAmount : scrollAmount,\n behavior: 'smooth'\n })\n }\n\n return (\n <ExpandableWrapper\n title={strings.carouselTitle}\n copyData={JSON.stringify(props.items, null, 2)}\n copyLabel={strings.carouselCopy}\n toolbarVariant={props.toolbarVariant}\n >\n <div class={`relative group ${isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''}`}>\n {/* Navigation Buttons */}\n <button\n onClick={() => scroll('left')}\n class={`absolute left-2 top-1/2 -translate-y-1/2 z-10 p-2 bg-white/80 dark:bg-gray-800/80 backdrop-blur-sm rounded-full shadow-md border border-gray-200 dark:border-gray-700 transition-opacity ${canScrollLeft() ? 'opacity-0 group-hover:opacity-100' : 'opacity-0 pointer-events-none'\n }`}\n >\n <svg class=\"w-5 h-5 text-gray-700 dark:text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <button\n onClick={() => scroll('right')}\n class={`absolute right-2 top-1/2 -translate-y-1/2 z-10 p-2 bg-white/80 dark:bg-gray-800/80 backdrop-blur-sm rounded-full shadow-md border border-gray-200 dark:border-gray-700 transition-opacity ${canScrollRight() ? 'opacity-0 group-hover:opacity-100' : 'opacity-0 pointer-events-none'\n }`}\n >\n <svg class=\"w-5 h-5 text-gray-700 dark:text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n\n {/* Scroll Container */}\n <div\n ref={scrollContainer}\n onScroll={checkScroll}\n class=\"flex gap-4 overflow-x-auto snap-x snap-mandatory pb-4 scrollbar-hide\"\n style={{ \"scroll-behavior\": \"smooth\" }}\n >\n <For each={props.items}>\n {(item) => (\n <div class=\"flex-none w-[85%] sm:w-[45%] snap-center\">\n <div class=\"h-full border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden bg-white dark:bg-gray-800\">\n {renderComponent(item)}\n </div>\n </div>\n )}\n </For>\n </div>\n </div>\n </ExpandableWrapper>\n )\n}\n"],"names":["CarouselRenderer","props","strings","useMCPUIStrings","scrollContainer","canScrollLeft","setCanScrollLeft","createSignal","canScrollRight","setCanScrollRight","isExpanded","useExpanded","renderComponent","useRenderContext","checkScroll","isServer","scrollLeft","scrollWidth","clientWidth","scroll","direction","scrollAmount","scrollBy","left","behavior","_$createComponent","ExpandableWrapper","title","carouselTitle","copyData","JSON","stringify","items","copyLabel","carouselCopy","toolbarVariant","children","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_el$4","$$click","addEventListener","_ref$","_$use","_$insert","For","each","item","_el$5","_tmpl$2","_el$6","_$effect","_p$","_v$","_v$2","_v$3","e","_$className","t","a","undefined","_$runHydrationEvents","_$delegateEvents"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselRenderer.d.ts","sourceRoot":"","sources":["../../src/components/CarouselRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,UAAU,CAAA;AAGvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"CarouselRenderer.d.ts","sourceRoot":"","sources":["../../src/components/CarouselRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,UAAU,CAAA;AAGvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAI3C,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAA;CAC9C;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,qBAAqB,CA4E7D,CAAA"}
|
|
@@ -2,8 +2,10 @@ import { createComponent, getNextElement, insert, effect, className, runHydratio
|
|
|
2
2
|
import { createSignal, For } from "solid-js";
|
|
3
3
|
import { useRenderContext } from "./RenderContext.js";
|
|
4
4
|
import { useExpanded, ExpandableWrapper } from "./ExpandableWrapper.js";
|
|
5
|
+
import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
|
|
5
6
|
var _tmpl$ = /* @__PURE__ */ template(`<div><button><svg class="w-5 h-5 text-gray-700 dark:text-gray-300"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M15 19l-7-7 7-7"></path></svg></button><button><svg class="w-5 h-5 text-gray-700 dark:text-gray-300"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M9 5l7 7-7 7"></path></svg></button><div class="flex gap-4 overflow-x-auto snap-x snap-mandatory pb-4 scrollbar-hide"style=scroll-behavior:smooth>`), _tmpl$2 = /* @__PURE__ */ template(`<div class="flex-none w-[85%] sm:w-[45%] snap-center"><div class="h-full border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden bg-white dark:bg-gray-800">`);
|
|
6
7
|
const CarouselRenderer = (props) => {
|
|
8
|
+
const strings = useMCPUIStrings();
|
|
7
9
|
let scrollContainer;
|
|
8
10
|
const [canScrollLeft, setCanScrollLeft] = createSignal(false);
|
|
9
11
|
const [canScrollRight, setCanScrollRight] = createSignal(true);
|
|
@@ -25,11 +27,15 @@ const CarouselRenderer = (props) => {
|
|
|
25
27
|
});
|
|
26
28
|
};
|
|
27
29
|
return createComponent(ExpandableWrapper, {
|
|
28
|
-
title
|
|
30
|
+
get title() {
|
|
31
|
+
return strings.carouselTitle;
|
|
32
|
+
},
|
|
29
33
|
get copyData() {
|
|
30
34
|
return JSON.stringify(props.items, null, 2);
|
|
31
35
|
},
|
|
32
|
-
copyLabel
|
|
36
|
+
get copyLabel() {
|
|
37
|
+
return strings.carouselCopy;
|
|
38
|
+
},
|
|
33
39
|
get toolbarVariant() {
|
|
34
40
|
return props.toolbarVariant;
|
|
35
41
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarouselRenderer.js","sources":["../../src/components/CarouselRenderer.tsx"],"sourcesContent":["import { Component, For, createSignal } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport { useRenderContext } from './RenderContext'\nimport type { UIComponent } from '../types'\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper'\n\nexport interface CarouselRendererProps {\n items: UIComponent[]\n height?: string\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible'\n}\n\nexport const CarouselRenderer: Component<CarouselRendererProps> = (props) => {\n let scrollContainer: HTMLDivElement | undefined\n const [canScrollLeft, setCanScrollLeft] = createSignal(false)\n const [canScrollRight, setCanScrollRight] = createSignal(true)\n const isExpanded = useExpanded()\n\n // Use render context to avoid circular dependency\n const { renderComponent } = useRenderContext()\n\n const checkScroll = () => {\n if (isServer || !scrollContainer) return\n setCanScrollLeft(scrollContainer.scrollLeft > 0)\n setCanScrollRight(\n scrollContainer.scrollLeft < scrollContainer.scrollWidth - scrollContainer.clientWidth - 10\n )\n }\n\n const scroll = (direction: 'left' | 'right') => {\n if (isServer || !scrollContainer) return\n const scrollAmount = scrollContainer.clientWidth * 0.8\n scrollContainer.scrollBy({\n left: direction === 'left' ? -scrollAmount : scrollAmount,\n behavior: 'smooth'\n })\n }\n\n return (\n <ExpandableWrapper\n title={
|
|
1
|
+
{"version":3,"file":"CarouselRenderer.js","sources":["../../src/components/CarouselRenderer.tsx"],"sourcesContent":["import { Component, For, createSignal } from 'solid-js'\nimport { isServer } from 'solid-js/web'\nimport { useRenderContext } from './RenderContext'\nimport type { UIComponent } from '../types'\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface CarouselRendererProps {\n items: UIComponent[]\n height?: string\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible'\n}\n\nexport const CarouselRenderer: Component<CarouselRendererProps> = (props) => {\n const strings = useMCPUIStrings()\n let scrollContainer: HTMLDivElement | undefined\n const [canScrollLeft, setCanScrollLeft] = createSignal(false)\n const [canScrollRight, setCanScrollRight] = createSignal(true)\n const isExpanded = useExpanded()\n\n // Use render context to avoid circular dependency\n const { renderComponent } = useRenderContext()\n\n const checkScroll = () => {\n if (isServer || !scrollContainer) return\n setCanScrollLeft(scrollContainer.scrollLeft > 0)\n setCanScrollRight(\n scrollContainer.scrollLeft < scrollContainer.scrollWidth - scrollContainer.clientWidth - 10\n )\n }\n\n const scroll = (direction: 'left' | 'right') => {\n if (isServer || !scrollContainer) return\n const scrollAmount = scrollContainer.clientWidth * 0.8\n scrollContainer.scrollBy({\n left: direction === 'left' ? -scrollAmount : scrollAmount,\n behavior: 'smooth'\n })\n }\n\n return (\n <ExpandableWrapper\n title={strings.carouselTitle}\n copyData={JSON.stringify(props.items, null, 2)}\n copyLabel={strings.carouselCopy}\n toolbarVariant={props.toolbarVariant}\n >\n <div class={`relative group ${isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''}`}>\n {/* Navigation Buttons */}\n <button\n onClick={() => scroll('left')}\n class={`absolute left-2 top-1/2 -translate-y-1/2 z-10 p-2 bg-white/80 dark:bg-gray-800/80 backdrop-blur-sm rounded-full shadow-md border border-gray-200 dark:border-gray-700 transition-opacity ${canScrollLeft() ? 'opacity-0 group-hover:opacity-100' : 'opacity-0 pointer-events-none'\n }`}\n >\n <svg class=\"w-5 h-5 text-gray-700 dark:text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n\n <button\n onClick={() => scroll('right')}\n class={`absolute right-2 top-1/2 -translate-y-1/2 z-10 p-2 bg-white/80 dark:bg-gray-800/80 backdrop-blur-sm rounded-full shadow-md border border-gray-200 dark:border-gray-700 transition-opacity ${canScrollRight() ? 'opacity-0 group-hover:opacity-100' : 'opacity-0 pointer-events-none'\n }`}\n >\n <svg class=\"w-5 h-5 text-gray-700 dark:text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n\n {/* Scroll Container */}\n <div\n ref={scrollContainer}\n onScroll={checkScroll}\n class=\"flex gap-4 overflow-x-auto snap-x snap-mandatory pb-4 scrollbar-hide\"\n style={{ \"scroll-behavior\": \"smooth\" }}\n >\n <For each={props.items}>\n {(item) => (\n <div class=\"flex-none w-[85%] sm:w-[45%] snap-center\">\n <div class=\"h-full border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden bg-white dark:bg-gray-800\">\n {renderComponent(item)}\n </div>\n </div>\n )}\n </For>\n </div>\n </div>\n </ExpandableWrapper>\n )\n}\n"],"names":["CarouselRenderer","props","strings","useMCPUIStrings","scrollContainer","canScrollLeft","setCanScrollLeft","createSignal","canScrollRight","setCanScrollRight","isExpanded","useExpanded","renderComponent","useRenderContext","checkScroll","isServer","scrollLeft","scrollWidth","clientWidth","scroll","direction","scrollAmount","scrollBy","left","behavior","_$createComponent","ExpandableWrapper","title","carouselTitle","copyData","JSON","stringify","items","copyLabel","carouselCopy","toolbarVariant","children","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_el$4","$$click","addEventListener","_ref$","_$use","_$insert","For","each","item","_el$5","_tmpl$2","_el$6","_$effect","_p$","_v$","_v$2","_v$3","e","_$className","t","a","undefined","_$runHydrationEvents","_$delegateEvents"],"mappings":";;;;;;AAiBO,MAAMA,mBAAsDC,CAAAA,UAAU;AACzE,QAAMC,UAAUC,gBAAAA;AAChB,MAAIC;AACJ,QAAM,CAACC,eAAeC,gBAAgB,IAAIC,aAAa,KAAK;AAC5D,QAAM,CAACC,gBAAgBC,iBAAiB,IAAIF,aAAa,IAAI;AAC7D,QAAMG,aAAaC,YAAAA;AAGnB,QAAM;AAAA,IAAEC;AAAAA,EAAAA,IAAoBC,iBAAAA;AAE5B,QAAMC,cAAcA,MAAM;AACtB,QAAIC,YAAY,CAACX,gBAAiB;AAClCE,qBAAiBF,gBAAgBY,aAAa,CAAC;AAC/CP,sBACIL,gBAAgBY,aAAaZ,gBAAgBa,cAAcb,gBAAgBc,cAAc,EAC7F;AAAA,EACJ;AAEA,QAAMC,SAASA,CAACC,cAAgC;AAC5C,QAAIL,YAAY,CAACX,gBAAiB;AAClC,UAAMiB,eAAejB,gBAAgBc,cAAc;AACnDd,oBAAgBkB,SAAS;AAAA,MACrBC,MAAMH,cAAc,SAAS,CAACC,eAAeA;AAAAA,MAC7CG,UAAU;AAAA,IAAA,CACb;AAAA,EACL;AAEA,SAAAC,gBACKC,mBAAiB;AAAA,IAAA,IACdC,QAAK;AAAA,aAAEzB,QAAQ0B;AAAAA,IAAa;AAAA,IAAA,IAC5BC,WAAQ;AAAA,aAAEC,KAAKC,UAAU9B,MAAM+B,OAAO,MAAM,CAAC;AAAA,IAAC;AAAA,IAAA,IAC9CC,YAAS;AAAA,aAAE/B,QAAQgC;AAAAA,IAAY;AAAA,IAAA,IAC/BC,iBAAc;AAAA,aAAElC,MAAMkC;AAAAA,IAAc;AAAA,IAAA,IAAAC,WAAA;AAAA,UAAAC,OAAAC,eAAAC,MAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAG,aAAAC,QAAAF,MAAAC;AAAAH,YAAAK,UAKvB,MAAM1B,OAAO,MAAM;AAACuB,YAAAG,UAUpB,MAAM1B,OAAO,OAAO;AAACyB,YAAAE,iBAAA,UAYpBhC,WAAW;AAAA,UAAAiC,QADhB3C;AAAe,aAAA2C,UAAA,aAAAC,IAAAD,OAAAH,KAAA,IAAfxC,kBAAewC;AAAAK,aAAAL,OAAAnB,gBAKnByB,KAAG;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAElD,MAAM+B;AAAAA,QAAK;AAAA,QAAAI,UAChBgB,WAAI,MAAA;AAAA,cAAAC,QAAAf,eAAAgB,OAAA,GAAAC,QAAAF,MAAAZ;AAAAQ,iBAAAM,OAAA,MAGO3C,gBAAgBwC,IAAI,CAAC;AAAA,iBAAAC;AAAAA,QAAA,GAAA;AAAA,MAAA,CAGjC,CAAA;AAAAG,aAAAC,CAAAA,QAAA;AAAA,YAAAC,MApCD,kBAAkBhD,WAAAA,IAAe,iCAAiC,EAAE,IAAEiD,OAInE,4LAA4LtD,kBAAkB,sCAAsC,+BAA+B,IACpRuD,OASC,6LAA6LpD,eAAAA,IAAmB,sCAAsC,+BAA+B;AACtRkD,gBAAAD,IAAAI,KAAAC,UAAAzB,MAAAoB,IAAAI,IAAAH,GAAA;AAAAC,iBAAAF,IAAAM,KAAAD,UAAAtB,OAAAiB,IAAAM,IAAAJ,IAAA;AAAAC,iBAAAH,IAAAO,KAAAF,UAAApB,OAAAe,IAAAO,IAAAJ,IAAA;AAAA,eAAAH;AAAAA,MAAA,GAAA;AAAA,QAAAI,GAAAI;AAAAA,QAAAF,GAAAE;AAAAA,QAAAD,GAAAC;AAAAA,MAAAA,CAAA;AAAAC,yBAAAA;AAAA,aAAA7B;AAAAA,IAAA;AAAA,EAAA,CAAA;AA2BtB;AAAC8B,eAAA,CAAA,OAAA,CAAA;"}
|
|
@@ -29,7 +29,8 @@ const DegradedFallback = require("./DegradedFallback.cjs");
|
|
|
29
29
|
const chartDataTable = require("./chart-data-table.cjs");
|
|
30
30
|
const MCPUITelemetryContext = require("../context/MCPUITelemetryContext.cjs");
|
|
31
31
|
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
32
|
-
|
|
32
|
+
const formatString = require("../utils/format-string.cjs");
|
|
33
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ web.template(`<button type=button class="opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z">`), _tmpl$3 = /* @__PURE__ */ web.template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-gray-50 dark:bg-gray-900/40"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div><span class="text-sm text-gray-500 dark:text-gray-400">`), _tmpl$6 = /* @__PURE__ */ web.template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600"role=group><button type=button></button><button type=button></button></div><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$8 = /* @__PURE__ */ web.template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$9 = /* @__PURE__ */ web.template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
|
|
33
34
|
let ChartJS = null;
|
|
34
35
|
let chartJSLoadPromise = null;
|
|
35
36
|
const loadChartJS = async () => {
|
|
@@ -62,9 +63,14 @@ const ChartJSRenderer = (props) => {
|
|
|
62
63
|
let chartInstance;
|
|
63
64
|
let renderVersion = 0;
|
|
64
65
|
const params = () => props.component.params;
|
|
65
|
-
const tableData = solidJs.createMemo(() => chartDataTable.chartToDataTable(params()));
|
|
66
66
|
const telemetry = MCPUITelemetryContext.useTelemetry();
|
|
67
67
|
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
68
|
+
const tableData = solidJs.createMemo(() => chartDataTable.chartToDataTable(params(), {
|
|
69
|
+
series: strings.chartTableSeries,
|
|
70
|
+
point: strings.chartTablePoint,
|
|
71
|
+
label: strings.degradedColLabel,
|
|
72
|
+
seriesName: strings.degradedSeries
|
|
73
|
+
}));
|
|
68
74
|
const descriptionId = solidJs.createUniqueId();
|
|
69
75
|
const title = () => params().title || strings.chartView;
|
|
70
76
|
const exportEnabled = () => params().exportable !== false;
|
|
@@ -136,7 +142,7 @@ const ChartJSRenderer = (props) => {
|
|
|
136
142
|
setIsLoading(false);
|
|
137
143
|
} catch (err) {
|
|
138
144
|
if (version !== renderVersion) return;
|
|
139
|
-
const error2 = err instanceof Error ? err : new Error(
|
|
145
|
+
const error2 = err instanceof Error ? err : new Error(strings.chartRenderError);
|
|
140
146
|
setError(error2.message);
|
|
141
147
|
setIsLoading(false);
|
|
142
148
|
telemetry == null ? void 0 : telemetry.dispatch({
|
|
@@ -170,14 +176,16 @@ const ChartJSRenderer = (props) => {
|
|
|
170
176
|
get copyData() {
|
|
171
177
|
return copyDataJSON();
|
|
172
178
|
},
|
|
173
|
-
copyLabel
|
|
179
|
+
get copyLabel() {
|
|
180
|
+
return strings.chartCopy;
|
|
181
|
+
},
|
|
174
182
|
get toolbarVariant() {
|
|
175
183
|
return props.toolbarVariant;
|
|
176
184
|
},
|
|
177
185
|
get children() {
|
|
178
186
|
return web.createComponent(ContextAwareChartLayout, {
|
|
179
187
|
render: (isExpanded) => (() => {
|
|
180
|
-
var _el$ = web.getNextElement(_tmpl$6), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$0 = _el$6.nextSibling, [_el$1, _co$] = web.getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$12 = _el$10.firstChild, [_el$13, _co$2] = web.getNextMarker(_el$12.nextSibling), _el$11 = _el$13.nextSibling, _el$14 = _el$11.nextSibling, [_el$15, _co$3] = web.getNextMarker(_el$14.nextSibling), _el$
|
|
188
|
+
var _el$ = web.getNextElement(_tmpl$6), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$0 = _el$6.nextSibling, [_el$1, _co$] = web.getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$12 = _el$10.firstChild, [_el$13, _co$2] = web.getNextMarker(_el$12.nextSibling), _el$11 = _el$13.nextSibling, _el$14 = _el$11.nextSibling, [_el$15, _co$3] = web.getNextMarker(_el$14.nextSibling), _el$41 = _el$10.nextSibling, [_el$42, _co$9] = web.getNextMarker(_el$41.nextSibling), _el$43 = _el$42.nextSibling, [_el$44, _co$0] = web.getNextMarker(_el$43.nextSibling), _el$33 = _el$44.nextSibling, _el$34 = _el$33.firstChild, _el$39 = _el$34.nextSibling, [_el$40, _co$8] = web.getNextMarker(_el$39.nextSibling);
|
|
181
189
|
web.insert(_el$3, web.createComponent(solidJs.Show, {
|
|
182
190
|
get when() {
|
|
183
191
|
return params().title;
|
|
@@ -199,7 +207,17 @@ const ChartJSRenderer = (props) => {
|
|
|
199
207
|
get children() {
|
|
200
208
|
var _el$9 = web.getNextElement(_tmpl$2);
|
|
201
209
|
_el$9.$$click = handleExportPNG;
|
|
202
|
-
web.effect(() =>
|
|
210
|
+
web.effect((_p$) => {
|
|
211
|
+
var _v$ = activeView() !== "chart" || isLoading() || Boolean(error()), _v$2 = strings.chartDownloadPng, _v$3 = strings.chartDownloadPngAria;
|
|
212
|
+
_v$ !== _p$.e && web.setProperty(_el$9, "disabled", _p$.e = _v$);
|
|
213
|
+
_v$2 !== _p$.t && web.setAttribute(_el$9, "title", _p$.t = _v$2);
|
|
214
|
+
_v$3 !== _p$.a && web.setAttribute(_el$9, "aria-label", _p$.a = _v$3);
|
|
215
|
+
return _p$;
|
|
216
|
+
}, {
|
|
217
|
+
e: void 0,
|
|
218
|
+
t: void 0,
|
|
219
|
+
a: void 0
|
|
220
|
+
});
|
|
203
221
|
web.runHydrationEvents();
|
|
204
222
|
return _el$9;
|
|
205
223
|
}
|
|
@@ -214,12 +232,16 @@ const ChartJSRenderer = (props) => {
|
|
|
214
232
|
get children() {
|
|
215
233
|
return web.createComponent(DegradedFallback.DegradedFallback, web.mergeProps({
|
|
216
234
|
get message() {
|
|
217
|
-
return
|
|
235
|
+
return formatString.formatMCPUIString(strings.chartRenderFailed, {
|
|
236
|
+
error: String(error())
|
|
237
|
+
});
|
|
218
238
|
},
|
|
219
|
-
caption
|
|
239
|
+
get caption() {
|
|
240
|
+
return strings.chartDegradedCaption;
|
|
241
|
+
}
|
|
220
242
|
}, tableData));
|
|
221
243
|
}
|
|
222
|
-
}), _el$
|
|
244
|
+
}), _el$42, _co$9);
|
|
223
245
|
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
224
246
|
get when() {
|
|
225
247
|
return activeView() === "data";
|
|
@@ -233,9 +255,9 @@ const ChartJSRenderer = (props) => {
|
|
|
233
255
|
return tableData().columns;
|
|
234
256
|
},
|
|
235
257
|
children: (column) => (() => {
|
|
236
|
-
var _el$
|
|
237
|
-
web.insert(_el$
|
|
238
|
-
return _el$
|
|
258
|
+
var _el$45 = web.getNextElement(_tmpl$7);
|
|
259
|
+
web.insert(_el$45, column);
|
|
260
|
+
return _el$45;
|
|
239
261
|
})()
|
|
240
262
|
}));
|
|
241
263
|
web.insert(_el$26, web.createComponent(solidJs.For, {
|
|
@@ -243,18 +265,18 @@ const ChartJSRenderer = (props) => {
|
|
|
243
265
|
return tableData().rows;
|
|
244
266
|
},
|
|
245
267
|
children: (row) => (() => {
|
|
246
|
-
var _el$
|
|
247
|
-
web.insert(_el$
|
|
268
|
+
var _el$46 = web.getNextElement(_tmpl$8);
|
|
269
|
+
web.insert(_el$46, web.createComponent(solidJs.For, {
|
|
248
270
|
get each() {
|
|
249
271
|
return tableData().columns;
|
|
250
272
|
},
|
|
251
273
|
children: (_column, index) => (() => {
|
|
252
|
-
var _el$
|
|
253
|
-
web.insert(_el$
|
|
254
|
-
return _el$
|
|
274
|
+
var _el$47 = web.getNextElement(_tmpl$9);
|
|
275
|
+
web.insert(_el$47, () => String(row[index()] ?? ""));
|
|
276
|
+
return _el$47;
|
|
255
277
|
})()
|
|
256
278
|
}));
|
|
257
|
-
return _el$
|
|
279
|
+
return _el$46;
|
|
258
280
|
})()
|
|
259
281
|
}), _el$30, _co$6);
|
|
260
282
|
web.insert(_el$26, web.createComponent(solidJs.Show, {
|
|
@@ -269,12 +291,12 @@ const ChartJSRenderer = (props) => {
|
|
|
269
291
|
}
|
|
270
292
|
}), _el$32, _co$7);
|
|
271
293
|
web.effect((_p$) => {
|
|
272
|
-
var _v$ = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$
|
|
294
|
+
var _v$4 = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$5 = isExpanded() ? void 0 : {
|
|
273
295
|
height: params().height || "250px",
|
|
274
296
|
"max-height": "70vh"
|
|
275
297
|
};
|
|
276
|
-
_v$ !== _p$.e && web.className(_el$16, _p$.e = _v$);
|
|
277
|
-
_p$.t = web.style(_el$16, _v$
|
|
298
|
+
_v$4 !== _p$.e && web.className(_el$16, _p$.e = _v$4);
|
|
299
|
+
_p$.t = web.style(_el$16, _v$5, _p$.t);
|
|
278
300
|
return _p$;
|
|
279
301
|
}, {
|
|
280
302
|
e: void 0,
|
|
@@ -282,7 +304,7 @@ const ChartJSRenderer = (props) => {
|
|
|
282
304
|
});
|
|
283
305
|
return _el$16;
|
|
284
306
|
}
|
|
285
|
-
}), _el$
|
|
307
|
+
}), _el$44, _co$0);
|
|
286
308
|
var _ref$ = canvasRef;
|
|
287
309
|
typeof _ref$ === "function" ? web.use(_ref$, _el$34) : canvasRef = _el$34;
|
|
288
310
|
web.setAttribute(_el$34, "aria-describedby", descriptionId);
|
|
@@ -291,11 +313,13 @@ const ChartJSRenderer = (props) => {
|
|
|
291
313
|
return web.memo(() => !!isLoading())() && activeView() === "chart";
|
|
292
314
|
},
|
|
293
315
|
get children() {
|
|
294
|
-
|
|
316
|
+
var _el$35 = web.getNextElement(_tmpl$5), _el$36 = _el$35.firstChild, _el$37 = _el$36.firstChild, _el$38 = _el$37.nextSibling;
|
|
317
|
+
web.insert(_el$38, () => strings.chartLoading);
|
|
318
|
+
return _el$35;
|
|
295
319
|
}
|
|
296
|
-
}), _el$
|
|
320
|
+
}), _el$40, _co$8);
|
|
297
321
|
web.effect((_p$) => {
|
|
298
|
-
var _v$
|
|
322
|
+
var _v$6 = `relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : ""} ${params().className || ""}`, _v$7 = strings.chartViewSelector, _v$8 = activeView() === "chart", _v$9 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "chart" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$0 = activeView() === "data", _v$1 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "data" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$10 = `relative w-full ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$11 = error() || activeView() === "data" ? {
|
|
299
323
|
display: "none"
|
|
300
324
|
} : isExpanded() ? {
|
|
301
325
|
height: "100%",
|
|
@@ -303,17 +327,17 @@ const ChartJSRenderer = (props) => {
|
|
|
303
327
|
} : {
|
|
304
328
|
height: params().height || "250px",
|
|
305
329
|
display: "block"
|
|
306
|
-
}, _v$
|
|
307
|
-
_v$
|
|
308
|
-
_v$
|
|
309
|
-
_v$
|
|
310
|
-
_v$
|
|
311
|
-
_v$
|
|
312
|
-
_v$
|
|
313
|
-
_v$
|
|
314
|
-
_p$.h = web.style(_el$33, _v$
|
|
315
|
-
_v$
|
|
316
|
-
_v$
|
|
330
|
+
}, _v$12 = title(), _v$13 = activeView() !== "chart" || Boolean(error());
|
|
331
|
+
_v$6 !== _p$.e && web.className(_el$, _p$.e = _v$6);
|
|
332
|
+
_v$7 !== _p$.t && web.setAttribute(_el$6, "aria-label", _p$.t = _v$7);
|
|
333
|
+
_v$8 !== _p$.a && web.setAttribute(_el$7, "aria-pressed", _p$.a = _v$8);
|
|
334
|
+
_v$9 !== _p$.o && web.className(_el$7, _p$.o = _v$9);
|
|
335
|
+
_v$0 !== _p$.i && web.setAttribute(_el$8, "aria-pressed", _p$.i = _v$0);
|
|
336
|
+
_v$1 !== _p$.n && web.className(_el$8, _p$.n = _v$1);
|
|
337
|
+
_v$10 !== _p$.s && web.className(_el$33, _p$.s = _v$10);
|
|
338
|
+
_p$.h = web.style(_el$33, _v$11, _p$.h);
|
|
339
|
+
_v$12 !== _p$.r && web.setAttribute(_el$34, "aria-label", _p$.r = _v$12);
|
|
340
|
+
_v$13 !== _p$.d && web.setAttribute(_el$34, "aria-hidden", _p$.d = _v$13);
|
|
317
341
|
return _p$;
|
|
318
342
|
}, {
|
|
319
343
|
e: void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartJSRenderer.cjs","sources":["../../src/components/ChartJSRenderer.tsx"],"sourcesContent":["/**\n * ChartJSRenderer - Native Chart.js rendering\n * Sprint 4: State & Charts\n *\n * Requires chart.js peer dependency:\n * ```\n * pnpm add chart.js\n * ```\n */\n\nimport {\n Component,\n For,\n createEffect,\n createMemo,\n createUniqueId,\n onCleanup,\n createSignal,\n Show,\n} from 'solid-js';\nimport type { Accessor, JSX } from 'solid-js';\nimport type { UIComponent, ChartComponentParams } from '../types';\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper';\nimport { DegradedFallback } from './DegradedFallback';\nimport { chartToDataTable } from './chart-data-table';\nimport { useTelemetry } from '../context/MCPUITelemetryContext';\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext';\n\n// Lazy load Chart.js to avoid bundling if not used\nlet ChartJS: any = null;\nlet chartJSLoadPromise: Promise<any> | null = null;\n\nconst loadChartJS = async () => {\n if (ChartJS) return ChartJS;\n\n if (!chartJSLoadPromise) {\n chartJSLoadPromise = import('chart.js/auto')\n .then((module) => {\n ChartJS = module.default || module.Chart;\n return ChartJS;\n })\n .catch((err) => {\n chartJSLoadPromise = null;\n throw err;\n });\n }\n\n return chartJSLoadPromise;\n};\n\n/**\n * Check if Chart.js is available\n */\nexport async function isChartJSAvailable(): Promise<boolean> {\n try {\n await loadChartJS();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ChartJSRendererProps {\n /**\n * UIComponent with chart params\n */\n component: UIComponent;\n\n /**\n * Error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible';\n}\n\nconst ContextAwareChartLayout: Component<{\n render: (isExpanded: Accessor<boolean>) => JSX.Element;\n}> = (props) => props.render(useExpanded());\n\n/**\n * Native Chart.js renderer component\n *\n * @example\n * ```tsx\n * const chartComponent: UIComponent = {\n * id: 'revenue-chart',\n * type: 'chart',\n * position: { colStart: 1, colSpan: 6 },\n * params: {\n * type: 'bar',\n * title: 'Monthly Revenue',\n * data: {\n * labels: ['Jan', 'Feb', 'Mar'],\n * datasets: [{ label: 'Revenue', data: [100, 200, 150] }]\n * },\n * renderer: 'native',\n * },\n * }\n * <ChartJSRenderer component={chartComponent} />\n * ```\n */\nexport const ChartJSRenderer: Component<ChartJSRendererProps> = (props) => {\n const [isLoading, setIsLoading] = createSignal(true);\n const [error, setError] = createSignal<string>();\n const [activeView, setActiveView] = createSignal<'chart' | 'data'>('chart');\n let canvasRef: HTMLCanvasElement | undefined;\n let chartInstance: any;\n let renderVersion = 0;\n\n const params = () => props.component.params as ChartComponentParams;\n const tableData = createMemo(() => chartToDataTable(params()));\n const telemetry = useTelemetry();\n const strings = useMCPUIStrings();\n const descriptionId = createUniqueId();\n const title = () => params().title || strings.chartView;\n\n // v6.1.0 — export visibility :\n // - undefined / true → button shown (new default, was opt-in)\n // - false → button hidden (explicit opt-out, unchanged)\n const exportEnabled = () => params().exportable !== false;\n\n // v6.1.0 — copy data for the ExpandableWrapper modal-header copy button.\n // Lazy-stringified each time the button is clicked.\n const copyDataJSON = () => JSON.stringify({ type: params().type, data: params().data }, null, 2);\n\n // Chart PNG export\n const handleExportPNG = () => {\n if (!canvasRef) return;\n const url = canvasRef.toDataURL('image/png');\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(params().title || 'chart').replace(/\\s+/g, '-').toLowerCase()}.png`;\n a.click();\n };\n\n // Create/update chart when params change\n createEffect(async () => {\n if (!canvasRef) return;\n\n // Access params to track dependencies\n const chartParams = params();\n const version = ++renderVersion;\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const Chart = await loadChartJS();\n\n // A newer prop update or an unmount superseded this async render.\n if (version !== renderVersion || !canvasRef) return;\n\n // Destroy previous instance\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n\n // Build options, merging time-axis config if present (v3.1.0)\n const baseOptions: any = {\n responsive: true,\n maintainAspectRatio: false,\n ...chartParams.options,\n plugins: {\n ...chartParams.options?.plugins,\n legend: {\n display: true,\n position: 'bottom',\n ...chartParams.options?.plugins?.legend,\n },\n },\n };\n\n // Time-series axis (v3.1.0)\n if (chartParams.timeAxis) {\n const ta = chartParams.timeAxis;\n baseOptions.scales = {\n ...baseOptions.scales,\n x: {\n ...baseOptions.scales?.x,\n type: 'time',\n time: {\n parser: ta.parser,\n unit: ta.unit,\n tooltipFormat: ta.tooltipFormat,\n },\n ...(ta.min ? { min: ta.min } : {}),\n ...(ta.max ? { max: ta.max } : {}),\n },\n };\n }\n\n // Create new chart\n chartInstance = new Chart(canvasRef, {\n type: chartParams.type,\n data: chartParams.data,\n options: baseOptions,\n });\n\n setIsLoading(false);\n } catch (err) {\n if (version !== renderVersion) return;\n const error = err instanceof Error ? err : new Error('Chart rendering failed');\n setError(error.message);\n setIsLoading(false);\n // Fallback ladder (P2.5): record the failure so it's observable, then\n // degrade to the series table below instead of a blank canvas.\n telemetry?.dispatch({\n type: 'render:error',\n errorMessage: error.message,\n id: props.component?.id ?? '',\n componentType: 'chart',\n ts: Date.now(),\n });\n props.onError?.(error);\n }\n });\n\n // Chart.js may measure a zero-sized canvas while the data view is visible.\n // Resize once Solid has revealed it again.\n createEffect(() => {\n if (activeView() !== 'chart' || !chartInstance) return;\n queueMicrotask(() => chartInstance?.resize?.());\n });\n\n // Cleanup on unmount\n onCleanup(() => {\n renderVersion += 1;\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n });\n\n return (\n <ExpandableWrapper\n title={title()}\n copyData={copyDataJSON()}\n copyLabel=\"Copy chart data (JSON)\"\n toolbarVariant={props.toolbarVariant}\n >\n <ContextAwareChartLayout\n render={(isExpanded) => (\n <div\n class={`relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${\n isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''\n } ${params().className || ''}`}\n >\n <div class=\"flex items-center justify-between gap-3 mb-3 flex-shrink-0\">\n <div class=\"min-w-0\">\n <Show when={params().title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params().title}</h3>\n </Show>\n </div>\n <div class=\"flex items-center gap-2\">\n <div\n class=\"inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600\"\n role=\"group\"\n aria-label={strings.chartViewSelector}\n >\n <button\n type=\"button\"\n aria-pressed={activeView() === 'chart'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'chart'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('chart')}\n >\n {strings.chartView}\n </button>\n <button\n type=\"button\"\n aria-pressed={activeView() === 'data'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'data'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('data')}\n >\n {strings.chartDataView}\n </button>\n </div>\n <Show when={exportEnabled()}>\n <button\n type=\"button\"\n onClick={handleExportPNG}\n disabled={activeView() !== 'chart' || isLoading() || Boolean(error())}\n class=\"opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm\"\n title=\"Download PNG\"\n aria-label=\"Download chart as PNG\"\n >\n <svg\n class=\"w-3 h-3 text-gray-500 dark:text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n </Show>\n </div>\n </div>\n\n <p id={descriptionId} class=\"sr-only\">\n {title()}. {strings.chartDataSummary}\n </p>\n\n {/* Fallback ladder (P2.5): degrade to a series table on render error\n instead of a bare \"Chart Error\" message. */}\n <Show when={error() && activeView() === 'chart'}>\n <DegradedFallback\n message={`Chart rendering failed: ${error()}`}\n caption=\"Showing the chart data as a table — the interactive chart is unavailable.\"\n {...tableData()}\n />\n </Show>\n\n <Show when={activeView() === 'data'}>\n <div\n class={`w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${\n isExpanded() ? 'flex-1 min-h-0' : ''\n }`}\n style={\n isExpanded()\n ? undefined\n : { height: params().height || '250px', 'max-height': '70vh' }\n }\n >\n <table class=\"w-full border-collapse text-left text-sm\">\n <caption class=\"sr-only\">\n {title()} — {strings.chartDataTable}\n </caption>\n <thead class=\"bg-gray-50 dark:bg-gray-900/40\">\n <tr>\n <For each={tableData().columns}>\n {(column) => (\n <th scope=\"col\" class=\"px-3 py-2 font-medium text-gray-900 dark:text-gray-100\">\n {column}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={tableData().rows}>\n {(row) => (\n <tr class=\"border-t border-gray-100 dark:border-gray-700\">\n <For each={tableData().columns}>\n {(_column, index) => (\n <td class=\"px-3 py-2 text-gray-700 dark:text-gray-300\">\n {String(row[index()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n <Show when={tableData().rows.length === 0}>\n <tr>\n <td\n colSpan={Math.max(1, tableData().columns.length)}\n class=\"px-3 py-6 text-center text-gray-500 dark:text-gray-400\"\n >\n {strings.chartNoData}\n </td>\n </tr>\n </Show>\n </tbody>\n </table>\n </div>\n </Show>\n\n <div\n class={`relative w-full ${isExpanded() ? 'flex-1 min-h-0' : ''}`}\n style={\n error() || activeView() === 'data'\n ? { display: 'none' }\n : isExpanded()\n ? { height: '100%', display: 'block' }\n : { height: params().height || '250px', display: 'block' }\n }\n >\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={title()}\n aria-describedby={descriptionId}\n aria-hidden={activeView() !== 'chart' || Boolean(error())}\n />\n <Show when={isLoading() && activeView() === 'chart'}>\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80\">\n <div class=\"flex flex-col items-center gap-2\">\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n <span class=\"text-sm text-gray-500 dark:text-gray-400\">Loading chart...</span>\n </div>\n </div>\n </Show>\n </div>\n </div>\n )}\n />\n </ExpandableWrapper>\n );\n};\n"],"names":["ChartJS","chartJSLoadPromise","loadChartJS","then","module","default","Chart","catch","err","isChartJSAvailable","ContextAwareChartLayout","props","render","useExpanded","ChartJSRenderer","isLoading","setIsLoading","createSignal","error","setError","activeView","setActiveView","canvasRef","chartInstance","renderVersion","params","component","tableData","createMemo","chartToDataTable","telemetry","useTelemetry","strings","useMCPUIStrings","descriptionId","createUniqueId","title","chartView","exportEnabled","exportable","copyDataJSON","JSON","stringify","type","data","handleExportPNG","url","toDataURL","a","document","createElement","href","download","replace","toLowerCase","click","createEffect","chartParams","version","undefined","destroy","baseOptions","responsive","maintainAspectRatio","options","plugins","legend","display","position","timeAxis","ta","scales","x","time","parser","unit","tooltipFormat","min","max","Error","message","dispatch","errorMessage","id","componentType","ts","Date","now","onError","queueMicrotask","resize","onCleanup","_$createComponent","ExpandableWrapper","copyData","copyLabel","toolbarVariant","children","isExpanded","_el$","_$getNextElement","_tmpl$6","_el$2","firstChild","_el$3","_el$5","nextSibling","_el$6","_el$7","_el$8","_el$0","_el$1","_co$","_$getNextMarker","_el$10","_el$12","_el$13","_co$2","_el$11","_el$14","_el$15","_co$3","_el$38","_el$39","_co$9","_el$40","_el$41","_co$0","_el$33","_el$34","_el$36","_el$37","_co$8","_$insert","Show","when","_el$4","_tmpl$","$$click","chartDataView","_el$9","_tmpl$2","_$effect","_$setProperty","Boolean","_$runHydrationEvents","_$setAttribute","chartDataSummary","_$memo","DegradedFallback","_$mergeProps","caption","_el$16","_tmpl$4","_el$17","_el$18","_el$20","_el$21","_co$4","_el$19","_el$22","_el$23","_co$5","_el$24","_el$25","_el$26","_el$29","_el$30","_co$6","_el$31","_el$32","_co$7","chartDataTable","For","each","columns","column","_el$42","_tmpl$7","rows","row","_el$43","_tmpl$8","_column","index","_el$44","_tmpl$9","String","length","_el$27","_tmpl$3","_el$28","chartNoData","Math","_p$","_v$","_v$2","height","e","_$className","t","_$style","_ref$","_$use","_tmpl$5","_v$3","className","_v$4","chartViewSelector","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_v$1","_v$10","o","i","n","s","h","r","d","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartJSRenderer.cjs","sources":["../../src/components/ChartJSRenderer.tsx"],"sourcesContent":["/**\n * ChartJSRenderer - Native Chart.js rendering\n * Sprint 4: State & Charts\n *\n * Requires chart.js peer dependency:\n * ```\n * pnpm add chart.js\n * ```\n */\n\nimport {\n Component,\n For,\n createEffect,\n createMemo,\n createUniqueId,\n onCleanup,\n createSignal,\n Show,\n} from 'solid-js';\nimport type { Accessor, JSX } from 'solid-js';\nimport type { UIComponent, ChartComponentParams } from '../types';\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper';\nimport { DegradedFallback } from './DegradedFallback';\nimport { chartToDataTable } from './chart-data-table';\nimport { useTelemetry } from '../context/MCPUITelemetryContext';\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext';\n\n// Lazy load Chart.js to avoid bundling if not used\nlet ChartJS: any = null;\nlet chartJSLoadPromise: Promise<any> | null = null;\n\nconst loadChartJS = async () => {\n if (ChartJS) return ChartJS;\n\n if (!chartJSLoadPromise) {\n chartJSLoadPromise = import('chart.js/auto')\n .then((module) => {\n ChartJS = module.default || module.Chart;\n return ChartJS;\n })\n .catch((err) => {\n chartJSLoadPromise = null;\n throw err;\n });\n }\n\n return chartJSLoadPromise;\n};\n\n/**\n * Check if Chart.js is available\n */\nexport async function isChartJSAvailable(): Promise<boolean> {\n try {\n await loadChartJS();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ChartJSRendererProps {\n /**\n * UIComponent with chart params\n */\n component: UIComponent;\n\n /**\n * Error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible';\n}\n\nconst ContextAwareChartLayout: Component<{\n render: (isExpanded: Accessor<boolean>) => JSX.Element;\n}> = (props) => props.render(useExpanded());\n\n/**\n * Native Chart.js renderer component\n *\n * @example\n * ```tsx\n * const chartComponent: UIComponent = {\n * id: 'revenue-chart',\n * type: 'chart',\n * position: { colStart: 1, colSpan: 6 },\n * params: {\n * type: 'bar',\n * title: 'Monthly Revenue',\n * data: {\n * labels: ['Jan', 'Feb', 'Mar'],\n * datasets: [{ label: 'Revenue', data: [100, 200, 150] }]\n * },\n * renderer: 'native',\n * },\n * }\n * <ChartJSRenderer component={chartComponent} />\n * ```\n */\nexport const ChartJSRenderer: Component<ChartJSRendererProps> = (props) => {\n const [isLoading, setIsLoading] = createSignal(true);\n const [error, setError] = createSignal<string>();\n const [activeView, setActiveView] = createSignal<'chart' | 'data'>('chart');\n let canvasRef: HTMLCanvasElement | undefined;\n let chartInstance: any;\n let renderVersion = 0;\n\n const params = () => props.component.params as ChartComponentParams;\n const telemetry = useTelemetry();\n const strings = useMCPUIStrings();\n // The accessible data table is a pure projection: its column headers come\n // from the chrome strings, injected rather than hardcoded in the helper.\n const tableData = createMemo(() =>\n chartToDataTable(params(), {\n series: strings.chartTableSeries,\n point: strings.chartTablePoint,\n label: strings.degradedColLabel,\n seriesName: strings.degradedSeries,\n })\n );\n const descriptionId = createUniqueId();\n const title = () => params().title || strings.chartView;\n\n // v6.1.0 — export visibility :\n // - undefined / true → button shown (new default, was opt-in)\n // - false → button hidden (explicit opt-out, unchanged)\n const exportEnabled = () => params().exportable !== false;\n\n // v6.1.0 — copy data for the ExpandableWrapper modal-header copy button.\n // Lazy-stringified each time the button is clicked.\n const copyDataJSON = () => JSON.stringify({ type: params().type, data: params().data }, null, 2);\n\n // Chart PNG export\n const handleExportPNG = () => {\n if (!canvasRef) return;\n const url = canvasRef.toDataURL('image/png');\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(params().title || 'chart').replace(/\\s+/g, '-').toLowerCase()}.png`;\n a.click();\n };\n\n // Create/update chart when params change\n createEffect(async () => {\n if (!canvasRef) return;\n\n // Access params to track dependencies\n const chartParams = params();\n const version = ++renderVersion;\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const Chart = await loadChartJS();\n\n // A newer prop update or an unmount superseded this async render.\n if (version !== renderVersion || !canvasRef) return;\n\n // Destroy previous instance\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n\n // Build options, merging time-axis config if present (v3.1.0)\n const baseOptions: any = {\n responsive: true,\n maintainAspectRatio: false,\n ...chartParams.options,\n plugins: {\n ...chartParams.options?.plugins,\n legend: {\n display: true,\n position: 'bottom',\n ...chartParams.options?.plugins?.legend,\n },\n },\n };\n\n // Time-series axis (v3.1.0)\n if (chartParams.timeAxis) {\n const ta = chartParams.timeAxis;\n baseOptions.scales = {\n ...baseOptions.scales,\n x: {\n ...baseOptions.scales?.x,\n type: 'time',\n time: {\n parser: ta.parser,\n unit: ta.unit,\n tooltipFormat: ta.tooltipFormat,\n },\n ...(ta.min ? { min: ta.min } : {}),\n ...(ta.max ? { max: ta.max } : {}),\n },\n };\n }\n\n // Create new chart\n chartInstance = new Chart(canvasRef, {\n type: chartParams.type,\n data: chartParams.data,\n options: baseOptions,\n });\n\n setIsLoading(false);\n } catch (err) {\n if (version !== renderVersion) return;\n const error = err instanceof Error ? err : new Error(strings.chartRenderError);\n setError(error.message);\n setIsLoading(false);\n // Fallback ladder (P2.5): record the failure so it's observable, then\n // degrade to the series table below instead of a blank canvas.\n telemetry?.dispatch({\n type: 'render:error',\n errorMessage: error.message,\n id: props.component?.id ?? '',\n componentType: 'chart',\n ts: Date.now(),\n });\n props.onError?.(error);\n }\n });\n\n // Chart.js may measure a zero-sized canvas while the data view is visible.\n // Resize once Solid has revealed it again.\n createEffect(() => {\n if (activeView() !== 'chart' || !chartInstance) return;\n queueMicrotask(() => chartInstance?.resize?.());\n });\n\n // Cleanup on unmount\n onCleanup(() => {\n renderVersion += 1;\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n });\n\n return (\n <ExpandableWrapper\n title={title()}\n copyData={copyDataJSON()}\n copyLabel={strings.chartCopy}\n toolbarVariant={props.toolbarVariant}\n >\n <ContextAwareChartLayout\n render={(isExpanded) => (\n <div\n class={`relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${\n isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''\n } ${params().className || ''}`}\n >\n <div class=\"flex items-center justify-between gap-3 mb-3 flex-shrink-0\">\n <div class=\"min-w-0\">\n <Show when={params().title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params().title}</h3>\n </Show>\n </div>\n <div class=\"flex items-center gap-2\">\n <div\n class=\"inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600\"\n role=\"group\"\n aria-label={strings.chartViewSelector}\n >\n <button\n type=\"button\"\n aria-pressed={activeView() === 'chart'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'chart'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('chart')}\n >\n {strings.chartView}\n </button>\n <button\n type=\"button\"\n aria-pressed={activeView() === 'data'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'data'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('data')}\n >\n {strings.chartDataView}\n </button>\n </div>\n <Show when={exportEnabled()}>\n <button\n type=\"button\"\n onClick={handleExportPNG}\n disabled={activeView() !== 'chart' || isLoading() || Boolean(error())}\n class=\"opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm\"\n title={strings.chartDownloadPng}\n aria-label={strings.chartDownloadPngAria}\n >\n <svg\n class=\"w-3 h-3 text-gray-500 dark:text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n </Show>\n </div>\n </div>\n\n <p id={descriptionId} class=\"sr-only\">\n {title()}. {strings.chartDataSummary}\n </p>\n\n {/* Fallback ladder (P2.5): degrade to a series table on render error\n instead of a bare \"Chart Error\" message. */}\n <Show when={error() && activeView() === 'chart'}>\n <DegradedFallback\n message={formatMCPUIString(strings.chartRenderFailed, { error: String(error()) })}\n caption={strings.chartDegradedCaption}\n {...tableData()}\n />\n </Show>\n\n <Show when={activeView() === 'data'}>\n <div\n class={`w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${\n isExpanded() ? 'flex-1 min-h-0' : ''\n }`}\n style={\n isExpanded()\n ? undefined\n : { height: params().height || '250px', 'max-height': '70vh' }\n }\n >\n <table class=\"w-full border-collapse text-left text-sm\">\n <caption class=\"sr-only\">\n {title()} — {strings.chartDataTable}\n </caption>\n <thead class=\"bg-gray-50 dark:bg-gray-900/40\">\n <tr>\n <For each={tableData().columns}>\n {(column) => (\n <th scope=\"col\" class=\"px-3 py-2 font-medium text-gray-900 dark:text-gray-100\">\n {column}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={tableData().rows}>\n {(row) => (\n <tr class=\"border-t border-gray-100 dark:border-gray-700\">\n <For each={tableData().columns}>\n {(_column, index) => (\n <td class=\"px-3 py-2 text-gray-700 dark:text-gray-300\">\n {String(row[index()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n <Show when={tableData().rows.length === 0}>\n <tr>\n <td\n colSpan={Math.max(1, tableData().columns.length)}\n class=\"px-3 py-6 text-center text-gray-500 dark:text-gray-400\"\n >\n {strings.chartNoData}\n </td>\n </tr>\n </Show>\n </tbody>\n </table>\n </div>\n </Show>\n\n <div\n class={`relative w-full ${isExpanded() ? 'flex-1 min-h-0' : ''}`}\n style={\n error() || activeView() === 'data'\n ? { display: 'none' }\n : isExpanded()\n ? { height: '100%', display: 'block' }\n : { height: params().height || '250px', display: 'block' }\n }\n >\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={title()}\n aria-describedby={descriptionId}\n aria-hidden={activeView() !== 'chart' || Boolean(error())}\n />\n <Show when={isLoading() && activeView() === 'chart'}>\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80\">\n <div class=\"flex flex-col items-center gap-2\">\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n <span class=\"text-sm text-gray-500 dark:text-gray-400\">{strings.chartLoading}</span>\n </div>\n </div>\n </Show>\n </div>\n </div>\n )}\n />\n </ExpandableWrapper>\n );\n};\n"],"names":["ChartJS","chartJSLoadPromise","loadChartJS","then","module","default","Chart","catch","err","isChartJSAvailable","ContextAwareChartLayout","props","render","useExpanded","ChartJSRenderer","isLoading","setIsLoading","createSignal","error","setError","activeView","setActiveView","canvasRef","chartInstance","renderVersion","params","component","telemetry","useTelemetry","strings","useMCPUIStrings","tableData","createMemo","chartToDataTable","series","chartTableSeries","point","chartTablePoint","label","degradedColLabel","seriesName","degradedSeries","descriptionId","createUniqueId","title","chartView","exportEnabled","exportable","copyDataJSON","JSON","stringify","type","data","handleExportPNG","url","toDataURL","a","document","createElement","href","download","replace","toLowerCase","click","createEffect","chartParams","version","undefined","destroy","baseOptions","responsive","maintainAspectRatio","options","plugins","legend","display","position","timeAxis","ta","scales","x","time","parser","unit","tooltipFormat","min","max","Error","chartRenderError","message","dispatch","errorMessage","id","componentType","ts","Date","now","onError","queueMicrotask","resize","onCleanup","_$createComponent","ExpandableWrapper","copyData","copyLabel","chartCopy","toolbarVariant","children","isExpanded","_el$","_$getNextElement","_tmpl$6","_el$2","firstChild","_el$3","_el$5","nextSibling","_el$6","_el$7","_el$8","_el$0","_el$1","_co$","_$getNextMarker","_el$10","_el$12","_el$13","_co$2","_el$11","_el$14","_el$15","_co$3","_el$41","_el$42","_co$9","_el$43","_el$44","_co$0","_el$33","_el$34","_el$39","_el$40","_co$8","_$insert","Show","when","_el$4","_tmpl$","$$click","chartDataView","_el$9","_tmpl$2","_$effect","_p$","_v$","Boolean","_v$2","chartDownloadPng","_v$3","chartDownloadPngAria","e","_$setProperty","t","_$setAttribute","_$runHydrationEvents","chartDataSummary","_$memo","DegradedFallback","_$mergeProps","formatMCPUIString","chartRenderFailed","String","caption","chartDegradedCaption","_el$16","_tmpl$4","_el$17","_el$18","_el$20","_el$21","_co$4","_el$19","_el$22","_el$23","_co$5","_el$24","_el$25","_el$26","_el$29","_el$30","_co$6","_el$31","_el$32","_co$7","chartDataTable","For","each","columns","column","_el$45","_tmpl$7","rows","row","_el$46","_tmpl$8","_column","index","_el$47","_tmpl$9","length","_el$27","_tmpl$3","_el$28","chartNoData","Math","_v$4","_v$5","height","_$className","_$style","_ref$","_$use","_el$35","_tmpl$5","_el$36","_el$37","_el$38","chartLoading","_v$6","className","_v$7","chartViewSelector","_v$8","_v$9","_v$0","_v$1","_v$10","_v$11","_v$12","_v$13","o","i","n","s","h","r","d","_$delegateEvents"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAIA,UAAe;AACnB,IAAIC,qBAA0C;AAE9C,MAAMC,cAAc,YAAY;AAC9B,MAAIF,QAAS,QAAOA;AAEpB,MAAI,CAACC,oBAAoB;AACvBA,yBAAqB,OAAO,eAAe,EACxCE,KAAMC,CAAAA,YAAW;AAChBJ,gBAAUI,QAAOC,WAAWD,QAAOE;AACnC,aAAON;AAAAA,IACT,CAAC,EACAO,MAAOC,CAAAA,QAAQ;AACdP,2BAAqB;AACrB,YAAMO;AAAAA,IACR,CAAC;AAAA,EACL;AAEA,SAAOP;AACT;AAKA,eAAsBQ,qBAAuC;AAC3D,MAAI;AACF,UAAMP,YAAAA;AACN,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAoBA,MAAMQ,0BAEAC,CAAAA,UAAUA,MAAMC,OAAOC,kBAAAA,aAAa;AAwBnC,MAAMC,kBAAoDH,CAAAA,UAAU;AACzE,QAAM,CAACI,WAAWC,YAAY,IAAIC,QAAAA,aAAa,IAAI;AACnD,QAAM,CAACC,OAAOC,QAAQ,IAAIF,qBAAAA;AAC1B,QAAM,CAACG,YAAYC,aAAa,IAAIJ,QAAAA,aAA+B,OAAO;AAC1E,MAAIK;AACJ,MAAIC;AACJ,MAAIC,gBAAgB;AAEpB,QAAMC,SAASA,MAAMd,MAAMe,UAAUD;AACrC,QAAME,YAAYC,sBAAAA,aAAAA;AAClB,QAAMC,UAAUC,oBAAAA,gBAAAA;AAGhB,QAAMC,YAAYC,QAAAA,WAAW,MAC3BC,eAAAA,iBAAiBR,UAAU;AAAA,IACzBS,QAAQL,QAAQM;AAAAA,IAChBC,OAAOP,QAAQQ;AAAAA,IACfC,OAAOT,QAAQU;AAAAA,IACfC,YAAYX,QAAQY;AAAAA,EAAAA,CACrB,CACH;AACA,QAAMC,gBAAgBC,QAAAA,eAAAA;AACtB,QAAMC,QAAQA,MAAMnB,OAAAA,EAASmB,SAASf,QAAQgB;AAK9C,QAAMC,gBAAgBA,MAAMrB,OAAAA,EAASsB,eAAe;AAIpD,QAAMC,eAAeA,MAAMC,KAAKC,UAAU;AAAA,IAAEC,MAAM1B,SAAS0B;AAAAA,IAAMC,MAAM3B,SAAS2B;AAAAA,EAAAA,GAAQ,MAAM,CAAC;AAG/F,QAAMC,kBAAkBA,MAAM;AAC5B,QAAI,CAAC/B,UAAW;AAChB,UAAMgC,MAAMhC,UAAUiC,UAAU,WAAW;AAC3C,UAAMC,IAAIC,SAASC,cAAc,GAAG;AACpCF,MAAEG,OAAOL;AACTE,MAAEI,WAAW,IAAInC,OAAAA,EAASmB,SAAS,SAASiB,QAAQ,QAAQ,GAAG,EAAEC,YAAAA,CAAa;AAC9EN,MAAEO,MAAAA;AAAAA,EACJ;AAGAC,UAAAA,aAAa,YAAY;;AACvB,QAAI,CAAC1C,UAAW;AAGhB,UAAM2C,cAAcxC,OAAAA;AACpB,UAAMyC,UAAU,EAAE1C;AAElBR,iBAAa,IAAI;AACjBG,aAASgD,MAAS;AAElB,QAAI;AACF,YAAM7D,QAAQ,MAAMJ,YAAAA;AAGpB,UAAIgE,YAAY1C,iBAAiB,CAACF,UAAW;AAG7C,UAAIC,eAAe;AACjBA,sBAAc6C,QAAAA;AACd7C,wBAAgB;AAAA,MAClB;AAGA,YAAM8C,cAAmB;AAAA,QACvBC,YAAY;AAAA,QACZC,qBAAqB;AAAA,QACrB,GAAGN,YAAYO;AAAAA,QACfC,SAAS;AAAA,UACP,IAAGR,iBAAYO,YAAZP,mBAAqBQ;AAAAA,UACxBC,QAAQ;AAAA,YACNC,SAAS;AAAA,YACTC,UAAU;AAAA,YACV,IAAGX,uBAAYO,YAAZP,mBAAqBQ,YAArBR,mBAA8BS;AAAAA,UAAAA;AAAAA,QACnC;AAAA,MACF;AAIF,UAAIT,YAAYY,UAAU;AACxB,cAAMC,KAAKb,YAAYY;AACvBR,oBAAYU,SAAS;AAAA,UACnB,GAAGV,YAAYU;AAAAA,UACfC,GAAG;AAAA,YACD,IAAGX,iBAAYU,WAAZV,mBAAoBW;AAAAA,YACvB7B,MAAM;AAAA,YACN8B,MAAM;AAAA,cACJC,QAAQJ,GAAGI;AAAAA,cACXC,MAAML,GAAGK;AAAAA,cACTC,eAAeN,GAAGM;AAAAA,YAAAA;AAAAA,YAEpB,GAAIN,GAAGO,MAAM;AAAA,cAAEA,KAAKP,GAAGO;AAAAA,YAAAA,IAAQ,CAAA;AAAA,YAC/B,GAAIP,GAAGQ,MAAM;AAAA,cAAEA,KAAKR,GAAGQ;AAAAA,YAAAA,IAAQ,CAAA;AAAA,UAAC;AAAA,QAClC;AAAA,MAEJ;AAGA/D,sBAAgB,IAAIjB,MAAMgB,WAAW;AAAA,QACnC6B,MAAMc,YAAYd;AAAAA,QAClBC,MAAMa,YAAYb;AAAAA,QAClBoB,SAASH;AAAAA,MAAAA,CACV;AAEDrD,mBAAa,KAAK;AAAA,IACpB,SAASR,KAAK;AACZ,UAAI0D,YAAY1C,cAAe;AAC/B,YAAMN,SAAQV,eAAe+E,QAAQ/E,MAAM,IAAI+E,MAAM1D,QAAQ2D,gBAAgB;AAC7ErE,eAASD,OAAMuE,OAAO;AACtBzE,mBAAa,KAAK;AAGlBW,6CAAW+D,SAAS;AAAA,QAClBvC,MAAM;AAAA,QACNwC,cAAczE,OAAMuE;AAAAA,QACpBG,MAAIjF,WAAMe,cAANf,mBAAiBiF,OAAM;AAAA,QAC3BC,eAAe;AAAA,QACfC,IAAIC,KAAKC,IAAAA;AAAAA,MAAI;AAEfrF,kBAAMsF,YAANtF,+BAAgBO;AAAAA,IAClB;AAAA,EACF,CAAC;AAID8C,UAAAA,aAAa,MAAM;AACjB,QAAI5C,WAAAA,MAAiB,WAAW,CAACG,cAAe;AAChD2E,mBAAe,MAAA;;AAAM3E,kEAAe4E,WAAf5E;AAAAA,KAAyB;AAAA,EAChD,CAAC;AAGD6E,UAAAA,UAAU,MAAM;AACd5E,qBAAiB;AACjB,QAAID,eAAe;AACjBA,oBAAc6C,QAAAA;AACd7C,sBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,SAAA8E,IAAAA,gBACGC,kBAAAA,mBAAiB;AAAA,IAAA,IAChB1D,QAAK;AAAA,aAAEA,MAAAA;AAAAA,IAAO;AAAA,IAAA,IACd2D,WAAQ;AAAA,aAAEvD,aAAAA;AAAAA,IAAc;AAAA,IAAA,IACxBwD,YAAS;AAAA,aAAE3E,QAAQ4E;AAAAA,IAAS;AAAA,IAAA,IAC5BC,iBAAc;AAAA,aAAE/F,MAAM+F;AAAAA,IAAc;AAAA,IAAA,IAAAC,WAAA;AAAA,aAAAN,IAAAA,gBAEnC3F,yBAAuB;AAAA,QACtBE,QAASgG,iBAAU,MAAA;AAAA,cAAAC,OAAAC,mBAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAF,YAAAK,QAAAD,MAAAJ,YAAAM,QAAAD,MAAAF,aAAAI,QAAAH,MAAAD,aAAA,CAAAK,OAAAC,IAAA,IAAAC,IAAAA,cAAAH,MAAAJ,WAAA,GAAAQ,SAAAZ,MAAAI,aAAAS,SAAAD,OAAAX,YAAA,CAAAa,QAAAC,KAAA,IAAAJ,kBAAAE,OAAAT,WAAA,GAAAY,SAAAF,OAAAV,aAAAa,SAAAD,OAAAZ,aAAA,CAAAc,QAAAC,KAAA,IAAAR,IAAAA,cAAAM,OAAAb,WAAA,GAAAgB,SAAAR,OAAAR,aAAA,CAAAiB,QAAAC,KAAA,IAAAX,IAAAA,cAAAS,OAAAhB,WAAA,GAAAmB,SAAAF,OAAAjB,aAAA,CAAAoB,QAAAC,KAAA,IAAAd,kBAAAY,OAAAnB,WAAA,GAAAsB,SAAAF,OAAApB,aAAAuB,SAAAD,OAAAzB,YAAA2B,SAAAD,OAAAvB,aAAA,CAAAyB,QAAAC,KAAA,IAAAnB,IAAAA,cAAAiB,OAAAxB,WAAA;AAAA2B,qBAAA7B,OAAAb,IAAAA,gBAQd2C,cAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAExH,SAASmB;AAAAA,YAAK;AAAA,YAAA,IAAA+D,WAAA;AAAA,kBAAAuC,QAAApC,IAAAA,eAAAqC,MAAA;AAAAJ,kBAAAA,OAAAG,OAAA,MACyCzH,OAAAA,EAASmB,KAAK;AAAA,qBAAAsG;AAAAA,YAAA;AAAA,UAAA,CAAA,CAAA;AAAA5B,gBAAA8B,UAiBpE,MAAM/H,cAAc,OAAO;AAAC0H,cAAAA,OAAAzB,OAAA,MAEpCzF,QAAQgB,SAAS;AAAA0E,gBAAA6B,UAUT,MAAM/H,cAAc,MAAM;AAAC0H,cAAAA,OAAAxB,OAAA,MAEnC1F,QAAQwH,aAAa;AAAAN,qBAAA5B,OAAAd,IAAAA,gBAGzB2C,cAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEnG,cAAAA;AAAAA,YAAe;AAAA,YAAA,IAAA6D,WAAA;AAAA,kBAAA2C,QAAAxC,IAAAA,eAAAyC,OAAA;AAAAD,oBAAAF,UAGd/F;AAAemG,kBAAAA,OAAAC,CAAAA,QAAA;AAAA,oBAAAC,MACdtI,WAAAA,MAAiB,WAAWL,eAAe4I,QAAQzI,MAAAA,CAAO,GAAC0I,OAE9D/H,QAAQgI,kBAAgBC,OACnBjI,QAAQkI;AAAoBL,wBAAAD,IAAAO,KAAAC,IAAAA,YAAAX,OAAA,YAAAG,IAAAO,IAAAN,GAAA;AAAAE,yBAAAH,IAAAS,KAAAC,IAAAA,aAAAb,OAAA,SAAAG,IAAAS,IAAAN,IAAA;AAAAE,yBAAAL,IAAAjG,KAAA2G,IAAAA,aAAAb,OAAA,cAAAG,IAAAjG,IAAAsG,IAAA;AAAA,uBAAAL;AAAAA,cAAA,GAAA;AAAA,gBAAAO,GAAA7F;AAAAA,gBAAA+F,GAAA/F;AAAAA,gBAAAX,GAAAW;AAAAA,cAAAA,CAAA;AAAAiG,qCAAAA;AAAA,qBAAAd;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAA7B,OAAAC,IAAA;AAAAyC,2BAAAvC,QAAA,MAoBzClF,aAAa;AAAAqG,cAAAA,OAAAnB,QACjBhF,OAAKkF,QAAAC,KAAA;AAAAgB,cAAAA,OAAAnB,QAAA,MAAM/F,QAAQwI,kBAAgBnC,QAAAC,KAAA;AAAAY,qBAAAlC,MAAAR,IAAAA,gBAKrC2C,cAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEqB,IAAAA,KAAA,MAAA,CAAA,CAAApJ,OAAO,EAAA,KAAIE,WAAAA,MAAiB;AAAA,YAAO;AAAA,YAAA,IAAAuF,WAAA;AAAA,qBAAAN,IAAAA,gBAC5CkE,iBAAAA,kBAAgBC,eAAA;AAAA,gBAAA,IACf/E,UAAO;AAAA,yBAAEgF,aAAAA,kBAAkB5I,QAAQ6I,mBAAmB;AAAA,oBAAExJ,OAAOyJ,OAAOzJ,MAAAA,CAAO;AAAA,kBAAA,CAAG;AAAA,gBAAC;AAAA,gBAAA,IACjF0J,UAAO;AAAA,yBAAE/I,QAAQgJ;AAAAA,gBAAoB;AAAA,cAAA,GACjC9I,SAAS,CAAA;AAAA,YAAA;AAAA,UAAA,CAAA,GAAAsG,QAAAC,KAAA;AAAAS,qBAAAlC,MAAAR,IAAAA,gBAIhB2C,cAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAE7H,iBAAiB;AAAA,YAAM;AAAA,YAAA,IAAAuF,WAAA;AAAA,kBAAAmE,SAAAhE,IAAAA,eAAAiE,OAAA,GAAAC,SAAAF,OAAA7D,YAAAgE,SAAAD,OAAA/D,YAAAiE,SAAAD,OAAAhE,YAAA,CAAAkE,QAAAC,KAAA,IAAAzD,IAAAA,cAAAuD,OAAA9D,WAAA,GAAAiE,SAAAF,OAAA/D,aAAAkE,SAAAD,OAAAjE,aAAA,CAAAmE,QAAAC,KAAA,IAAA7D,IAAAA,cAAA2D,OAAAlE,WAAA,GAAAqE,SAAAR,OAAA7D,aAAAsE,SAAAD,OAAAxE,YAAA0E,SAAAF,OAAArE,aAAAwE,SAAAD,OAAA1E,YAAA,CAAA4E,QAAAC,KAAA,IAAAnE,IAAAA,cAAAiE,OAAAxE,WAAA,GAAA2E,SAAAF,OAAAzE,aAAA,CAAA4E,QAAAC,KAAA,IAAAtE,IAAAA,cAAAoE,OAAA3E,WAAA;AAAA2B,kBAAAA,OAAAkC,QAa1BrI,OAAKuI,QAAAC,KAAA;AAAArC,kBAAAA,OAAAkC,QAAA,MAAOpJ,QAAQqK,gBAAcX,QAAAC,KAAA;AAAAzC,yBAAA2C,QAAArF,IAAAA,gBAIhC8F,aAAG;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAErK,YAAYsK;AAAAA,gBAAO;AAAA,gBAAA1F,UAC1B2F,aAAM,MAAA;AAAA,sBAAAC,SAAAzF,IAAAA,eAAA0F,OAAA;AAAAzD,sBAAAA,OAAAwD,QAEHD,MAAM;AAAA,yBAAAC;AAAAA,gBAAA,GAAA;AAAA,cAAA,CAEV,CAAA;AAAAxD,yBAAA4C,QAAAtF,IAAAA,gBAKJ8F,aAAG;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAErK,YAAY0K;AAAAA,gBAAI;AAAA,gBAAA9F,UACvB+F,UAAG,MAAA;AAAA,sBAAAC,SAAA7F,IAAAA,eAAA8F,OAAA;AAAA7D,6BAAA4D,QAAAtG,IAAAA,gBAEA8F,aAAG;AAAA,oBAAA,IAACC,OAAI;AAAA,6BAAErK,YAAYsK;AAAAA,oBAAO;AAAA,oBAAA1F,UAC3BA,CAACkG,SAASC,WAAK,MAAA;AAAA,0BAAAC,SAAAjG,IAAAA,eAAAkG,OAAA;AAAAjE,0BAAAA,OAAAgE,QAAA,MAEXpC,OAAO+B,IAAII,OAAO,KAAK,EAAE,CAAC;AAAA,6BAAAC;AAAAA,oBAAA,GAAA;AAAA,kBAAA,CAE9B,CAAA;AAAA,yBAAAJ;AAAAA,gBAAA,GAAA;AAAA,cAAA,CAGN,GAAAd,QAAAC,KAAA;AAAA/C,yBAAA4C,QAAAtF,IAAAA,gBAEF2C,cAAI;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAElH,UAAAA,EAAY0K,KAAKQ,WAAW;AAAA,gBAAC;AAAA,gBAAA,IAAAtG,WAAA;AAAA,sBAAAuG,SAAApG,IAAAA,eAAAqG,OAAA,GAAAC,SAAAF,OAAAjG;AAAA8B,sBAAAA,OAAAqE,QAAA,MAMlCvL,QAAQwL,WAAW;AAAA7D,sBAAAA,aAAAW,IAAAA,aAAAiD,QAAA,WAHXE,KAAKhI,IAAI,GAAGvD,UAAAA,EAAYsK,QAAQY,MAAM,CAAC,CAAA;AAAA,yBAAAC;AAAAA,gBAAA;AAAA,cAAA,CAAA,GAAAlB,QAAAC,KAAA;AAAAzC,kBAAAA,OAAAC,CAAAA,QAAA;AAAA,oBAAA8D,OAzCnD,4EACL3G,eAAe,mBAAmB,EAAE,IACpC4G,OAEA5G,WAAAA,IACIzC,SACA;AAAA,kBAAEsJ,QAAQhM,SAASgM,UAAU;AAAA,kBAAS,cAAc;AAAA,gBAAA;AAAQF,yBAAA9D,IAAAO,KAAA0D,IAAAA,UAAA5C,QAAArB,IAAAO,IAAAuD,IAAA;AAAA9D,oBAAAS,IAAAyD,IAAAA,MAAA7C,QAAA0C,MAAA/D,IAAAS,CAAA;AAAA,uBAAAT;AAAAA,cAAA,GAAA;AAAA,gBAAAO,GAAA7F;AAAAA,gBAAA+F,GAAA/F;AAAAA,cAAAA,CAAA;AAAA,qBAAA2G;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAAtC,QAAAC,KAAA;AAAA,cAAAmF,QA0D7DtM;AAAS,iBAAAsM,UAAA,aAAAC,IAAAA,IAAAD,OAAAjF,MAAA,IAATrH,YAASqH;AAAAwB,2BAAAxB,QAAA,oBAGIjG,aAAa;AAAAqG,qBAAAL,QAAArC,IAAAA,gBAGhC2C,cAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEqB,IAAAA,KAAA,MAAA,CAAA,CAAAvJ,WAAW,EAAA,KAAIK,WAAAA,MAAiB;AAAA,YAAO;AAAA,YAAA,IAAAuF,WAAA;AAAA,kBAAAmH,SAAAhH,IAAAA,eAAAiH,OAAA,GAAAC,SAAAF,OAAA7G,YAAAgH,SAAAD,OAAA/G,YAAAiH,SAAAD,OAAA7G;AAAA2B,kBAAAA,OAAAmF,QAAA,MAIWrM,QAAQsM,YAAY;AAAA,qBAAAL;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAAjF,QAAAC,KAAA;AAAAU,cAAAA,OAAAC,CAAAA,QAAA;AAAA,gBAAA2E,OA9JzE,wIACLxH,eAAe,iCAAiC,EAAE,IAChDnF,SAAS4M,aAAa,EAAE,IAAEC,OAYhBzM,QAAQ0M,mBAAiBC,OAIrBpN,WAAAA,MAAiB,SAAOqN,OAC/B,2DACLrN,WAAAA,MAAiB,UACb,+DACA,2EAA2E,IAC/EsN,OAOYtN,WAAAA,MAAiB,QAAMuN,OAC9B,2DACLvN,WAAAA,MAAiB,SACb,+DACA,2EAA2E,IAC/EwN,QAuGD,mBAAmBhI,WAAAA,IAAe,mBAAmB,EAAE,IAAEiI,QAE9D3N,MAAAA,KAAWE,WAAAA,MAAiB,SACxB;AAAA,cAAEuD,SAAS;AAAA,YAAA,IACXiC,eACE;AAAA,cAAE6G,QAAQ;AAAA,cAAQ9I,SAAS;AAAA,YAAA,IAC3B;AAAA,cAAE8I,QAAQhM,SAASgM,UAAU;AAAA,cAAS9I,SAAS;AAAA,YAAA,GAASmK,QAMlDlM,MAAAA,GAAOmM,QAEN3N,iBAAiB,WAAWuI,QAAQzI,OAAO;AAACkN,qBAAA3E,IAAAO,KAAA0D,IAAAA,UAAA7G,MAAA4C,IAAAO,IAAAoE,IAAA;AAAAE,qBAAA7E,IAAAS,KAAAC,IAAAA,aAAA9C,OAAA,cAAAoC,IAAAS,IAAAoE,IAAA;AAAAE,qBAAA/E,IAAAjG,KAAA2G,IAAAA,aAAA7C,OAAA,gBAAAmC,IAAAjG,IAAAgL,IAAA;AAAAC,qBAAAhF,IAAAuF,KAAAtB,IAAAA,UAAApG,OAAAmC,IAAAuF,IAAAP,IAAA;AAAAC,qBAAAjF,IAAAwF,KAAA9E,IAAAA,aAAA5C,OAAA,gBAAAkC,IAAAwF,IAAAP,IAAA;AAAAC,qBAAAlF,IAAAyF,KAAAxB,IAAAA,UAAAnG,OAAAkC,IAAAyF,IAAAP,IAAA;AAAAC,sBAAAnF,IAAA0F,KAAAzB,IAAAA,UAAAhF,QAAAe,IAAA0F,IAAAP,KAAA;AAAAnF,gBAAA2F,IAAAzB,IAAAA,MAAAjF,QAAAmG,OAAApF,IAAA2F,CAAA;AAAAN,sBAAArF,IAAA4F,KAAAlF,IAAAA,aAAAxB,QAAA,cAAAc,IAAA4F,IAAAP,KAAA;AAAAC,sBAAAtF,IAAA6F,KAAAnF,IAAAA,aAAAxB,QAAA,eAAAc,IAAA6F,IAAAP,KAAA;AAAA,mBAAAtF;AAAAA,UAAA,GAAA;AAAA,YAAAO,GAAA7F;AAAAA,YAAA+F,GAAA/F;AAAAA,YAAAX,GAAAW;AAAAA,YAAA6K,GAAA7K;AAAAA,YAAA8K,GAAA9K;AAAAA,YAAA+K,GAAA/K;AAAAA,YAAAgL,GAAAhL;AAAAA,YAAAiL,GAAAjL;AAAAA,YAAAkL,GAAAlL;AAAAA,YAAAmL,GAAAnL;AAAAA,UAAAA,CAAA;AAAAiG,iCAAAA;AAAA,iBAAAvD;AAAAA,QAAA,GAAA;AAAA,MAAA,CAY5D;AAAA,IAAA;AAAA,EAAA,CAAA;AAIT;AAAE0I,IAAAA,eAAA,CAAA,OAAA,CAAA;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartJSRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ChartJSRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,SAAS,EAQV,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,UAAU,CAAC;AA6BlE;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,SAAS,EAAE,WAAW,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;CAC7C;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"ChartJSRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ChartJSRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,SAAS,EAQV,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,UAAU,CAAC;AA6BlE;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,SAAS,EAAE,WAAW,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;CAC7C;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,oBAAoB,CAgU3D,CAAC"}
|