From dd91b45ca84e29de270e723056141cf7fd4775c1 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Wed, 22 Apr 2026 23:48:57 -0500 Subject: [PATCH] add embedding rich content --- src/lib/helpers/enums.js | 1 + src/lib/helpers/types/conversationTypes.js | 27 ++++++ src/lib/scss/app.scss | 1 + .../scss/custom/components/_rich_content.scss | 89 +++++++++++++++++++ .../rich-content/rc-embedding.svelte | 50 +++++++++++ .../rich-content/rich-content.svelte | 12 +-- 6 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 src/lib/scss/custom/components/_rich_content.scss create mode 100644 src/routes/chat/[agentId]/[conversationId]/rich-content/rc-embedding.svelte diff --git a/src/lib/helpers/enums.js b/src/lib/helpers/enums.js index 001111ac..5a1a526e 100644 --- a/src/lib/helpers/enums.js +++ b/src/lib/helpers/enums.js @@ -29,6 +29,7 @@ const richType = { Generic: 'generic_template', Upload: 'upload_template', ProgramCode: 'program_code', + Embedding: 'embedding_template' } export const RichType = Object.freeze(richType); diff --git a/src/lib/helpers/types/conversationTypes.js b/src/lib/helpers/types/conversationTypes.js index 82d2c68f..d4834297 100644 --- a/src/lib/helpers/types/conversationTypes.js +++ b/src/lib/helpers/types/conversationTypes.js @@ -127,6 +127,33 @@ IRichContent.prototype.code_script; */ IRichContent.prototype.language; +/** + * The URL of the embedding rich content. + * + * @name url + * @type {string} + * @instance + */ +IRichContent.prototype.url; + +/** + * The title of the embedding rich content. + * + * @name title + * @type {string} + * @instance + */ +IRichContent.prototype.title; + +/** + * The html tag of the embedding rich content. + * + * @name html_tag + * @type {string} + * @instance + */ +IRichContent.prototype.html_tag; + /** * @typedef {Object} TextMessage diff --git a/src/lib/scss/app.scss b/src/lib/scss/app.scss index a9bb31c0..459d337c 100644 --- a/src/lib/scss/app.scss +++ b/src/lib/scss/app.scss @@ -47,6 +47,7 @@ File: Main Css File @import "custom/components/markdown"; @import "custom/components/state"; @import "custom/components/codeScript"; +@import "custom/components/rich_content"; /* Plugins */ @import "custom/plugins/custom-scrollbar"; diff --git a/src/lib/scss/custom/components/_rich_content.scss b/src/lib/scss/custom/components/_rich_content.scss new file mode 100644 index 00000000..ccb2fc74 --- /dev/null +++ b/src/lib/scss/custom/components/_rich_content.scss @@ -0,0 +1,89 @@ +.rc-embedding-wrapper { + width: 100%; + margin-top: 8px; + display: flex; + flex-direction: column; + align-items: center; + + .rc-embedding-toggle-group { + display: inline-flex; + align-items: center; + gap: 6px; + } + + .rc-embedding-link { + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--bs-info, #50a5f1); + font-size: 16px; + transition: color 0.2s ease; + text-decoration: none; + + &:hover { + color: darken(#50a5f1, 15%); + } + } + + .rc-embedding-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + margin: 0 auto; + width: auto; + background: linear-gradient(135deg, rgba(244, 106, 106, 0.08), rgba(244, 106, 106, 0.15)); + border: 1px solid rgba(244, 106, 106, 0.2); + border-radius: 20px; + cursor: pointer; + padding: 6px 16px; + font-size: 13px; + font-weight: 500; + color: var(--bs-danger, #f46a6a); + user-select: none; + transition: all 0.25s ease; + backdrop-filter: blur(4px); + + &:hover { + background: linear-gradient(135deg, rgba(244, 106, 106, 0.15), rgba(244, 106, 106, 0.25)); + border-color: rgba(244, 106, 106, 0.4); + box-shadow: 0 2px 8px rgba(244, 106, 106, 0.2); + transform: translateY(-1px); + } + + &:active { + transform: translateY(0); + box-shadow: none; + } + + &.closed { + background: linear-gradient(135deg, rgba(52, 195, 143, 0.08), rgba(52, 195, 143, 0.15)); + border-color: rgba(52, 195, 143, 0.2); + color: var(--bs-success, #34c38f); + + &:hover { + background: linear-gradient(135deg, rgba(52, 195, 143, 0.15), rgba(52, 195, 143, 0.25)); + border-color: rgba(52, 195, 143, 0.4); + box-shadow: 0 2px 8px rgba(52, 195, 143, 0.2); + } + } + } + + .rc-embedding-container { + width: 100%; + border-radius: 8px; + display: flex; + justify-content: center; + overflow: auto; + scrollbar-width: thin; + + .rc-embedding-iframe { + width: fit-content; + min-width: 100%; + max-height: 800px; + min-height: 500px; + border: 1px solid var(--bs-border-color, #dee2e6); + border-radius: 8px; + } + } +} diff --git a/src/routes/chat/[agentId]/[conversationId]/rich-content/rc-embedding.svelte b/src/routes/chat/[agentId]/[conversationId]/rich-content/rc-embedding.svelte new file mode 100644 index 00000000..7b40a032 --- /dev/null +++ b/src/routes/chat/[agentId]/[conversationId]/rich-content/rc-embedding.svelte @@ -0,0 +1,50 @@ + + +{#if htmlTag && url} +
+{/if} + diff --git a/src/routes/chat/[agentId]/[conversationId]/rich-content/rich-content.svelte b/src/routes/chat/[agentId]/[conversationId]/rich-content/rich-content.svelte index 76653a03..80c95834 100644 --- a/src/routes/chat/[agentId]/[conversationId]/rich-content/rich-content.svelte +++ b/src/routes/chat/[agentId]/[conversationId]/rich-content/rich-content.svelte @@ -2,6 +2,7 @@ import { EditorType, RichType } from "$lib/helpers/enums"; import RcPlainOptions from "./rc-plain-options.svelte"; import RcComplexOptions from "./rc-complex-options.svelte"; + import RcEmbedding from "./rc-embedding.svelte"; import ChatAttachmentOptions from "../chat-util/chat-attachment-options.svelte"; /** @@ -47,13 +48,12 @@ - {#if message?.rich_content?.editor === EditorType.File}