netra-artifacts 0.1.0-alpha.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 +25 -0
- package/LICENSE +21 -0
- package/README.md +239 -0
- package/dist/artifacts/artifactEnvelope.d.ts +46 -0
- package/dist/artifacts/artifactEnvelope.d.ts.map +1 -0
- package/dist/artifacts/artifactEnvelope.js +217 -0
- package/dist/artifacts/artifactEnvelope.js.map +1 -0
- package/dist/artifacts/artifactStatus.d.ts +9 -0
- package/dist/artifacts/artifactStatus.d.ts.map +1 -0
- package/dist/artifacts/artifactStatus.js +10 -0
- package/dist/artifacts/artifactStatus.js.map +1 -0
- package/dist/artifacts/artifactStore.d.ts +15 -0
- package/dist/artifacts/artifactStore.d.ts.map +1 -0
- package/dist/artifacts/artifactStore.js +35 -0
- package/dist/artifacts/artifactStore.js.map +1 -0
- package/dist/artifacts/htmlArtifact.d.ts +10 -0
- package/dist/artifacts/htmlArtifact.d.ts.map +1 -0
- package/dist/artifacts/htmlArtifact.js +20 -0
- package/dist/artifacts/htmlArtifact.js.map +1 -0
- package/dist/artifacts/index.d.ts +5 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +5 -0
- package/dist/artifacts/index.js.map +1 -0
- package/dist/circuit-breaker/circuitBreaker.d.ts +35 -0
- package/dist/circuit-breaker/circuitBreaker.d.ts.map +1 -0
- package/dist/circuit-breaker/circuitBreaker.js +59 -0
- package/dist/circuit-breaker/circuitBreaker.js.map +1 -0
- package/dist/circuit-breaker/index.d.ts +3 -0
- package/dist/circuit-breaker/index.d.ts.map +1 -0
- package/dist/circuit-breaker/index.js +3 -0
- package/dist/circuit-breaker/index.js.map +1 -0
- package/dist/circuit-breaker/memoryCircuitStore.d.ts +24 -0
- package/dist/circuit-breaker/memoryCircuitStore.d.ts.map +1 -0
- package/dist/circuit-breaker/memoryCircuitStore.js +12 -0
- package/dist/circuit-breaker/memoryCircuitStore.js.map +1 -0
- package/dist/classifier/classifierPrompt.d.ts +7 -0
- package/dist/classifier/classifierPrompt.d.ts.map +1 -0
- package/dist/classifier/classifierPrompt.js +43 -0
- package/dist/classifier/classifierPrompt.js.map +1 -0
- package/dist/classifier/classifyMode.d.ts +21 -0
- package/dist/classifier/classifyMode.d.ts.map +1 -0
- package/dist/classifier/classifyMode.js +50 -0
- package/dist/classifier/classifyMode.js.map +1 -0
- package/dist/classifier/index.d.ts +4 -0
- package/dist/classifier/index.d.ts.map +1 -0
- package/dist/classifier/index.js +4 -0
- package/dist/classifier/index.js.map +1 -0
- package/dist/classifier/rules.d.ts +13 -0
- package/dist/classifier/rules.d.ts.map +1 -0
- package/dist/classifier/rules.js +118 -0
- package/dist/classifier/rules.js.map +1 -0
- package/dist/client/ArtifactChat.d.ts +15 -0
- package/dist/client/ArtifactChat.d.ts.map +1 -0
- package/dist/client/ArtifactChat.js +62 -0
- package/dist/client/ArtifactChat.js.map +1 -0
- package/dist/client/ArtifactMessage.d.ts +24 -0
- package/dist/client/ArtifactMessage.d.ts.map +1 -0
- package/dist/client/ArtifactMessage.js +29 -0
- package/dist/client/ArtifactMessage.js.map +1 -0
- package/dist/client/MarkdownMessage.d.ts +12 -0
- package/dist/client/MarkdownMessage.d.ts.map +1 -0
- package/dist/client/MarkdownMessage.js +141 -0
- package/dist/client/MarkdownMessage.js.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/useArtifactStream.d.ts +9 -0
- package/dist/client/useArtifactStream.d.ts.map +1 -0
- package/dist/client/useArtifactStream.js +210 -0
- package/dist/client/useArtifactStream.js.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +4 -0
- package/dist/client.js.map +1 -0
- package/dist/constants/defaults.d.ts +17 -0
- package/dist/constants/defaults.d.ts.map +1 -0
- package/dist/constants/defaults.js +38 -0
- package/dist/constants/defaults.js.map +1 -0
- package/dist/constants/events.d.ts +16 -0
- package/dist/constants/events.d.ts.map +1 -0
- package/dist/constants/events.js +16 -0
- package/dist/constants/events.js.map +1 -0
- package/dist/constants/index.d.ts +4 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +4 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/sandbox.d.ts +19 -0
- package/dist/constants/sandbox.d.ts.map +1 -0
- package/dist/constants/sandbox.js +24 -0
- package/dist/constants/sandbox.js.map +1 -0
- package/dist/core/createArtifactResponse.d.ts +5 -0
- package/dist/core/createArtifactResponse.d.ts.map +1 -0
- package/dist/core/createArtifactResponse.js +16 -0
- package/dist/core/createArtifactResponse.js.map +1 -0
- package/dist/core/createArtifactStream.d.ts +9 -0
- package/dist/core/createArtifactStream.d.ts.map +1 -0
- package/dist/core/createArtifactStream.js +34 -0
- package/dist/core/createArtifactStream.js.map +1 -0
- package/dist/core/createIds.d.ts +3 -0
- package/dist/core/createIds.d.ts.map +1 -0
- package/dist/core/createIds.js +13 -0
- package/dist/core/createIds.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lifecycle.d.ts +35 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +81 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/parseArtifactEnvelope.d.ts +2 -0
- package/dist/core/parseArtifactEnvelope.d.ts.map +1 -0
- package/dist/core/parseArtifactEnvelope.js +3 -0
- package/dist/core/parseArtifactEnvelope.js.map +1 -0
- package/dist/errors/ArtifactParseError.d.ts +10 -0
- package/dist/errors/ArtifactParseError.d.ts.map +1 -0
- package/dist/errors/ArtifactParseError.js +10 -0
- package/dist/errors/ArtifactParseError.js.map +1 -0
- package/dist/errors/ClassificationError.d.ts +13 -0
- package/dist/errors/ClassificationError.d.ts.map +1 -0
- package/dist/errors/ClassificationError.js +13 -0
- package/dist/errors/ClassificationError.js.map +1 -0
- package/dist/errors/StreamError.d.ts +11 -0
- package/dist/errors/StreamError.d.ts.map +1 -0
- package/dist/errors/StreamError.js +11 -0
- package/dist/errors/StreamError.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/iframe/HtmlArtifactCard.d.ts +9 -0
- package/dist/iframe/HtmlArtifactCard.d.ts.map +1 -0
- package/dist/iframe/HtmlArtifactCard.js +117 -0
- package/dist/iframe/HtmlArtifactCard.js.map +1 -0
- package/dist/iframe/HtmlArtifactCodeView.d.ts +7 -0
- package/dist/iframe/HtmlArtifactCodeView.d.ts.map +1 -0
- package/dist/iframe/HtmlArtifactCodeView.js +20 -0
- package/dist/iframe/HtmlArtifactCodeView.js.map +1 -0
- package/dist/iframe/HtmlArtifactModal.d.ts +16 -0
- package/dist/iframe/HtmlArtifactModal.d.ts.map +1 -0
- package/dist/iframe/HtmlArtifactModal.js +99 -0
- package/dist/iframe/HtmlArtifactModal.js.map +1 -0
- package/dist/iframe/HtmlArtifactPreview.d.ts +15 -0
- package/dist/iframe/HtmlArtifactPreview.d.ts.map +1 -0
- package/dist/iframe/HtmlArtifactPreview.js +214 -0
- package/dist/iframe/HtmlArtifactPreview.js.map +1 -0
- package/dist/iframe/HtmlArtifactToolbar.d.ts +20 -0
- package/dist/iframe/HtmlArtifactToolbar.d.ts.map +1 -0
- package/dist/iframe/HtmlArtifactToolbar.js +14 -0
- package/dist/iframe/HtmlArtifactToolbar.js.map +1 -0
- package/dist/iframe/iframeSizing.d.ts +22 -0
- package/dist/iframe/iframeSizing.d.ts.map +1 -0
- package/dist/iframe/iframeSizing.js +74 -0
- package/dist/iframe/iframeSizing.js.map +1 -0
- package/dist/iframe/iframeSrcDoc.d.ts +34 -0
- package/dist/iframe/iframeSrcDoc.d.ts.map +1 -0
- package/dist/iframe/iframeSrcDoc.js +236 -0
- package/dist/iframe/iframeSrcDoc.js.map +1 -0
- package/dist/iframe/index.d.ts +15 -0
- package/dist/iframe/index.d.ts.map +1 -0
- package/dist/iframe/index.js +9 -0
- package/dist/iframe/index.js.map +1 -0
- package/dist/iframe/styles.d.ts +10 -0
- package/dist/iframe/styles.d.ts.map +1 -0
- package/dist/iframe/styles.js +181 -0
- package/dist/iframe/styles.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/htmlArtifactPrompt.d.ts +15 -0
- package/dist/prompts/htmlArtifactPrompt.d.ts.map +1 -0
- package/dist/prompts/htmlArtifactPrompt.js +248 -0
- package/dist/prompts/htmlArtifactPrompt.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +4 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/markdownPrompt.d.ts +3 -0
- package/dist/prompts/markdownPrompt.d.ts.map +1 -0
- package/dist/prompts/markdownPrompt.js +10 -0
- package/dist/prompts/markdownPrompt.js.map +1 -0
- package/dist/prompts/systemPrompt.d.ts +3 -0
- package/dist/prompts/systemPrompt.d.ts.map +1 -0
- package/dist/prompts/systemPrompt.js +3 -0
- package/dist/prompts/systemPrompt.js.map +1 -0
- package/dist/sanitizer/dangerousPatterns.d.ts +41 -0
- package/dist/sanitizer/dangerousPatterns.d.ts.map +1 -0
- package/dist/sanitizer/dangerousPatterns.js +41 -0
- package/dist/sanitizer/dangerousPatterns.js.map +1 -0
- package/dist/sanitizer/index.d.ts +4 -0
- package/dist/sanitizer/index.d.ts.map +1 -0
- package/dist/sanitizer/index.js +4 -0
- package/dist/sanitizer/index.js.map +1 -0
- package/dist/sanitizer/sanitizeConfig.d.ts +4 -0
- package/dist/sanitizer/sanitizeConfig.d.ts.map +1 -0
- package/dist/sanitizer/sanitizeConfig.js +10 -0
- package/dist/sanitizer/sanitizeConfig.js.map +1 -0
- package/dist/sanitizer/sanitizeHtml.d.ts +20 -0
- package/dist/sanitizer/sanitizeHtml.d.ts.map +1 -0
- package/dist/sanitizer/sanitizeHtml.js +81 -0
- package/dist/sanitizer/sanitizeHtml.js.map +1 -0
- package/dist/server/config.d.ts +6 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +68 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/createArtifactStreamResponse.d.ts +9 -0
- package/dist/server/createArtifactStreamResponse.d.ts.map +1 -0
- package/dist/server/createArtifactStreamResponse.js +104 -0
- package/dist/server/createArtifactStreamResponse.js.map +1 -0
- package/dist/server/createHtmlArtifactStream.d.ts +30 -0
- package/dist/server/createHtmlArtifactStream.d.ts.map +1 -0
- package/dist/server/createHtmlArtifactStream.js +115 -0
- package/dist/server/createHtmlArtifactStream.js.map +1 -0
- package/dist/server/createMarkdownStream.d.ts +13 -0
- package/dist/server/createMarkdownStream.d.ts.map +1 -0
- package/dist/server/createMarkdownStream.js +27 -0
- package/dist/server/createMarkdownStream.js.map +1 -0
- package/dist/server/createSseResponse.d.ts +7 -0
- package/dist/server/createSseResponse.d.ts.map +1 -0
- package/dist/server/createSseResponse.js +11 -0
- package/dist/server/createSseResponse.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +12 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -0
- package/dist/stream/assembleDocument.d.ts +42 -0
- package/dist/stream/assembleDocument.d.ts.map +1 -0
- package/dist/stream/assembleDocument.js +104 -0
- package/dist/stream/assembleDocument.js.map +1 -0
- package/dist/stream/buffering.d.ts +37 -0
- package/dist/stream/buffering.d.ts.map +1 -0
- package/dist/stream/buffering.js +97 -0
- package/dist/stream/buffering.js.map +1 -0
- package/dist/stream/debounce.d.ts +12 -0
- package/dist/stream/debounce.d.ts.map +1 -0
- package/dist/stream/debounce.js +36 -0
- package/dist/stream/debounce.js.map +1 -0
- package/dist/stream/decoder.d.ts +17 -0
- package/dist/stream/decoder.d.ts.map +1 -0
- package/dist/stream/decoder.js +71 -0
- package/dist/stream/decoder.js.map +1 -0
- package/dist/stream/encoder.d.ts +12 -0
- package/dist/stream/encoder.d.ts.map +1 -0
- package/dist/stream/encoder.js +19 -0
- package/dist/stream/encoder.js.map +1 -0
- package/dist/stream/events.d.ts +20 -0
- package/dist/stream/events.d.ts.map +1 -0
- package/dist/stream/events.js +65 -0
- package/dist/stream/events.js.map +1 -0
- package/dist/stream/index.d.ts +9 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +9 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/predictiveHtmlParser.d.ts +52 -0
- package/dist/stream/predictiveHtmlParser.d.ts.map +1 -0
- package/dist/stream/predictiveHtmlParser.js +252 -0
- package/dist/stream/predictiveHtmlParser.js.map +1 -0
- package/dist/stream/sse.d.ts +7 -0
- package/dist/stream/sse.d.ts.map +1 -0
- package/dist/stream/sse.js +33 -0
- package/dist/stream/sse.js.map +1 -0
- package/dist/types/artifact.d.ts +88 -0
- package/dist/types/artifact.d.ts.map +1 -0
- package/dist/types/artifact.js +2 -0
- package/dist/types/artifact.js.map +1 -0
- package/dist/types/client.d.ts +98 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +2 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/config.d.ts +23 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +9 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +2 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/server.d.ts +111 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/types/server.js +2 -0
- package/dist/types/server.js.map +1 -0
- package/dist/types/stream.d.ts +60 -0
- package/dist/types/stream.d.ts.map +1 -0
- package/dist/types/stream.js +7 -0
- package/dist/types/stream.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/invariant.d.ts +6 -0
- package/dist/utils/invariant.d.ts.map +1 -0
- package/dist/utils/invariant.js +10 -0
- package/dist/utils/invariant.js.map +1 -0
- package/dist/utils/isBrowser.d.ts +3 -0
- package/dist/utils/isBrowser.d.ts.map +1 -0
- package/dist/utils/isBrowser.js +3 -0
- package/dist/utils/isBrowser.js.map +1 -0
- package/dist/utils/mergeConfig.d.ts +6 -0
- package/dist/utils/mergeConfig.d.ts.map +1 -0
- package/dist/utils/mergeConfig.js +17 -0
- package/dist/utils/mergeConfig.js.map +1 -0
- package/dist/utils/noop.d.ts +3 -0
- package/dist/utils/noop.d.ts.map +1 -0
- package/dist/utils/noop.js +3 -0
- package/dist/utils/noop.js.map +1 -0
- package/dist/utils/safeJsonParse.d.ts +7 -0
- package/dist/utils/safeJsonParse.d.ts.map +1 -0
- package/dist/utils/safeJsonParse.js +62 -0
- package/dist/utils/safeJsonParse.js.map +1 -0
- package/dist-cjs/artifacts/artifactEnvelope.js +224 -0
- package/dist-cjs/artifacts/artifactEnvelope.js.map +1 -0
- package/dist-cjs/artifacts/artifactStatus.js +14 -0
- package/dist-cjs/artifacts/artifactStatus.js.map +1 -0
- package/dist-cjs/artifacts/artifactStore.js +39 -0
- package/dist-cjs/artifacts/artifactStore.js.map +1 -0
- package/dist-cjs/artifacts/htmlArtifact.js +24 -0
- package/dist-cjs/artifacts/htmlArtifact.js.map +1 -0
- package/dist-cjs/artifacts/index.js +21 -0
- package/dist-cjs/artifacts/index.js.map +1 -0
- package/dist-cjs/circuit-breaker/circuitBreaker.js +63 -0
- package/dist-cjs/circuit-breaker/circuitBreaker.js.map +1 -0
- package/dist-cjs/circuit-breaker/index.js +19 -0
- package/dist-cjs/circuit-breaker/index.js.map +1 -0
- package/dist-cjs/circuit-breaker/memoryCircuitStore.js +16 -0
- package/dist-cjs/circuit-breaker/memoryCircuitStore.js.map +1 -0
- package/dist-cjs/classifier/classifierPrompt.js +47 -0
- package/dist-cjs/classifier/classifierPrompt.js.map +1 -0
- package/dist-cjs/classifier/classifyMode.js +53 -0
- package/dist-cjs/classifier/classifyMode.js.map +1 -0
- package/dist-cjs/classifier/index.js +20 -0
- package/dist-cjs/classifier/index.js.map +1 -0
- package/dist-cjs/classifier/rules.js +121 -0
- package/dist-cjs/classifier/rules.js.map +1 -0
- package/dist-cjs/client/ArtifactChat.js +98 -0
- package/dist-cjs/client/ArtifactChat.js.map +1 -0
- package/dist-cjs/client/ArtifactMessage.js +32 -0
- package/dist-cjs/client/ArtifactMessage.js.map +1 -0
- package/dist-cjs/client/MarkdownMessage.js +177 -0
- package/dist-cjs/client/MarkdownMessage.js.map +1 -0
- package/dist-cjs/client/index.js +20 -0
- package/dist-cjs/client/index.js.map +1 -0
- package/dist-cjs/client/useArtifactStream.js +246 -0
- package/dist-cjs/client/useArtifactStream.js.map +1 -0
- package/dist-cjs/client.js +20 -0
- package/dist-cjs/client.js.map +1 -0
- package/dist-cjs/constants/defaults.js +41 -0
- package/dist-cjs/constants/defaults.js.map +1 -0
- package/dist-cjs/constants/events.js +19 -0
- package/dist-cjs/constants/events.js.map +1 -0
- package/dist-cjs/constants/index.js +20 -0
- package/dist-cjs/constants/index.js.map +1 -0
- package/dist-cjs/constants/sandbox.js +27 -0
- package/dist-cjs/constants/sandbox.js.map +1 -0
- package/dist-cjs/core/createArtifactResponse.js +20 -0
- package/dist-cjs/core/createArtifactResponse.js.map +1 -0
- package/dist-cjs/core/createArtifactStream.js +37 -0
- package/dist-cjs/core/createArtifactStream.js.map +1 -0
- package/dist-cjs/core/createIds.js +17 -0
- package/dist-cjs/core/createIds.js.map +1 -0
- package/dist-cjs/core/index.js +22 -0
- package/dist-cjs/core/index.js.map +1 -0
- package/dist-cjs/core/lifecycle.js +86 -0
- package/dist-cjs/core/lifecycle.js.map +1 -0
- package/dist-cjs/core/parseArtifactEnvelope.js +8 -0
- package/dist-cjs/core/parseArtifactEnvelope.js.map +1 -0
- package/dist-cjs/errors/ArtifactParseError.js +14 -0
- package/dist-cjs/errors/ArtifactParseError.js.map +1 -0
- package/dist-cjs/errors/ClassificationError.js +17 -0
- package/dist-cjs/errors/ClassificationError.js.map +1 -0
- package/dist-cjs/errors/StreamError.js +15 -0
- package/dist-cjs/errors/StreamError.js.map +1 -0
- package/dist-cjs/errors/index.js +20 -0
- package/dist-cjs/errors/index.js.map +1 -0
- package/dist-cjs/iframe/HtmlArtifactCard.js +153 -0
- package/dist-cjs/iframe/HtmlArtifactCard.js.map +1 -0
- package/dist-cjs/iframe/HtmlArtifactCodeView.js +23 -0
- package/dist-cjs/iframe/HtmlArtifactCodeView.js.map +1 -0
- package/dist-cjs/iframe/HtmlArtifactModal.js +135 -0
- package/dist-cjs/iframe/HtmlArtifactModal.js.map +1 -0
- package/dist-cjs/iframe/HtmlArtifactPreview.js +250 -0
- package/dist-cjs/iframe/HtmlArtifactPreview.js.map +1 -0
- package/dist-cjs/iframe/HtmlArtifactToolbar.js +17 -0
- package/dist-cjs/iframe/HtmlArtifactToolbar.js.map +1 -0
- package/dist-cjs/iframe/iframeSizing.js +77 -0
- package/dist-cjs/iframe/iframeSizing.js.map +1 -0
- package/dist-cjs/iframe/iframeSrcDoc.js +241 -0
- package/dist-cjs/iframe/iframeSrcDoc.js.map +1 -0
- package/dist-cjs/iframe/index.js +22 -0
- package/dist-cjs/iframe/index.js.map +1 -0
- package/dist-cjs/iframe/styles.js +218 -0
- package/dist-cjs/iframe/styles.js.map +1 -0
- package/dist-cjs/index.js +52 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/prompts/htmlArtifactPrompt.js +252 -0
- package/dist-cjs/prompts/htmlArtifactPrompt.js.map +1 -0
- package/dist-cjs/prompts/index.js +20 -0
- package/dist-cjs/prompts/index.js.map +1 -0
- package/dist-cjs/prompts/markdownPrompt.js +13 -0
- package/dist-cjs/prompts/markdownPrompt.js.map +1 -0
- package/dist-cjs/prompts/systemPrompt.js +6 -0
- package/dist-cjs/prompts/systemPrompt.js.map +1 -0
- package/dist-cjs/sanitizer/dangerousPatterns.js +44 -0
- package/dist-cjs/sanitizer/dangerousPatterns.js.map +1 -0
- package/dist-cjs/sanitizer/index.js +43 -0
- package/dist-cjs/sanitizer/index.js.map +1 -0
- package/dist-cjs/sanitizer/sanitizeConfig.js +13 -0
- package/dist-cjs/sanitizer/sanitizeConfig.js.map +1 -0
- package/dist-cjs/sanitizer/sanitizeHtml.js +86 -0
- package/dist-cjs/sanitizer/sanitizeHtml.js.map +1 -0
- package/dist-cjs/server/config.js +72 -0
- package/dist-cjs/server/config.js.map +1 -0
- package/dist-cjs/server/createArtifactStreamResponse.js +107 -0
- package/dist-cjs/server/createArtifactStreamResponse.js.map +1 -0
- package/dist-cjs/server/createHtmlArtifactStream.js +119 -0
- package/dist-cjs/server/createHtmlArtifactStream.js.map +1 -0
- package/dist-cjs/server/createMarkdownStream.js +31 -0
- package/dist-cjs/server/createMarkdownStream.js.map +1 -0
- package/dist-cjs/server/createSseResponse.js +14 -0
- package/dist-cjs/server/createSseResponse.js.map +1 -0
- package/dist-cjs/server/index.js +34 -0
- package/dist-cjs/server/index.js.map +1 -0
- package/dist-cjs/server.js +19 -0
- package/dist-cjs/server.js.map +1 -0
- package/dist-cjs/stream/assembleDocument.js +109 -0
- package/dist-cjs/stream/assembleDocument.js.map +1 -0
- package/dist-cjs/stream/buffering.js +102 -0
- package/dist-cjs/stream/buffering.js.map +1 -0
- package/dist-cjs/stream/debounce.js +39 -0
- package/dist-cjs/stream/debounce.js.map +1 -0
- package/dist-cjs/stream/decoder.js +75 -0
- package/dist-cjs/stream/decoder.js.map +1 -0
- package/dist-cjs/stream/encoder.js +24 -0
- package/dist-cjs/stream/encoder.js.map +1 -0
- package/dist-cjs/stream/events.js +69 -0
- package/dist-cjs/stream/events.js.map +1 -0
- package/dist-cjs/stream/index.js +25 -0
- package/dist-cjs/stream/index.js.map +1 -0
- package/dist-cjs/stream/predictiveHtmlParser.js +256 -0
- package/dist-cjs/stream/predictiveHtmlParser.js.map +1 -0
- package/dist-cjs/stream/sse.js +36 -0
- package/dist-cjs/stream/sse.js.map +1 -0
- package/dist-cjs/types/artifact.js +3 -0
- package/dist-cjs/types/artifact.js.map +1 -0
- package/dist-cjs/types/client.js +3 -0
- package/dist-cjs/types/client.js.map +1 -0
- package/dist-cjs/types/config.js +3 -0
- package/dist-cjs/types/config.js.map +1 -0
- package/dist-cjs/types/errors.js +3 -0
- package/dist-cjs/types/errors.js.map +1 -0
- package/dist-cjs/types/index.js +3 -0
- package/dist-cjs/types/index.js.map +1 -0
- package/dist-cjs/types/server.js +3 -0
- package/dist-cjs/types/server.js.map +1 -0
- package/dist-cjs/types/stream.js +8 -0
- package/dist-cjs/types/stream.js.map +1 -0
- package/dist-cjs/utils/index.js +22 -0
- package/dist-cjs/utils/index.js.map +1 -0
- package/dist-cjs/utils/invariant.js +13 -0
- package/dist-cjs/utils/invariant.js.map +1 -0
- package/dist-cjs/utils/isBrowser.js +6 -0
- package/dist-cjs/utils/isBrowser.js.map +1 -0
- package/dist-cjs/utils/mergeConfig.js +20 -0
- package/dist-cjs/utils/mergeConfig.js.map +1 -0
- package/dist-cjs/utils/noop.js +7 -0
- package/dist-cjs/utils/noop.js.map +1 -0
- package/dist-cjs/utils/safeJsonParse.js +65 -0
- package/dist-cjs/utils/safeJsonParse.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlArtifactModal.js","sourceRoot":"","sources":["../../src/iframe/HtmlArtifactModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.HtmlArtifactPreview = HtmlArtifactPreview;
|
|
38
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
|
+
const React = __importStar(require("react"));
|
|
40
|
+
const styles_js_1 = require("./styles.js");
|
|
41
|
+
const assembleDocument_js_1 = require("../stream/assembleDocument.js");
|
|
42
|
+
const defaults_js_1 = require("../constants/defaults.js");
|
|
43
|
+
const mergeConfig_js_1 = require("../utils/mergeConfig.js");
|
|
44
|
+
const iframeSrcDoc_js_1 = require("./iframeSrcDoc.js");
|
|
45
|
+
const iframeSizing_js_1 = require("./iframeSizing.js");
|
|
46
|
+
function HtmlArtifactPreview(props) {
|
|
47
|
+
(0, styles_js_1.useArtifactStyles)();
|
|
48
|
+
const { html, streaming = false, errored = false, title, options, theme, bare = false } = props;
|
|
49
|
+
const opts = React.useMemo(() => (0, mergeConfig_js_1.mergeConfig)(defaults_js_1.DEFAULT_PREVIEW_OPTIONS, options), [options]);
|
|
50
|
+
const { ref: iframeRef, height, onLoad, measure } = (0, iframeSizing_js_1.useIframeAutoSize)({
|
|
51
|
+
enabled: opts.autoResize,
|
|
52
|
+
minHeight: opts.minHeight,
|
|
53
|
+
maxHeight: opts.maxHeight,
|
|
54
|
+
});
|
|
55
|
+
const [srcDoc, setSrcDoc] = React.useState("");
|
|
56
|
+
// Tracks the last document we rendered and whether the iframe has loaded once.
|
|
57
|
+
// Lets us update the *live* document in place while streaming instead of
|
|
58
|
+
// reassigning `srcDoc` (which fully reloads the frame and flashes blank).
|
|
59
|
+
const lastDocRef = React.useRef("");
|
|
60
|
+
const loadedRef = React.useRef(false);
|
|
61
|
+
// One persistent parser for the whole stream: each frame feeds only the new
|
|
62
|
+
// tail (O(n) total) instead of re-parsing the full accumulated HTML (O(n²)).
|
|
63
|
+
const projectorRef = React.useRef(null);
|
|
64
|
+
// Latest inputs, read by the throttled flush without re-subscribing it.
|
|
65
|
+
const stateRef = React.useRef({ html, streaming, opts });
|
|
66
|
+
React.useLayoutEffect(() => {
|
|
67
|
+
stateRef.current = { html, streaming, opts };
|
|
68
|
+
}, [html, streaming, opts]);
|
|
69
|
+
// Throttle bookkeeping: coalesce bursts of tokens into frame-aligned paints.
|
|
70
|
+
const schedRef = React.useRef({ raf: null, timer: null, last: 0 });
|
|
71
|
+
const handleLoad = React.useCallback(() => {
|
|
72
|
+
loadedRef.current = true;
|
|
73
|
+
onLoad();
|
|
74
|
+
}, [onLoad]);
|
|
75
|
+
// Commit a built document to the frame: patch the live DOM in place once the
|
|
76
|
+
// frame has loaded (no reload, no flash), else seed it via `srcDoc`.
|
|
77
|
+
const paint = React.useCallback((doc) => {
|
|
78
|
+
if (doc === lastDocRef.current)
|
|
79
|
+
return;
|
|
80
|
+
lastDocRef.current = doc;
|
|
81
|
+
const iframe = iframeRef.current;
|
|
82
|
+
if (loadedRef.current && iframe?.contentDocument) {
|
|
83
|
+
try {
|
|
84
|
+
patchIframeDocument(iframe.contentDocument, doc);
|
|
85
|
+
measure();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Fall back to a full reload if in-place patching isn't possible.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
setSrcDoc(doc);
|
|
93
|
+
}, [iframeRef, measure]);
|
|
94
|
+
// Build + paint from the newest inputs. Cheap parse work runs every call so
|
|
95
|
+
// the projector stays in sync; the expensive sanitize+DOM write is gated by
|
|
96
|
+
// the scheduler. Skipped frames are safe — the projector catches up the tail.
|
|
97
|
+
const flush = React.useCallback(() => {
|
|
98
|
+
schedRef.current.last = now();
|
|
99
|
+
const { html, streaming, opts } = stateRef.current;
|
|
100
|
+
if (!html)
|
|
101
|
+
return;
|
|
102
|
+
let finalHtml = html;
|
|
103
|
+
if (streaming) {
|
|
104
|
+
const projector = projectorRef.current ?? (projectorRef.current = new assembleDocument_js_1.StreamingHtmlProjector());
|
|
105
|
+
const assembled = projector.update(html);
|
|
106
|
+
if (!assembled.renderable)
|
|
107
|
+
return;
|
|
108
|
+
finalHtml = assembled.html;
|
|
109
|
+
}
|
|
110
|
+
const doc = (0, iframeSrcDoc_js_1.buildSrcDoc)(finalHtml, {
|
|
111
|
+
sanitize: opts.sanitize,
|
|
112
|
+
seamless: true,
|
|
113
|
+
camouflage: bare,
|
|
114
|
+
theme,
|
|
115
|
+
sanitizeOptions: opts,
|
|
116
|
+
});
|
|
117
|
+
paint(doc);
|
|
118
|
+
}, [paint, theme, bare]);
|
|
119
|
+
// Schedule a flush, throttled to at most once per `debounceMs` and aligned to
|
|
120
|
+
// an animation frame so rapid SSE deltas don't trigger a render storm.
|
|
121
|
+
const schedule = React.useCallback(() => {
|
|
122
|
+
const sched = schedRef.current;
|
|
123
|
+
if (sched.raf != null || sched.timer != null)
|
|
124
|
+
return; // already pending
|
|
125
|
+
const interval = stateRef.current.opts.debounceMs ?? 0;
|
|
126
|
+
const wait = Math.max(0, interval - (now() - sched.last));
|
|
127
|
+
const fire = () => {
|
|
128
|
+
sched.timer = null;
|
|
129
|
+
if (typeof requestAnimationFrame !== "undefined") {
|
|
130
|
+
sched.raf = requestAnimationFrame(() => {
|
|
131
|
+
sched.raf = null;
|
|
132
|
+
flush();
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
flush();
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
if (wait <= 0)
|
|
140
|
+
fire();
|
|
141
|
+
else
|
|
142
|
+
sched.timer = setTimeout(fire, wait);
|
|
143
|
+
}, [flush]);
|
|
144
|
+
React.useEffect(() => {
|
|
145
|
+
if (!html) {
|
|
146
|
+
lastDocRef.current = "";
|
|
147
|
+
loadedRef.current = false;
|
|
148
|
+
projectorRef.current?.reset();
|
|
149
|
+
cancelScheduled(schedRef.current);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (!streaming) {
|
|
153
|
+
// Authoritative final document: paint immediately, skip the throttle.
|
|
154
|
+
cancelScheduled(schedRef.current);
|
|
155
|
+
flush();
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
schedule();
|
|
159
|
+
}, [html, streaming, opts, flush, schedule]);
|
|
160
|
+
// Cancel any pending paint on unmount.
|
|
161
|
+
React.useEffect(() => () => cancelScheduled(schedRef.current), []);
|
|
162
|
+
const sandbox = React.useMemo(() => (0, iframeSrcDoc_js_1.resolveSandbox)(opts), [opts]);
|
|
163
|
+
// In bare/seamless mode the host surface shows through: no background, no
|
|
164
|
+
// skeleton box, no progress bar — just the transparent artifact inline.
|
|
165
|
+
const showSkeleton = !html && !errored && !bare;
|
|
166
|
+
const minHeight = bare ? 0 : opts.minHeight;
|
|
167
|
+
const iframeSrcDoc = html ? srcDoc : "";
|
|
168
|
+
return ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
169
|
+
position: "relative",
|
|
170
|
+
width: "100%",
|
|
171
|
+
background: bare ? "transparent" : "var(--aha-bg)",
|
|
172
|
+
minHeight,
|
|
173
|
+
maxHeight: opts.autoResize ? undefined : opts.maxHeight,
|
|
174
|
+
overflow: opts.autoResize ? "hidden" : "auto",
|
|
175
|
+
transition: "height 0.15s ease-out",
|
|
176
|
+
height: opts.autoResize ? height : undefined,
|
|
177
|
+
}, children: [streaming && !bare && (0, jsx_runtime_1.jsx)("div", { className: "aha-progress", "aria-hidden": true }), (0, jsx_runtime_1.jsx)("iframe", { ref: iframeRef, srcDoc: iframeSrcDoc, title: title || "Artifact preview", sandbox: sandbox, onLoad: handleLoad, allowTransparency: true, scrolling: opts.autoResize ? "no" : "auto", style: {
|
|
178
|
+
display: "block",
|
|
179
|
+
width: "100%",
|
|
180
|
+
height: opts.autoResize ? height : "100%",
|
|
181
|
+
minHeight,
|
|
182
|
+
border: "none",
|
|
183
|
+
background: "transparent",
|
|
184
|
+
// In camouflage, stop the browser compositing a light/dark canvas
|
|
185
|
+
// behind the transparent document, so the host surface shows through.
|
|
186
|
+
colorScheme: bare ? "normal" : undefined,
|
|
187
|
+
pointerEvents: streaming && !iframeSrcDoc ? "none" : "auto",
|
|
188
|
+
opacity: showSkeleton ? 0 : 1,
|
|
189
|
+
transition: "opacity 0.2s ease",
|
|
190
|
+
} }), showSkeleton && ((0, jsx_runtime_1.jsxs)("div", { className: "aha-skel", style: { minHeight: opts.minHeight }, children: [(0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" }), (0, jsx_runtime_1.jsx)("div", { className: "row" })] })), errored && ((0, jsx_runtime_1.jsx)("div", { className: "aha-overlay", style: {
|
|
191
|
+
position: html ? "absolute" : "relative",
|
|
192
|
+
inset: html ? 0 : undefined,
|
|
193
|
+
minHeight: html ? undefined : opts.minHeight,
|
|
194
|
+
}, children: (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { style: { fontWeight: 600, color: "var(--aha-fg)", marginBottom: 4 }, children: "Preview unavailable" }), html ? "Showing the last valid snapshot." : "The artifact could not be rendered."] }) }))] }));
|
|
195
|
+
}
|
|
196
|
+
/** Monotonic-ish clock; falls back to Date.now where performance is absent. */
|
|
197
|
+
function now() {
|
|
198
|
+
return typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
199
|
+
}
|
|
200
|
+
/** Cancel any pending rAF/timeout held in the scheduler record. */
|
|
201
|
+
function cancelScheduled(sched) {
|
|
202
|
+
if (sched.raf != null && typeof cancelAnimationFrame !== "undefined") {
|
|
203
|
+
cancelAnimationFrame(sched.raf);
|
|
204
|
+
}
|
|
205
|
+
if (sched.timer != null)
|
|
206
|
+
clearTimeout(sched.timer);
|
|
207
|
+
sched.raf = null;
|
|
208
|
+
sched.timer = null;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Apply an already-built, sanitized full document into a live same-origin iframe
|
|
212
|
+
* without reloading it. We replace the `<head>` styles and `<body>` contents in
|
|
213
|
+
* place; the `<body>` node itself persists, so the auto-size ResizeObserver keeps
|
|
214
|
+
* firing and the frame never flashes blank. Parsing happens in the parent via
|
|
215
|
+
* `DOMParser`, which never executes scripts.
|
|
216
|
+
*/
|
|
217
|
+
function patchIframeDocument(target, fullDoc) {
|
|
218
|
+
if (typeof DOMParser === "undefined" || !target.body) {
|
|
219
|
+
throw new Error("in-place patch unavailable");
|
|
220
|
+
}
|
|
221
|
+
const parsed = new DOMParser().parseFromString(fullDoc, "text/html");
|
|
222
|
+
if (!parsed.body)
|
|
223
|
+
throw new Error("no body in parsed document");
|
|
224
|
+
if (target.head && parsed.head && target.head.innerHTML !== parsed.head.innerHTML) {
|
|
225
|
+
target.head.innerHTML = parsed.head.innerHTML;
|
|
226
|
+
}
|
|
227
|
+
// Mirror root/body attributes. Camouflage puts transparent background and CSS
|
|
228
|
+
// variables on <html style="...">, so missing this makes the live preview
|
|
229
|
+
// diverge from PDF/static renders.
|
|
230
|
+
mirrorAttributes(target.documentElement, parsed.documentElement);
|
|
231
|
+
mirrorAttributes(target.body, parsed.body);
|
|
232
|
+
if (target.body.innerHTML !== parsed.body.innerHTML) {
|
|
233
|
+
target.body.innerHTML = parsed.body.innerHTML;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function mirrorAttributes(target, source) {
|
|
237
|
+
const sourceNames = new Set();
|
|
238
|
+
for (const attr of Array.from(source.attributes)) {
|
|
239
|
+
sourceNames.add(attr.name);
|
|
240
|
+
if (target.getAttribute(attr.name) !== attr.value) {
|
|
241
|
+
target.setAttribute(attr.name, attr.value);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
for (const attr of Array.from(target.attributes)) {
|
|
245
|
+
if (!sourceNames.has(attr.name)) {
|
|
246
|
+
target.removeAttribute(attr.name);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=HtmlArtifactPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlArtifactPreview.js","sourceRoot":"","sources":["../../src/iframe/HtmlArtifactPreview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.HtmlArtifactToolbar = HtmlArtifactToolbar;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const Icon = {
|
|
7
|
+
copy: ((0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [(0, jsx_runtime_1.jsx)("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2.5" }), (0, jsx_runtime_1.jsx)("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] })),
|
|
8
|
+
check: ((0, jsx_runtime_1.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.6", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: (0, jsx_runtime_1.jsx)("polyline", { points: "20 6 9 17 4 12" }) })),
|
|
9
|
+
download: ((0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [(0, jsx_runtime_1.jsx)("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }), (0, jsx_runtime_1.jsx)("polyline", { points: "7 10 12 15 17 10" }), (0, jsx_runtime_1.jsx)("line", { x1: "12", y1: "15", x2: "12", y2: "3" })] })),
|
|
10
|
+
expand: ((0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [(0, jsx_runtime_1.jsx)("polyline", { points: "15 3 21 3 21 9" }), (0, jsx_runtime_1.jsx)("polyline", { points: "9 21 3 21 3 15" }), (0, jsx_runtime_1.jsx)("line", { x1: "21", y1: "3", x2: "14", y2: "10" }), (0, jsx_runtime_1.jsx)("line", { x1: "3", y1: "21", x2: "10", y2: "14" })] })),
|
|
11
|
+
pdf: ((0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [(0, jsx_runtime_1.jsx)("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), (0, jsx_runtime_1.jsx)("polyline", { points: "14 2 14 8 20 8" }), (0, jsx_runtime_1.jsx)("path", { d: "M9 15h1.2a1.3 1.3 0 0 0 0-2.6H9V18" }), (0, jsx_runtime_1.jsx)("path", { d: "M15.5 12.4H14V18" }), (0, jsx_runtime_1.jsx)("path", { d: "M14 15.4h1.3" })] })),
|
|
12
|
+
};
|
|
13
|
+
function HtmlArtifactToolbar(props) {
|
|
14
|
+
const { title, tab, onTabChange, allowCopy = true, allowDownload = true, allowPdf = true, allowFullscreen = true, copied = false, onCopy, onDownload, onDownloadPdf, onFullscreen, streaming = false, showDots = true, } = props;
|
|
15
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "aha-toolbar", children: [showDots && ((0, jsx_runtime_1.jsxs)("span", { className: "aha-dots", "aria-hidden": true, children: [(0, jsx_runtime_1.jsx)("span", { className: "aha-dot", style: { background: "#ff5f57" } }), (0, jsx_runtime_1.jsx)("span", { className: "aha-dot", style: { background: "#febc2e" } }), (0, jsx_runtime_1.jsx)("span", { className: "aha-dot", style: { background: "#28c840" } })] })), streaming && (0, jsx_runtime_1.jsx)("span", { className: "aha-stream-dot", "aria-label": "streaming" }), (0, jsx_runtime_1.jsx)("span", { className: "aha-title", title: title, children: title }), (0, jsx_runtime_1.jsx)("div", { style: { flex: 1 } }), (0, jsx_runtime_1.jsxs)("div", { className: "aha-seg", role: "tablist", "aria-label": "Artifact view", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", role: "tab", "aria-selected": tab === "preview", "data-active": tab === "preview", onClick: () => onTabChange("preview"), children: "Preview" }), (0, jsx_runtime_1.jsx)("button", { type: "button", role: "tab", "aria-selected": tab === "code", "data-active": tab === "code", onClick: () => onTabChange("code"), children: "Code" })] }), allowCopy && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onCopy, title: "Copy HTML", "aria-label": "Copy HTML", children: copied ? Icon.check : Icon.copy })), allowDownload && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onDownload, title: "Download HTML", "aria-label": "Download HTML", children: Icon.download })), allowPdf && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onDownloadPdf, title: "Download PDF", "aria-label": "Download PDF", children: Icon.pdf })), allowFullscreen && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "aha-iconbtn", onClick: onFullscreen, title: "Fullscreen", "aria-label": "Open fullscreen", children: Icon.expand }))] }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=HtmlArtifactToolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlArtifactToolbar.js","sourceRoot":"","sources":["../../src/iframe/HtmlArtifactToolbar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useIframeAutoSize = useIframeAutoSize;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
/**
|
|
6
|
+
* Auto-size an iframe to its full content height so the artifact never shows an
|
|
7
|
+
* inner scrollbar — the page provides the single scroll. This requires reading
|
|
8
|
+
* the framed document, which works when the sandbox includes `allow-same-origin`
|
|
9
|
+
* (the default here). No scripts run inside the frame, so this stays safe.
|
|
10
|
+
*
|
|
11
|
+
* Measurement is resilient: it re-measures on load, on every content reflow
|
|
12
|
+
* (ResizeObserver), and after web fonts finish loading (which changes height).
|
|
13
|
+
* If the document is cross-origin/opaque it falls back to `minHeight`.
|
|
14
|
+
*/
|
|
15
|
+
function useIframeAutoSize(options = {}) {
|
|
16
|
+
const { enabled = true, minHeight = 420, maxHeight = 900 } = options;
|
|
17
|
+
const ref = (0, react_1.useRef)(null);
|
|
18
|
+
const observerRef = (0, react_1.useRef)(null);
|
|
19
|
+
const [height, setHeight] = (0, react_1.useState)(minHeight);
|
|
20
|
+
const measure = (0, react_1.useCallback)(() => {
|
|
21
|
+
if (!enabled)
|
|
22
|
+
return;
|
|
23
|
+
const iframe = ref.current;
|
|
24
|
+
if (!iframe)
|
|
25
|
+
return;
|
|
26
|
+
try {
|
|
27
|
+
const doc = iframe.contentDocument;
|
|
28
|
+
const body = doc?.body;
|
|
29
|
+
const root = doc?.documentElement;
|
|
30
|
+
if (!body || !root)
|
|
31
|
+
return; // opaque origin — keep min height
|
|
32
|
+
const measured = Math.max(body.scrollHeight, body.offsetHeight, root.scrollHeight, Math.ceil(root.getBoundingClientRect().height));
|
|
33
|
+
if (!measured)
|
|
34
|
+
return;
|
|
35
|
+
const clamped = Math.min(Math.max(measured, minHeight), maxHeight);
|
|
36
|
+
setHeight((prev) => (Math.abs(prev - clamped) > 1 ? clamped : prev));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Cross-origin / sandboxed without same-origin — leave at min height.
|
|
40
|
+
}
|
|
41
|
+
}, [enabled, minHeight, maxHeight]);
|
|
42
|
+
const onLoad = (0, react_1.useCallback)(() => {
|
|
43
|
+
const iframe = ref.current;
|
|
44
|
+
measure();
|
|
45
|
+
// Track reflow inside the frame (content streaming in, font swaps, etc.).
|
|
46
|
+
try {
|
|
47
|
+
const doc = iframe?.contentDocument;
|
|
48
|
+
const root = doc?.documentElement;
|
|
49
|
+
observerRef.current?.disconnect();
|
|
50
|
+
if (root && typeof ResizeObserver !== "undefined") {
|
|
51
|
+
const ro = new ResizeObserver(() => measure());
|
|
52
|
+
ro.observe(root);
|
|
53
|
+
if (doc?.body)
|
|
54
|
+
ro.observe(doc.body);
|
|
55
|
+
observerRef.current = ro;
|
|
56
|
+
}
|
|
57
|
+
// Re-measure once web fonts have loaded (height usually grows).
|
|
58
|
+
const fonts = doc?.fonts;
|
|
59
|
+
fonts?.ready?.then(() => measure()).catch(() => { });
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* opaque origin */
|
|
63
|
+
}
|
|
64
|
+
// A couple of delayed passes catch late layout (images, slow fonts).
|
|
65
|
+
const t1 = setTimeout(measure, 60);
|
|
66
|
+
const t2 = setTimeout(measure, 240);
|
|
67
|
+
return () => {
|
|
68
|
+
clearTimeout(t1);
|
|
69
|
+
clearTimeout(t2);
|
|
70
|
+
};
|
|
71
|
+
}, [measure]);
|
|
72
|
+
(0, react_1.useEffect)(() => {
|
|
73
|
+
return () => observerRef.current?.disconnect();
|
|
74
|
+
}, []);
|
|
75
|
+
return { ref, height, onLoad, measure };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=iframeSizing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframeSizing.js","sourceRoot":"","sources":["../../src/iframe/iframeSizing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.themeToCss = themeToCss;
|
|
4
|
+
exports.buildSrcDoc = buildSrcDoc;
|
|
5
|
+
exports.resolveSandbox = resolveSandbox;
|
|
6
|
+
const sanitizeHtml_js_1 = require("../sanitizer/sanitizeHtml.js");
|
|
7
|
+
const artifactEnvelope_js_1 = require("../artifacts/artifactEnvelope.js");
|
|
8
|
+
const sandbox_js_1 = require("../constants/sandbox.js");
|
|
9
|
+
/**
|
|
10
|
+
* Minimal reset injected for the framed (pure artifact) path: margin/box-sizing
|
|
11
|
+
* only. It must NOT force a background — a standalone artifact owns its own
|
|
12
|
+
* background (often set inline on <html>/<body>), and an !important transparent
|
|
13
|
+
* rule here would override it and reveal the card surface (a white sheet in
|
|
14
|
+
* light mode). Camouflage transparency is handled separately by
|
|
15
|
+
* {@link inlineCamouflageHtml}.
|
|
16
|
+
*/
|
|
17
|
+
const SEAMLESS_BASE = `<style>html,body{margin:0;padding:0;}*{box-sizing:border-box;}</style>`;
|
|
18
|
+
const LIGHT_COLOR = /(?:#fff(?:fff)?\b|#f[0-9a-f]{2}f[0-9a-f]{2}f[0-9a-f]{2}\b|#(?:f8fafc|f9fafb|f8f9fa|f5f5f5|f4f4f5|f3f4f6|f1f5f9|fafafa|fcfcfd|fdfdfd)\b|white\b|rgba?\(\s*(?:23[0-9]|24[0-9]|25[0-5])\s*,\s*(?:23[0-9]|24[0-9]|25[0-5])\s*,\s*(?:23[0-9]|24[0-9]|25[0-5])(?:\s*,\s*(?:0?\.[5-9]\d*|1(?:\.0+)?))?\s*\)|hsla?\(\s*(?:0|[12]?\d{1,2}|3[0-5]\d|360)\s*,\s*(?:0|[1-9]\d?|100)%\s*,\s*(?:8[8-9]|9\d|100)%[^)]*\))/i;
|
|
19
|
+
const LIGHT_GRADIENT = /(?:linear|radial|conic)-gradient\([^;}]*(?:#fff(?:fff)?\b|white\b|rgba?\(\s*255\s*,\s*255\s*,\s*255)[^;}]*\)/i;
|
|
20
|
+
/**
|
|
21
|
+
* Render a host {@link ArtifactTheme} into a `<style>` block exposing its values
|
|
22
|
+
* as CSS custom properties inside the iframe, plus sensible base color/font so
|
|
23
|
+
* artifacts inherit the host look. Background is intentionally left transparent
|
|
24
|
+
* (the host surface shows through — essential for seamless mode).
|
|
25
|
+
*/
|
|
26
|
+
function themeToCss(theme) {
|
|
27
|
+
const vars = [];
|
|
28
|
+
const push = (name, value) => {
|
|
29
|
+
if (value)
|
|
30
|
+
vars.push(`${name}:${value}`);
|
|
31
|
+
};
|
|
32
|
+
push("--background", theme.background);
|
|
33
|
+
push("--foreground", theme.foreground);
|
|
34
|
+
push("--primary", theme.primary);
|
|
35
|
+
push("--accent", theme.accent);
|
|
36
|
+
push("--muted", theme.muted);
|
|
37
|
+
push("--border", theme.border);
|
|
38
|
+
push("--surface", theme.surface);
|
|
39
|
+
push("--radius", theme.radius);
|
|
40
|
+
push("--font", theme.fontFamily);
|
|
41
|
+
const root = vars.length ? `:root{${vars.join(";")}}` : "";
|
|
42
|
+
const base = [];
|
|
43
|
+
if (theme.foreground)
|
|
44
|
+
base.push("color:var(--foreground)");
|
|
45
|
+
if (theme.fontFamily)
|
|
46
|
+
base.push("font-family:var(--font)");
|
|
47
|
+
const baseRule = base.length ? `html,body{${base.join(";")}}` : "";
|
|
48
|
+
if (!root && !baseRule)
|
|
49
|
+
return "";
|
|
50
|
+
return `<style>${root}${baseRule}</style>`;
|
|
51
|
+
}
|
|
52
|
+
/** True if the string already looks like a full HTML document. */
|
|
53
|
+
function isFullDocument(html) {
|
|
54
|
+
return /<html[\s>]/i.test(html) || /<!DOCTYPE/i.test(html);
|
|
55
|
+
}
|
|
56
|
+
function injectIntoHead(doc, injection) {
|
|
57
|
+
if (/<\/head\s*>/i.test(doc)) {
|
|
58
|
+
return doc.replace(/<\/head\s*>/i, `${injection}</head>`);
|
|
59
|
+
}
|
|
60
|
+
if (/<head[^>]*>/i.test(doc)) {
|
|
61
|
+
return doc.replace(/<head([^>]*)>/i, `<head$1>${injection}`);
|
|
62
|
+
}
|
|
63
|
+
if (/<html[^>]*>/i.test(doc)) {
|
|
64
|
+
return doc.replace(/<html([^>]*)>/i, `<html$1><head>${injection}</head>`);
|
|
65
|
+
}
|
|
66
|
+
return injection + doc;
|
|
67
|
+
}
|
|
68
|
+
function themeToInlineVars(theme) {
|
|
69
|
+
if (!theme)
|
|
70
|
+
return "";
|
|
71
|
+
const vars = [];
|
|
72
|
+
const push = (name, value) => {
|
|
73
|
+
if (value)
|
|
74
|
+
vars.push(`${name}:${value}`);
|
|
75
|
+
};
|
|
76
|
+
push("--background", theme.background);
|
|
77
|
+
push("--foreground", theme.foreground);
|
|
78
|
+
push("--primary", theme.primary);
|
|
79
|
+
push("--accent", theme.accent);
|
|
80
|
+
push("--muted", theme.muted);
|
|
81
|
+
push("--border", theme.border);
|
|
82
|
+
push("--surface", theme.surface);
|
|
83
|
+
push("--radius", theme.radius);
|
|
84
|
+
push("--font", theme.fontFamily);
|
|
85
|
+
return vars.join(";");
|
|
86
|
+
}
|
|
87
|
+
function normalizeCamouflageHtml(html) {
|
|
88
|
+
return html
|
|
89
|
+
.replace(/<style\b([^>]*)>([\s\S]*?)<\/style>/gi, (_tag, attrs, css) => {
|
|
90
|
+
return `<style${attrs}>${normalizeCamouflageCss(css)}</style>`;
|
|
91
|
+
})
|
|
92
|
+
.replace(/\sstyle\s*=\s*(["'])([\s\S]*?)\1/gi, (_attr, quote, css) => {
|
|
93
|
+
const normalized = normalizeInlineCamouflageStyle(css);
|
|
94
|
+
return normalized ? ` style=${quote}${normalized}${quote}` : "";
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const CAMOUFLAGE_TAGS = /<(html|body|main|section|article|aside|header|footer|nav|form|div)\b([^>]*)>/gi;
|
|
98
|
+
function appendInlineStyle(attrs, style) {
|
|
99
|
+
if (!style)
|
|
100
|
+
return attrs;
|
|
101
|
+
const styleAttr = attrs.match(/\sstyle\s*=\s*(["'])([\s\S]*?)\1/i);
|
|
102
|
+
if (!styleAttr)
|
|
103
|
+
return `${attrs} style="${style}"`;
|
|
104
|
+
const quote = styleAttr[1] ?? `"`;
|
|
105
|
+
const existing = styleAttr[2]?.trim();
|
|
106
|
+
const merged = existing ? `${existing};${style}` : style;
|
|
107
|
+
return attrs.replace(/\sstyle\s*=\s*(["'])([\s\S]*?)\1/i, ` style=${quote}${merged}${quote}`);
|
|
108
|
+
}
|
|
109
|
+
function inlineCamouflageHtml(html, theme) {
|
|
110
|
+
const themeVars = themeToInlineVars(theme);
|
|
111
|
+
const rootStyle = [
|
|
112
|
+
themeVars,
|
|
113
|
+
"margin:0!important",
|
|
114
|
+
"padding:0!important",
|
|
115
|
+
"background:transparent!important",
|
|
116
|
+
"background-color:transparent!important",
|
|
117
|
+
"background-image:none!important",
|
|
118
|
+
"color-scheme:normal!important",
|
|
119
|
+
"box-sizing:border-box",
|
|
120
|
+
"color:var(--foreground,#f4f4f8)!important",
|
|
121
|
+
theme?.fontFamily ? "font-family:var(--font)!important" : "",
|
|
122
|
+
]
|
|
123
|
+
.filter(Boolean)
|
|
124
|
+
.join(";");
|
|
125
|
+
const bodyStyle = [
|
|
126
|
+
"margin:0!important",
|
|
127
|
+
"padding:0!important",
|
|
128
|
+
"background:transparent!important",
|
|
129
|
+
"background-color:transparent!important",
|
|
130
|
+
"background-image:none!important",
|
|
131
|
+
"box-sizing:border-box",
|
|
132
|
+
"color:var(--foreground,#f4f4f8)!important",
|
|
133
|
+
theme?.fontFamily ? "font-family:var(--font)!important" : "",
|
|
134
|
+
]
|
|
135
|
+
.filter(Boolean)
|
|
136
|
+
.join(";");
|
|
137
|
+
const blockStyle = [
|
|
138
|
+
"background-color:transparent!important",
|
|
139
|
+
"background-image:none!important",
|
|
140
|
+
"box-sizing:border-box",
|
|
141
|
+
"color:var(--foreground,#f4f4f8)!important",
|
|
142
|
+
"border-color:var(--border,rgba(255,255,255,0.12))!important",
|
|
143
|
+
].join(";");
|
|
144
|
+
return html.replace(CAMOUFLAGE_TAGS, (tag, name, attrs) => {
|
|
145
|
+
const lowerName = name.toLowerCase();
|
|
146
|
+
if (lowerName === "html")
|
|
147
|
+
return `<${name}${appendInlineStyle(attrs, rootStyle)}>`;
|
|
148
|
+
if (lowerName === "body")
|
|
149
|
+
return `<${name}${appendInlineStyle(attrs, bodyStyle)}>`;
|
|
150
|
+
return `<${name}${appendInlineStyle(attrs, blockStyle)}>`;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function normalizeInlineCamouflageStyle(style) {
|
|
154
|
+
return style
|
|
155
|
+
.split(";")
|
|
156
|
+
.map((declaration) => normalizeCamouflageDeclaration(declaration))
|
|
157
|
+
.filter(Boolean)
|
|
158
|
+
.join(";");
|
|
159
|
+
}
|
|
160
|
+
function normalizeCamouflageCss(css) {
|
|
161
|
+
return css
|
|
162
|
+
.replace(/([^{}]+)\{([^{}]*)\}/g, (rule, selector, body) => {
|
|
163
|
+
const normalizedBody = body
|
|
164
|
+
.split(";")
|
|
165
|
+
.map((declaration) => normalizeCamouflageDeclaration(declaration, /\b(html|body)\b/i.test(selector)))
|
|
166
|
+
.filter(Boolean)
|
|
167
|
+
.join(";");
|
|
168
|
+
return normalizedBody ? `${selector}{${normalizedBody}}` : rule;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function normalizeCamouflageDeclaration(declaration, forceTransparent = false) {
|
|
172
|
+
const trimmed = declaration.trim();
|
|
173
|
+
if (!trimmed)
|
|
174
|
+
return "";
|
|
175
|
+
const match = trimmed.match(/^(-?[\w-]+)\s*:\s*([\s\S]+)$/);
|
|
176
|
+
if (!match)
|
|
177
|
+
return trimmed;
|
|
178
|
+
const property = match[1]?.toLowerCase() ?? "";
|
|
179
|
+
const value = match[2] ?? "";
|
|
180
|
+
const important = /!important/i.test(value) ? " !important" : "";
|
|
181
|
+
const cleanValue = value.replace(/!important/gi, "").trim();
|
|
182
|
+
if (property === "background-image" && (forceTransparent || LIGHT_GRADIENT.test(cleanValue) || LIGHT_COLOR.test(cleanValue))) {
|
|
183
|
+
return `${property}:none${important}`;
|
|
184
|
+
}
|
|
185
|
+
if (property.startsWith("--") && LIGHT_COLOR.test(cleanValue)) {
|
|
186
|
+
return `${property}:transparent`;
|
|
187
|
+
}
|
|
188
|
+
if (property === "background" || property === "background-color") {
|
|
189
|
+
if (forceTransparent)
|
|
190
|
+
return `${property}:transparent${important}`;
|
|
191
|
+
if (LIGHT_COLOR.test(cleanValue) || LIGHT_GRADIENT.test(cleanValue)) {
|
|
192
|
+
return `${property}:transparent${important}`;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (property === "color" && LIGHT_COLOR.test(cleanValue)) {
|
|
196
|
+
return `${property}:var(--foreground,#f4f4f8)${important}`;
|
|
197
|
+
}
|
|
198
|
+
return trimmed;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Produce the final `srcDoc` string for the preview iframe: sanitized (by
|
|
202
|
+
* default), wrapped into a complete document if needed, with seamless base
|
|
203
|
+
* styles and `<base target="_blank">` so any links open in a new tab.
|
|
204
|
+
*/
|
|
205
|
+
function buildSrcDoc(rawHtml, options = {}) {
|
|
206
|
+
const { sanitize = true, seamless = true, camouflage = false, theme, sanitizeOptions } = options;
|
|
207
|
+
let html = (0, artifactEnvelope_js_1.cleanArtifactHtml)(rawHtml ?? "");
|
|
208
|
+
if (sanitize) {
|
|
209
|
+
html = (0, sanitizeHtml_js_1.sanitizeHtml)(html, { ...sanitizeOptions, allowScripts: false }).html;
|
|
210
|
+
}
|
|
211
|
+
if (camouflage) {
|
|
212
|
+
html = normalizeCamouflageHtml(html);
|
|
213
|
+
}
|
|
214
|
+
const themeStyles = theme && !camouflage ? themeToCss(theme) : "";
|
|
215
|
+
const injection = `<base target="_blank" />${seamless && !camouflage ? SEAMLESS_BASE : ""}${themeStyles}`;
|
|
216
|
+
let doc;
|
|
217
|
+
if (isFullDocument(html)) {
|
|
218
|
+
doc = injectIntoHead(html, injection);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
doc = `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" />${injection}</head><body>${html}</body></html>`;
|
|
222
|
+
}
|
|
223
|
+
return camouflage ? inlineCamouflageHtml(doc, theme) : doc;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Resolve the sandbox attribute. An explicit `sandbox` wins; otherwise we build
|
|
227
|
+
* a minimal token set from the flags. Forbidden tokens (notably `allow-scripts`)
|
|
228
|
+
* are stripped no matter what.
|
|
229
|
+
*/
|
|
230
|
+
function resolveSandbox(options) {
|
|
231
|
+
const explicit = options.sandbox;
|
|
232
|
+
if (explicit !== undefined) {
|
|
233
|
+
return explicit
|
|
234
|
+
.split(/\s+/)
|
|
235
|
+
.filter(Boolean)
|
|
236
|
+
.filter((t) => !sandbox_js_1.FORBIDDEN_SANDBOX_TOKENS.includes(t))
|
|
237
|
+
.join(" ");
|
|
238
|
+
}
|
|
239
|
+
return options.allowForms === false ? "" : sandbox_js_1.DEFAULT_SANDBOX;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=iframeSrcDoc.js.map
|