@seed-ship/mcp-ui-solid 6.19.1 → 6.20.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 +519 -0
- package/README.md +791 -1
- 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/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 +456 -363
- 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 +458 -365
- 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 +10 -5
- package/dist/components/VideoRenderer.cjs.map +1 -1
- package/dist/components/VideoRenderer.d.ts.map +1 -1
- package/dist/components/VideoRenderer.js +10 -5
- 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/MCPUIStringsContext.cjs +285 -2
- package/dist/context/MCPUIStringsContext.cjs.map +1 -1
- package/dist/context/MCPUIStringsContext.d.ts +600 -3
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
- package/dist/context/MCPUIStringsContext.js +285 -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 +23 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/dist/services/validation.cjs +41 -16
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts +47 -2
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +41 -16
- 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/validation.cjs +3 -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 +4 -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/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 +145 -63
- package/src/components/VerifiedText.tsx +19 -9
- package/src/components/VideoRenderer.tsx +6 -4
- package/src/components/chart-data-table.ts +68 -14
- package/src/context/MCPActionContext.tsx +4 -1
- package/src/context/MCPUIStringsContext.tsx +1004 -1
- package/src/hooks/index.ts +2 -1
- package/src/hooks/useStreamingUI.ts +64 -10
- package/src/index.ts +23 -0
- package/src/services/validation.ts +93 -16
- package/src/utils/degraded-projections.ts +75 -12
- package/src/utils/format-string.ts +33 -0
- package/src/validation.ts +5 -0
|
@@ -3,8 +3,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const solidJs = require("solid-js");
|
|
5
5
|
const safeUrl = require("../utils/safe-url.cjs");
|
|
6
|
-
|
|
6
|
+
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
7
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<button class="absolute left-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors"><svg class="w-8 h-8"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">`), _tmpl$2 = /* @__PURE__ */ web.template(`<button class="absolute right-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors"><svg class="w-8 h-8"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">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div class="absolute bottom-16 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-lg max-w-[80vw] text-center">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class="fixed inset-0 z-50 bg-black/90 flex items-center justify-center"role=dialog aria-modal=true><button class="absolute top-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors"><svg class="w-8 h-8"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M6 18L18 6M6 6l12 12"></path></svg></button><!$><!/><!$><!/><img class="max-w-[90vw] max-h-[90vh] object-contain"><!$><!/><div class="absolute top-4 left-4 text-white/80 bg-black/40 px-3 py-1 rounded-full text-sm"><!$><!/> / <!$><!/>`);
|
|
7
8
|
const LightboxOverlay = (props) => {
|
|
9
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
8
10
|
const isOpen = () => props.selectedIndex !== null;
|
|
9
11
|
const currentImage = () => props.selectedIndex !== null ? props.images[props.selectedIndex] : null;
|
|
10
12
|
const canGoPrev = () => props.selectedIndex !== null && props.selectedIndex > 0;
|
|
@@ -61,6 +63,7 @@ const LightboxOverlay = (props) => {
|
|
|
61
63
|
e.stopPropagation();
|
|
62
64
|
handlePrev();
|
|
63
65
|
};
|
|
66
|
+
web.effect(() => web.setAttribute(_el$3, "aria-label", strings.lightboxPrevious));
|
|
64
67
|
web.runHydrationEvents();
|
|
65
68
|
return _el$3;
|
|
66
69
|
}
|
|
@@ -75,6 +78,7 @@ const LightboxOverlay = (props) => {
|
|
|
75
78
|
e.stopPropagation();
|
|
76
79
|
handleNext();
|
|
77
80
|
};
|
|
81
|
+
web.effect(() => web.setAttribute(_el$4, "aria-label", strings.lightboxNext));
|
|
78
82
|
web.runHydrationEvents();
|
|
79
83
|
return _el$4;
|
|
80
84
|
}
|
|
@@ -95,19 +99,23 @@ const LightboxOverlay = (props) => {
|
|
|
95
99
|
web.insert(_el$7, () => props.images.length, _el$10, _co$2);
|
|
96
100
|
web.effect((_p$) => {
|
|
97
101
|
var _a, _b, _c, _d;
|
|
98
|
-
var _v$ = safeUrl.safeUrl(((_a = currentImage()) == null ? void 0 : _a.url) ?? "", {
|
|
102
|
+
var _v$ = strings.lightboxLabel, _v$2 = strings.lightboxClose, _v$3 = safeUrl.safeUrl(((_a = currentImage()) == null ? void 0 : _a.url) ?? "", {
|
|
99
103
|
allowDataImage: true
|
|
100
|
-
}), _v$
|
|
101
|
-
_v$ !== _p$.e && web.setAttribute(_el
|
|
102
|
-
_v$2 !== _p$.t && web.setAttribute(_el$
|
|
103
|
-
_v$3 !== _p$.a && web.setAttribute(_el$5, "
|
|
104
|
-
_v$4 !== _p$.o && web.setAttribute(_el$5, "
|
|
104
|
+
}), _v$4 = ((_b = currentImage()) == null ? void 0 : _b.alt) || "", _v$5 = (_c = currentImage()) == null ? void 0 : _c.srcset, _v$6 = (_d = currentImage()) == null ? void 0 : _d.sizes;
|
|
105
|
+
_v$ !== _p$.e && web.setAttribute(_el$, "aria-label", _p$.e = _v$);
|
|
106
|
+
_v$2 !== _p$.t && web.setAttribute(_el$2, "aria-label", _p$.t = _v$2);
|
|
107
|
+
_v$3 !== _p$.a && web.setAttribute(_el$5, "src", _p$.a = _v$3);
|
|
108
|
+
_v$4 !== _p$.o && web.setAttribute(_el$5, "alt", _p$.o = _v$4);
|
|
109
|
+
_v$5 !== _p$.i && web.setAttribute(_el$5, "srcset", _p$.i = _v$5);
|
|
110
|
+
_v$6 !== _p$.n && web.setAttribute(_el$5, "sizes", _p$.n = _v$6);
|
|
105
111
|
return _p$;
|
|
106
112
|
}, {
|
|
107
113
|
e: void 0,
|
|
108
114
|
t: void 0,
|
|
109
115
|
a: void 0,
|
|
110
|
-
o: void 0
|
|
116
|
+
o: void 0,
|
|
117
|
+
i: void 0,
|
|
118
|
+
n: void 0
|
|
111
119
|
});
|
|
112
120
|
web.runHydrationEvents();
|
|
113
121
|
return _el$;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightboxOverlay.cjs","sources":["../../src/components/LightboxOverlay.tsx"],"sourcesContent":["/**\n * LightboxOverlay - Fullscreen image viewer\n * Sprint 5: Media Components\n */\n\nimport { Component, Show, createEffect, onCleanup } from 'solid-js'\nimport { Portal } from 'solid-js/web'\nimport type { GalleryImage } from '../types'\nimport { safeUrl } from '../utils/safe-url'\n\nexport interface LightboxOverlayProps {\n /**\n * Array of images to navigate through\n */\n images: GalleryImage[]\n\n /**\n * Currently selected image index (null when closed)\n */\n selectedIndex: number | null\n\n /**\n * Callback when lightbox should close\n */\n onClose: () => void\n\n /**\n * Callback when navigating to a different image\n */\n onNavigate: (index: number) => void\n}\n\nexport const LightboxOverlay: Component<LightboxOverlayProps> = (props) => {\n const isOpen = () => props.selectedIndex !== null\n const currentImage = () =>\n props.selectedIndex !== null ? props.images[props.selectedIndex] : null\n const canGoPrev = () => props.selectedIndex !== null && props.selectedIndex > 0\n const canGoNext = () =>\n props.selectedIndex !== null && props.selectedIndex < props.images.length - 1\n\n const handlePrev = () => {\n if (canGoPrev()) {\n props.onNavigate(props.selectedIndex! - 1)\n }\n }\n\n const handleNext = () => {\n if (canGoNext()) {\n props.onNavigate(props.selectedIndex! + 1)\n }\n }\n\n // Keyboard navigation\n createEffect(() => {\n if (!isOpen()) return\n\n const handleKeydown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n props.onClose()\n break\n case 'ArrowLeft':\n handlePrev()\n break\n case 'ArrowRight':\n handleNext()\n break\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n document.body.style.overflow = 'hidden'\n\n onCleanup(() => {\n document.removeEventListener('keydown', handleKeydown)\n document.body.style.overflow = ''\n })\n })\n\n return (\n <Show when={isOpen()}>\n <Portal>\n <div\n class=\"fixed inset-0 z-50 bg-black/90 flex items-center justify-center\"\n onClick={props.onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Image lightbox\"\n >\n {/* Close button */}\n <button\n class=\"absolute top-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={props.onClose}\n aria-label=\"Close lightbox\"\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* Previous button */}\n <Show when={canGoPrev()}>\n <button\n class=\"absolute left-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handlePrev()\n }}\n aria-label=\"Previous image\"\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Next button */}\n <Show when={canGoNext()}>\n <button\n class=\"absolute right-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handleNext()\n }}\n aria-label=\"Next image\"\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Image */}\n <img\n src={safeUrl(currentImage()?.url ?? '', { allowDataImage: true })}\n alt={currentImage()?.alt || ''}\n srcset={currentImage()?.srcset}\n sizes={currentImage()?.sizes}\n class=\"max-w-[90vw] max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n\n {/* Caption */}\n <Show when={currentImage()?.caption}>\n <div class=\"absolute bottom-16 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-lg max-w-[80vw] text-center\">\n {currentImage()!.caption}\n </div>\n </Show>\n\n {/* Counter */}\n <div class=\"absolute top-4 left-4 text-white/80 bg-black/40 px-3 py-1 rounded-full text-sm\">\n {(props.selectedIndex ?? 0) + 1} / {props.images.length}\n </div>\n </div>\n </Portal>\n </Show>\n )\n}\n"],"names":["LightboxOverlay","props","isOpen","selectedIndex","currentImage","images","canGoPrev","canGoNext","length","handlePrev","onNavigate","handleNext","createEffect","handleKeydown","e","key","onClose","document","addEventListener","body","style","overflow","onCleanup","removeEventListener","_$createComponent","Show","when","children","Portal","_el$","_$getNextElement","_tmpl$4","_el$2","firstChild","_el$11","nextSibling","_el$12","_co$3","_$getNextMarker","_el$13","_el$14","_co$4","_el$5","_el$15","_el$16","_co$5","_el$7","_el$9","_el$0","_co$","_el$8","_el$1","_el$10","_co$2","_$addEventListener","_$insert","_el$3","_tmpl$","$$click","stopPropagation","_$runHydrationEvents","_el$4","_tmpl$2","caption","_el$6","_tmpl$3","_$effect","_p$","_v$","safeUrl","url","allowDataImage","_v$2","alt","_v$3","srcset","_v$4","sizes","_$setAttribute","t","a","o","undefined","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LightboxOverlay.cjs","sources":["../../src/components/LightboxOverlay.tsx"],"sourcesContent":["/**\n * LightboxOverlay - Fullscreen image viewer\n * Sprint 5: Media Components\n */\n\nimport { Component, Show, createEffect, onCleanup } from 'solid-js'\nimport { Portal } from 'solid-js/web'\nimport type { GalleryImage } from '../types'\nimport { safeUrl } from '../utils/safe-url'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface LightboxOverlayProps {\n /**\n * Array of images to navigate through\n */\n images: GalleryImage[]\n\n /**\n * Currently selected image index (null when closed)\n */\n selectedIndex: number | null\n\n /**\n * Callback when lightbox should close\n */\n onClose: () => void\n\n /**\n * Callback when navigating to a different image\n */\n onNavigate: (index: number) => void\n}\n\nexport const LightboxOverlay: Component<LightboxOverlayProps> = (props) => {\n const strings = useMCPUIStrings()\n const isOpen = () => props.selectedIndex !== null\n const currentImage = () =>\n props.selectedIndex !== null ? props.images[props.selectedIndex] : null\n const canGoPrev = () => props.selectedIndex !== null && props.selectedIndex > 0\n const canGoNext = () =>\n props.selectedIndex !== null && props.selectedIndex < props.images.length - 1\n\n const handlePrev = () => {\n if (canGoPrev()) {\n props.onNavigate(props.selectedIndex! - 1)\n }\n }\n\n const handleNext = () => {\n if (canGoNext()) {\n props.onNavigate(props.selectedIndex! + 1)\n }\n }\n\n // Keyboard navigation\n createEffect(() => {\n if (!isOpen()) return\n\n const handleKeydown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n props.onClose()\n break\n case 'ArrowLeft':\n handlePrev()\n break\n case 'ArrowRight':\n handleNext()\n break\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n document.body.style.overflow = 'hidden'\n\n onCleanup(() => {\n document.removeEventListener('keydown', handleKeydown)\n document.body.style.overflow = ''\n })\n })\n\n return (\n <Show when={isOpen()}>\n <Portal>\n <div\n class=\"fixed inset-0 z-50 bg-black/90 flex items-center justify-center\"\n onClick={props.onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={strings.lightboxLabel}\n >\n {/* Close button */}\n <button\n class=\"absolute top-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={props.onClose}\n aria-label={strings.lightboxClose}\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* Previous button */}\n <Show when={canGoPrev()}>\n <button\n class=\"absolute left-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handlePrev()\n }}\n aria-label={strings.lightboxPrevious}\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Next button */}\n <Show when={canGoNext()}>\n <button\n class=\"absolute right-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handleNext()\n }}\n aria-label={strings.lightboxNext}\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Image */}\n <img\n src={safeUrl(currentImage()?.url ?? '', { allowDataImage: true })}\n alt={currentImage()?.alt || ''}\n srcset={currentImage()?.srcset}\n sizes={currentImage()?.sizes}\n class=\"max-w-[90vw] max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n\n {/* Caption */}\n <Show when={currentImage()?.caption}>\n <div class=\"absolute bottom-16 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-lg max-w-[80vw] text-center\">\n {currentImage()!.caption}\n </div>\n </Show>\n\n {/* Counter */}\n <div class=\"absolute top-4 left-4 text-white/80 bg-black/40 px-3 py-1 rounded-full text-sm\">\n {(props.selectedIndex ?? 0) + 1} / {props.images.length}\n </div>\n </div>\n </Portal>\n </Show>\n )\n}\n"],"names":["LightboxOverlay","props","strings","useMCPUIStrings","isOpen","selectedIndex","currentImage","images","canGoPrev","canGoNext","length","handlePrev","onNavigate","handleNext","createEffect","handleKeydown","e","key","onClose","document","addEventListener","body","style","overflow","onCleanup","removeEventListener","_$createComponent","Show","when","children","Portal","_el$","_$getNextElement","_tmpl$4","_el$2","firstChild","_el$11","nextSibling","_el$12","_co$3","_$getNextMarker","_el$13","_el$14","_co$4","_el$5","_el$15","_el$16","_co$5","_el$7","_el$9","_el$0","_co$","_el$8","_el$1","_el$10","_co$2","_$addEventListener","_$insert","_el$3","_tmpl$","$$click","stopPropagation","_$effect","_$setAttribute","lightboxPrevious","_$runHydrationEvents","_el$4","_tmpl$2","lightboxNext","caption","_el$6","_tmpl$3","_p$","_v$","lightboxLabel","_v$2","lightboxClose","_v$3","safeUrl","url","allowDataImage","_v$4","alt","_v$5","srcset","_v$6","sizes","t","a","o","i","n","undefined","_$delegateEvents"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightboxOverlay.d.ts","sourceRoot":"","sources":["../../src/components/LightboxOverlay.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAiC,MAAM,UAAU,CAAA;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"LightboxOverlay.d.ts","sourceRoot":"","sources":["../../src/components/LightboxOverlay.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAiC,MAAM,UAAU,CAAA;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAI5C,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,MAAM,EAAE,YAAY,EAAE,CAAA;IAEtB;;OAEG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAE5B;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAA;IAEnB;;OAEG;IACH,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,oBAAoB,CA6I3D,CAAA"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { createComponent, Portal, getNextElement, getNextMarker, addEventListener, insert,
|
|
1
|
+
import { createComponent, Portal, getNextElement, getNextMarker, addEventListener, insert, effect, setAttribute, runHydrationEvents, template, delegateEvents } from "solid-js/web";
|
|
2
2
|
import { createEffect, onCleanup, Show } from "solid-js";
|
|
3
3
|
import { safeUrl } from "../utils/safe-url.js";
|
|
4
|
-
|
|
4
|
+
import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
|
|
5
|
+
var _tmpl$ = /* @__PURE__ */ template(`<button class="absolute left-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors"><svg class="w-8 h-8"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">`), _tmpl$2 = /* @__PURE__ */ template(`<button class="absolute right-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors"><svg class="w-8 h-8"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">`), _tmpl$3 = /* @__PURE__ */ template(`<div class="absolute bottom-16 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-lg max-w-[80vw] text-center">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="fixed inset-0 z-50 bg-black/90 flex items-center justify-center"role=dialog aria-modal=true><button class="absolute top-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors"><svg class="w-8 h-8"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M6 18L18 6M6 6l12 12"></path></svg></button><!$><!/><!$><!/><img class="max-w-[90vw] max-h-[90vh] object-contain"><!$><!/><div class="absolute top-4 left-4 text-white/80 bg-black/40 px-3 py-1 rounded-full text-sm"><!$><!/> / <!$><!/>`);
|
|
5
6
|
const LightboxOverlay = (props) => {
|
|
7
|
+
const strings = useMCPUIStrings();
|
|
6
8
|
const isOpen = () => props.selectedIndex !== null;
|
|
7
9
|
const currentImage = () => props.selectedIndex !== null ? props.images[props.selectedIndex] : null;
|
|
8
10
|
const canGoPrev = () => props.selectedIndex !== null && props.selectedIndex > 0;
|
|
@@ -59,6 +61,7 @@ const LightboxOverlay = (props) => {
|
|
|
59
61
|
e.stopPropagation();
|
|
60
62
|
handlePrev();
|
|
61
63
|
};
|
|
64
|
+
effect(() => setAttribute(_el$3, "aria-label", strings.lightboxPrevious));
|
|
62
65
|
runHydrationEvents();
|
|
63
66
|
return _el$3;
|
|
64
67
|
}
|
|
@@ -73,6 +76,7 @@ const LightboxOverlay = (props) => {
|
|
|
73
76
|
e.stopPropagation();
|
|
74
77
|
handleNext();
|
|
75
78
|
};
|
|
79
|
+
effect(() => setAttribute(_el$4, "aria-label", strings.lightboxNext));
|
|
76
80
|
runHydrationEvents();
|
|
77
81
|
return _el$4;
|
|
78
82
|
}
|
|
@@ -93,19 +97,23 @@ const LightboxOverlay = (props) => {
|
|
|
93
97
|
insert(_el$7, () => props.images.length, _el$10, _co$2);
|
|
94
98
|
effect((_p$) => {
|
|
95
99
|
var _a, _b, _c, _d;
|
|
96
|
-
var _v$ = safeUrl(((_a = currentImage()) == null ? void 0 : _a.url) ?? "", {
|
|
100
|
+
var _v$ = strings.lightboxLabel, _v$2 = strings.lightboxClose, _v$3 = safeUrl(((_a = currentImage()) == null ? void 0 : _a.url) ?? "", {
|
|
97
101
|
allowDataImage: true
|
|
98
|
-
}), _v$
|
|
99
|
-
_v$ !== _p$.e && setAttribute(_el
|
|
100
|
-
_v$2 !== _p$.t && setAttribute(_el$
|
|
101
|
-
_v$3 !== _p$.a && setAttribute(_el$5, "
|
|
102
|
-
_v$4 !== _p$.o && setAttribute(_el$5, "
|
|
102
|
+
}), _v$4 = ((_b = currentImage()) == null ? void 0 : _b.alt) || "", _v$5 = (_c = currentImage()) == null ? void 0 : _c.srcset, _v$6 = (_d = currentImage()) == null ? void 0 : _d.sizes;
|
|
103
|
+
_v$ !== _p$.e && setAttribute(_el$, "aria-label", _p$.e = _v$);
|
|
104
|
+
_v$2 !== _p$.t && setAttribute(_el$2, "aria-label", _p$.t = _v$2);
|
|
105
|
+
_v$3 !== _p$.a && setAttribute(_el$5, "src", _p$.a = _v$3);
|
|
106
|
+
_v$4 !== _p$.o && setAttribute(_el$5, "alt", _p$.o = _v$4);
|
|
107
|
+
_v$5 !== _p$.i && setAttribute(_el$5, "srcset", _p$.i = _v$5);
|
|
108
|
+
_v$6 !== _p$.n && setAttribute(_el$5, "sizes", _p$.n = _v$6);
|
|
103
109
|
return _p$;
|
|
104
110
|
}, {
|
|
105
111
|
e: void 0,
|
|
106
112
|
t: void 0,
|
|
107
113
|
a: void 0,
|
|
108
|
-
o: void 0
|
|
114
|
+
o: void 0,
|
|
115
|
+
i: void 0,
|
|
116
|
+
n: void 0
|
|
109
117
|
});
|
|
110
118
|
runHydrationEvents();
|
|
111
119
|
return _el$;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightboxOverlay.js","sources":["../../src/components/LightboxOverlay.tsx"],"sourcesContent":["/**\n * LightboxOverlay - Fullscreen image viewer\n * Sprint 5: Media Components\n */\n\nimport { Component, Show, createEffect, onCleanup } from 'solid-js'\nimport { Portal } from 'solid-js/web'\nimport type { GalleryImage } from '../types'\nimport { safeUrl } from '../utils/safe-url'\n\nexport interface LightboxOverlayProps {\n /**\n * Array of images to navigate through\n */\n images: GalleryImage[]\n\n /**\n * Currently selected image index (null when closed)\n */\n selectedIndex: number | null\n\n /**\n * Callback when lightbox should close\n */\n onClose: () => void\n\n /**\n * Callback when navigating to a different image\n */\n onNavigate: (index: number) => void\n}\n\nexport const LightboxOverlay: Component<LightboxOverlayProps> = (props) => {\n const isOpen = () => props.selectedIndex !== null\n const currentImage = () =>\n props.selectedIndex !== null ? props.images[props.selectedIndex] : null\n const canGoPrev = () => props.selectedIndex !== null && props.selectedIndex > 0\n const canGoNext = () =>\n props.selectedIndex !== null && props.selectedIndex < props.images.length - 1\n\n const handlePrev = () => {\n if (canGoPrev()) {\n props.onNavigate(props.selectedIndex! - 1)\n }\n }\n\n const handleNext = () => {\n if (canGoNext()) {\n props.onNavigate(props.selectedIndex! + 1)\n }\n }\n\n // Keyboard navigation\n createEffect(() => {\n if (!isOpen()) return\n\n const handleKeydown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n props.onClose()\n break\n case 'ArrowLeft':\n handlePrev()\n break\n case 'ArrowRight':\n handleNext()\n break\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n document.body.style.overflow = 'hidden'\n\n onCleanup(() => {\n document.removeEventListener('keydown', handleKeydown)\n document.body.style.overflow = ''\n })\n })\n\n return (\n <Show when={isOpen()}>\n <Portal>\n <div\n class=\"fixed inset-0 z-50 bg-black/90 flex items-center justify-center\"\n onClick={props.onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Image lightbox\"\n >\n {/* Close button */}\n <button\n class=\"absolute top-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={props.onClose}\n aria-label=\"Close lightbox\"\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* Previous button */}\n <Show when={canGoPrev()}>\n <button\n class=\"absolute left-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handlePrev()\n }}\n aria-label=\"Previous image\"\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Next button */}\n <Show when={canGoNext()}>\n <button\n class=\"absolute right-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handleNext()\n }}\n aria-label=\"Next image\"\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Image */}\n <img\n src={safeUrl(currentImage()?.url ?? '', { allowDataImage: true })}\n alt={currentImage()?.alt || ''}\n srcset={currentImage()?.srcset}\n sizes={currentImage()?.sizes}\n class=\"max-w-[90vw] max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n\n {/* Caption */}\n <Show when={currentImage()?.caption}>\n <div class=\"absolute bottom-16 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-lg max-w-[80vw] text-center\">\n {currentImage()!.caption}\n </div>\n </Show>\n\n {/* Counter */}\n <div class=\"absolute top-4 left-4 text-white/80 bg-black/40 px-3 py-1 rounded-full text-sm\">\n {(props.selectedIndex ?? 0) + 1} / {props.images.length}\n </div>\n </div>\n </Portal>\n </Show>\n )\n}\n"],"names":["LightboxOverlay","props","isOpen","selectedIndex","currentImage","images","canGoPrev","canGoNext","length","handlePrev","onNavigate","handleNext","createEffect","handleKeydown","e","key","onClose","document","addEventListener","body","style","overflow","onCleanup","removeEventListener","_$createComponent","Show","when","children","Portal","_el$","_$getNextElement","_tmpl$4","_el$2","firstChild","_el$11","nextSibling","_el$12","_co$3","_$getNextMarker","_el$13","_el$14","_co$4","_el$5","_el$15","_el$16","_co$5","_el$7","_el$9","_el$0","_co$","_el$8","_el$1","_el$10","_co$2","_$addEventListener","_$insert","_el$3","_tmpl$","$$click","stopPropagation","_$runHydrationEvents","_el$4","_tmpl$2","caption","_el$6","_tmpl$3","_$effect","_p$","_v$","safeUrl","url","allowDataImage","_v$2","alt","_v$3","srcset","_v$4","sizes","_$setAttribute","t","a","o","undefined","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LightboxOverlay.js","sources":["../../src/components/LightboxOverlay.tsx"],"sourcesContent":["/**\n * LightboxOverlay - Fullscreen image viewer\n * Sprint 5: Media Components\n */\n\nimport { Component, Show, createEffect, onCleanup } from 'solid-js'\nimport { Portal } from 'solid-js/web'\nimport type { GalleryImage } from '../types'\nimport { safeUrl } from '../utils/safe-url'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface LightboxOverlayProps {\n /**\n * Array of images to navigate through\n */\n images: GalleryImage[]\n\n /**\n * Currently selected image index (null when closed)\n */\n selectedIndex: number | null\n\n /**\n * Callback when lightbox should close\n */\n onClose: () => void\n\n /**\n * Callback when navigating to a different image\n */\n onNavigate: (index: number) => void\n}\n\nexport const LightboxOverlay: Component<LightboxOverlayProps> = (props) => {\n const strings = useMCPUIStrings()\n const isOpen = () => props.selectedIndex !== null\n const currentImage = () =>\n props.selectedIndex !== null ? props.images[props.selectedIndex] : null\n const canGoPrev = () => props.selectedIndex !== null && props.selectedIndex > 0\n const canGoNext = () =>\n props.selectedIndex !== null && props.selectedIndex < props.images.length - 1\n\n const handlePrev = () => {\n if (canGoPrev()) {\n props.onNavigate(props.selectedIndex! - 1)\n }\n }\n\n const handleNext = () => {\n if (canGoNext()) {\n props.onNavigate(props.selectedIndex! + 1)\n }\n }\n\n // Keyboard navigation\n createEffect(() => {\n if (!isOpen()) return\n\n const handleKeydown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n props.onClose()\n break\n case 'ArrowLeft':\n handlePrev()\n break\n case 'ArrowRight':\n handleNext()\n break\n }\n }\n\n document.addEventListener('keydown', handleKeydown)\n document.body.style.overflow = 'hidden'\n\n onCleanup(() => {\n document.removeEventListener('keydown', handleKeydown)\n document.body.style.overflow = ''\n })\n })\n\n return (\n <Show when={isOpen()}>\n <Portal>\n <div\n class=\"fixed inset-0 z-50 bg-black/90 flex items-center justify-center\"\n onClick={props.onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={strings.lightboxLabel}\n >\n {/* Close button */}\n <button\n class=\"absolute top-4 right-4 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={props.onClose}\n aria-label={strings.lightboxClose}\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* Previous button */}\n <Show when={canGoPrev()}>\n <button\n class=\"absolute left-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handlePrev()\n }}\n aria-label={strings.lightboxPrevious}\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Next button */}\n <Show when={canGoNext()}>\n <button\n class=\"absolute right-4 top-1/2 -translate-y-1/2 text-white/80 hover:text-white p-2 rounded-full hover:bg-white/10 transition-colors\"\n onClick={(e) => {\n e.stopPropagation()\n handleNext()\n }}\n aria-label={strings.lightboxNext}\n >\n <svg class=\"w-8 h-8\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </Show>\n\n {/* Image */}\n <img\n src={safeUrl(currentImage()?.url ?? '', { allowDataImage: true })}\n alt={currentImage()?.alt || ''}\n srcset={currentImage()?.srcset}\n sizes={currentImage()?.sizes}\n class=\"max-w-[90vw] max-h-[90vh] object-contain\"\n onClick={(e) => e.stopPropagation()}\n />\n\n {/* Caption */}\n <Show when={currentImage()?.caption}>\n <div class=\"absolute bottom-16 left-1/2 -translate-x-1/2 bg-black/60 text-white px-4 py-2 rounded-lg max-w-[80vw] text-center\">\n {currentImage()!.caption}\n </div>\n </Show>\n\n {/* Counter */}\n <div class=\"absolute top-4 left-4 text-white/80 bg-black/40 px-3 py-1 rounded-full text-sm\">\n {(props.selectedIndex ?? 0) + 1} / {props.images.length}\n </div>\n </div>\n </Portal>\n </Show>\n )\n}\n"],"names":["LightboxOverlay","props","strings","useMCPUIStrings","isOpen","selectedIndex","currentImage","images","canGoPrev","canGoNext","length","handlePrev","onNavigate","handleNext","createEffect","handleKeydown","e","key","onClose","document","addEventListener","body","style","overflow","onCleanup","removeEventListener","_$createComponent","Show","when","children","Portal","_el$","_$getNextElement","_tmpl$4","_el$2","firstChild","_el$11","nextSibling","_el$12","_co$3","_$getNextMarker","_el$13","_el$14","_co$4","_el$5","_el$15","_el$16","_co$5","_el$7","_el$9","_el$0","_co$","_el$8","_el$1","_el$10","_co$2","_$addEventListener","_$insert","_el$3","_tmpl$","$$click","stopPropagation","_$effect","_$setAttribute","lightboxPrevious","_$runHydrationEvents","_el$4","_tmpl$2","lightboxNext","caption","_el$6","_tmpl$3","_p$","_v$","lightboxLabel","_v$2","lightboxClose","_v$3","safeUrl","url","allowDataImage","_v$4","alt","_v$5","srcset","_v$6","sizes","t","a","o","i","n","undefined","_$delegateEvents"],"mappings":";;;;;AAiCO,MAAMA,kBAAoDC,CAAAA,UAAU;AACzE,QAAMC,UAAUC,gBAAAA;AAChB,QAAMC,SAASA,MAAMH,MAAMI,kBAAkB;AAC7C,QAAMC,eAAeA,MACnBL,MAAMI,kBAAkB,OAAOJ,MAAMM,OAAON,MAAMI,aAAa,IAAI;AACrE,QAAMG,YAAYA,MAAMP,MAAMI,kBAAkB,QAAQJ,MAAMI,gBAAgB;AAC9E,QAAMI,YAAYA,MAChBR,MAAMI,kBAAkB,QAAQJ,MAAMI,gBAAgBJ,MAAMM,OAAOG,SAAS;AAE9E,QAAMC,aAAaA,MAAM;AACvB,QAAIH,aAAa;AACfP,YAAMW,WAAWX,MAAMI,gBAAiB,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,QAAMQ,aAAaA,MAAM;AACvB,QAAIJ,aAAa;AACfR,YAAMW,WAAWX,MAAMI,gBAAiB,CAAC;AAAA,IAC3C;AAAA,EACF;AAGAS,eAAa,MAAM;AACjB,QAAI,CAACV,SAAU;AAEf,UAAMW,gBAAgBA,CAACC,MAAqB;AAC1C,cAAQA,EAAEC,KAAAA;AAAAA,QACR,KAAK;AACHhB,gBAAMiB,QAAAA;AACN;AAAA,QACF,KAAK;AACHP,qBAAAA;AACA;AAAA,QACF,KAAK;AACHE,qBAAAA;AACA;AAAA,MAAA;AAAA,IAEN;AAEAM,aAASC,iBAAiB,WAAWL,aAAa;AAClDI,aAASE,KAAKC,MAAMC,WAAW;AAE/BC,cAAU,MAAM;AACdL,eAASM,oBAAoB,WAAWV,aAAa;AACrDI,eAASE,KAAKC,MAAMC,WAAW;AAAA,IACjC,CAAC;AAAA,EACH,CAAC;AAED,SAAAG,gBACGC,MAAI;AAAA,IAAA,IAACC,OAAI;AAAA,aAAExB,OAAAA;AAAAA,IAAQ;AAAA,IAAA,IAAAyB,WAAA;AAAA,aAAAH,gBACjBI,QAAM;AAAA,QAAA,IAAAD,WAAA;AAAA,cAAAE,OAAAC,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,SAAAF,MAAAG,aAAA,CAAAC,QAAAC,KAAA,IAAAC,cAAAJ,OAAAC,WAAA,GAAAI,SAAAH,OAAAD,aAAA,CAAAK,QAAAC,KAAA,IAAAH,cAAAC,OAAAJ,WAAA,GAAAO,QAAAF,OAAAL,aAAAQ,SAAAD,MAAAP,aAAA,CAAAS,QAAAC,KAAA,IAAAP,cAAAK,OAAAR,WAAA,GAAAW,QAAAF,OAAAT,aAAAY,QAAAD,MAAAb,YAAA,CAAAe,OAAAC,IAAA,IAAAX,cAAAS,MAAAZ,WAAA,GAAAe,QAAAF,MAAAb,aAAAgB,QAAAD,MAAAf,aAAA,CAAAiB,QAAAC,KAAA,IAAAf,cAAAa,MAAAhB,WAAA;AAAAmB,2BAAAzB,MAAA,SAGM9B,MAAMiB,SAAO,IAAA;AAAAsC,2BAAAtB,OAAA,SAQXjC,MAAMiB,SAAO,IAAA;AAAAuC,iBAAA1B,MAAAL,gBAcvBC,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEpB,UAAAA;AAAAA,YAAW;AAAA,YAAA,IAAAqB,WAAA;AAAA,kBAAA6B,QAAA1B,eAAA2B,MAAA;AAAAD,oBAAAE,UAGT5C,CAAAA,MAAM;AACdA,kBAAE6C,gBAAAA;AACFlD,2BAAAA;AAAAA,cACF;AAACmD,2BAAAC,aAAAL,OAAA,cACWxD,QAAQ8D,gBAAgB,CAAA;AAAAC,iCAAAA;AAAA,qBAAAP;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAApB,QAAAC,KAAA;AAAAkB,iBAAA1B,MAAAL,gBAcvCC,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEnB,UAAAA;AAAAA,YAAW;AAAA,YAAA,IAAAoB,WAAA;AAAA,kBAAAqC,QAAAlC,eAAAmC,OAAA;AAAAD,oBAAAN,UAGT5C,CAAAA,MAAM;AACdA,kBAAE6C,gBAAAA;AACFhD,2BAAAA;AAAAA,cACF;AAACiD,2BAAAC,aAAAG,OAAA,cACWhE,QAAQkE,YAAY,CAAA;AAAAH,iCAAAA;AAAA,qBAAAC;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAAxB,QAAAC,KAAA;AAAAC,gBAAAgB,UAoBxB5C,CAAAA,MAAMA,EAAE6C,gBAAAA;AAAiBJ,iBAAA1B,MAAAL,gBAIpCC,MAAI;AAAA,YAAA,IAACC,OAAI;;AAAA,sBAAEtB,wBAAAA,mBAAgB+D;AAAAA,YAAO;AAAA,YAAA,IAAAxC,WAAA;AAAA,kBAAAyC,QAAAtC,eAAAuC,OAAA;AAAAd,qBAAAa,OAAA,MAE9BhE,aAAAA,EAAgB+D,OAAO;AAAA,qBAAAC;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAAxB,QAAAC,KAAA;AAAAU,iBAAAT,OAAA,OAMxB/C,MAAMI,iBAAiB,KAAK,GAAC6C,OAAAC,IAAA;AAAAM,iBAAAT,OAAA,MAAK/C,MAAMM,OAAOG,QAAM4C,QAAAC,KAAA;AAAAO,iBAAAU,CAAAA,QAAA;;AAAA,gBAAAC,MA/E7CvE,QAAQwE,eAAaC,OAMnBzE,QAAQ0E,eAAaC,OAwD5BC,UAAQxE,wBAAAA,mBAAgByE,QAAO,IAAI;AAAA,cAAEC,gBAAgB;AAAA,YAAA,CAAM,GAACC,SAC5D3E,kBAAAA,MAAAA,mBAAgB4E,QAAO,IAAEC,QACtB7E,kBAAAA,MAAAA,mBAAgB8E,QAAMC,QACvB/E,wBAAAA,mBAAgBgF;AAAKb,oBAAAD,IAAAxD,KAAA+C,aAAAhC,MAAA,cAAAyC,IAAAxD,IAAAyD,GAAA;AAAAE,qBAAAH,IAAAe,KAAAxB,aAAA7B,OAAA,cAAAsC,IAAAe,IAAAZ,IAAA;AAAAE,qBAAAL,IAAAgB,KAAAzB,aAAAnB,OAAA,OAAA4B,IAAAgB,IAAAX,IAAA;AAAAI,qBAAAT,IAAAiB,KAAA1B,aAAAnB,OAAA,OAAA4B,IAAAiB,IAAAR,IAAA;AAAAE,qBAAAX,IAAAkB,KAAA3B,aAAAnB,OAAA,UAAA4B,IAAAkB,IAAAP,IAAA;AAAAE,qBAAAb,IAAAmB,KAAA5B,aAAAnB,OAAA,SAAA4B,IAAAmB,IAAAN,IAAA;AAAA,mBAAAb;AAAAA,UAAA,GAAA;AAAA,YAAAxD,GAAA4E;AAAAA,YAAAL,GAAAK;AAAAA,YAAAJ,GAAAI;AAAAA,YAAAH,GAAAG;AAAAA,YAAAF,GAAAE;AAAAA,YAAAD,GAAAC;AAAAA,UAAAA,CAAA;AAAA3B,6BAAAA;AAAA,iBAAAlC;AAAAA,QAAA;AAAA,MAAA,CAAA;AAAA,IAAA;AAAA,EAAA,CAAA;AAoBxC;AAAC8D,eAAA,CAAA,OAAA,CAAA;"}
|
|
@@ -29,7 +29,9 @@ const DegradedFallback = require("./DegradedFallback.cjs");
|
|
|
29
29
|
const degradedProjections = require("../utils/degraded-projections.cjs");
|
|
30
30
|
const escapeHtml = require("../utils/escape-html.cjs");
|
|
31
31
|
const MCPUITelemetryContext = require("../context/MCPUITelemetryContext.cjs");
|
|
32
|
-
|
|
32
|
+
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
33
|
+
const formatString = require("../utils/format-string.cjs");
|
|
34
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<div class=p-3>`), _tmpl$2 = /* @__PURE__ */ web.template(`<div role=alert class="m-2 rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-800 dark:border-amber-700/50 dark:bg-amber-900/20 dark:text-amber-200"><!$><!/> <!$><!/>`), _tmpl$3 = /* @__PURE__ */ web.template(`<div>`), _tmpl$4 = /* @__PURE__ */ web.template(`<div><!$><!/><!$><!/>`);
|
|
33
35
|
let L = null;
|
|
34
36
|
let clusterCssLoaded = false;
|
|
35
37
|
function getChoroplethColor(value, scale, fallback) {
|
|
@@ -67,7 +69,7 @@ function buildStyleFn(style) {
|
|
|
67
69
|
};
|
|
68
70
|
};
|
|
69
71
|
}
|
|
70
|
-
function buildPopupContent(feature, popup, allowHtml = false) {
|
|
72
|
+
function buildPopupContent(feature, popup, allowHtml = false, locale = MCPUIStringsContext.DEFAULT_MCPUI_STRINGS.locale) {
|
|
71
73
|
if (!popup || !(feature == null ? void 0 : feature.properties)) return null;
|
|
72
74
|
const props = feature.properties;
|
|
73
75
|
if (allowHtml && popup.template) {
|
|
@@ -85,7 +87,7 @@ function buildPopupContent(feature, popup, allowHtml = false) {
|
|
|
85
87
|
if (key === popup.titleField) continue;
|
|
86
88
|
const val = props[key];
|
|
87
89
|
if (val == null) continue;
|
|
88
|
-
const formatted = typeof val === "number" ? val.toLocaleString(
|
|
90
|
+
const formatted = typeof val === "number" ? val.toLocaleString(locale) : String(val);
|
|
89
91
|
parts.push(`<span style="color:#666;font-size:11px">${escapeHtml.escapeHtml(key)}</span>: ${escapeHtml.escapeHtml(formatted)}`);
|
|
90
92
|
}
|
|
91
93
|
return parts.join("<br/>");
|
|
@@ -100,7 +102,7 @@ function bindMarkerContent(m, marker, allowHtml) {
|
|
|
100
102
|
const popup = popupSafeText(marker.popup, allowHtml);
|
|
101
103
|
if (popup) m.bindPopup(popup);
|
|
102
104
|
}
|
|
103
|
-
function addGeoJSONLayer(mapInst, leaflet, geojson, style, popup, allowHtml = false) {
|
|
105
|
+
function addGeoJSONLayer(mapInst, leaflet, geojson, style, popup, allowHtml = false, locale = MCPUIStringsContext.DEFAULT_MCPUI_STRINGS.locale) {
|
|
104
106
|
const styleFn = buildStyleFn(style);
|
|
105
107
|
const layer = leaflet.geoJSON(geojson, {
|
|
106
108
|
style: styleFn,
|
|
@@ -116,9 +118,10 @@ function addGeoJSONLayer(mapInst, leaflet, geojson, style, popup, allowHtml = fa
|
|
|
116
118
|
});
|
|
117
119
|
},
|
|
118
120
|
onEachFeature: (feature, featureLayer) => {
|
|
119
|
-
const
|
|
121
|
+
const currentLocale = () => typeof locale === "function" ? solidJs.untrack(locale) : locale;
|
|
122
|
+
const html = buildPopupContent(feature, popup, allowHtml, currentLocale());
|
|
120
123
|
if (html) {
|
|
121
|
-
featureLayer.bindPopup(html, {
|
|
124
|
+
featureLayer.bindPopup(typeof locale === "function" ? () => buildPopupContent(feature, popup, allowHtml, currentLocale()) ?? "" : html, {
|
|
122
125
|
maxWidth: 300
|
|
123
126
|
});
|
|
124
127
|
}
|
|
@@ -157,6 +160,7 @@ function mapToGeoJSON(p) {
|
|
|
157
160
|
}, null, 2);
|
|
158
161
|
}
|
|
159
162
|
const MapRenderer = (props) => {
|
|
163
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
160
164
|
let mapContainer;
|
|
161
165
|
let mapInstance = null;
|
|
162
166
|
const [isLeafletLoaded, setIsLeafletLoaded] = solidJs.createSignal(false);
|
|
@@ -188,7 +192,7 @@ const MapRenderer = (props) => {
|
|
|
188
192
|
setIsLeafletLoaded(true);
|
|
189
193
|
} catch (e) {
|
|
190
194
|
console.warn("Failed to load leaflet", e);
|
|
191
|
-
setError(
|
|
195
|
+
setError(strings.mapLibraryUnavailable);
|
|
192
196
|
return;
|
|
193
197
|
}
|
|
194
198
|
} else {
|
|
@@ -271,13 +275,24 @@ const MapRenderer = (props) => {
|
|
|
271
275
|
allBoundsLayers.push(...markers);
|
|
272
276
|
}
|
|
273
277
|
if (p == null ? void 0 : p.geojson) {
|
|
274
|
-
const geoLayer = addGeoJSONLayer(
|
|
278
|
+
const geoLayer = addGeoJSONLayer(
|
|
279
|
+
mapInstance,
|
|
280
|
+
L,
|
|
281
|
+
p.geojson,
|
|
282
|
+
p.geojsonStyle,
|
|
283
|
+
p.popup,
|
|
284
|
+
allowHtml(),
|
|
285
|
+
// A getter, not a value: popups read the current locale when they
|
|
286
|
+
// open. Tracking the locale here would re-run this effect, which is
|
|
287
|
+
// not idempotent (layer control, PMTiles layer, view reset).
|
|
288
|
+
() => strings.locale
|
|
289
|
+
);
|
|
275
290
|
allBoundsLayers.push(geoLayer);
|
|
276
291
|
}
|
|
277
292
|
if ((p == null ? void 0 : p.layers) && p.layers.length > 0) {
|
|
278
293
|
const overlays = {};
|
|
279
294
|
for (const layerDef of p.layers) {
|
|
280
|
-
const geoLayer = addGeoJSONLayer(mapInstance, L, layerDef.geojson, layerDef.style || (p == null ? void 0 : p.geojsonStyle), layerDef.popup || (p == null ? void 0 : p.popup), allowHtml());
|
|
295
|
+
const geoLayer = addGeoJSONLayer(mapInstance, L, layerDef.geojson, layerDef.style || (p == null ? void 0 : p.geojsonStyle), layerDef.popup || (p == null ? void 0 : p.popup), allowHtml(), () => strings.locale);
|
|
281
296
|
overlays[layerDef.name] = geoLayer;
|
|
282
297
|
allBoundsLayers.push(geoLayer);
|
|
283
298
|
if (layerDef.visible === false) {
|
|
@@ -325,12 +340,12 @@ const MapRenderer = (props) => {
|
|
|
325
340
|
pmLayer.addTo(mapInstance);
|
|
326
341
|
} catch (e) {
|
|
327
342
|
const detail = e instanceof Error ? e.message : String(e);
|
|
328
|
-
const
|
|
329
|
-
console.warn("[MCP-UI] " +
|
|
330
|
-
setPmtilesError(
|
|
343
|
+
const diagnostic = 'PMTiles layer unavailable — the optional "protomaps-leaflet" peer dependency failed to load or render.';
|
|
344
|
+
console.warn("[MCP-UI] " + diagnostic, e);
|
|
345
|
+
setPmtilesError(strings.mapPmtilesUnavailable);
|
|
331
346
|
telemetry == null ? void 0 : telemetry.dispatch({
|
|
332
347
|
type: "render:error",
|
|
333
|
-
errorMessage: `${
|
|
348
|
+
errorMessage: `${diagnostic} (${detail})`,
|
|
334
349
|
id: ((_f = props.component) == null ? void 0 : _f.id) ?? "",
|
|
335
350
|
componentType: "map",
|
|
336
351
|
ts: Date.now()
|
|
@@ -347,7 +362,7 @@ const MapRenderer = (props) => {
|
|
|
347
362
|
mapInstance.setView(p.center, p.zoom || mapInstance.getZoom());
|
|
348
363
|
}
|
|
349
364
|
} catch (err) {
|
|
350
|
-
const message = err instanceof Error ? err.message :
|
|
365
|
+
const message = err instanceof Error ? err.message : strings.mapRenderError;
|
|
351
366
|
setError(message);
|
|
352
367
|
telemetry == null ? void 0 : telemetry.dispatch({
|
|
353
368
|
type: "render:error",
|
|
@@ -366,16 +381,20 @@ const MapRenderer = (props) => {
|
|
|
366
381
|
}
|
|
367
382
|
});
|
|
368
383
|
return web.createComponent(ExpandableWrapper.ExpandableWrapper, {
|
|
369
|
-
title
|
|
384
|
+
get title() {
|
|
385
|
+
return strings.mapTitle;
|
|
386
|
+
},
|
|
370
387
|
get copyData() {
|
|
371
388
|
return mapToGeoJSON(params());
|
|
372
389
|
},
|
|
373
|
-
copyLabel
|
|
390
|
+
get copyLabel() {
|
|
391
|
+
return strings.mapCopy;
|
|
392
|
+
},
|
|
374
393
|
get toolbarVariant() {
|
|
375
394
|
return props.toolbarVariant;
|
|
376
395
|
},
|
|
377
396
|
get children() {
|
|
378
|
-
var _el$ = web.getNextElement(_tmpl$4), _el$
|
|
397
|
+
var _el$ = web.getNextElement(_tmpl$4), _el$0 = _el$.firstChild, [_el$1, _co$3] = web.getNextMarker(_el$0.nextSibling), _el$10 = _el$1.nextSibling, [_el$11, _co$4] = web.getNextMarker(_el$10.nextSibling);
|
|
379
398
|
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
380
399
|
get when() {
|
|
381
400
|
return error();
|
|
@@ -384,13 +403,24 @@ const MapRenderer = (props) => {
|
|
|
384
403
|
var _el$2 = web.getNextElement(_tmpl$);
|
|
385
404
|
web.insert(_el$2, web.createComponent(DegradedFallback.DegradedFallback, web.mergeProps({
|
|
386
405
|
get message() {
|
|
387
|
-
return
|
|
406
|
+
return formatString.formatMCPUIString(strings.mapRenderFailed, {
|
|
407
|
+
error: String(error())
|
|
408
|
+
});
|
|
388
409
|
},
|
|
389
|
-
caption
|
|
390
|
-
|
|
410
|
+
get caption() {
|
|
411
|
+
return strings.mapDegradedCaption;
|
|
412
|
+
}
|
|
413
|
+
}, () => degradedProjections.mapToDegradedTable(params() ?? {}, {
|
|
414
|
+
type: strings.degradedColType,
|
|
415
|
+
lat: strings.degradedColLat,
|
|
416
|
+
lng: strings.degradedColLng,
|
|
417
|
+
info: strings.degradedColInfo,
|
|
418
|
+
marker: strings.degradedMarker,
|
|
419
|
+
feature: strings.degradedFeature
|
|
420
|
+
}))));
|
|
391
421
|
return _el$2;
|
|
392
422
|
}
|
|
393
|
-
}), _el$
|
|
423
|
+
}), _el$1, _co$3);
|
|
394
424
|
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
395
425
|
get when() {
|
|
396
426
|
return !error();
|
|
@@ -401,15 +431,15 @@ const MapRenderer = (props) => {
|
|
|
401
431
|
return pmtilesError();
|
|
402
432
|
},
|
|
403
433
|
get children() {
|
|
404
|
-
var _el$3 = web.getNextElement(_tmpl$2), _el$5 = _el$3.firstChild, [_el$6, _co$] = web.getNextMarker(_el$5.nextSibling);
|
|
405
|
-
_el$6.nextSibling;
|
|
434
|
+
var _el$3 = web.getNextElement(_tmpl$2), _el$5 = _el$3.firstChild, [_el$6, _co$] = web.getNextMarker(_el$5.nextSibling), _el$4 = _el$6.nextSibling, _el$7 = _el$4.nextSibling, [_el$8, _co$2] = web.getNextMarker(_el$7.nextSibling);
|
|
406
435
|
web.insert(_el$3, pmtilesError, _el$6, _co$);
|
|
436
|
+
web.insert(_el$3, () => strings.mapBaseMapStillShown, _el$8, _co$2);
|
|
407
437
|
return _el$3;
|
|
408
438
|
}
|
|
409
439
|
}), (() => {
|
|
410
|
-
var _el$
|
|
440
|
+
var _el$9 = web.getNextElement(_tmpl$3);
|
|
411
441
|
var _ref$ = mapContainer;
|
|
412
|
-
typeof _ref$ === "function" ? web.use(_ref$, _el$
|
|
442
|
+
typeof _ref$ === "function" ? web.use(_ref$, _el$9) : mapContainer = _el$9;
|
|
413
443
|
web.effect((_p$) => {
|
|
414
444
|
var _a;
|
|
415
445
|
var _v$ = isExpanded() ? {
|
|
@@ -421,17 +451,17 @@ const MapRenderer = (props) => {
|
|
|
421
451
|
width: "100%",
|
|
422
452
|
"z-index": 0
|
|
423
453
|
}, _v$2 = `relative z-0 ${isExpanded() ? "flex-1 min-h-0" : ""}`;
|
|
424
|
-
_p$.e = web.style(_el$
|
|
425
|
-
_v$2 !== _p$.t && web.className(_el$
|
|
454
|
+
_p$.e = web.style(_el$9, _v$, _p$.e);
|
|
455
|
+
_v$2 !== _p$.t && web.className(_el$9, _p$.t = _v$2);
|
|
426
456
|
return _p$;
|
|
427
457
|
}, {
|
|
428
458
|
e: void 0,
|
|
429
459
|
t: void 0
|
|
430
460
|
});
|
|
431
|
-
return _el$
|
|
461
|
+
return _el$9;
|
|
432
462
|
})()];
|
|
433
463
|
}
|
|
434
|
-
}), _el$
|
|
464
|
+
}), _el$11, _co$4);
|
|
435
465
|
web.effect(() => {
|
|
436
466
|
var _a;
|
|
437
467
|
return web.className(_el$, `w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden ${((_a = params()) == null ? void 0 : _a.className) || ""} ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : ""}`);
|