- emoji.js: Emoji-Replacement-Engine mit umfassendem Unicode 15.0 Regex - String-basiert (replaceEmojisWithFluent) in renderMarkdown() - DOM-basiert (parseFluentEmojis) als Post-Processing via TreeWalker - CDN: @lobehub/fluent-emoji-3d@1.1.0 via jsdelivr (WebP/3D) - Intelligenter Fallback: fe0f-Varianten, dann Original-Unicode - Fail-Cache verhindert wiederholte Requests für fehlende Emojis - User-Nachrichten werden jetzt als Markdown gerendert (renderMarkdown) - [Datei: ...] Refs: Platzhalter-Mechanismus vor Markdown-Parsing - Reply-Quotes bleiben durch Wrapper-Div erhalten - parseFluentEmojis an allen Render-Stellen integriert: addAssistantBubble, endStreamBubble, _renderUserTextContent, _renderSystemPromptBlocks, history._renderMessagesIntoFragment, history.loadLatestArchive - CSS: .fluent-emoji Klasse (1.2em, inline, scale 1.25) - CSS: white-space:pre-wrap nur noch für .msg:not(.markdown)
148 lines
2.2 KiB
CSS
148 lines
2.2 KiB
CSS
/* Markdown in Chat Bubbles */
|
|
|
|
.markdown {
|
|
white-space: normal;
|
|
}
|
|
|
|
.markdown > *:first-child {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.markdown > *:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.markdown p {
|
|
margin: 0 0 .5em 0;
|
|
}
|
|
|
|
.markdown p:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.markdown h1,
|
|
.markdown h2,
|
|
.markdown h3,
|
|
.markdown h4,
|
|
.markdown h5,
|
|
.markdown h6 {
|
|
margin: 1em 0 .5em 0;
|
|
}
|
|
|
|
.markdown h1:first-child,
|
|
.markdown h2:first-child,
|
|
.markdown h3:first-child {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.markdown h1 {
|
|
font-size: calc(var(--font-size) * 1.5);
|
|
padding-bottom: .125em;
|
|
border-bottom: 1px solid var(--f3-border);
|
|
}
|
|
|
|
.markdown h2 {
|
|
font-size: calc(var(--font-size) * 1.25);
|
|
}
|
|
|
|
.markdown ul,
|
|
.markdown ol {
|
|
margin: 0 0 .5em 0;
|
|
padding-left: 1.5em;
|
|
}
|
|
|
|
.markdown li {
|
|
margin-bottom: .25em;
|
|
}
|
|
|
|
.markdown li:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.markdown code {
|
|
background: var(--f3-bg);
|
|
border-radius: var(--border-radius);
|
|
padding: .1em .3em;
|
|
}
|
|
|
|
.markdown pre {
|
|
background: var(--f3-bg);
|
|
border: var(--border-width) solid var(--f3-border);
|
|
border-radius: var(--border-radius);
|
|
padding: .5em;
|
|
margin: 0 0 .5em 0;
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.markdown pre:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.markdown pre code {
|
|
background: none;
|
|
padding: 0;
|
|
}
|
|
|
|
.markdown blockquote {
|
|
border-left: 3px solid var(--f3-border);
|
|
margin: 0 0 .5em 0;
|
|
padding: .5em;
|
|
opacity: var(--semi-transparent);
|
|
}
|
|
|
|
.markdown blockquote:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.markdown hr {
|
|
border: none;
|
|
border-top: var(--border-width) solid var(--f3-border);
|
|
margin: .5em 0;
|
|
}
|
|
|
|
.markdown table {
|
|
border-collapse: collapse;
|
|
margin: 0 0 .5em 0;
|
|
width: 100%;
|
|
}
|
|
|
|
.markdown table:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.markdown th,
|
|
.markdown td {
|
|
border: var(--border-width) solid var(--f3-border);
|
|
padding: .5em;
|
|
text-align: left;
|
|
}
|
|
|
|
.markdown th {
|
|
background: var(--f3-bg);
|
|
}
|
|
|
|
.markdown a {
|
|
color: var(--primary);
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.markdown img {
|
|
max-width: 100%;
|
|
}
|
|
|
|
.markdown input[type="checkbox"] {
|
|
margin-right: .5em;
|
|
}
|
|
|
|
/* Fluent Emoji */
|
|
|
|
img.fluent-emoji {
|
|
display: inline-block;
|
|
height: 1.2em;
|
|
width: 1.2em;
|
|
vertical-align: -0.2em;
|
|
object-fit: contain;
|
|
margin: 0 .1em;
|
|
scale: 1.25;
|
|
}
|