@mariozechner/pi-web-ui 0.5.44 → 0.5.46
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/README.md +178 -99
- package/dist/ChatPanel.d.ts +15 -10
- package/dist/ChatPanel.d.ts.map +1 -1
- package/dist/ChatPanel.js +68 -100
- package/dist/ChatPanel.js.map +1 -1
- package/dist/{state/agent-session.d.ts → agent/agent.d.ts} +23 -19
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/{state/agent-session.js → agent/agent.js} +50 -32
- package/dist/agent/agent.js.map +1 -0
- package/dist/{state → agent}/transports/AppTransport.d.ts +1 -3
- package/dist/agent/transports/AppTransport.d.ts.map +1 -0
- package/dist/{state → agent}/transports/AppTransport.js +5 -4
- package/dist/{state → agent}/transports/AppTransport.js.map +1 -1
- package/dist/{state → agent}/transports/ProviderTransport.d.ts +1 -3
- package/dist/agent/transports/ProviderTransport.d.ts.map +1 -0
- package/dist/{state → agent}/transports/ProviderTransport.js +6 -7
- package/dist/agent/transports/ProviderTransport.js.map +1 -0
- package/dist/{state → agent}/transports/index.d.ts.map +1 -1
- package/dist/agent/transports/index.js.map +1 -0
- package/dist/{state → agent}/transports/proxy-types.d.ts.map +1 -1
- package/dist/agent/transports/proxy-types.js.map +1 -0
- package/dist/agent/transports/types.d.ts +12 -0
- package/dist/agent/transports/types.d.ts.map +1 -0
- package/dist/{state → agent}/transports/types.js.map +1 -1
- package/dist/{state → agent}/types.d.ts.map +1 -1
- package/dist/{state → agent}/types.js.map +1 -1
- package/dist/app.css +1 -1
- package/dist/components/AgentInterface.d.ts +7 -4
- package/dist/components/AgentInterface.d.ts.map +1 -1
- package/dist/components/AgentInterface.js +29 -17
- package/dist/components/AgentInterface.js.map +1 -1
- package/dist/components/ConsoleBlock.d.ts +1 -0
- package/dist/components/ConsoleBlock.d.ts.map +1 -1
- package/dist/components/ConsoleBlock.js +7 -1
- package/dist/components/ConsoleBlock.js.map +1 -1
- package/dist/components/ExpandableSection.d.ts +15 -0
- package/dist/components/ExpandableSection.d.ts.map +1 -0
- package/dist/components/ExpandableSection.js +63 -0
- package/dist/components/ExpandableSection.js.map +1 -0
- package/dist/components/MessageEditor.d.ts +8 -1
- package/dist/components/MessageEditor.d.ts.map +1 -1
- package/dist/components/MessageEditor.js +149 -6
- package/dist/components/MessageEditor.js.map +1 -1
- package/dist/components/MessageList.d.ts +3 -2
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +14 -1
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/Messages.d.ts +15 -6
- package/dist/components/Messages.d.ts.map +1 -1
- package/dist/components/Messages.js +17 -83
- package/dist/components/Messages.js.map +1 -1
- package/dist/components/ProviderKeyInput.d.ts.map +1 -1
- package/dist/components/ProviderKeyInput.js +6 -5
- package/dist/components/ProviderKeyInput.js.map +1 -1
- package/dist/components/SandboxedIframe.d.ts +29 -7
- package/dist/components/SandboxedIframe.d.ts.map +1 -1
- package/dist/components/SandboxedIframe.js +350 -282
- package/dist/components/SandboxedIframe.js.map +1 -1
- package/dist/components/message-renderer-registry.d.ts +12 -0
- package/dist/components/message-renderer-registry.d.ts.map +1 -0
- package/dist/components/message-renderer-registry.js +12 -0
- package/dist/components/message-renderer-registry.js.map +1 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts +35 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.js +189 -0
- package/dist/components/sandbox/ArtifactsRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts +17 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.js +64 -0
- package/dist/components/sandbox/AttachmentsRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts +42 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.js +161 -0
- package/dist/components/sandbox/ConsoleRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts +30 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.js +97 -0
- package/dist/components/sandbox/FileDownloadRuntimeProvider.js.map +1 -0
- package/dist/components/sandbox/RuntimeMessageBridge.d.ts +19 -0
- package/dist/components/sandbox/RuntimeMessageBridge.d.ts.map +1 -0
- package/dist/components/sandbox/RuntimeMessageBridge.js +74 -0
- package/dist/components/sandbox/RuntimeMessageBridge.js.map +1 -0
- package/dist/components/sandbox/RuntimeMessageRouter.d.ts +65 -0
- package/dist/components/sandbox/RuntimeMessageRouter.d.ts.map +1 -0
- package/dist/components/sandbox/RuntimeMessageRouter.js +168 -0
- package/dist/components/sandbox/RuntimeMessageRouter.js.map +1 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.d.ts +33 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.d.ts.map +1 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.js +2 -0
- package/dist/components/sandbox/SandboxRuntimeProvider.js.map +1 -0
- package/dist/dialogs/ApiKeyPromptDialog.d.ts.map +1 -1
- package/dist/dialogs/ApiKeyPromptDialog.js +2 -5
- package/dist/dialogs/ApiKeyPromptDialog.js.map +1 -1
- package/dist/dialogs/ModelSelector.js.map +1 -1
- package/dist/dialogs/PersistentStorageDialog.d.ts +17 -0
- package/dist/dialogs/PersistentStorageDialog.d.ts.map +1 -0
- package/dist/dialogs/PersistentStorageDialog.js +144 -0
- package/dist/dialogs/PersistentStorageDialog.js.map +1 -0
- package/dist/dialogs/SessionListDialog.d.ts +19 -0
- package/dist/dialogs/SessionListDialog.d.ts.map +1 -0
- package/dist/dialogs/SessionListDialog.js +152 -0
- package/dist/dialogs/SessionListDialog.js.map +1 -0
- package/dist/dialogs/SettingsDialog.d.ts.map +1 -1
- package/dist/dialogs/SettingsDialog.js +1 -0
- package/dist/dialogs/SettingsDialog.js.map +1 -1
- package/dist/index.d.ts +34 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -14
- package/dist/index.js.map +1 -1
- package/dist/prompts/prompts.d.ts +11 -0
- package/dist/prompts/prompts.d.ts.map +1 -0
- package/dist/prompts/prompts.js +272 -0
- package/dist/prompts/prompts.js.map +1 -0
- package/dist/storage/app-storage.d.ts +17 -12
- package/dist/storage/app-storage.d.ts.map +1 -1
- package/dist/storage/app-storage.js +13 -20
- package/dist/storage/app-storage.js.map +1 -1
- package/dist/storage/backends/indexeddb-storage-backend.d.ts +27 -0
- package/dist/storage/backends/indexeddb-storage-backend.d.ts.map +1 -0
- package/dist/storage/backends/indexeddb-storage-backend.js +166 -0
- package/dist/storage/backends/indexeddb-storage-backend.js.map +1 -0
- package/dist/storage/store.d.ts +23 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +26 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/storage/stores/provider-keys-store.d.ts +14 -0
- package/dist/storage/stores/provider-keys-store.d.ts.map +1 -0
- package/dist/storage/stores/provider-keys-store.js +27 -0
- package/dist/storage/stores/provider-keys-store.js.map +1 -0
- package/dist/storage/stores/sessions-store.d.ts +31 -0
- package/dist/storage/stores/sessions-store.d.ts.map +1 -0
- package/dist/storage/stores/sessions-store.js +113 -0
- package/dist/storage/stores/sessions-store.js.map +1 -0
- package/dist/storage/stores/settings-store.d.ts +14 -0
- package/dist/storage/stores/settings-store.d.ts.map +1 -0
- package/dist/storage/stores/settings-store.js +28 -0
- package/dist/storage/stores/settings-store.js.map +1 -0
- package/dist/storage/types.d.ts +156 -22
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/tools/artifacts/ArtifactElement.d.ts +0 -1
- package/dist/tools/artifacts/ArtifactElement.d.ts.map +1 -1
- package/dist/tools/artifacts/ArtifactElement.js +0 -1
- package/dist/tools/artifacts/ArtifactElement.js.map +1 -1
- package/dist/tools/artifacts/ArtifactPill.d.ts +4 -0
- package/dist/tools/artifacts/ArtifactPill.d.ts.map +1 -0
- package/dist/tools/artifacts/ArtifactPill.js +22 -0
- package/dist/tools/artifacts/ArtifactPill.js.map +1 -0
- package/dist/tools/artifacts/Console.d.ts +18 -0
- package/dist/tools/artifacts/Console.d.ts.map +1 -0
- package/dist/tools/artifacts/Console.js +95 -0
- package/dist/tools/artifacts/Console.js.map +1 -0
- package/dist/tools/artifacts/DocxArtifact.d.ts +22 -0
- package/dist/tools/artifacts/DocxArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/DocxArtifact.js +208 -0
- package/dist/tools/artifacts/DocxArtifact.js.map +1 -0
- package/dist/tools/artifacts/ExcelArtifact.d.ts +24 -0
- package/dist/tools/artifacts/ExcelArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/ExcelArtifact.js +216 -0
- package/dist/tools/artifacts/ExcelArtifact.js.map +1 -0
- package/dist/tools/artifacts/GenericArtifact.d.ts +19 -0
- package/dist/tools/artifacts/GenericArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/GenericArtifact.js +117 -0
- package/dist/tools/artifacts/GenericArtifact.js.map +1 -0
- package/dist/tools/artifacts/HtmlArtifact.d.ts +8 -11
- package/dist/tools/artifacts/HtmlArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/HtmlArtifact.js +56 -88
- package/dist/tools/artifacts/HtmlArtifact.js.map +1 -1
- package/dist/tools/artifacts/ImageArtifact.d.ts +20 -0
- package/dist/tools/artifacts/ImageArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/ImageArtifact.js +120 -0
- package/dist/tools/artifacts/ImageArtifact.js.map +1 -0
- package/dist/tools/artifacts/MarkdownArtifact.d.ts +0 -1
- package/dist/tools/artifacts/MarkdownArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/MarkdownArtifact.js +0 -4
- package/dist/tools/artifacts/MarkdownArtifact.js.map +1 -1
- package/dist/tools/artifacts/PdfArtifact.d.ts +25 -0
- package/dist/tools/artifacts/PdfArtifact.d.ts.map +1 -0
- package/dist/tools/artifacts/PdfArtifact.js +184 -0
- package/dist/tools/artifacts/PdfArtifact.js.map +1 -0
- package/dist/tools/artifacts/SvgArtifact.d.ts +0 -1
- package/dist/tools/artifacts/SvgArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/SvgArtifact.js +0 -4
- package/dist/tools/artifacts/SvgArtifact.js.map +1 -1
- package/dist/tools/artifacts/TextArtifact.d.ts +0 -1
- package/dist/tools/artifacts/TextArtifact.d.ts.map +1 -1
- package/dist/tools/artifacts/TextArtifact.js +0 -4
- package/dist/tools/artifacts/TextArtifact.js.map +1 -1
- package/dist/tools/artifacts/artifacts-tool-renderer.d.ts +11 -0
- package/dist/tools/artifacts/artifacts-tool-renderer.d.ts.map +1 -0
- package/dist/tools/artifacts/artifacts-tool-renderer.js +262 -0
- package/dist/tools/artifacts/artifacts-tool-renderer.js.map +1 -0
- package/dist/tools/artifacts/artifacts.d.ts +10 -13
- package/dist/tools/artifacts/artifacts.d.ts.map +1 -1
- package/dist/tools/artifacts/artifacts.js +166 -344
- package/dist/tools/artifacts/artifacts.js.map +1 -1
- package/dist/tools/artifacts/index.d.ts +1 -0
- package/dist/tools/artifacts/index.d.ts.map +1 -1
- package/dist/tools/artifacts/index.js +1 -0
- package/dist/tools/artifacts/index.js.map +1 -1
- package/dist/tools/extract-document.d.ts +24 -0
- package/dist/tools/extract-document.d.ts.map +1 -0
- package/dist/tools/extract-document.js +193 -0
- package/dist/tools/extract-document.js.map +1 -0
- package/dist/tools/index.d.ts +9 -7
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +17 -13
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/javascript-repl.d.ts +16 -15
- package/dist/tools/javascript-repl.d.ts.map +1 -1
- package/dist/tools/javascript-repl.js +101 -133
- package/dist/tools/javascript-repl.js.map +1 -1
- package/dist/tools/renderer-registry.d.ts +12 -0
- package/dist/tools/renderer-registry.d.ts.map +1 -1
- package/dist/tools/renderer-registry.js +78 -0
- package/dist/tools/renderer-registry.js.map +1 -1
- package/dist/tools/renderers/BashRenderer.d.ts +2 -4
- package/dist/tools/renderers/BashRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/BashRenderer.js +30 -26
- package/dist/tools/renderers/BashRenderer.js.map +1 -1
- package/dist/tools/renderers/CalculateRenderer.d.ts +2 -4
- package/dist/tools/renderers/CalculateRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/CalculateRenderer.js +32 -28
- package/dist/tools/renderers/CalculateRenderer.js.map +1 -1
- package/dist/tools/renderers/DefaultRenderer.d.ts +2 -4
- package/dist/tools/renderers/DefaultRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/DefaultRenderer.js +78 -18
- package/dist/tools/renderers/DefaultRenderer.js.map +1 -1
- package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts +2 -4
- package/dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map +1 -1
- package/dist/tools/renderers/GetCurrentTimeRenderer.js +57 -21
- package/dist/tools/renderers/GetCurrentTimeRenderer.js.map +1 -1
- package/dist/tools/types.d.ts +5 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/i18n.d.ts +424 -1
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +131 -7
- package/dist/utils/i18n.js.map +1 -1
- package/example/package.json +2 -1
- package/example/src/custom-messages.ts +112 -0
- package/example/src/main.ts +391 -38
- package/package.json +48 -43
- package/scripts/count-prompt-tokens.ts +88 -0
- package/src/ChatPanel.ts +93 -101
- package/src/{state/agent-session.ts → agent/agent.ts} +80 -55
- package/src/{state → agent}/transports/AppTransport.ts +6 -6
- package/src/{state → agent}/transports/ProviderTransport.ts +13 -7
- package/src/{state → agent}/transports/types.ts +8 -2
- package/src/components/AgentInterface.ts +32 -16
- package/src/components/ConsoleBlock.ts +5 -1
- package/src/components/ExpandableSection.ts +46 -0
- package/src/components/MessageEditor.ts +159 -5
- package/src/components/MessageList.ts +18 -3
- package/src/components/Messages.ts +48 -89
- package/src/components/ProviderKeyInput.ts +6 -5
- package/src/components/SandboxedIframe.ts +412 -321
- package/src/components/message-renderer-registry.ts +28 -0
- package/src/components/sandbox/ArtifactsRuntimeProvider.ts +219 -0
- package/src/components/sandbox/AttachmentsRuntimeProvider.ts +66 -0
- package/src/components/sandbox/ConsoleRuntimeProvider.ts +187 -0
- package/src/components/sandbox/FileDownloadRuntimeProvider.ts +110 -0
- package/src/components/sandbox/RuntimeMessageBridge.ts +82 -0
- package/src/components/sandbox/RuntimeMessageRouter.ts +216 -0
- package/src/components/sandbox/SandboxRuntimeProvider.ts +35 -0
- package/src/dialogs/ApiKeyPromptDialog.ts +2 -5
- package/src/dialogs/ModelSelector.ts +2 -2
- package/src/dialogs/PersistentStorageDialog.ts +141 -0
- package/src/dialogs/SessionListDialog.ts +148 -0
- package/src/dialogs/SettingsDialog.ts +1 -0
- package/src/index.ts +61 -20
- package/src/prompts/prompts.ts +282 -0
- package/src/storage/app-storage.ts +27 -24
- package/src/storage/backends/indexeddb-storage-backend.ts +193 -0
- package/src/storage/store.ts +33 -0
- package/src/storage/stores/provider-keys-store.ts +33 -0
- package/src/storage/stores/sessions-store.ts +130 -0
- package/src/storage/stores/settings-store.ts +34 -0
- package/src/storage/types.ts +182 -22
- package/src/tools/artifacts/ArtifactElement.ts +0 -1
- package/src/tools/artifacts/ArtifactPill.ts +25 -0
- package/src/tools/artifacts/Console.ts +93 -0
- package/src/tools/artifacts/DocxArtifact.ts +213 -0
- package/src/tools/artifacts/ExcelArtifact.ts +231 -0
- package/src/tools/artifacts/GenericArtifact.ts +117 -0
- package/src/tools/artifacts/HtmlArtifact.ts +64 -94
- package/src/tools/artifacts/ImageArtifact.ts +116 -0
- package/src/tools/artifacts/MarkdownArtifact.ts +0 -1
- package/src/tools/artifacts/PdfArtifact.ts +201 -0
- package/src/tools/artifacts/SvgArtifact.ts +0 -1
- package/src/tools/artifacts/TextArtifact.ts +0 -1
- package/src/tools/artifacts/artifacts-tool-renderer.ts +298 -0
- package/src/tools/artifacts/artifacts.ts +190 -366
- package/src/tools/artifacts/index.ts +1 -0
- package/src/tools/extract-document.ts +250 -0
- package/src/tools/index.ts +25 -14
- package/src/tools/javascript-repl.ts +138 -160
- package/src/tools/renderer-registry.ts +98 -0
- package/src/tools/renderers/BashRenderer.ts +33 -30
- package/src/tools/renderers/CalculateRenderer.ts +36 -31
- package/src/tools/renderers/DefaultRenderer.ts +84 -21
- package/src/tools/renderers/GetCurrentTimeRenderer.ts +68 -23
- package/src/tools/types.ts +10 -2
- package/src/utils/i18n.ts +203 -8
- package/dist/state/agent-session.d.ts.map +0 -1
- package/dist/state/agent-session.js.map +0 -1
- package/dist/state/transports/AppTransport.d.ts.map +0 -1
- package/dist/state/transports/ProviderTransport.d.ts.map +0 -1
- package/dist/state/transports/ProviderTransport.js.map +0 -1
- package/dist/state/transports/index.js.map +0 -1
- package/dist/state/transports/proxy-types.js.map +0 -1
- package/dist/state/transports/types.d.ts +0 -11
- package/dist/state/transports/types.d.ts.map +0 -1
- package/dist/storage/backends/chrome-storage-backend.d.ts +0 -18
- package/dist/storage/backends/chrome-storage-backend.d.ts.map +0 -1
- package/dist/storage/backends/chrome-storage-backend.js +0 -67
- package/dist/storage/backends/chrome-storage-backend.js.map +0 -1
- package/dist/storage/backends/indexeddb-backend.d.ts +0 -20
- package/dist/storage/backends/indexeddb-backend.d.ts.map +0 -1
- package/dist/storage/backends/indexeddb-backend.js +0 -89
- package/dist/storage/backends/indexeddb-backend.js.map +0 -1
- package/dist/storage/backends/local-storage-backend.d.ts +0 -18
- package/dist/storage/backends/local-storage-backend.d.ts.map +0 -1
- package/dist/storage/backends/local-storage-backend.js +0 -69
- package/dist/storage/backends/local-storage-backend.js.map +0 -1
- package/dist/storage/repositories/provider-keys-repository.d.ts +0 -34
- package/dist/storage/repositories/provider-keys-repository.d.ts.map +0 -1
- package/dist/storage/repositories/provider-keys-repository.js +0 -50
- package/dist/storage/repositories/provider-keys-repository.js.map +0 -1
- package/dist/storage/repositories/settings-repository.d.ts +0 -34
- package/dist/storage/repositories/settings-repository.d.ts.map +0 -1
- package/dist/storage/repositories/settings-repository.js +0 -46
- package/dist/storage/repositories/settings-repository.js.map +0 -1
- package/src/storage/backends/chrome-storage-backend.ts +0 -82
- package/src/storage/backends/indexeddb-backend.ts +0 -107
- package/src/storage/backends/local-storage-backend.ts +0 -74
- package/src/storage/repositories/provider-keys-repository.ts +0 -55
- package/src/storage/repositories/settings-repository.ts +0 -51
- /package/dist/{state → agent}/transports/index.d.ts +0 -0
- /package/dist/{state → agent}/transports/index.js +0 -0
- /package/dist/{state → agent}/transports/proxy-types.d.ts +0 -0
- /package/dist/{state → agent}/transports/proxy-types.js +0 -0
- /package/dist/{state → agent}/transports/types.js +0 -0
- /package/dist/{state → agent}/types.d.ts +0 -0
- /package/dist/{state → agent}/types.js +0 -0
- /package/src/{state → agent}/transports/index.ts +0 -0
- /package/src/{state → agent}/transports/proxy-types.ts +0 -0
- /package/src/{state → agent}/types.ts +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { DownloadButton } from "@mariozechner/mini-lit";
|
|
2
|
+
import { renderAsync } from "docx-preview";
|
|
3
|
+
import { html, type TemplateResult } from "lit";
|
|
4
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
5
|
+
import { i18n } from "../../utils/i18n.js";
|
|
6
|
+
import { ArtifactElement } from "./ArtifactElement.js";
|
|
7
|
+
|
|
8
|
+
@customElement("docx-artifact")
|
|
9
|
+
export class DocxArtifact extends ArtifactElement {
|
|
10
|
+
@property({ type: String }) private _content = "";
|
|
11
|
+
@state() private error: string | null = null;
|
|
12
|
+
|
|
13
|
+
get content(): string {
|
|
14
|
+
return this._content;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
set content(value: string) {
|
|
18
|
+
this._content = value;
|
|
19
|
+
this.error = null;
|
|
20
|
+
this.requestUpdate();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected override createRenderRoot(): HTMLElement | DocumentFragment {
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override connectedCallback(): void {
|
|
28
|
+
super.connectedCallback();
|
|
29
|
+
this.style.display = "block";
|
|
30
|
+
this.style.height = "100%";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private base64ToArrayBuffer(base64: string): ArrayBuffer {
|
|
34
|
+
// Remove data URL prefix if present
|
|
35
|
+
let base64Data = base64;
|
|
36
|
+
if (base64.startsWith("data:")) {
|
|
37
|
+
const base64Match = base64.match(/base64,(.+)/);
|
|
38
|
+
if (base64Match) {
|
|
39
|
+
base64Data = base64Match[1];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const binaryString = atob(base64Data);
|
|
44
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
45
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
46
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
47
|
+
}
|
|
48
|
+
return bytes.buffer;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private decodeBase64(): Uint8Array {
|
|
52
|
+
let base64Data = this._content;
|
|
53
|
+
if (this._content.startsWith("data:")) {
|
|
54
|
+
const base64Match = this._content.match(/base64,(.+)/);
|
|
55
|
+
if (base64Match) {
|
|
56
|
+
base64Data = base64Match[1];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const binaryString = atob(base64Data);
|
|
61
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
62
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
63
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
64
|
+
}
|
|
65
|
+
return bytes;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public getHeaderButtons() {
|
|
69
|
+
return html`
|
|
70
|
+
<div class="flex items-center gap-1">
|
|
71
|
+
${DownloadButton({
|
|
72
|
+
content: this.decodeBase64(),
|
|
73
|
+
filename: this.filename,
|
|
74
|
+
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
75
|
+
title: i18n("Download"),
|
|
76
|
+
})}
|
|
77
|
+
</div>
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
override async updated(changedProperties: Map<string, any>) {
|
|
82
|
+
super.updated(changedProperties);
|
|
83
|
+
|
|
84
|
+
if (changedProperties.has("_content") && this._content && !this.error) {
|
|
85
|
+
await this.renderDocx();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private async renderDocx() {
|
|
90
|
+
const container = this.querySelector("#docx-container");
|
|
91
|
+
if (!container || !this._content) return;
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const arrayBuffer = this.base64ToArrayBuffer(this._content);
|
|
95
|
+
|
|
96
|
+
// Clear container first
|
|
97
|
+
container.innerHTML = "";
|
|
98
|
+
|
|
99
|
+
// Create a wrapper div for the document
|
|
100
|
+
const wrapper = document.createElement("div");
|
|
101
|
+
wrapper.className = "docx-wrapper-custom";
|
|
102
|
+
container.appendChild(wrapper);
|
|
103
|
+
|
|
104
|
+
// Render the DOCX file into the wrapper
|
|
105
|
+
await renderAsync(arrayBuffer, wrapper as HTMLElement, undefined, {
|
|
106
|
+
className: "docx",
|
|
107
|
+
inWrapper: true,
|
|
108
|
+
ignoreWidth: true,
|
|
109
|
+
ignoreHeight: false,
|
|
110
|
+
ignoreFonts: false,
|
|
111
|
+
breakPages: true,
|
|
112
|
+
ignoreLastRenderedPageBreak: true,
|
|
113
|
+
experimental: false,
|
|
114
|
+
trimXmlDeclaration: true,
|
|
115
|
+
useBase64URL: false,
|
|
116
|
+
renderHeaders: true,
|
|
117
|
+
renderFooters: true,
|
|
118
|
+
renderFootnotes: true,
|
|
119
|
+
renderEndnotes: true,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Apply custom styles to match theme and fix sizing
|
|
123
|
+
const style = document.createElement("style");
|
|
124
|
+
style.textContent = `
|
|
125
|
+
#docx-container {
|
|
126
|
+
padding: 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#docx-container .docx-wrapper-custom {
|
|
130
|
+
max-width: 100%;
|
|
131
|
+
overflow-x: auto;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
#docx-container .docx-wrapper {
|
|
135
|
+
max-width: 100% !important;
|
|
136
|
+
margin: 0 !important;
|
|
137
|
+
background: transparent !important;
|
|
138
|
+
padding: 0em !important;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
#docx-container .docx-wrapper > section.docx {
|
|
142
|
+
box-shadow: none !important;
|
|
143
|
+
border: none !important;
|
|
144
|
+
border-radius: 0 !important;
|
|
145
|
+
margin: 0 !important;
|
|
146
|
+
padding: 2em !important;
|
|
147
|
+
background: white !important;
|
|
148
|
+
color: black !important;
|
|
149
|
+
max-width: 100% !important;
|
|
150
|
+
width: 100% !important;
|
|
151
|
+
min-width: 0 !important;
|
|
152
|
+
overflow-x: auto !important;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* Fix tables and wide content */
|
|
156
|
+
#docx-container table {
|
|
157
|
+
max-width: 100% !important;
|
|
158
|
+
width: auto !important;
|
|
159
|
+
overflow-x: auto !important;
|
|
160
|
+
display: block !important;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
#docx-container img {
|
|
164
|
+
max-width: 100% !important;
|
|
165
|
+
height: auto !important;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Fix paragraphs and text */
|
|
169
|
+
#docx-container p,
|
|
170
|
+
#docx-container span,
|
|
171
|
+
#docx-container div {
|
|
172
|
+
max-width: 100% !important;
|
|
173
|
+
word-wrap: break-word !important;
|
|
174
|
+
overflow-wrap: break-word !important;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Hide page breaks in web view */
|
|
178
|
+
#docx-container .docx-page-break {
|
|
179
|
+
display: none !important;
|
|
180
|
+
}
|
|
181
|
+
`;
|
|
182
|
+
container.appendChild(style);
|
|
183
|
+
} catch (error: any) {
|
|
184
|
+
console.error("Error rendering DOCX:", error);
|
|
185
|
+
this.error = error?.message || i18n("Failed to load document");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
override render(): TemplateResult {
|
|
190
|
+
if (this.error) {
|
|
191
|
+
return html`
|
|
192
|
+
<div class="h-full flex items-center justify-center bg-background p-4">
|
|
193
|
+
<div class="bg-destructive/10 border border-destructive text-destructive p-4 rounded-lg max-w-2xl">
|
|
194
|
+
<div class="font-medium mb-1">${i18n("Error loading document")}</div>
|
|
195
|
+
<div class="text-sm opacity-90">${this.error}</div>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
`;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return html`
|
|
202
|
+
<div class="h-full flex flex-col bg-background overflow-auto">
|
|
203
|
+
<div id="docx-container" class="flex-1 overflow-auto"></div>
|
|
204
|
+
</div>
|
|
205
|
+
`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
declare global {
|
|
210
|
+
interface HTMLElementTagNameMap {
|
|
211
|
+
"docx-artifact": DocxArtifact;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { DownloadButton } from "@mariozechner/mini-lit";
|
|
2
|
+
import { html, type TemplateResult } from "lit";
|
|
3
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
4
|
+
import * as XLSX from "xlsx";
|
|
5
|
+
import { i18n } from "../../utils/i18n.js";
|
|
6
|
+
import { ArtifactElement } from "./ArtifactElement.js";
|
|
7
|
+
|
|
8
|
+
@customElement("excel-artifact")
|
|
9
|
+
export class ExcelArtifact extends ArtifactElement {
|
|
10
|
+
@property({ type: String }) private _content = "";
|
|
11
|
+
@state() private error: string | null = null;
|
|
12
|
+
|
|
13
|
+
get content(): string {
|
|
14
|
+
return this._content;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
set content(value: string) {
|
|
18
|
+
this._content = value;
|
|
19
|
+
this.error = null;
|
|
20
|
+
this.requestUpdate();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected override createRenderRoot(): HTMLElement | DocumentFragment {
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override connectedCallback(): void {
|
|
28
|
+
super.connectedCallback();
|
|
29
|
+
this.style.display = "block";
|
|
30
|
+
this.style.height = "100%";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private base64ToArrayBuffer(base64: string): ArrayBuffer {
|
|
34
|
+
// Remove data URL prefix if present
|
|
35
|
+
let base64Data = base64;
|
|
36
|
+
if (base64.startsWith("data:")) {
|
|
37
|
+
const base64Match = base64.match(/base64,(.+)/);
|
|
38
|
+
if (base64Match) {
|
|
39
|
+
base64Data = base64Match[1];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const binaryString = atob(base64Data);
|
|
44
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
45
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
46
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
47
|
+
}
|
|
48
|
+
return bytes.buffer;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private decodeBase64(): Uint8Array {
|
|
52
|
+
let base64Data = this._content;
|
|
53
|
+
if (this._content.startsWith("data:")) {
|
|
54
|
+
const base64Match = this._content.match(/base64,(.+)/);
|
|
55
|
+
if (base64Match) {
|
|
56
|
+
base64Data = base64Match[1];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const binaryString = atob(base64Data);
|
|
61
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
62
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
63
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
64
|
+
}
|
|
65
|
+
return bytes;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private getMimeType(): string {
|
|
69
|
+
const ext = this.filename.split(".").pop()?.toLowerCase();
|
|
70
|
+
if (ext === "xls") return "application/vnd.ms-excel";
|
|
71
|
+
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public getHeaderButtons() {
|
|
75
|
+
return html`
|
|
76
|
+
<div class="flex items-center gap-1">
|
|
77
|
+
${DownloadButton({
|
|
78
|
+
content: this.decodeBase64(),
|
|
79
|
+
filename: this.filename,
|
|
80
|
+
mimeType: this.getMimeType(),
|
|
81
|
+
title: i18n("Download"),
|
|
82
|
+
})}
|
|
83
|
+
</div>
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
override async updated(changedProperties: Map<string, any>) {
|
|
88
|
+
super.updated(changedProperties);
|
|
89
|
+
|
|
90
|
+
if (changedProperties.has("_content") && this._content && !this.error) {
|
|
91
|
+
await this.renderExcel();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private async renderExcel() {
|
|
96
|
+
const container = this.querySelector("#excel-container");
|
|
97
|
+
if (!container || !this._content) return;
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const arrayBuffer = this.base64ToArrayBuffer(this._content);
|
|
101
|
+
const workbook = XLSX.read(arrayBuffer, { type: "array" });
|
|
102
|
+
|
|
103
|
+
container.innerHTML = "";
|
|
104
|
+
const wrapper = document.createElement("div");
|
|
105
|
+
wrapper.className = "overflow-auto h-full flex flex-col";
|
|
106
|
+
container.appendChild(wrapper);
|
|
107
|
+
|
|
108
|
+
// Create tabs for multiple sheets
|
|
109
|
+
if (workbook.SheetNames.length > 1) {
|
|
110
|
+
const tabContainer = document.createElement("div");
|
|
111
|
+
tabContainer.className = "flex gap-2 mb-4 border-b border-border sticky top-0 bg-background z-10";
|
|
112
|
+
|
|
113
|
+
const sheetContents: HTMLElement[] = [];
|
|
114
|
+
|
|
115
|
+
workbook.SheetNames.forEach((sheetName, index) => {
|
|
116
|
+
// Create tab button
|
|
117
|
+
const tab = document.createElement("button");
|
|
118
|
+
tab.textContent = sheetName;
|
|
119
|
+
tab.className =
|
|
120
|
+
index === 0
|
|
121
|
+
? "px-4 py-2 text-sm font-medium border-b-2 border-primary text-primary"
|
|
122
|
+
: "px-4 py-2 text-sm font-medium text-muted-foreground hover:text-foreground hover:border-b-2 hover:border-border transition-colors";
|
|
123
|
+
|
|
124
|
+
// Create sheet content
|
|
125
|
+
const sheetDiv = document.createElement("div");
|
|
126
|
+
sheetDiv.style.display = index === 0 ? "flex" : "none";
|
|
127
|
+
sheetDiv.className = "flex-1 overflow-auto";
|
|
128
|
+
sheetDiv.appendChild(this.renderExcelSheet(workbook.Sheets[sheetName], sheetName));
|
|
129
|
+
sheetContents.push(sheetDiv);
|
|
130
|
+
|
|
131
|
+
// Tab click handler
|
|
132
|
+
tab.onclick = () => {
|
|
133
|
+
// Update tab styles
|
|
134
|
+
tabContainer.querySelectorAll("button").forEach((btn, btnIndex) => {
|
|
135
|
+
if (btnIndex === index) {
|
|
136
|
+
btn.className = "px-4 py-2 text-sm font-medium border-b-2 border-primary text-primary";
|
|
137
|
+
} else {
|
|
138
|
+
btn.className =
|
|
139
|
+
"px-4 py-2 text-sm font-medium text-muted-foreground hover:text-foreground hover:border-b-2 hover:border-border transition-colors";
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// Show/hide sheets
|
|
143
|
+
sheetContents.forEach((content, contentIndex) => {
|
|
144
|
+
content.style.display = contentIndex === index ? "flex" : "none";
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
tabContainer.appendChild(tab);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
wrapper.appendChild(tabContainer);
|
|
152
|
+
sheetContents.forEach((content) => {
|
|
153
|
+
wrapper.appendChild(content);
|
|
154
|
+
});
|
|
155
|
+
} else {
|
|
156
|
+
// Single sheet
|
|
157
|
+
const sheetName = workbook.SheetNames[0];
|
|
158
|
+
wrapper.appendChild(this.renderExcelSheet(workbook.Sheets[sheetName], sheetName));
|
|
159
|
+
}
|
|
160
|
+
} catch (error: any) {
|
|
161
|
+
console.error("Error rendering Excel:", error);
|
|
162
|
+
this.error = error?.message || i18n("Failed to load spreadsheet");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private renderExcelSheet(worksheet: any, sheetName: string): HTMLElement {
|
|
167
|
+
const sheetDiv = document.createElement("div");
|
|
168
|
+
|
|
169
|
+
// Generate HTML table
|
|
170
|
+
const htmlTable = XLSX.utils.sheet_to_html(worksheet, { id: `sheet-${sheetName}` });
|
|
171
|
+
const tempDiv = document.createElement("div");
|
|
172
|
+
tempDiv.innerHTML = htmlTable;
|
|
173
|
+
|
|
174
|
+
// Find and style the table
|
|
175
|
+
const table = tempDiv.querySelector("table");
|
|
176
|
+
if (table) {
|
|
177
|
+
table.className = "w-full border-collapse text-foreground";
|
|
178
|
+
|
|
179
|
+
// Style all cells
|
|
180
|
+
table.querySelectorAll("td, th").forEach((cell) => {
|
|
181
|
+
const cellEl = cell as HTMLElement;
|
|
182
|
+
cellEl.className = "border border-border px-3 py-2 text-sm text-left";
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Style header row
|
|
186
|
+
const headerCells = table.querySelectorAll("thead th, tr:first-child td");
|
|
187
|
+
if (headerCells.length > 0) {
|
|
188
|
+
headerCells.forEach((th) => {
|
|
189
|
+
const thEl = th as HTMLElement;
|
|
190
|
+
thEl.className =
|
|
191
|
+
"border border-border px-3 py-2 text-sm font-semibold bg-muted text-foreground sticky top-0";
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Alternate row colors
|
|
196
|
+
table.querySelectorAll("tbody tr:nth-child(even)").forEach((row) => {
|
|
197
|
+
const rowEl = row as HTMLElement;
|
|
198
|
+
rowEl.className = "bg-muted/30";
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
sheetDiv.appendChild(table);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return sheetDiv;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
override render(): TemplateResult {
|
|
208
|
+
if (this.error) {
|
|
209
|
+
return html`
|
|
210
|
+
<div class="h-full flex items-center justify-center bg-background p-4">
|
|
211
|
+
<div class="bg-destructive/10 border border-destructive text-destructive p-4 rounded-lg max-w-2xl">
|
|
212
|
+
<div class="font-medium mb-1">${i18n("Error loading spreadsheet")}</div>
|
|
213
|
+
<div class="text-sm opacity-90">${this.error}</div>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
`;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return html`
|
|
220
|
+
<div class="h-full flex flex-col bg-background overflow-auto">
|
|
221
|
+
<div id="excel-container" class="flex-1 overflow-auto"></div>
|
|
222
|
+
</div>
|
|
223
|
+
`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
declare global {
|
|
228
|
+
interface HTMLElementTagNameMap {
|
|
229
|
+
"excel-artifact": ExcelArtifact;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { DownloadButton } from "@mariozechner/mini-lit";
|
|
2
|
+
import { html, type TemplateResult } from "lit";
|
|
3
|
+
import { customElement, property } from "lit/decorators.js";
|
|
4
|
+
import { i18n } from "../../utils/i18n.js";
|
|
5
|
+
import { ArtifactElement } from "./ArtifactElement.js";
|
|
6
|
+
|
|
7
|
+
@customElement("generic-artifact")
|
|
8
|
+
export class GenericArtifact extends ArtifactElement {
|
|
9
|
+
@property({ type: String }) private _content = "";
|
|
10
|
+
|
|
11
|
+
get content(): string {
|
|
12
|
+
return this._content;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
set content(value: string) {
|
|
16
|
+
this._content = value;
|
|
17
|
+
this.requestUpdate();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected override createRenderRoot(): HTMLElement | DocumentFragment {
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
override connectedCallback(): void {
|
|
25
|
+
super.connectedCallback();
|
|
26
|
+
this.style.display = "block";
|
|
27
|
+
this.style.height = "100%";
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private decodeBase64(): Uint8Array {
|
|
31
|
+
let base64Data = this._content;
|
|
32
|
+
if (this._content.startsWith("data:")) {
|
|
33
|
+
const base64Match = this._content.match(/base64,(.+)/);
|
|
34
|
+
if (base64Match) {
|
|
35
|
+
base64Data = base64Match[1];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const binaryString = atob(base64Data);
|
|
40
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
41
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
42
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
43
|
+
}
|
|
44
|
+
return bytes;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private getMimeType(): string {
|
|
48
|
+
const ext = this.filename.split(".").pop()?.toLowerCase();
|
|
49
|
+
// Add common MIME types
|
|
50
|
+
const mimeTypes: Record<string, string> = {
|
|
51
|
+
pdf: "application/pdf",
|
|
52
|
+
zip: "application/zip",
|
|
53
|
+
tar: "application/x-tar",
|
|
54
|
+
gz: "application/gzip",
|
|
55
|
+
rar: "application/vnd.rar",
|
|
56
|
+
"7z": "application/x-7z-compressed",
|
|
57
|
+
mp3: "audio/mpeg",
|
|
58
|
+
mp4: "video/mp4",
|
|
59
|
+
avi: "video/x-msvideo",
|
|
60
|
+
mov: "video/quicktime",
|
|
61
|
+
wav: "audio/wav",
|
|
62
|
+
ogg: "audio/ogg",
|
|
63
|
+
json: "application/json",
|
|
64
|
+
xml: "application/xml",
|
|
65
|
+
bin: "application/octet-stream",
|
|
66
|
+
};
|
|
67
|
+
return mimeTypes[ext || ""] || "application/octet-stream";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public getHeaderButtons() {
|
|
71
|
+
return html`
|
|
72
|
+
<div class="flex items-center gap-1">
|
|
73
|
+
${DownloadButton({
|
|
74
|
+
content: this.decodeBase64(),
|
|
75
|
+
filename: this.filename,
|
|
76
|
+
mimeType: this.getMimeType(),
|
|
77
|
+
title: i18n("Download"),
|
|
78
|
+
})}
|
|
79
|
+
</div>
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
override render(): TemplateResult {
|
|
84
|
+
return html`
|
|
85
|
+
<div class="h-full flex items-center justify-center bg-background p-8">
|
|
86
|
+
<div class="text-center max-w-md">
|
|
87
|
+
<div class="text-muted-foreground text-lg mb-4">
|
|
88
|
+
<svg
|
|
89
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
90
|
+
class="h-16 w-16 mx-auto mb-4 text-muted-foreground/50"
|
|
91
|
+
fill="none"
|
|
92
|
+
viewBox="0 0 24 24"
|
|
93
|
+
stroke="currentColor"
|
|
94
|
+
>
|
|
95
|
+
<path
|
|
96
|
+
stroke-linecap="round"
|
|
97
|
+
stroke-linejoin="round"
|
|
98
|
+
stroke-width="1.5"
|
|
99
|
+
d="M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"
|
|
100
|
+
/>
|
|
101
|
+
</svg>
|
|
102
|
+
<div class="font-medium text-foreground mb-2">${this.filename}</div>
|
|
103
|
+
<p class="text-sm">
|
|
104
|
+
${i18n("Preview not available for this file type.")} ${i18n("Click the download button above to view it on your computer.")}
|
|
105
|
+
</p>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
declare global {
|
|
114
|
+
interface HTMLElementTagNameMap {
|
|
115
|
+
"generic-artifact": GenericArtifact;
|
|
116
|
+
}
|
|
117
|
+
}
|