@admin-layout/tailwind-chat-pro 12.2.5-alpha.16 → 12.2.5-alpha.20
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 +6 -0
- package/lib/components/messages-container-ui/ModernMessageGroup.d.ts +1 -0
- package/lib/components/messages-container-ui/ModernMessageGroup.d.ts.map +1 -1
- package/lib/components/messages-container-ui/ModernMessageGroup.js +62 -17
- package/lib/components/messages-container-ui/ModernMessageGroup.js.map +1 -1
- package/lib/components/messages-container-ui/markdownTables.d.ts +25 -0
- package/lib/components/messages-container-ui/markdownTables.d.ts.map +1 -0
- package/lib/components/messages-container-ui/markdownTables.js +103 -0
- package/lib/components/messages-container-ui/markdownTables.js.map +1 -0
- package/package.json +6 -7
- package/src/__tests__/stubs/common-graphql.ts +2 -0
- package/src/__tests__/stubs/common.ts +5 -0
- package/src/__tests__/stubs/components-pro.ts +2 -0
- package/src/components/messages-container-ui/ModernMessageGroup.tsx +67 -19
- package/src/components/messages-container-ui/__tests__/markdownTables.test.tsx +94 -0
- package/src/components/messages-container-ui/markdownTables.ts +108 -0
- package/vitest.config.ts +17 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [12.2.5-alpha.20](https://github.com/CDEBase/admin-layout/compare/v12.2.5-alpha.19...v12.2.5-alpha.20) (2026-10-14)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **tailwind-chat-pro:** a markdown table never splits a number to fit ([ac6a7ef](https://github.com/CDEBase/admin-layout/commit/ac6a7ef045753fd7f4c720fb79ec4d066f54d7a7))
|
|
11
|
+
|
|
6
12
|
## [12.2.5-alpha.16](https://github.com/CDEBase/admin-layout/compare/v12.2.5-alpha.15...v12.2.5-alpha.16) (2026-10-10)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @admin-layout/tailwind-chat-pro
|
|
@@ -4,6 +4,7 @@ export declare function AssistantResponseWrapper({ children, bubbleClassName, }:
|
|
|
4
4
|
children: React.ReactNode;
|
|
5
5
|
bubbleClassName?: string;
|
|
6
6
|
}): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare const htmlContentStyles = "\n .html-content {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n color: inherit;\n }\n\n .html-content h1, .html-content h2, .html-content h3, .html-content h4, .html-content h5, .html-content h6 {\n margin-top: 1.5rem;\n margin-bottom: 1rem;\n font-weight: 600;\n line-height: 1.25;\n color: inherit;\n }\n \n .html-content h1 {\n font-size: 1.875rem;\n border-bottom: 2px solid #e5e7eb;\n padding-bottom: 0.5rem;\n }\n .llm-response-theme {\n --llm-content-max-width: 100%;\n --llm-font-sans: 'Avenir Next', 'Segoe UI', sans-serif;\n --llm-font-mono: 'IBM Plex Mono', 'SFMono-Regular', Menlo, Consolas, monospace;\n --llm-color-bg: #ffffff;\n --llm-color-surface: #f6f7f8;\n --llm-color-surface-2: #eef1f4;\n --llm-color-surface-hover: #e9edf2;\n --llm-color-border: #e3e7ee;\n --llm-color-border-strong: #cfd7e3;\n --llm-color-text: #121926;\n --llm-color-text-secondary: #667085;\n --llm-color-marker: #8e98a8;\n --llm-color-link-underline: rgba(18, 25, 38, 0.18);\n --llm-color-code-bg: rgba(249, 115, 22, 0.1);\n --llm-color-code-text: #d96b00;\n --llm-color-code-block-border: #ebeef3;\n --llm-shadow-soft: 0 1px 2px rgba(18, 25, 38, 0.04), 0 10px 32px rgba(18, 25, 38, 0.05);\n --llm-table-scroll-shadow: rgba(18, 25, 38, 0.14);\n --llm-radius-bubble: 1.5rem;\n --llm-radius-code: 0.85rem;\n --llm-line-height-body: 1.62;\n --llm-line-height-mobile: 1.55;\n --llm-line-height-heading: 1.35;\n --llm-space-heading-top: 1.45rem;\n --llm-space-heading-bottom: 0.75rem;\n --llm-space-paragraph: 1rem;\n --llm-space-list: 0.9rem;\n color: inherit;\n background: transparent;\n }\n\n /* The app's dark mode is a `dark` class on <html> (design-pro toggles it); nothing sets\n data-color-mode, so without `.dark` a reply's table stayed a white card on a dark page. */\n .llm-response-theme[data-color-mode='dark'],\n [data-color-mode='dark'] .llm-response-theme,\n .dark .llm-response-theme {\n --llm-color-bg: #0f1115;\n --llm-color-surface: #171a20;\n --llm-color-surface-2: #1f2530;\n --llm-color-surface-hover: #232a36;\n --llm-color-border: #2a3240;\n --llm-color-border-strong: #364052;\n --llm-color-text: #f3f5f8;\n --llm-color-text-secondary: #aab3c2;\n --llm-color-marker: #7f8999;\n --llm-color-link-underline: rgba(243, 245, 248, 0.24);\n --llm-color-code-bg: rgba(251, 146, 60, 0.14);\n --llm-color-code-text: #ffb36b;\n --llm-color-code-block-border: #262d39;\n --llm-shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.28), 0 14px 36px rgba(0, 0, 0, 0.3);\n --llm-table-scroll-shadow: rgba(0, 0, 0, 0.55);\n }\n\n .llm-response {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n width: 100%;\n max-width: var(--llm-content-max-width);\n font-family: var(--llm-font-sans);\n color: inherit;\n }\n\n .llm-response__bubble {\n position: relative;\n width: 100%;\n min-height: 1.75rem;\n border-radius: var(--llm-radius-bubble);\n color: inherit;\n /* Long tokens (paths, URLs) wrap rather than widen the chat. Same behaviour as the\n legacy `word-break: break-word` this replaces; tables opt out (see TABLE_STYLES). */\n overflow-wrap: anywhere;\n }\n\n .llm-response__markdown {\n position: relative;\n width: 100%;\n max-width: none;\n color: inherit;\n font-size: 1rem;\n line-height: var(--llm-line-height-body);\n }\n\n .llm-response__markdown > :first-child {\n margin-top: 0;\n }\n\n .llm-response__markdown > :last-child {\n margin-bottom: 0;\n }\n\n .llm-response__markdown p,\n .llm-response__markdown li,\n .llm-response__markdown th,\n .llm-response__markdown td,\n .llm-response__markdown blockquote,\n .llm-response__markdown.html-content,\n .llm-response__markdown.assistant-html-content {\n color: inherit;\n }\n\n .llm-response__markdown p,\n .llm-response__markdown.html-content p,\n .llm-response__markdown.assistant-html-content p {\n margin: 0 0 var(--llm-space-paragraph);\n white-space: pre-wrap;\n }\n\n .llm-response__markdown h1,\n .llm-response__markdown h2,\n .llm-response__markdown h3,\n .llm-response__markdown h4,\n .llm-response__markdown h5,\n .llm-response__markdown h6 {\n margin: var(--llm-space-heading-top) 0 var(--llm-space-heading-bottom);\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: var(--llm-line-height-heading);\n color: inherit;\n }\n\n .llm-response__markdown h1 { font-size: 1.75rem; }\n .llm-response__markdown h2 { font-size: 1.5rem; }\n .llm-response__markdown h3 { font-size: 1.25rem; }\n .llm-response__markdown h4 { font-size: 1.05rem; }\n\n .llm-response__markdown strong,\n .llm-response__markdown b {\n font-weight: 600;\n color: inherit;\n }\n\n .llm-response__markdown em,\n .llm-response__markdown i {\n color: var(--llm-color-text-secondary);\n }\n\n .llm-response__markdown a {\n color: currentColor;\n text-decoration: underline;\n text-decoration-color: var(--llm-color-link-underline);\n text-underline-offset: 0.18em;\n transition: color 120ms ease, text-decoration-color 120ms ease;\n }\n\n .llm-response__markdown a:hover {\n color: inherit;\n text-decoration-color: currentColor;\n }\n\n .llm-response__markdown ul,\n .llm-response__markdown ol {\n margin: 0.35rem 0 var(--llm-space-list);\n padding-left: 1.15rem;\n }\n\n .llm-response__markdown ul {\n list-style-type: disc;\n }\n\n .llm-response__markdown ol {\n list-style-type: decimal;\n /* Wider gutter so multi-digit markers (e.g. \"60.\") aren't clipped at the\n content's left edge \u2014 long numbered content (verse, step lists) showed\n \"0.\" for line 60. */\n padding-left: 2rem;\n }\n\n .llm-response__markdown li {\n margin: 0.28rem 0;\n padding-inline-start: 0.1rem;\n /* `normal` collapses the stray \"\\n\" react-markdown inserts between <li>\n and its child <p>; with `pre-wrap` that newline rendered as a blank\n first line, stranding the marker above its text. Intra-paragraph\n whitespace is preserved by the `li > p` rule below. */\n white-space: normal;\n }\n\n /* Loose list items wrap their text in <p>. Keep pre-wrap for the text but\n drop the paragraph margins so each item is a single tight line \u2014 fixes\n poems / verse the model emits as numbered lists rendering as a sprawling,\n double-spaced listicle. */\n .llm-response__markdown li > p {\n margin-top: 0;\n white-space: pre-wrap;\n }\n\n .llm-response__markdown li > p:last-child {\n margin-bottom: 0;\n }\n\n .llm-response__markdown li > ul,\n .llm-response__markdown li > ol {\n margin-top: 0.35rem;\n margin-bottom: 0.15rem;\n white-space: normal;\n }\n\n .llm-response__markdown ::marker {\n color: var(--llm-color-marker);\n }\n\n .llm-response__markdown hr {\n margin: 1.25rem 0;\n border: 0;\n border-top: 1px solid var(--llm-color-border);\n }\n\n .llm-response__markdown blockquote {\n margin: 1rem 0;\n padding: 0.2rem 0 0.2rem 1rem;\n border-left: 2px solid var(--llm-color-border-strong);\n background: transparent;\n color: var(--llm-color-text-secondary);\n }\n\n .llm-response__markdown blockquote p {\n margin-bottom: 0;\n color: inherit;\n }\n\n .llm-response__markdown :not(pre) > code,\n .llm-response__markdown .llm-inline-code {\n display: inline-block;\n padding: 0.08rem 0.38rem;\n border: 0;\n border-radius: 0.32rem;\n font-family: var(--llm-font-mono);\n font-size: 0.875em;\n line-height: 1.45;\n background: var(--llm-color-code-bg);\n color: var(--llm-color-code-text);\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n }\n\n /* The card is the scroll box around the table, so a table wider than the reply scrolls\n inside a card that keeps its rounded edges on screen. It is also the size container the\n narrow-table rule below measures, and so never widens the reply. */\n .llm-response__markdown .llm-table-scroll {\n margin: 1rem 0 1.1rem;\n border: 1px solid var(--llm-color-border);\n border-radius: 1rem;\n box-shadow: var(--llm-shadow-soft);\n container-type: inline-size;\n }\n\n .llm-response__markdown table {\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n }\n\n .llm-response__markdown thead {\n background: var(--llm-color-surface);\n }\n\n .llm-response__markdown th,\n .llm-response__markdown td {\n padding: 0.85rem 1rem;\n border-bottom: 1px solid var(--llm-color-border);\n text-align: left;\n vertical-align: top;\n }\n\n /* A column the markdown aligns (`|---:|`, `|:---:|`) keeps that alignment. */\n .llm-response__markdown th[align='right'],\n .llm-response__markdown td[align='right'] {\n text-align: right;\n }\n\n .llm-response__markdown th[align='center'],\n .llm-response__markdown td[align='center'] {\n text-align: center;\n }\n\n .llm-response__markdown th {\n font-size: 0.8rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--llm-color-text-secondary);\n background: var(--llm-color-surface);\n }\n\n .llm-response__markdown td {\n color: var(--llm-color-text);\n background: var(--llm-color-bg);\n }\n\n .llm-response__markdown tbody tr:last-child td {\n border-bottom: 0;\n }\n\n @media (max-width: 768px) {\n .llm-response__markdown {\n font-size: 0.95rem;\n line-height: var(--llm-line-height-mobile);\n }\n\n .llm-response__markdown th,\n .llm-response__markdown td {\n padding: 0.75rem 0.8rem;\n }\n }\n\n /* The same tighter cells in a narrow chat pane on a wide screen, which the viewport query\n above never sees: the table measures its own card. */\n @container (max-width: 30rem) {\n .llm-response__markdown th,\n .llm-response__markdown td {\n padding: 0.75rem 0.8rem;\n }\n }\n\n /* The user pill is drawn by .user-message. A shared global class (.message-container, from\n * @messenger-box/tailwind-ui-inbox) ships its own background and padding, so neutralize it\n * inside the pill. (This comment had lost its opening, which turned the rule below into an\n * invalid selector that never applied.)\n */\n .user-message .message-container {\n background: transparent !important;\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n margin: 0 !important;\n transition: none !important;\n box-shadow: none !important;\n }\n\n /* Safety net: long unbroken tokens (file paths, CSS selectors, URLs) inside a\n pasted user query must never push the bubble past its own width \u2014 wrap\n anywhere rather than overflow the card. */\n .user-message,\n .user-message * {\n max-width: 100%;\n overflow-wrap: anywhere;\n }\n\n .llm-table-scroll {\n max-width: 100%;\n overflow-x: auto;\n }\n\n /* The box carries the spacing: a scroll box never collapses its child's margins, so a\n table's own (prose gives it 1em) would show as an empty band inside the box. */\n .llm-table-scroll > table {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n .llm-table-scroll table,\n .llm-table-scroll table * {\n word-break: normal;\n overflow-wrap: normal;\n }\n\n .llm-table-scroll th,\n .llm-table-scroll td {\n font-variant-numeric: tabular-nums;\n }\n\n /* A cut-off column alone reads as a finished table (or as a number split in two), so a side\n that has more columns to scroll to carries a soft shadow. Both shadows are pinned to the\n box's edges (sticky, in the table's grid cell) and fade with the scroll position; a table\n that fits has no scroll timeline, so neither shows. Where the browser cannot tie an\n animation to scrolling, the box scrolls without the cue. */\n @supports (animation-timeline: scroll()) {\n .llm-table-scroll {\n display: grid;\n scroll-timeline: --llm-table-scroll inline;\n }\n\n .llm-table-scroll > table,\n .llm-table-scroll::before,\n .llm-table-scroll::after {\n grid-area: 1 / 1;\n }\n\n .llm-table-scroll::before,\n .llm-table-scroll::after {\n content: '';\n position: sticky;\n z-index: 1;\n width: 0.875rem;\n pointer-events: none;\n opacity: 0;\n }\n\n .llm-table-scroll::before {\n left: 0;\n justify-self: start;\n background: linear-gradient(to right, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);\n animation: llm-table-scroll-start linear both;\n animation-timeline: --llm-table-scroll;\n }\n\n .llm-table-scroll::after {\n right: 0;\n justify-self: end;\n background: linear-gradient(to left, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);\n animation: llm-table-scroll-end linear both;\n animation-timeline: --llm-table-scroll;\n }\n }\n\n @keyframes llm-table-scroll-start {\n 0% { opacity: 0; }\n 6%, 100% { opacity: 1; }\n }\n\n @keyframes llm-table-scroll-end {\n 0%, 94% { opacity: 1; }\n 100% { opacity: 0; }\n }\n\n /* Assistant replies must read as plain text on the page \u2014 no card. A shared\n global class (.message-container, from @messenger-box/tailwind-ui-inbox)\n ships its own pill background/padding; neutralize it here the same way the\n user bubble already does above. */\n .llm-response-theme,\n .llm-response,\n .llm-response__bubble,\n .llm-response-theme .message-container {\n background: transparent !important;\n box-shadow: none !important;\n }\n .llm-response-theme .message-container {\n padding: 0 !important;\n margin: 0 !important;\n }\n\n /* Code block container styling */\n .code-block-container {\n background: #ffffff;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n overflow: hidden;\n margin: 1rem 0;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);\n }\n \n .code-block-header {\n background: #f9fafb;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid #e5e7eb;\n font-weight: 600;\n color: #374151;\n font-size: 0.875rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n \n";
|
|
7
8
|
interface ModernMessageGroupProps {
|
|
8
9
|
showAuthorName?: boolean;
|
|
9
10
|
showAvatar?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModernMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,SAAS,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG9D,OAAO,KAAuC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ModernMessageGroup.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,SAAS,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG9D,OAAO,KAAuC,MAAM,OAAO,CAAC;AAgC5D,wBAAgB,wBAAwB,CAAC,EACrC,QAAQ,EACR,eAAe,GAClB,EAAE;IACC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,2CAUA;AAGD,eAAO,MAAM,iBAAiB,i+eA6Y7B,CAAC;AA4BF,UAAU,uBAAuB;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,WAAW,EAAE,SAAS,CAAC;IACvB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,iGAAiG;IACjG,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC;AAiBD,eAAO,MAAM,0BAA0B,GAAI,UAAU,KAAK,EAAE,EAAE,6BAAwB,KAAG,KAAK,EAAE,EAgC/F,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,MAAM,KAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAyDhF,CAAC;AAuWF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CA8DA,CAAC;AAGF,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACzC,CAqTA,CAAC;AA+CF,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,GAAI,eAAe,OAAO,EAAE,eAAe,OAAO,2DACQ,CAAC;AAwe3F,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA0DzE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {Slot}from'@common-stack/components-pro';import {AiAgentMessageRole}from'common';import {format,differenceInMinutes}from'date-fns';import {marked}from'marked';import React,{useMemo,useEffect,useState}from'react';import ReactMarkdown from'react-markdown';import remarkBreaks from'remark-breaks';import remarkGfm from'remark-gfm';import {MessengerSlotFillNameEnum}from'./messenger-slot-fill-name-enum.js';import {FilesList}from'./FilesList.js';import {ErrorFixCard}from'./ErrorFixCard.js';import {useBubbleEntrance}from'./useBubbleEntrance.js';// Configure marked for better markdown rendering
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {Slot}from'@common-stack/components-pro';import {AiAgentMessageRole}from'common';import {format,differenceInMinutes}from'date-fns';import {marked}from'marked';import React,{useMemo,useEffect,useState}from'react';import ReactMarkdown from'react-markdown';import remarkBreaks from'remark-breaks';import remarkGfm from'remark-gfm';import {MessengerSlotFillNameEnum}from'./messenger-slot-fill-name-enum.js';import {FilesList}from'./FilesList.js';import {ErrorFixCard}from'./ErrorFixCard.js';import {useBubbleEntrance}from'./useBubbleEntrance.js';import {wrapTables,TABLE_SCROLL_CLASS,TABLE_STYLES}from'./markdownTables.js';// Configure marked for better markdown rendering
|
|
2
2
|
marked.setOptions({
|
|
3
3
|
breaks: true,
|
|
4
4
|
// Convert line breaks to <br>
|
|
@@ -35,7 +35,7 @@ function AssistantResponseWrapper({
|
|
|
35
35
|
})
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
// Enhanced CSS styles for HTML content rendering with prettification
|
|
38
|
+
// Enhanced CSS styles for HTML content rendering with prettification (exported for its tests)
|
|
39
39
|
const htmlContentStyles = `
|
|
40
40
|
.html-content {
|
|
41
41
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
@@ -74,6 +74,7 @@ const htmlContentStyles = `
|
|
|
74
74
|
--llm-color-code-text: #d96b00;
|
|
75
75
|
--llm-color-code-block-border: #ebeef3;
|
|
76
76
|
--llm-shadow-soft: 0 1px 2px rgba(18, 25, 38, 0.04), 0 10px 32px rgba(18, 25, 38, 0.05);
|
|
77
|
+
--llm-table-scroll-shadow: rgba(18, 25, 38, 0.14);
|
|
77
78
|
--llm-radius-bubble: 1.5rem;
|
|
78
79
|
--llm-radius-code: 0.85rem;
|
|
79
80
|
--llm-line-height-body: 1.62;
|
|
@@ -87,8 +88,11 @@ const htmlContentStyles = `
|
|
|
87
88
|
background: transparent;
|
|
88
89
|
}
|
|
89
90
|
|
|
91
|
+
/* The app's dark mode is a \`dark\` class on <html> (design-pro toggles it); nothing sets
|
|
92
|
+
data-color-mode, so without \`.dark\` a reply's table stayed a white card on a dark page. */
|
|
90
93
|
.${ASSISTANT_RESPONSE_THEME_CLASS}[data-color-mode='dark'],
|
|
91
|
-
[data-color-mode='dark'] .${ASSISTANT_RESPONSE_THEME_CLASS}
|
|
94
|
+
[data-color-mode='dark'] .${ASSISTANT_RESPONSE_THEME_CLASS},
|
|
95
|
+
.dark .${ASSISTANT_RESPONSE_THEME_CLASS} {
|
|
92
96
|
--llm-color-bg: #0f1115;
|
|
93
97
|
--llm-color-surface: #171a20;
|
|
94
98
|
--llm-color-surface-2: #1f2530;
|
|
@@ -103,6 +107,7 @@ const htmlContentStyles = `
|
|
|
103
107
|
--llm-color-code-text: #ffb36b;
|
|
104
108
|
--llm-color-code-block-border: #262d39;
|
|
105
109
|
--llm-shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.28), 0 14px 36px rgba(0, 0, 0, 0.3);
|
|
110
|
+
--llm-table-scroll-shadow: rgba(0, 0, 0, 0.55);
|
|
106
111
|
}
|
|
107
112
|
|
|
108
113
|
.${ASSISTANT_RESPONSE_CLASS} {
|
|
@@ -123,7 +128,9 @@ const htmlContentStyles = `
|
|
|
123
128
|
min-height: 1.75rem;
|
|
124
129
|
border-radius: var(--llm-radius-bubble);
|
|
125
130
|
color: inherit;
|
|
126
|
-
|
|
131
|
+
/* Long tokens (paths, URLs) wrap rather than widen the chat. Same behaviour as the
|
|
132
|
+
legacy \`word-break: break-word\` this replaces; tables opt out (see TABLE_STYLES). */
|
|
133
|
+
overflow-wrap: anywhere;
|
|
127
134
|
}
|
|
128
135
|
|
|
129
136
|
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} {
|
|
@@ -288,15 +295,21 @@ const htmlContentStyles = `
|
|
|
288
295
|
-webkit-box-decoration-break: clone;
|
|
289
296
|
}
|
|
290
297
|
|
|
291
|
-
|
|
292
|
-
|
|
298
|
+
/* The card is the scroll box around the table, so a table wider than the reply scrolls
|
|
299
|
+
inside a card that keeps its rounded edges on screen. It is also the size container the
|
|
300
|
+
narrow-table rule below measures, and so never widens the reply. */
|
|
301
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} .${TABLE_SCROLL_CLASS} {
|
|
293
302
|
margin: 1rem 0 1.1rem;
|
|
294
|
-
border-collapse: separate;
|
|
295
|
-
border-spacing: 0;
|
|
296
303
|
border: 1px solid var(--llm-color-border);
|
|
297
304
|
border-radius: 1rem;
|
|
298
|
-
overflow: hidden;
|
|
299
305
|
box-shadow: var(--llm-shadow-soft);
|
|
306
|
+
container-type: inline-size;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} table {
|
|
310
|
+
width: 100%;
|
|
311
|
+
border-collapse: separate;
|
|
312
|
+
border-spacing: 0;
|
|
300
313
|
}
|
|
301
314
|
|
|
302
315
|
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} thead {
|
|
@@ -311,6 +324,17 @@ const htmlContentStyles = `
|
|
|
311
324
|
vertical-align: top;
|
|
312
325
|
}
|
|
313
326
|
|
|
327
|
+
/* A column the markdown aligns (\`|---:|\`, \`|:---:|\`) keeps that alignment. */
|
|
328
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th[align='right'],
|
|
329
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} td[align='right'] {
|
|
330
|
+
text-align: right;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th[align='center'],
|
|
334
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} td[align='center'] {
|
|
335
|
+
text-align: center;
|
|
336
|
+
}
|
|
337
|
+
|
|
314
338
|
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th {
|
|
315
339
|
font-size: 0.8rem;
|
|
316
340
|
font-weight: 600;
|
|
@@ -339,7 +363,20 @@ const htmlContentStyles = `
|
|
|
339
363
|
padding: 0.75rem 0.8rem;
|
|
340
364
|
}
|
|
341
365
|
}
|
|
342
|
-
|
|
366
|
+
|
|
367
|
+
/* The same tighter cells in a narrow chat pane on a wide screen, which the viewport query
|
|
368
|
+
above never sees: the table measures its own card. */
|
|
369
|
+
@container (max-width: 30rem) {
|
|
370
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th,
|
|
371
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} td {
|
|
372
|
+
padding: 0.75rem 0.8rem;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/* The user pill is drawn by .user-message. A shared global class (.message-container, from
|
|
377
|
+
* @messenger-box/tailwind-ui-inbox) ships its own background and padding, so neutralize it
|
|
378
|
+
* inside the pill. (This comment had lost its opening, which turned the rule below into an
|
|
379
|
+
* invalid selector that never applied.)
|
|
343
380
|
*/
|
|
344
381
|
.user-message .message-container {
|
|
345
382
|
background: transparent !important;
|
|
@@ -358,7 +395,7 @@ const htmlContentStyles = `
|
|
|
358
395
|
max-width: 100%;
|
|
359
396
|
overflow-wrap: anywhere;
|
|
360
397
|
}
|
|
361
|
-
|
|
398
|
+
${TABLE_STYLES}
|
|
362
399
|
/* Assistant replies must read as plain text on the page — no card. A shared
|
|
363
400
|
global class (.message-container, from @messenger-box/tailwind-ui-inbox)
|
|
364
401
|
ships its own pill background/padding; neutralize it here the same way the
|
|
@@ -583,6 +620,7 @@ const prettifyHtmlContent = htmlContent => {
|
|
|
583
620
|
prettified = prettified.replace(/<table>/g, '<table class="html-table">');
|
|
584
621
|
prettified = prettified.replace(/<th>/g, '<th class="html-table-header">');
|
|
585
622
|
prettified = prettified.replace(/<td>/g, '<td class="html-table-cell">');
|
|
623
|
+
prettified = wrapTables(prettified);
|
|
586
624
|
// Add info boxes for certain content patterns
|
|
587
625
|
prettified = prettified.replace(/<p>(Note|Tip|Info|Warning|Error):\s*(.*?)<\/p>/gi, '<div class="html-info-box"><strong>$1:</strong> $2</div>');
|
|
588
626
|
return prettified;
|
|
@@ -907,7 +945,7 @@ const FormattedMessageContent = ({
|
|
|
907
945
|
// Only return if parsing actually produced HTML (not just the same text)
|
|
908
946
|
if (parsed && parsed.trim() !== trimmed && parsed.includes('<')) {
|
|
909
947
|
return {
|
|
910
|
-
htmlContent: parsed,
|
|
948
|
+
htmlContent: wrapTables(parsed),
|
|
911
949
|
markdownSource: trimmed
|
|
912
950
|
};
|
|
913
951
|
}
|
|
@@ -1055,14 +1093,14 @@ const FormattedMessageContent = ({
|
|
|
1055
1093
|
children,
|
|
1056
1094
|
...props
|
|
1057
1095
|
}) => isUserVariant ? jsx("div", {
|
|
1058
|
-
className:
|
|
1096
|
+
className: `${TABLE_SCROLL_CLASS} my-4 w-full rounded-md border border-border`,
|
|
1059
1097
|
children: jsx("table", {
|
|
1060
1098
|
className: "w-full text-sm",
|
|
1061
1099
|
...props,
|
|
1062
1100
|
children: children
|
|
1063
1101
|
})
|
|
1064
1102
|
}) : jsx("div", {
|
|
1065
|
-
className:
|
|
1103
|
+
className: TABLE_SCROLL_CLASS,
|
|
1066
1104
|
children: jsx("table", {
|
|
1067
1105
|
...props,
|
|
1068
1106
|
children: children
|
|
@@ -1076,20 +1114,27 @@ const FormattedMessageContent = ({
|
|
|
1076
1114
|
}) : jsx("thead", {
|
|
1077
1115
|
children: children
|
|
1078
1116
|
}),
|
|
1117
|
+
// `style` carries the column's markdown alignment (`|---:|` is text-align: right).
|
|
1079
1118
|
th: ({
|
|
1080
|
-
children
|
|
1119
|
+
children,
|
|
1120
|
+
style
|
|
1081
1121
|
}) => isUserVariant ? jsx("th", {
|
|
1082
1122
|
className: `px-3 py-2 text-left font-semibold ${userTextClass}`,
|
|
1123
|
+
style: style,
|
|
1083
1124
|
children: children
|
|
1084
1125
|
}) : jsx("th", {
|
|
1126
|
+
style: style,
|
|
1085
1127
|
children: children
|
|
1086
1128
|
}),
|
|
1087
1129
|
td: ({
|
|
1088
|
-
children
|
|
1130
|
+
children,
|
|
1131
|
+
style
|
|
1089
1132
|
}) => isUserVariant ? jsx("td", {
|
|
1090
1133
|
className: `px-3 py-2 ${userMutedTextClass}`,
|
|
1134
|
+
style: style,
|
|
1091
1135
|
children: children
|
|
1092
1136
|
}) : jsx("td", {
|
|
1137
|
+
style: style,
|
|
1093
1138
|
children: children
|
|
1094
1139
|
}),
|
|
1095
1140
|
pre: ({
|
|
@@ -1576,4 +1621,4 @@ const ModernMessageGroupComponent = ({
|
|
|
1576
1621
|
})
|
|
1577
1622
|
}, error.id))]
|
|
1578
1623
|
});
|
|
1579
|
-
};export{AssistantResponseWrapper,CodeFormatter,FormattedMessageContent,ModernMessageGroupComponent,assistantFrameClass,detectContentType,groupMessagesByUserAndTime};//# sourceMappingURL=ModernMessageGroup.js.map
|
|
1624
|
+
};export{AssistantResponseWrapper,CodeFormatter,FormattedMessageContent,ModernMessageGroupComponent,assistantFrameClass,detectContentType,groupMessagesByUserAndTime,htmlContentStyles};//# sourceMappingURL=ModernMessageGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModernMessageGroup.js","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"ulBAaA;AACA,MAAM,CAAC,UAAU,CAAC;QACd,EAAM,IAAE;;KAER,EAAA,IAAA;;AAEH,EAAC,SAAC,EAAA,KAAA;AAEH;AACA,EAAA,MAAM,EAAA,KAAA;AACN,CAAA,CAAA;AACA,MAAM,8BAAA,GAAiC,oBAAG;AAC1C,MAAM,wBAAA,GAAA,cAA+B;AACrC,MAAM,+BAA6B,GAAG,sBAAa;AACnD,MAAA,iCAAA,GAAA,wBAAA;AACA,MAAM,4BAAA,GAAA,WAA0C;AAChD,MAAM,6BAAA,GAAA,YAAwC;AAE9C;AACI,MAAA,oCAAQ,GAAiC,GAAE;AAC/C,MAAC,iCAAA,GAAA,GAAA;AAED,oCAAgB,CAAA,cACJ,EACR;AAKA,EAAA,OAAA,CAAA,yDACkD,CAAA,OAAA,CAAA,CAAA,IAC1C,CAAA,GAAA,CAAA;AAOZ;AAEA,SAAA,wBAAA,CAAA;AACA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsHO,iCAAiC,CAAA;;;;;;OAMjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;;;;;;;;;;OAWjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;OAEjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;;;;;;;;;OAUjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;OAuBjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCjC,iCAAiC,CAAA;;;;;;;;;;;;;;;OAejC,iCAAiC,CAAA;;;;;;;;;;;;;;;;OAgBjC,iCAAiC,CAAA;;;;;;;;;;;;;;;wCAe7B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEX;AACA;;;;;;;;;AAWQ;AACA;AACA;;AAGA,CAAA;;qBAEQ,GAAA;kBACA;6BACH,GAAA,CAAA,CAAA,QAAA,CAAA,cAAA,CAAA,qBAAA,CAAA;AACL;IACJ,IAAG,mBAAI,EAAA;AACX,MAAE;AAkCF,IAAA;AACA;AACI,IAAA,MAAK,uBAAqB,CAAA,aAAY,CAAA,OAAA,CAAA;AAAE,IAAA,aAAS,EAAC,GAAA,qBAAA;IAElD,YAAY,CAAA,WAAiB,GAAA,iBAAA;IAC7B,QAAI,CAAA,IAAA,CAAA,WAA2B,CAAA,YAAA,CAAA;;AAG/B,IAAA,OAAK,MAAM;YACH,aAAO,GAAO,QAAK,CAAA,cAAQ,CAAA,qBAAA,CAAA;AAAE,MAAA,IAAA,aAAU,EAAA;QAE3C,aAAM,CAAA,MAAA,EAAA;;AAGF,IAAA,CAAA;QAEJ;AACI,CAAA;AACI;AACJ,MAAC,0BAAA,GAAA,CAAA,QAAA,EAAA,oBAAA,GAAA,CAAA,KAAA;AACD,EAAA,IAAA,CAAA,QAAA,IAAA,QAAe,CAAC,MAAA,KAAS,CAAA,EAAA,OAAA,EAAA;QAC7B,MAAC,GAAA,EAAA;kBAAO,GAAA,EAAA;AACJ,EAAA,IAAA,WAAA,GAAA,IAAY;aACf,OAAA,IAAA,QAAA,EAAA;QAED,OAAA,OAAc,aAAQ,EAAA,SAAA;IAC1B,MAAC,mBAAA,GAAA,CAAA,WAAA,IAAA,WAAA,CAAA,MAAA,EAAA,EAAA,KAAA,OAAA,CAAA,MAAA,EAAA,EAAA,IAAA,mBAAA,CAAA,IAAA,IAAA,CAAA,OAAA,CAAA,SAAA,CAAA,EAAA,IAAA,IAAA,CAAA,WAAA,CAAA,SAAA,CAAA,CAAA,GAAA,oBAAA;AAED,IAAA,IAAI,mBAAmB,EAAA;AACnB,MAAA,IAAA,YAAY,CAAA,MAAA,GAAY,CAAC,EAAC;QAC7B,MAAA,CAAA,IAAA,CAAA,YAAA,CAAA;AAED,MAAA;AACJ,MAAE,YAAA,GAAA,CAAA,OAAA,CAAA;AAEF,IAAA,CAAA,MAAA;AACA,MAAM,YAAO,CAAA,IAAA,CAAA;AACT,IAAA;AAAY,IAAA,WAAO,UAAO;AAE1B,EAAA;MAEA,YAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACA,IAAA,MAAM,kBAAgB,CAAG;AACrB,EAAA;AACA,EAAA,OAAA,MAAA;AACA;AACA;AACA,MAAA,iBAAoB,GAAA,KAAS,IAAA;AAC7B,EAAA,IAAA,CAAA,KAAA,EAAA,OAAA,MAAmB;AACnB,EAAA,MAAA,OAAA,GAAA,KAAc,CAAA,IAAA,EAAA;AACd;AACA,EAAA,MAAA,gBAAgB,GAAA,CAAA,iBAAA;AAChB;qBACF;;qBAGI;;AAEF,EAAA;;oBAGJ;;AAC0B,EAAA;;cAGtB;AACA;gBACH;;AAGD,EAAA;AACI;AACA,EAAA,cAAA;AACA,GAAA;AACA;QACF,eAAA,GAAA,gBAAA,CAAA,MAAA,CAAA,OAAA,IAAA;AAEF,IAAA,MAAM,uBAAsB,CAAA,OAAA,CAAA;AAC5B,IAAA,OAAI,OAAA,IAAA,OAAmB,CAAA,MAAI,GAAA,CAAA;AAAuB,EAAA,CAAA,CAAA,CAAA,MAAA;;AAGlD,EAAA,IAAA,mBAAqB,CAAA,EAAA,OAAA,UAAA;AACjB;AACA,EAAA,IAAA,cAAA,CAAA,IAAiB,CAAA,OAAA,CAAA,IAAA,gBAAgB,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,gBAAA,CAAA,IAAA,CAAA,OAAA,CAAA,EAAA;AACjC,IAAA,OAAA,UAAA;;AAGJ;QACA,gBAAA,GAAA,CAAA,0BAAA;AACA;AAA8C,EAAA,oBAAc;;AAG5D,EAAA,0BAAc;AAClB;AAEA,EAAA,8BAAA;AACA,GAAA;AACI,EAAA,MAAA,sBAAyB,gBAAiB,CAAC,IAAA,CAAA,OAAA,IAAA,OAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA;AAC/C,EAAE,IAAA,mBAAA,IAAA,eAAA,KAAA,CAAA,EAAA,OAAA,MAAA;AAEF;AACA,EAAA,MAAM,YAAA,GAAA,CAAkB,kBAA+C;AACnE;AAAW,EAAA;;0BAES;;QAChB,eAAe,GAAA,YAAA,CAAA,IAAA,CAAA,OAAA,IAAA,OAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA;;MACnB,eAAU,IAAW,eAAA,KAAA,CAAA,EAAA,OAAA,MAAA;;SAChB,MAAK;;;wBAGgB,GAAA,IAAA,IAAA;MAC1B,CAAA,aAAU,IAAU;QAAE,CAAA,GAAA,MAAO,CAAA,IAAA,CAAA,CAAA,WAAA,EAAA;MAC7B,CAAA,eAAU,EAAA,OAAW,yBAAA,CAAA,aAAA;YAAE,SAAO,EAAA,OAAA,yBAAwC,CAAC,YAAA;MACvE,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,cAAA;MACA,CAAA,KAAA,SAAA,EAAA,OAAA,yBAAA,CAAA,YAAA;MACA,CAAA,kBAAmB,IAAA,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,gBAAA;YAAE,QAAO,EAAA,OAAA,yBAAuC,CAAA,WAAA;MACnE,CAAA,KAAA,OAAA,EAAA,OAAA,yBAAA,CAAA,UAAA;MACA,CAAA,KAAA,UAAA,EAAA,OAAA,yBAAA,CAAA,aAAA;MACA,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,cAAA;;;MAEA,CAAA,cAAU,EAAQ,OAAA,yBAAA,CAAA,YAAA;;;;MAElB,CAAA,eAAkB,EAAA,OAAA,yBAAA,CAAA,aAAA;YAAE,QAAO,EAAA,OAAA,yBAAsC,CAAA,WAAA;AACjE,EAAA,IAAA,CAAA,WAAY,EAAA,OAAA,yBAAA,CAAA,SAAA;AAChB,EAAE,IAAA,CAAA,KAAA,QAAA,EAAA,OAAA,yBAAA,CAAA,WAAA;AAEF,EAAA,OAAA,IAAA;AACA,CAAA;AACI;AACI,MAAA,YAAI,GAAO,IAAM,IAAA;AACb,EAAA,IAAA;AACK,IAAA,IAAA,OAAA,MAAA,KAAQ,WAAA,IAAA,OAAA,MAAA,CAAA,SAAsC,KAAK,WAAA,EAAA;AACnD,MAAA,OAAA,IAAA,CAAA,OAAQ,CAAA,sCAAsC,EAAG,EAAA,CAAA,CAAA,OAAA,CAAA,oCAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,uBAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,uBAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,uBAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,eAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,mBAAA,EAAA,EAAA,CAAA;AACjD,IAAA;AACA,IAAA,MAAA,MAAA,GAAA,IAAA,MAAQ,CAAA,SAAA,EAAA;AACR,IAAA,MAAA,GAAA,GAAA,MAAA,CAAA,eAAQ,CAAA,IAAA,EAAA,WAA4B,CAAA;AACpC;AACA,IAAA,MAAA,aAAA,GAAQ,CAAA,QAAA,EAAA,OAAmB,CAAA;iBACnC,CAAA,OAAA,CAAA,GAAA,IAAA;AAED,MAAA,GAAA,CAAA,gBAAe,CAAI,YAAO,CAAA,EAAA,IAAY,EAAA,CAAA,MAAA,EAAA,CAAA;;UAGtC,MAAA,GAAA,GAAA,CAAA,gBAAA,CAAA,GAAA,CAAA,IAAsC,EAAA,UAAA,CAAA,YAAA,CAAA;AACtC,IAAA,IAAA,IAAA,kBAAsB;AACtB,IAAA,OAAA,IAAA,EAAA;AACI,MAAA,KAAA,CAAA,IAAI,CAAA,IAAA,CAAA,UAAgB,CAAC,aAAa,IAAG;AACzC,QAAA,MAAG,IAAA,GAAA,IAAA,CAAA,IAAA,CAAA,WAAA,EAAA;AAEH,QAAA,MAAM,KAAA,GAAM,CAAG,IAAI,yBAAyB,EAAG;AAC/C;QACA,IAAA,IAAO,CAAA,UAAO,CAAA,IAAA,CAAA,IAAA,KAAA,CAAA,UAAA,CAAA,aAAA,CAAA,EAAA;AACV,UAAA,IAAA,EAAA,eAAgB,CAAA,IAAA,CAAA,IAAY,CAAA;;AAExB;iBAEA,KAAA,KAAA,IAAA,IAAA,KAAA,MAAA,KAAA,CAAA,gBAAiD,CAAA,IAAA,CAAA,IAAA,CAAA,KAAA,CAAA,EAAA;AACjD,UAAA,IAAA,EAAA,eAAS,CAAA,IAAW,KAAK,CAAA;AACrB,QAAA;;mBAGJ,CAAA,QAAA,EAAA;;AAEI,IAAA,OAAA,GAAA,CAAA,IAAA,CAAA,SAAM;;AAEd,IAAA,OAAA,IAAG,CAAA,OAAA,CAAA,sCAAA,EAAA,EAAA,CAAA;AACH,EAAA;;AAGJ;MACH,mBAAA,GAAA,WAAA,IAAA;;gBACU,GAAI;;AAEnB,EAAE,UAAA,GAAA,UAAA,CAAA,OAAA,CAAA,aAAA,EAAA,4CAAA,CAAA;AAEF;AACA,EAAA,UAAM,GAAA,UAAmB,CAAA,OAAI,CAAA,SAA6B,4CAAE,CAAA;YACxD,GAAA,UAAA,CAAA,OAAA,CAAA,OAAA,EAAA,0CAA0C,CAAA;;YAG1C,GAAA,UAAA,CAAA,OAAA,CAAA,MAAA,EAAA,4BAAuC,CAAA;;YAGvC,GAAA,UAAA,CAAA,OAAA,CAAA,SAAoC,EAAA,iCAAA,CAAA;YACpC,GAAU,kBAAc,CAAA,QAAQ,EAAO,+BAAE,CAAA;;YAGzC,GAAA,UAAA,CAAA,OAAA,CAAA,eAAyC,EAAA,sCAAA,CAAA;;YAGzC,GAAA,UAAA,CAAsB,OAAA,CAAA,UAAA,EAAA,4BAAA,CAAA;YACtB,GAAU,kBAAc,CAAA,OAAQ,EAAA,gCAAW,CAAA;YAC3C,GAAU,kBAAc,CAAA,OAAQ,EAAA,8BAAU,CAAA;;YAG1C,GAAU,kBAAc,CAAA,kDAAyB,EAAA,0DAAwC,CAAA;SAEzF,UAAA;;;MAGA,sBAAwB,CAAA;;MAGxB;AAKA,EAAA,IAAA,CAAA,gBAAkB,CAAA,OAAA,CAAA,MAAA,CAAA,IAAA,MAAA,CAAA,MAAA,KAAA,CAAA,EAAA,OAAA,IAAA;AACtB,EAAE,OAAAA,GAAA,CAAA,KAAA,EAAA;AAEF,IAAA,SAAA,EAAA,WAAA;AACA,IAAA,qBAAyB,CAAA,KAAoC,EAAA,GAAA,KAAU;AACnE,MAAA,MAAK,IAAM,GAAI,QAAO,OAAQ,CAAA,IAAA,KAAO,EAAI,IAAA;AAAqB,MAAA,IAAA,CAAA,IAAO,SAAK,IAAA;AAE1E,MAAA,IAAA,OACI,CAAA,IAAA,CAAA,IAAK,CAAA,EAAA;cAEG,IAAM,GAAA,YAAe,CAAA,KAAA,EAAQ,IAAI,IAAA,KAAO,EAAI,IAAC,EAAA,IAAA,IAAA,EAAA,CAAA;AAC7C,QAAA,OAAAA,GAAK,CAAA,KAAI,EAAA;AAAE,UAAA,SAAA,EAAA,0BAAY;AAEvB,UAAA,uBAAqB;AACjB,YAAA,MAAA,EAAA;AACA;cAOH,CAAA;AAED,MAAA;AACI,MAAA,IAAA,QAAA,CAAA,IAAM,CAAA,IAAM,CAAA,EAAA;AACZ,QAAA,MAAA,GAAA,GAAA,KAAS,EAAA,GAAG,IAAK,KAAK,EAAA,KAAI,IAAO,KAAM,EAAA,IAAG,KAAO;AACjD,QAAA,MAAA,GAAA,GAAI,KAAI,EAAA,GAAA,IAAA,KAAA,EAAA,IAAA,EAAA,GAAA,IAAA,EAAA;AAAE,QAAA,IAAA,CAAA,GAAA,EAAA,OAAA;kBACV,CAAA;mBAKH,EAAA,mDAAA;AAED,UAAA,cAAa,KAAK,EAAC;AACf,YAAA,SAAA,EAAM,eAAc;AACpB,YAAA,GAAA,EAAA,GAAA;iBACA;;AAaJ,SAAA,EAAA,GAAA,CAAA;AACI,MAAA;mBACA,CAAA,IACI;cAQP,IAAA,GAAA,KAAA,EAAA,IAAA,IAAA,KAAA,EAAA,IAAA,EAAA,IAAA,IAAA,QAAA;cAED,IAAA,GACI,KAAA,EAAA,IAAA,IAAe,KAAA,EAAS,IAAC,IAAA,KAAA,EAAA,IAAA,EAAmB,IAAA,IAAA,GAAA;QAIpD,OAENA,GAAA,CAAA,GAAA,EAAA;AACN,UAAE,IAAA,EAAA,IAAA;AAEF,UAAA,MAAA,EAAA,QAAA;AACA,UAAM,GAAA,EAAA,qBAIE;AACJ,UAAM,SAAS,EAAA,kGAAmC;AAElD,UAAM,UAAU;SACZ,EAAA,GAAA,CAAA;;qBAEI,CAAU,IAAI,CAAA,IAAG,CAAA,EAAA;AACrB,QAAA,MAAG,IAAA,GAAA,KAAA,EAAA,OAAA,IAAA,KAAA,EAAA,IAAA,EAAA,OAAA,IAAA,EAAA;AACP,QAAI,OAAOA,GAAG,CAAA,KAAA,EAAA;AAEd,UAAM,kDAAwC;AAC1C,UAAA,QAAS,EACL,IAAA,CAAA,GAAQ,CAAA,CAAA,GAAK,EAAA,MAAK,KAAIA,GAAQ,CAAA,KAAK,EAAA;AACvC,YAAA,SAAa,EAAA,WAAU;YACvB,QAAY,EAAAA,uBAA0B,EAAA;cAChC,MAAI,EAAA,GAAA,EAAS,aAAa,EAAC;AACjC,aAAE;AACF,WAAE,EAAA,MAAQ,CAAA;SACT,EAAC,GAAA,CAAK;AACP,MAAA;AACJ,aAAIA,GAAS,CAAA,KAAA,EAAQ;QAErB,SAAM,EAAS;AAEf,QAAA,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAA;;;AAGG,SAAA;OACH,EAAA,GAAM,CAAA;IA6BN,CAAA;IACA;;;AAgCA,MAAA,oBACI,GAAK,CAAA;AAkDb,EAAE,OAAA;AAEF,EAAA,QAAA;AACA,EAAA;MACI;AACI,EAAA,MAAA,CAAA,MAAM,EAAG,SAAG,CAAA,QAAe,CAAA,QAAQ,CAAE,KAAE,CAAA;AACvC,EAAA,MAAA,UAAS,GAA2B,KAAA,CAAA,WAAA,CAAA,MAAA;AAChC,IAAA,SAAA,CAAA,SAAU,CAAA,SAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA,MAAA;AACV,MAAA,SAAG,KAAE,CAAA;AACL,MAAA,UAAI,CAAA,MAAI,SAAA,CAAA,KAAA,CAAA,EAAA,IAAA,CAAA;AACR,IAAA,CAAA,CAAA;AACA,EAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAG;AACH,EAAA,MAAA,cAAM,GAAM,KAAA,CAAA,WAAA,CAAA,MAAA;AACZ,IAAA,MAAA,GAAA,GAAI,QAAQ,KAAA,KAAA,IAAA,QAAA,KAAA,KAAA,GAAA,MAAA,GAAA,QAAA,KAAA,IAAA,IAAA,QAAA,KAAA,IAAA,GAAA,KAAA,GAAA,MAAA;UACd,IAAA,GAAA,IAAA,IAAA,CAAA,CAAA,OAAA,CAAA,EAAA;UACF,EAAA;KACH,CAAA;AACD,IAAA,MAAI,GAAA,GAAA,GAAA,CAAA,eAAA,CAAA,IAAA,CAAA;AAAgF,IAAA,MAAA,CAAA,GAAA,QAAa,CAAA,aAAA,CAAA,GAAA,CAAA;AACjG,IAAA,CAAA,CAAA,IAAI,GAAA,GAAA;AAA4D,IAAA,CAAA,CAAA,QAAA,WAAY,EAAA,GAAA,CAAA,CAAA;AAC5E,IAAA,CAAA,CAAA,KAAO;AACX,IAAE,GAAA,CAAA,eAAA,CAAA,GAAA,CAAA;AAEF,EAAA,CAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,CAAA;AACA,EAAA,eAAa,GAAA,CAAA,QAMR,IAAG,MAAO,EAAE,WAAA,EAAA;AACb;AAAc;;;AAKd,EAAA,MAAA,QACI,GAAA,CAAA;AAGY,IAAA;AAAqB,GAAA,KAAAC,IAAA,CAAA,KAAA,EAAA;wBAErB;wBACM;gBACN;;iBAMC,EAAA,IAAA;kBAED,CAAA,MAAA,EAAA;;AAEA,MAAA,CAAA,EAAA,MAAA;AAGQ,MAAA,KAAA,EAAA,MAAA;AACA,MAAA,MAAA,EAAA,MAAA;AACA,MAAA,EAAA,EAAA,MAAA;AACA,MAAA,EAAA,EAAA,MAAA;AACA,MAAA,MAAA,EAAA,cAAK;AACL,MAAA,WAAA,EAAA,KAAI;mBAGZ,EAAI,OAAQ;AACR,MAAA,cAAA,EAAA;oBACA;;;AAWJ,MAAA,KAAA,EAAA,MAAA;AAUJ,MAAA,MAAA,EAAE,MAEJ;AAEd,MAAE,EAAA,EAAA,MAAA;AAEF,MAAA,EAAA,EAAA,MAAA;AACA,MAAM,QAAO,cAAA;AAWT,MAAA,WAAY,EAAA,KAAA;AAAE,MAAA,aAAW,EAAC,OAAA;MAE1B,cAAA,EAAA;KACA,CAAA;AACI,GAAA,CAAA;AACI;oBAEA,GAAA,CAAA;AACA,IAAA;AACI,GAAA,KAAAD,GAAA,CAAA,KAAA,EAAA;AACA,IAAA,SAAA,EAAA,SAAA;AACA,IAAA,OAAA,EAAA,WAAA;AACA,IAAA,IAAA,EAAA,MAAA;AACA,IAAA,MAAA,EAAA,cAAA;AACA,IAAA,WAAA,EAAA,GAAA;AACA,IAAA,aAAA,EAAA,OAAA;AACA,IAAA,cAAA,EAAA,OAAA;AACA,IAAA,aAAA,EAAA,IAAA;AACA,IAAA,QAAA,EAAAA,GAAA,CAAA,MAAA,EAAA;AACA,MAAA,CAAA,EAAA;;;iBAIJ,GAAM,CAAA;;AAEF,GAAA,KAAAA,GAAA,CAAA,KAAA,EAAA;AACJ,IAAA,SAAC,EAAE,SAAA;aAEH,WAAA;AACA,IAAA,IAAA,EAAA,MAAA;YAEA,cAAA;AACA,IAAA,WAAA,EAAI,IAAA;AACA,IAAA,aAAA,EAAA,OAAM;kBACN,EAAA,OAAA;AACA,IAAA,aAAA,EAAA;wBACI,EAAO;;;;QAKnB,SAAC,GAAA,qCAAA;SAACC,IAAA,CAAO,KAAK,EAAE;AACZ,IAAA,SAAA,EAAA,6EAAgD;YAChD,EAAA,CAAAA,IAAO,CAAE;eACZ,EAAA,2DAAA;AACL,MAAC,QAAG,EAAQ,CAACD,GAAC,CAAA,MAAA,EAAA;AAEd,QAAA,SAAM,EAAA,kEAA+D;;;;;;;;;;;;;;;;;;;;AAqBrE,YAAM,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;AAsBN,QAAA,KAAM,EAAA,UAAA;AACF,QAAA,YAAM,EAAA,UAAgB;QACtB,QAAM,EAAAA,GAAA,CAAA,YAAgB,EAAA;UACtB,SAAM,EAAA;SACN;QAEA;AACI,KAAA,CAAA;AAMA,GAAA,CAAA;AAMA,CAAA;AAMA;AAMA,MAAA,iBAAO,GAAA,CAAQ,OACX,EAAA,QAAA,KAAe;yCAyEf,CAAA,IAAA,CAAA,uBAAuB,CAAA,IAAA,CAAA,OAAU,CAAA,EAAA,OAAA,KAAA;AACrC,EAAA,IAAA,YAAK,CAAE,IAAA,CAAA,OAA4C,CAAA,IAC/C,cAAgB,CACZ,IAAA,CAAA,OAAA,CAAI,EAAA,OAAS,IAAE;eAIrB;;;mBAIQ,GAAK,CAAG;AACd,EAAA,OAAA;kBACA,GAAI,IAAK;qBACL;;AAUJ,CAAA,KAAA;uBACI,IAAO;;AAUX,EAAA,MAAA,QAAA,GAAA,OACI,CAAA,KAAA,CAAA,yBAEQ,CAAA;AACI,EAAA,OAAAA,GAAA,CAAA,KAAA,EAAA;AACA,IAAA,SAAA,EAAA,OAAA,KAAE,MAAA,GAAA,EAAA,GAAA,mBAA+B;YAOrD,EAACA,GAAA,CAAA,KAAA,EAAA;eACH,EAAA,WAAA;MACL,QAAG,EAAQ,iCAA+B;QAE3C,IAAA,CAAA,OAAA,CAAA,IAAA,EAAA,EAAA,OAAA,IAAA;AACA;AACI,QAAA,MAAI,SAAO,GAAK,OAAS,CAAA,KAAA,CAAA,wBAAA,CAAA;YACrB,SACI,EAAA;UAMP,OAAAA,GAAA,CAAA,KAAA,EAAA;AAED,YAAA,SACK,EAAA,sBAAwB;YAQhC,QAAA,EAAAC,IAAA,CAAA,KAAA,EAAA;cAED,SAAA,EAAA,mBAAA;cACI,QAAc,EAAA,CAAA,eAAA,EAAA,SAAA,CAAA,CAAA,CAAA;AACd,aAAI;AACA,WAAA,EAAA,KAAA,CAAO;QACX;;QAUH,MAAA,KAAA,GAAA,OAAA,CAAA,IAAA,EAAA,CAAA,KAAA,CAAA,IAAA,CAAA;QAED,MAAA,MAAA,GAAA,KAAA,CAAyB,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,QAAA,CAAA,WAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,gBAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,SAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA;AACzB,QAAA,UAAc,EAAA;AAalB,UAAE,MAAA,IAAA,GAAA,iBAAA,CAAA,OAAA,CAAA;AAEF,UAAA,OAAAD,GAAA,CAAA,oBAAA,EAAA;AACA,YAAM,OAAA,EAAA,OAAsB,CAAC,IAAY,EAAiB;AACtD,YAAK,QAAI,EAAA,IAAA;AAAE,YAAA,gBAAa,EAAA;AACxB,WAAM,EAAA,KAAA,CAAS;QACf;AACA;AACA,QAAA,OAAMA,GAAQ,CAAA,KAAI,EAAK;UACvB,SAAe,EAAA,CAAG,EAAA,OAAS,KAAE,MAAQ,GAAA,4BAAM,GAAA,SAAA,CAAA,CAAA,EAAA,OAAA,KAAA,MAAA,GAAA,iBAAA,GAAA,eAAA,CAAA,gDAAA,CAAA;AAC/C,UAAE,QAAA,EAAA,OAAA,CAAA,IAAA;AAEF,SAAA,EAAA,KAAA,CAAA;AACA,MAAM,CAAA;AACF,KAAA;AAAW,GAAA,CAAA;AACX;AAAqC;AACjC,MAAA,uBAA4B,GAAA,CAAA;AAAE,EAAA,OAAA;AAClC,EAAA,OAAI,GAAA,SAAA;AAA8B,EAAA,QAAA,GAAA;AAClC,EAAA,2BAAsB;AAAY,CAAA,KAAA;AAClC,EAAA,IAAA,CAAA,OAAI,EAAA,OAAA,IAAkB;AAAY;AAClC,EAAA,MAAI;AAA2C,IAAA,WAAO;AACtD,IAAA;AAAkC,GAAA,GAAA,OAAA,CAAA,MAAY;AAC9C,IAAA,IAAI;AAA8B,MAAA,MAAA,OAAW,GAAC,OAAA,CAAA,IAAA,EAAA;AAC9C;AAAkC,MAAA,MAAA,kBAAY,GAAA,CAAA,iBAAA;AAC9C;AACJ,MAAE,mBAAA;AAEF;AACA,MAAM,mBAAA;AACF;AAAoC,MAAA,iBAAY;AAChD;AACI,MAAA,kBAAgB;;AAEhB,MAAA,iBAAc;;AAEd,MAAA,YAAU;AACN;AAA6D,MAAA,gBAAA;;AAC1D,MAAA;AACH;oBAAkC;;AACO,MAAA,SAAA;;AAE7C;MACH,MAAA,WAAA,GAAA,kBAAA,CAAA,IAAA,CAAA,OAAA,IAAA;AAAC,QAAA,MAAO,OAAA,GAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA;AACL,QAAA,OAAO,OAAK,IAAA,OAAA,CAAA,MAAA,GAAA,CAAA;MACf,CAAA,CAAA;AACL;AAEA,MAAA,MAAA,gBAAA,GAAA,eAAA,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,OAAA,CAAA,MAAyE,GAAA,EAAA;AACzE;AAGA,MAAM,mBAAkB,gBAEpB,EAAA;QAWA,MAAA,MAAA,GAAA,MAAA,CAAA,KAAA,CAAA,OAAqC,EAAA;AACrC,UAAA,KAAA,EAAA;SAEA,CAAA;;QAGA,IAAA,MAAA,IAAA,MAAA,CAAA,IAAA,EAAA,KAAA,OAAA,IAAA,MAAA,CAAsD,QAAA,CAAA,GAAA,CAAA,EAAA;UACtD,OAAA;YACM,aACF,MAAA;AAGA,0BAAe,EAAA;AACX,WAAA;;MAGR;aAEa;AACL,QAAA,WAAU,EAAA,IAAA;AAElB,QAAA,cAAkB,EAAA;AAClB,OAAA;AACI,IAAA,CAAA,CAAA,OAAA,KAAU,EAAA;AACV,MAAA,OAAA,CAAA,+BAA8B,EAAA,KAAA,CAAA;AAClC,MAAE,OAAA;QAEF,WAAA,EAAA,IAAA;AACA,QAAA,cAAM,EAAA;;;KAIN,CAAA,OAAA,CAAA,CAAA;QACA,mBAAA,GAAA,CAAA,EAAA,4BAAA,CAAA,OAAA,EAAA,6BAAA,CAAA;;;;;;;;AA4FJ;AAgBA;;AAcQ;AACJ;;AAGA;;AAGK;AACA;AACL;AACA,6LACwG,CAAA;AACxG,EAAA,MAAA,eAAiB,GAAG,CAAA,EAAA,4BAA+B,CAAA,OAAA,EAAA,6BAAA,CAAA;AACnD;;;AAKI;AAEQ;;;AAkBoB;AACA;;AAiBI;AACI;;AAQG;;AAEC;;;;AAcJ,6LAGiC,CAAA;;AAExB,IAAA,MAAA,aAAA,GAAA,OAAA,KAAA,MAAA;;sDAGL;AACJ,IAAA,MAAA,aAAA,GAAA;;AASR,MAAA,CAAA,EAAA,CAAA;;;+DAWU,EAAA,aAAA,CAAA,CAAA;;AAqDd,OAAA,CAAA,GAAAA,GAAA,CAAA,GAAA,EAAA;AAEI,QAAA,QAAA,EAAA;AACJ,OAAA,CAAA;MAO3B,EAAA,EAAA,CAAA;QAED;AACA,OAAA,KAAM,aACD,GAAAA,GAAiB,KAAK,EAAE;QAC7B,SAAM,+CAAsD,EAAA,aAAA,CAAA,CAAA;QAC5D,QAAA,EAAA;AACA,OAAA,CAAA;AACA,QAAA,QAAM,EAAA;QAEF;QACA,EAAC,CAAA;AACL,QAAA;AACA,OAAA,qBAAsBA,GAAK,CAAA,IAAA,EAAQ;QACnC,SACI,EAAA,CAAA,2CACe,EAAA,aAAA,CAAA,CACP;AAWgB,QAAA,QAAA,EAAA;;AAEA,QAAA,QAAA,EAAA;;AAEH,MAAA,EAAA,EAAA,CAAA;;+BAaG,CAAA,IAAA,EAAA;+DACA,EAAA,aAAA,CAAA,CAAA;AACA,QAAA,QAAA,EAAA;AACI,OAAA,CAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;;AAMG,OAAA,CAAA;AACH,MAAA,EAAA,EAAA,CAAA;;;iEAYH,EAAA,aAAA,CAAA,CAAA;;;;AAGG,OAAA,CAAA;;AAOR,QAAA;AAkE5B,OAAE,KAAA,aAAA,GAAAA,GAAA,CAAA,YAAA,EAAA;AAEF,iBAAa,EAAA,CAAA,8DAGT,qBACU,CAAA;QAWV,QAAA,EAAA;AACA,OAAA,CAAA,GAAAA,GAAA,CAAA,YAAkB,EAAA;QAElB,QAAA,EAAA;AACA,OAAA,CAAA;MAEA,EAAA,EAAA,MAAA,aAAA,GAAAA,GAAA,CAAA,IAAkC,EAAA;AAClC,QAAA;AAEA,OAAA,CAAA,GAAOA,GACH,CAAA,IAAA,EAAA,EAAA,CAAA;;AAGQ,QAAA;YAgBJA,GAEC,CAAA,IAAA,EAAA;AAYb,QAAE,SAAA,EAAA,aAAA,GAAA,CAAA,yFAAA,EAAA,aAAA,CAAA,CAAA,GAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"ModernMessageGroup.js","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"oqBAcA;AACA,MAAM,CAAC,UAAU,CAAC;QACd,EAAM,IAAE;;KAER,EAAA,IAAA;;AAEH,EAAC,SAAC,EAAA,KAAA;AAEH;AACA,EAAA,MAAM,EAAA,KAAA;AACN,CAAA,CAAA;AACA,MAAM,8BAAA,GAAiC,oBAAG;AAC1C,MAAM,wBAAA,GAAA,cAA+B;AACrC,MAAM,+BAA6B,GAAG,sBAAa;AACnD,MAAA,iCAAA,GAAA,wBAAA;AACA,MAAM,4BAAA,GAAA,WAA0C;AAChD,MAAM,6BAAA,GAAA,YAAwC;AAE9C;AACI,MAAA,oCAAQ,GAAiC,GAAE;AAC/C,MAAC,iCAAA,GAAA,GAAA;AAED,oCAAgB,CAAA,cACJ,EACR;AAKA,EAAA,OAAA,CAAA,yDACkD,CAAA,OAAA,CAAA,CAAA,IAC1C,CAAA,GAAA,CAAA;AAOZ;AAEA,SAAA,wBAAA,CAAA;AACA,EAAA,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6HA,iCAAiC,CAAA;;;;;;OAMjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;;;;;;;;;;OAWjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;OAEjC,iCAAiC,CAAA;OACjC,iCAAiC,CAAA;;;;;;;;;;OAUjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;OAuBjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CjC,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCA,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;wCA2B7B,CAAA;;;;;;;;;;WAUA,iCAAiC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmE5C;AACA;;;;;;;;;AAWQ;AACA;AACA;;AAGA;;qBAEQ,GAAA;kBACA;6BACH,GAAA,CAAA,CAAA,QAAA,CAAA,cAAA,CAAA,qBAAA,CAAA;AACL;IACJ,IAAG,mBAAI,EAAA;AACX,MAAE;AAkCF,IAAA;AACA;AACI,IAAA,MAAK,uBAAqB,CAAA,aAAY,CAAA,OAAA,CAAA;AAAE,IAAA,aAAS,EAAC,GAAA,qBAAA;IAElD,YAAY,CAAA,WAAiB,GAAA,iBAAA;IAC7B,QAAI,CAAA,IAAA,CAAA,WAA2B,CAAA,YAAA,CAAA;;AAG/B,IAAA,OAAK,MAAM;YACH,aAAO,GAAO,QAAK,CAAA,cAAQ,CAAA,qBAAA,CAAA;AAAE,MAAA,IAAA,aAAU,EAAA;QAE3C,aAAM,CAAA,MAAA,EAAA;;AAGF,IAAA,CAAA;QAEJ;AACI,CAAA;AACI;AACJ,MAAC,0BAAA,GAAA,CAAA,QAAA,EAAA,oBAAA,GAAA,CAAA,KAAA;AACD,EAAA,IAAA,CAAA,QAAA,IAAA,QAAe,CAAC,MAAA,KAAS,CAAA,EAAA,OAAA,EAAA;QAC7B,MAAC,GAAA,EAAA;kBAAO,GAAA,EAAA;AACJ,EAAA,IAAA,WAAA,GAAA,IAAY;aACf,OAAA,IAAA,QAAA,EAAA;QAED,OAAA,OAAc,aAAQ,EAAA,SAAA;IAC1B,MAAC,mBAAA,GAAA,CAAA,WAAA,IAAA,WAAA,CAAA,MAAA,EAAA,EAAA,KAAA,OAAA,CAAA,MAAA,EAAA,EAAA,IAAA,mBAAA,CAAA,IAAA,IAAA,CAAA,OAAA,CAAA,SAAA,CAAA,EAAA,IAAA,IAAA,CAAA,WAAA,CAAA,SAAA,CAAA,CAAA,GAAA,oBAAA;AAED,IAAA,IAAI,mBAAmB,EAAA;AACnB,MAAA,IAAA,YAAY,CAAA,MAAA,GAAY,CAAC,EAAC;QAC7B,MAAA,CAAA,IAAA,CAAA,YAAA,CAAA;AAED,MAAA;AACJ,MAAE,YAAA,GAAA,CAAA,OAAA,CAAA;AAEF,IAAA,CAAA,MAAA;AACA,MAAM,YAAO,CAAA,IAAA,CAAA;AACT,IAAA;AAAY,IAAA,WAAO,UAAO;AAE1B,EAAA;MAEA,YAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACA,IAAA,MAAM,kBAAgB,CAAG;AACrB,EAAA;AACA,EAAA,OAAA,MAAA;AACA;AACA;AACA,MAAA,iBAAoB,GAAA,KAAS,IAAA;AAC7B,EAAA,IAAA,CAAA,KAAA,EAAA,OAAA,MAAmB;AACnB,EAAA,MAAA,OAAA,GAAA,KAAc,CAAA,IAAA,EAAA;AACd;AACA,EAAA,MAAA,gBAAgB,GAAA,CAAA,iBAAA;AAChB;qBACF;;qBAGI;;AAEF,EAAA;;oBAGJ;;AAC0B,EAAA;;cAGtB;AACA;gBACH;;AAGD,EAAA;AACI;AACA,EAAA,cAAA;AACA,GAAA;AACA;QACF,eAAA,GAAA,gBAAA,CAAA,MAAA,CAAA,OAAA,IAAA;AAEF,IAAA,MAAM,uBAAsB,CAAA,OAAA,CAAA;AAC5B,IAAA,OAAI,OAAA,IAAA,OAAmB,CAAA,MAAI,GAAA,CAAA;AAAuB,EAAA,CAAA,CAAA,CAAA,MAAA;;AAGlD,EAAA,IAAA,mBAAqB,CAAA,EAAA,OAAA,UAAA;AACjB;AACA,EAAA,IAAA,cAAA,CAAA,IAAiB,CAAA,OAAA,CAAA,IAAA,gBAAgB,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,gBAAA,CAAA,IAAA,CAAA,OAAA,CAAA,EAAA;AACjC,IAAA,OAAA,UAAA;;AAGJ;QACA,gBAAA,GAAA,CAAA,0BAAA;AACA;AAA8C,EAAA,oBAAc;;AAG5D,EAAA,0BAAc;AAClB;AAEA,EAAA,8BAAA;AACA,GAAA;AACI,EAAA,MAAA,sBAAyB,gBAAiB,CAAC,IAAA,CAAA,OAAA,IAAA,OAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA;AAC/C,EAAE,IAAA,mBAAA,IAAA,eAAA,KAAA,CAAA,EAAA,OAAA,MAAA;AAEF;AACA,EAAA,MAAM,YAAA,GAAA,CAAkB,kBAA+C;AACnE;AAAW,EAAA;;0BAES;;QAChB,eAAe,GAAA,YAAA,CAAA,IAAA,CAAA,OAAA,IAAA,OAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA;;MACnB,eAAU,IAAW,eAAA,KAAA,CAAA,EAAA,OAAA,MAAA;;SAChB,MAAK;;;wBAGgB,GAAA,IAAA,IAAA;MAC1B,CAAA,aAAU,IAAU;QAAE,CAAA,GAAA,MAAO,CAAA,IAAA,CAAA,CAAA,WAAA,EAAA;MAC7B,CAAA,eAAU,EAAA,OAAW,yBAAA,CAAA,aAAA;YAAE,SAAO,EAAA,OAAA,yBAAwC,CAAC,YAAA;MACvE,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,cAAA;MACA,CAAA,KAAA,SAAA,EAAA,OAAA,yBAAA,CAAA,YAAA;MACA,CAAA,kBAAmB,IAAA,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,gBAAA;YAAE,QAAO,EAAA,OAAA,yBAAuC,CAAA,WAAA;MACnE,CAAA,KAAA,OAAA,EAAA,OAAA,yBAAA,CAAA,UAAA;MACA,CAAA,KAAA,UAAA,EAAA,OAAA,yBAAA,CAAA,aAAA;MACA,CAAA,KAAA,WAAA,EAAA,OAAA,yBAAA,CAAA,cAAA;;;MAEA,CAAA,cAAU,EAAQ,OAAA,yBAAA,CAAA,YAAA;;;;MAElB,CAAA,eAAkB,EAAA,OAAA,yBAAA,CAAA,aAAA;YAAE,QAAO,EAAA,OAAA,yBAAsC,CAAA,WAAA;AACjE,EAAA,IAAA,CAAA,WAAY,EAAA,OAAA,yBAAA,CAAA,SAAA;AAChB,EAAE,IAAA,CAAA,KAAA,QAAA,EAAA,OAAA,yBAAA,CAAA,WAAA;AAEF,EAAA,OAAA,IAAA;AACA,CAAA;AACI;AACI,MAAA,YAAI,GAAO,IAAM,IAAA;AACb,EAAA,IAAA;AACK,IAAA,IAAA,OAAA,MAAA,KAAQ,WAAA,IAAA,OAAA,MAAA,CAAA,SAAsC,KAAK,WAAA,EAAA;AACnD,MAAA,OAAA,IAAA,CAAA,OAAQ,CAAA,sCAAsC,EAAG,EAAA,CAAA,CAAA,OAAA,CAAA,oCAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,uBAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,uBAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,uBAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,eAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,mBAAA,EAAA,EAAA,CAAA;AACjD,IAAA;AACA,IAAA,MAAA,MAAA,GAAA,IAAA,MAAQ,CAAA,SAAA,EAAA;AACR,IAAA,MAAA,GAAA,GAAA,MAAA,CAAA,eAAQ,CAAA,IAAA,EAAA,WAA4B,CAAA;AACpC;AACA,IAAA,MAAA,aAAA,GAAQ,CAAA,QAAA,EAAA,OAAmB,CAAA;iBACnC,CAAA,OAAA,CAAA,GAAA,IAAA;AAED,MAAA,GAAA,CAAA,gBAAe,CAAI,YAAO,CAAA,EAAA,IAAY,EAAA,CAAA,MAAA,EAAA,CAAA;;UAGtC,MAAA,GAAA,GAAA,CAAA,gBAAA,CAAA,GAAA,CAAA,IAAsC,EAAA,UAAA,CAAA,YAAA,CAAA;AACtC,IAAA,IAAA,IAAA,kBAAsB;AACtB,IAAA,OAAA,IAAA,EAAA;AACI,MAAA,KAAA,CAAA,IAAI,CAAA,IAAA,CAAA,UAAgB,CAAC,aAAa,IAAG;AACzC,QAAA,MAAG,IAAA,GAAA,IAAA,CAAA,IAAA,CAAA,WAAA,EAAA;AAEH,QAAA,MAAM,KAAA,GAAM,CAAG,IAAI,yBAAyB,EAAG;AAC/C;QACA,IAAA,IAAO,CAAA,UAAO,CAAA,IAAA,CAAA,IAAA,KAAA,CAAA,UAAA,CAAA,aAAA,CAAA,EAAA;AACV,UAAA,IAAA,EAAA,eAAgB,CAAA,IAAA,CAAA,IAAY,CAAA;;AAExB;iBAEA,KAAA,KAAA,IAAA,IAAA,KAAA,MAAA,KAAA,CAAA,gBAAiD,CAAA,IAAA,CAAA,IAAA,CAAA,KAAA,CAAA,EAAA;AACjD,UAAA,IAAA,EAAA,eAAS,CAAA,IAAW,KAAK,CAAA;AACrB,QAAA;;mBAGJ,CAAA,QAAA,EAAA;;AAEI,IAAA,OAAA,GAAA,CAAA,IAAA,CAAA,SAAM;;AAEd,IAAA,OAAA,IAAG,CAAA,OAAA,CAAA,sCAAA,EAAA,EAAA,CAAA;AACH,EAAA;;AAGJ;MACH,mBAAA,GAAA,WAAA,IAAA;;gBACU,GAAI;;AAEnB,EAAE,UAAA,GAAA,UAAA,CAAA,OAAA,CAAA,aAAA,EAAA,4CAAA,CAAA;AAEF;AACA,EAAA,UAAM,GAAA,UAAmB,CAAA,OAAI,CAAA,SAA6B,4CAAE,CAAA;YACxD,GAAA,UAAA,CAAA,OAAA,CAAA,OAAA,EAAA,0CAA0C,CAAA;;YAG1C,GAAA,UAAA,CAAA,OAAA,CAAA,MAAA,EAAA,4BAAuC,CAAA;;YAGvC,GAAA,UAAA,CAAA,OAAA,CAAA,SAAoC,EAAA,iCAAA,CAAA;YACpC,GAAU,kBAAc,CAAA,QAAQ,EAAO,+BAAE,CAAA;;YAGzC,GAAA,UAAA,CAAA,OAAA,CAAA,eAAyC,EAAA,sCAAA,CAAA;;YAGzC,GAAA,UAAA,CAAsB,OAAA,CAAA,UAAA,EAAA,4BAAA,CAAA;YACtB,GAAU,kBAAc,CAAA,OAAQ,EAAA,gCAAW,CAAA;YAC3C,GAAU,kBAAc,CAAA,OAAQ,EAAA,8BAAU,CAAA;YAE1C,GAAA,UAAA,CAAsB,UAAA,CAAA;;YAGtB,GAAA,UAAiB,CAAA,OAAA,CAAA,kDAAA,EAAA,0DAAA,CAAA;SACjB;;;AAGA,MAAA,mBAAa,GAAW,CAAA;;MAGxB;AAKA,EAAA,IAAA,CAAA,gBAAkB,CAAA,OAAA,CAAA,MAAA,CAAA,IAAA,MAAA,CAAA,MAAA,KAAA,CAAA,EAAA,OAAA,IAAA;AACtB,EAAE,OAAAA,GAAA,CAAA,KAAA,EAAA;AAEF,IAAA,SAAA,EAAA,WAAA;AACA,IAAA,qBAAyB,CAAA,KAAoC,EAAA,GAAA,KAAU;AACnE,MAAA,MAAK,IAAM,GAAI,QAAO,OAAQ,CAAA,IAAA,KAAO,EAAI,IAAA;AAAqB,MAAA,IAAA,CAAA,IAAO,SAAK,IAAA;AAE1E,MAAA,IAAA,OACI,CAAA,IAAA,CAAA,IAAK,CAAA,EAAA;cAEG,IAAM,GAAA,YAAe,CAAA,KAAA,EAAQ,IAAI,IAAA,KAAO,EAAI,IAAC,EAAA,IAAA,IAAA,EAAA,CAAA;AAC7C,QAAA,OAAAA,GAAK,CAAA,KAAI,EAAA;AAAE,UAAA,SAAA,EAAA,0BAAY;AAEvB,UAAA,uBAAqB;AACjB,YAAA,MAAA,EAAA;AACA;cAOH,CAAA;AAED,MAAA;AACI,MAAA,IAAA,QAAA,CAAA,IAAM,CAAA,IAAM,CAAA,EAAA;AACZ,QAAA,MAAA,GAAA,GAAA,KAAS,EAAA,GAAG,IAAK,KAAK,EAAA,KAAI,IAAO,KAAM,EAAA,IAAG,KAAO;AACjD,QAAA,MAAA,GAAA,GAAI,KAAI,EAAA,GAAA,IAAA,KAAA,EAAA,IAAA,EAAA,GAAA,IAAA,EAAA;AAAE,QAAA,IAAA,CAAA,GAAA,EAAA,OAAA;kBACV,CAAA;mBAKH,EAAA,mDAAA;AAED,UAAA,cAAa,KAAK,EAAC;AACf,YAAA,SAAA,EAAM,eAAc;AACpB,YAAA,GAAA,EAAA,GAAA;iBACA;;AAaJ,SAAA,EAAA,GAAA,CAAA;AACI,MAAA;mBACA,CAAA,IACI;cAQP,IAAA,GAAA,KAAA,EAAA,IAAA,IAAA,KAAA,EAAA,IAAA,EAAA,IAAA,IAAA,QAAA;cAED,IAAA,GACI,KAAA,EAAA,IAAA,IAAe,KAAA,EAAS,IAAC,IAAA,KAAA,EAAA,IAAA,EAAmB,IAAA,IAAA,GAAA;QAIpD,OAENA,GAAA,CAAA,GAAA,EAAA;AACN,UAAE,IAAA,EAAA,IAAA;AAEF,UAAA,MAAA,EAAA,QAAA;AACA,UAAM,GAAA,EAAA,qBAIE;AACJ,UAAM,SAAS,EAAA,kGAAmC;AAElD,UAAM,UAAU;SACZ,EAAA,GAAA,CAAA;;qBAEI,CAAU,IAAI,CAAA,IAAG,CAAA,EAAA;AACrB,QAAA,MAAG,IAAA,GAAA,KAAA,EAAA,OAAA,IAAA,KAAA,EAAA,IAAA,EAAA,OAAA,IAAA,EAAA;AACP,QAAI,OAAOA,GAAG,CAAA,KAAA,EAAA;AAEd,UAAM,kDAAwC;AAC1C,UAAA,QAAS,EACL,IAAA,CAAA,GAAQ,CAAA,CAAA,GAAK,EAAA,MAAK,KAAIA,GAAQ,CAAA,KAAK,EAAA;AACvC,YAAA,SAAa,EAAA,WAAU;YACvB,QAAY,EAAAA,uBAA0B,EAAA;cAChC,MAAI,EAAA,GAAA,EAAS,aAAa,EAAC;AACjC,aAAE;AACF,WAAE,EAAA,MAAQ,CAAA;SACT,EAAC,GAAA,CAAK;AACP,MAAA;AACJ,aAAIA,GAAS,CAAA,KAAA,EAAQ;QAErB,SAAM,EAAS;AAEf,QAAA,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAA;;;AAGG,SAAA;OACH,EAAA,GAAM,CAAA;IA6BN,CAAA;IACA;;;AAgCA,MAAA,oBACI,GAAK,CAAA;AAkDb,EAAE,OAAA;AAEF,EAAA,QAAA;AACA,EAAA;MACI;AACI,EAAA,MAAA,CAAA,MAAM,EAAG,SAAG,CAAA,QAAe,CAAA,QAAQ,CAAE,KAAE,CAAA;AACvC,EAAA,MAAA,UAAS,GAA2B,KAAA,CAAA,WAAA,CAAA,MAAA;AAChC,IAAA,SAAA,CAAA,SAAU,CAAA,SAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA,MAAA;AACV,MAAA,SAAG,KAAE,CAAA;AACL,MAAA,UAAI,CAAA,MAAI,SAAA,CAAA,KAAA,CAAA,EAAA,IAAA,CAAA;AACR,IAAA,CAAA,CAAA;AACA,EAAA,CAAA,EAAA,CAAA,OAAA,CAAA,CAAG;AACH,EAAA,MAAA,cAAM,GAAM,KAAA,CAAA,WAAA,CAAA,MAAA;AACZ,IAAA,MAAA,GAAA,GAAI,QAAQ,KAAA,KAAA,IAAA,QAAA,KAAA,KAAA,GAAA,MAAA,GAAA,QAAA,KAAA,IAAA,IAAA,QAAA,KAAA,IAAA,GAAA,KAAA,GAAA,MAAA;UACd,IAAA,GAAA,IAAA,IAAA,CAAA,CAAA,OAAA,CAAA,EAAA;UACF,EAAA;KACH,CAAA;AACD,IAAA,MAAI,GAAA,GAAA,GAAA,CAAA,eAAA,CAAA,IAAA,CAAA;AAAgF,IAAA,MAAA,CAAA,GAAA,QAAa,CAAA,aAAA,CAAA,GAAA,CAAA;AACjG,IAAA,CAAA,CAAA,IAAI,GAAA,GAAA;AAA4D,IAAA,CAAA,CAAA,QAAA,WAAY,EAAA,GAAA,CAAA,CAAA;AAC5E,IAAA,CAAA,CAAA,KAAO;AACX,IAAE,GAAA,CAAA,eAAA,CAAA,GAAA,CAAA;AAEF,EAAA,CAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,CAAA;AACA,EAAA,eAAa,GAAA,CAAA,QAMR,IAAG,MAAO,EAAE,WAAA,EAAA;AACb;AAAc;;;AAKd,EAAA,MAAA,QACI,GAAA,CAAA;AAGY,IAAA;AAAqB,GAAA,KAAAC,IAAA,CAAA,KAAA,EAAA;wBAErB;wBACM;gBACN;;iBAMC,EAAA,IAAA;kBAED,CAAA,MAAA,EAAA;;AAEA,MAAA,CAAA,EAAA,MAAA;AAGQ,MAAA,KAAA,EAAA,MAAA;AACA,MAAA,MAAA,EAAA,MAAA;AACA,MAAA,EAAA,EAAA,MAAA;AACA,MAAA,EAAA,EAAA,MAAA;AACA,MAAA,MAAA,EAAA,cAAK;AACL,MAAA,WAAA,EAAA,KAAI;mBAGZ,EAAI,OAAQ;AACR,MAAA,cAAA,EAAA;oBACA;;;AAWJ,MAAA,KAAA,EAAA,MAAA;AAUJ,MAAA,MAAA,EAAE,MAEJ;AAEd,MAAE,EAAA,EAAA,MAAA;AAEF,MAAA,EAAA,EAAA,MAAA;AACA,MAAM,QAAO,cAAA;AAWT,MAAA,WAAY,EAAA,KAAA;AAAE,MAAA,aAAW,EAAC,OAAA;MAE1B,cAAA,EAAA;KACA,CAAA;AACI,GAAA,CAAA;AACI;oBAEA,GAAA,CAAA;AACA,IAAA;AACI,GAAA,KAAAD,GAAA,CAAA,KAAA,EAAA;AACA,IAAA,SAAA,EAAA,SAAA;AACA,IAAA,OAAA,EAAA,WAAA;AACA,IAAA,IAAA,EAAA,MAAA;AACA,IAAA,MAAA,EAAA,cAAA;AACA,IAAA,WAAA,EAAA,GAAA;AACA,IAAA,aAAA,EAAA,OAAA;AACA,IAAA,cAAA,EAAA,OAAA;AACA,IAAA,aAAA,EAAA,IAAA;AACA,IAAA,QAAA,EAAAA,GAAA,CAAA,MAAA,EAAA;AACA,MAAA,CAAA,EAAA;;;iBAIJ,GAAM,CAAA;;AAEF,GAAA,KAAAA,GAAA,CAAA,KAAA,EAAA;AACJ,IAAA,SAAC,EAAE,SAAA;aAEH,WAAA;AACA,IAAA,IAAA,EAAA,MAAA;YAEA,cAAA;AACA,IAAA,WAAA,EAAI,IAAA;AACA,IAAA,aAAA,EAAA,OAAM;kBACN,EAAA,OAAA;AACA,IAAA,aAAA,EAAA;AACI,IAAA,QAAA,EAAAA,GAAA,CAAA,MAAA,EAAO;;;;QAKnB,SAAC,GAAA,qCAAA;SAACC,IAAA,CAAO,KAAK,EAAE;AACZ,IAAA,SAAA,EAAA,6EAAgD;YAChD,EAAA,CAAAA,IAAO,CAAE;eACZ,EAAA,2DAAA;AACL,MAAC,QAAG,EAAQ,CAACD,GAAC,CAAA,MAAA,EAAA;AAEd,QAAA,SAAM,EAAA,kEAA+D;;;;;;;;;;;;;;;;;;;;AAqBrE,YAAM,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;AAsBN,QAAA,KAAM,EAAA,UAAA;AACF,QAAA,YAAM,EAAA,UAAgB;QACtB,QAAM,EAAAA,GAAA,CAAA,YAAgB,EAAA;UACtB,SAAM,EAAA;SACN;QAEA;AACI,KAAA,CAAA;AAMA,GAAA,CAAA;AAMA,CAAA;AAMA;AAMA,MAAA,iBAAO,GAAA,CAAQ,OACX,EAAA,QAAA,KAAe;yCAyEf,CAAA,IAAA,CAAA,uBAAuB,CAAA,IAAA,CAAA,OAAU,CAAA,EAAA,OAAA,KAAA;kBACrC,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,cAAA,CAAA,IAAA,CAAA,OAAA,CAAA,EAAA,OAAA,IAAA;AACA,EAAA,OAAA;AAQA,CAAA;;AASA,MAAA,aAAS,GAAA,CAAS;;AAEd,EAAA,gBAAA,GAAA,IAAM;qBACF;;;AAWJ,EAAA,IAAA,CAAA,OAAA,EAAA,WAAS;;gBAUT,GAAC,OAAA,CAAA,KAAA,CAAA,yBAAA,CAAA;AACD,EAAA,OAAAA,GAAA,CAAA,KAAA,EAAA;AAIgB,IAAA,SAAA,EAAA,OAAA,KAAE,MAAA,GAAA,EAAA,GAAA,mBAAA;AACF,IAAA,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAE;eAOrB,EAAA,WAAA;cACH,EAAA,QAAA,CAAA,GAAA,CAAA,CAAA,OAAA,EAAA,KAAA,KAAA;QACF,IAAA,CAAA;;AAGJ,QAAI,MAAA,SAAA,GAAA,OAAA,CAAA,KAA+B,CAAA,wBAAiB,CAAA;AAChD,QAAA,IAAI,SAAO,EAAA;iBACPA,GACI,CAAA,KAAA,EAAA;YAMP,SAAA,EAAA,sBAAA;AAED,YAAA,QACI,EAACC,IAAA,CAAA,KAAA,EAAA;cAQR,SAAA,EAAA,mBAAA;cAED,QAAA,EAAA,CAAA,eAAA,EAAA,SAAA,CAAA,CAAA,CAAA;aACI;AACA,WAAA,EAAI,KAAA,CAAO;AACP,QAAA;;QAGJ,MAAA,QACK,OAAA,CAAA,IAAA,EAAA,CAAA,KAAA,CAAA,IAAwB,CAAA;QAOhC,MAAA,MAAA,GAAA,KAAA,CAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,QAAA,CAAA,WAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,gBAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,SAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,IAAA,IAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA;QAED,IAAA,MAAA,EAAA;AACA,UAAA,UAAc,GAAK,iBACf,CAAA,OACI,CAAA;AAWZ,UAAE,OAAAD,GAAA,CAAA,oBAAA,EAAA;AAEF,YAAA,OAAA,EAAA,OAAA,CAAA,IAAA,EAAA;AACA,YAAM,QAAA,EAAA,IAAmB;AACrB,YAAK,gBAAI,EAAA;AAAE,WAAA,EAAA;AACX,QAAA;;AAEA,QAAA,OAAMA,GAAQ,CAAA,KAAI,EAAK;AACvB,UAAM,SAAQ,EAAG,CAAC,EAAA,OAAK,KAAM,MAAS,GAAC,4BAAe,GAAA,SAAA,CAAA,CAAA,EAAA,OAAA,KAAA,MAAA,GAAA,iBAAA,GAAA,eAAA,CAAA,gDAAA,CAAA;UACtD,QAAO,EAAQ,OAAG,CAAA,IAAU;AAChC,SAAE,EAAA,KAAA,CAAA;AAEF,MAAA,CAAA;AACA,KAAA;AACI,GAAA,CAAA;AAAW;AACX;AAAqC,MAAA,uBAAY,GAAA,CAAA;AACjD,EAAA,OAAI;AAA8B,EAAA,OAAA,GAAA,SAAY;AAC9C,EAAA,QAAI,GAAA,KAAA;AAA8B,EAAA,2BAAY,GAAA;AAC9C,CAAA,KAAA;AAAkC,EAAA,IAAA,CAAA,OAAA,SAAY,IAAA;AAC9C;AAAkC,EAAA,MAAA;AAClC,IAAA,WAAI;AAA2C,IAAA;AAC/C,GAAA,GAAA,OAAI,CAAA,MAAA;AAA8B,IAAA,IAAA;AAClC,MAAA,MAAI,OAAA,GAAA,OAAkB,CAAI,MAAM;AAAE;AAClC,MAAA,MAAI,kBAAsB,qBAAM;AAAE;AAClC,MAAA,mBAAY;AAChB;AAEA,MAAA,mBAAA;AACA;AACI,MAAA;AAAoC;AACpC,MAAA,kBAAK;AACD;uBACe;AACf;kBACM;AACN;AACI,MAAA,gBAAU;AAAmD;oBAChE;AAAM;AACH,MAAA;;eACA;AAAyC,OAAA;;AAE7C,MAAA,MAAA,WAAY,GAAA,kBAAA,CAAA,IAAA,CAAA,OAAA,IAAA;QACf,MAAA,OAAA,GAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA;AAAC,QAAA,OAAO,OAAA,IAAA,OAAA,CAAA,MAAA,GAAA,CAAA;AACL,MAAA,CAAA,CAAA;;AAER,MAAE,MAAA,gBAAA,GAAA,eAAA,CAAA,IAAA,CAAA,OAAA,CAAA,IAAA,OAAA,CAAA,MAAA,GAAA,EAAA;AAEF;AACA,MAAM,IAAC,WAAM,IAAA,gBAAuB,EAAA;AAGpC,6BAAyD,CACrD,KAAA,CAAM,OACN,EAAA;UAWA,KAAA,EAAA;AACA,SAAA,CAAA;;QAGA,IAAM,MAAA,IAAA,MAAkB,CAAA,IAAA,EAAA,KAAS,OAAA,IAAA,MAAA,CAAA,QAAA,CAAA,GAAA,CAAA,EAAA;UAEjC,OAAA;YACA,WAAA,EAAA,UAAA,CAAA,MAAA,CAAA;YACM,cACF,EAAA;AAGA;AACI,QAAA;;MAGR,OAAM;QAEE,WAAW;AACX,QAAA,cAAU,EAAA;AAElB,OAAA;AACA,IAAA,CAAA,CAAA,OAAM,KAAA,EAAU;AACZ,MAAA,OAAA,CAAM,KAAI,CAAA,yBAAuB,EAAA,KAAA,CAAA;AACjC,MAAA,OAAA;AACJ,QAAE,WAAA,EAAA,IAAA;QAEF,cAAA,EAAA;AACA,OAAA;;aAGI,CAAM,CAAA;QACV,mBAAA,GAAA,CAAA,EAAA,4BAAyC,CAAA,OAAA,EAAA,6BAAA,CAAA;;;;;;;;;AA6F7C;AAgBA;;AAcQ;AACJ;;AAGA;;AAGK;AACA;AACL,6LAA0C,CAAA;AAC1C,EAAA,MAAA,mBAAuB,EAAA,4BACG,CAAe,OAAE,EAAO;AAClD;AACA;;;AAKI;AAEQ;;;AAkBoB;AACA;;AAiBI;AACI;;AAQG;;AAEC;;;6LAYH,CAAA;AAED,EAAA,MAAA,kBAAA,GAAA,OAAA,CAAA,MAAA;;AAKS,IAAA,MAAA,aAAA,GAAA,iBAAA;sDAGZ;iGAAO;AACJ,IAAA,OAAA;;AASR,QAAA;;+DASuB,EAAE,aAAE,CAAA,CAAA;;;AAuD/B,QAAA,QAAA,EAAA;AAEI,OAAA,CAAA;AACJ,MAAA,EAAA,EAAA,CAAA;QAO3B;OAED,KAAA,aAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;AACA,QAAA,SAAM,EAAA,CAAU,4CAC6C,EAAA,aAAA,CAAkB,CAAA;QAC/E,QAAM,EAAQ;OACd,CAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;AACA,QAAA;AACA,OAAA,CAAA;QAEI,EAAA,CAAA;QACA;AACJ,OAAA,KAAM,aAAc,GAAGA,GAAA,CAAA,IAAA,EAAA;AACvB,QAAA,uDAAsD,EAAA,aAAA,CAAA,CAAA;QACtD,QACI,EAAA;AAawB,OAAA,CAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;;AAEA,OAAA,CAAA;;AAEH,QAAA;+BAWG,CAAA,IAAA,EAAM;+DAEN,EAAA,aAAA,CAAA,CAAA;;AAEA,OAAA,CAAA,GAAAA,GAAA,CAAA,IAAA,EAAA;AACI,QAAA,QAAA,EAAA;;AAMG,MAAA,EAAA,EAAA,CAAA;AACH,QAAA;;iEAWE,EAAA,aAAA,CAAA,CAAA;;;;;AAIF,MAAA,UAAA,EAAA,CAAA;;AAOR,OAAA,KAAA,aAAA,GAAAA,GAAI,CAAA,YAIV,EAAA;AA8DtB,QAAE,SAAA,EAAA,CAAA,8DAAA,EAAA,kBAAA,CAAA,CAAA;AAEF,gBAAa,EAAA;OAeT,CAAA,GAAAA,GAAA,CAAA,YAAA,EAAA;AACA,QAAA,QAAA,EAAA;OAEA,CAAA;AACA,MAAA,EAAA,EAAM,mBAAiB,GAAAA,GAAS,CAAA,IAAA,EAAO;QAEvC,SAAA,EAAA;AACA,OAAA,CAAA,eAAmB,CAAA;AAEnB,MAAA,EAAA,EAAA,CAAO;;AAIK,OAAA,KAAAA,GAAA,CAAA,IAAA,EAAO;iBAkBV,EAAA,aAAe,GAAI,CAAC,yFAIT,EAAA,aAAY,CAAA,CAAA,GAAA,gBAAqB;AAQzD,QAAE,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown tables in a chat message: every table sits in its own box that scrolls sideways, and
|
|
3
|
+
* nothing inside a table may break a word to make it fit.
|
|
4
|
+
*
|
|
5
|
+
* A message's prose wraps anywhere (`overflow-wrap: anywhere`), so a long path or URL never
|
|
6
|
+
* pushes the chat wider. That rule also counts every character as a break when a table sizes its
|
|
7
|
+
* columns, so a table in a narrow pane squeezed its number columns to a few characters and split
|
|
8
|
+
* "2,000" into "2,00" / "0". Inside a table a line now breaks only where the text has a space,
|
|
9
|
+
* and a table still too wide for the message scrolls in its box instead.
|
|
10
|
+
*/
|
|
11
|
+
/** The box every rendered markdown table sits in. */
|
|
12
|
+
export declare const TABLE_SCROLL_CLASS = "llm-table-scroll";
|
|
13
|
+
/**
|
|
14
|
+
* Put each `<table>` of rendered HTML in a {@link TABLE_SCROLL_CLASS} box. Every opening tag gets
|
|
15
|
+
* a box and every closing tag closes it, so well-formed HTML stays balanced (nested tables too).
|
|
16
|
+
* Escaped markup, such as a table inside a code block, is text and is left alone.
|
|
17
|
+
*/
|
|
18
|
+
export declare function wrapTables(html: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* The box, the no-split rule and the scroll cue, for both the assistant's reply and the person's
|
|
21
|
+
* own bubble. `.llm-table-scroll table *` outranks the bubbles' wrap-anywhere rules
|
|
22
|
+
* (`.user-message *`, the reply's bubble), which is what keeps a number whole.
|
|
23
|
+
*/
|
|
24
|
+
export declare const TABLE_STYLES = "\n .llm-table-scroll {\n max-width: 100%;\n overflow-x: auto;\n }\n\n /* The box carries the spacing: a scroll box never collapses its child's margins, so a\n table's own (prose gives it 1em) would show as an empty band inside the box. */\n .llm-table-scroll > table {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n .llm-table-scroll table,\n .llm-table-scroll table * {\n word-break: normal;\n overflow-wrap: normal;\n }\n\n .llm-table-scroll th,\n .llm-table-scroll td {\n font-variant-numeric: tabular-nums;\n }\n\n /* A cut-off column alone reads as a finished table (or as a number split in two), so a side\n that has more columns to scroll to carries a soft shadow. Both shadows are pinned to the\n box's edges (sticky, in the table's grid cell) and fade with the scroll position; a table\n that fits has no scroll timeline, so neither shows. Where the browser cannot tie an\n animation to scrolling, the box scrolls without the cue. */\n @supports (animation-timeline: scroll()) {\n .llm-table-scroll {\n display: grid;\n scroll-timeline: --llm-table-scroll inline;\n }\n\n .llm-table-scroll > table,\n .llm-table-scroll::before,\n .llm-table-scroll::after {\n grid-area: 1 / 1;\n }\n\n .llm-table-scroll::before,\n .llm-table-scroll::after {\n content: '';\n position: sticky;\n z-index: 1;\n width: 0.875rem;\n pointer-events: none;\n opacity: 0;\n }\n\n .llm-table-scroll::before {\n left: 0;\n justify-self: start;\n background: linear-gradient(to right, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);\n animation: llm-table-scroll-start linear both;\n animation-timeline: --llm-table-scroll;\n }\n\n .llm-table-scroll::after {\n right: 0;\n justify-self: end;\n background: linear-gradient(to left, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);\n animation: llm-table-scroll-end linear both;\n animation-timeline: --llm-table-scroll;\n }\n }\n\n @keyframes llm-table-scroll-start {\n 0% { opacity: 0; }\n 6%, 100% { opacity: 1; }\n }\n\n @keyframes llm-table-scroll-end {\n 0%, 94% { opacity: 1; }\n 100% { opacity: 0; }\n }\n";
|
|
25
|
+
//# sourceMappingURL=markdownTables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownTables.d.ts","sourceRoot":"","sources":["../../../src/components/messages-container-ui/markdownTables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,q/EA6ExB,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown tables in a chat message: every table sits in its own box that scrolls sideways, and
|
|
3
|
+
* nothing inside a table may break a word to make it fit.
|
|
4
|
+
*
|
|
5
|
+
* A message's prose wraps anywhere (`overflow-wrap: anywhere`), so a long path or URL never
|
|
6
|
+
* pushes the chat wider. That rule also counts every character as a break when a table sizes its
|
|
7
|
+
* columns, so a table in a narrow pane squeezed its number columns to a few characters and split
|
|
8
|
+
* "2,000" into "2,00" / "0". Inside a table a line now breaks only where the text has a space,
|
|
9
|
+
* and a table still too wide for the message scrolls in its box instead.
|
|
10
|
+
*/
|
|
11
|
+
/** The box every rendered markdown table sits in. */
|
|
12
|
+
const TABLE_SCROLL_CLASS = 'llm-table-scroll';
|
|
13
|
+
/**
|
|
14
|
+
* Put each `<table>` of rendered HTML in a {@link TABLE_SCROLL_CLASS} box. Every opening tag gets
|
|
15
|
+
* a box and every closing tag closes it, so well-formed HTML stays balanced (nested tables too).
|
|
16
|
+
* Escaped markup, such as a table inside a code block, is text and is left alone.
|
|
17
|
+
*/
|
|
18
|
+
function wrapTables(html) {
|
|
19
|
+
return html.replace(/<table\b[^>]*>/gi, open => `<div class="${TABLE_SCROLL_CLASS}">${open}`).replace(/<\/table\s*>/gi, close => `${close}</div>`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The box, the no-split rule and the scroll cue, for both the assistant's reply and the person's
|
|
23
|
+
* own bubble. `.llm-table-scroll table *` outranks the bubbles' wrap-anywhere rules
|
|
24
|
+
* (`.user-message *`, the reply's bubble), which is what keeps a number whole.
|
|
25
|
+
*/
|
|
26
|
+
const TABLE_STYLES = `
|
|
27
|
+
.${TABLE_SCROLL_CLASS} {
|
|
28
|
+
max-width: 100%;
|
|
29
|
+
overflow-x: auto;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* The box carries the spacing: a scroll box never collapses its child's margins, so a
|
|
33
|
+
table's own (prose gives it 1em) would show as an empty band inside the box. */
|
|
34
|
+
.${TABLE_SCROLL_CLASS} > table {
|
|
35
|
+
margin-top: 0;
|
|
36
|
+
margin-bottom: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.${TABLE_SCROLL_CLASS} table,
|
|
40
|
+
.${TABLE_SCROLL_CLASS} table * {
|
|
41
|
+
word-break: normal;
|
|
42
|
+
overflow-wrap: normal;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.${TABLE_SCROLL_CLASS} th,
|
|
46
|
+
.${TABLE_SCROLL_CLASS} td {
|
|
47
|
+
font-variant-numeric: tabular-nums;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* A cut-off column alone reads as a finished table (or as a number split in two), so a side
|
|
51
|
+
that has more columns to scroll to carries a soft shadow. Both shadows are pinned to the
|
|
52
|
+
box's edges (sticky, in the table's grid cell) and fade with the scroll position; a table
|
|
53
|
+
that fits has no scroll timeline, so neither shows. Where the browser cannot tie an
|
|
54
|
+
animation to scrolling, the box scrolls without the cue. */
|
|
55
|
+
@supports (animation-timeline: scroll()) {
|
|
56
|
+
.${TABLE_SCROLL_CLASS} {
|
|
57
|
+
display: grid;
|
|
58
|
+
scroll-timeline: --llm-table-scroll inline;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.${TABLE_SCROLL_CLASS} > table,
|
|
62
|
+
.${TABLE_SCROLL_CLASS}::before,
|
|
63
|
+
.${TABLE_SCROLL_CLASS}::after {
|
|
64
|
+
grid-area: 1 / 1;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.${TABLE_SCROLL_CLASS}::before,
|
|
68
|
+
.${TABLE_SCROLL_CLASS}::after {
|
|
69
|
+
content: '';
|
|
70
|
+
position: sticky;
|
|
71
|
+
z-index: 1;
|
|
72
|
+
width: 0.875rem;
|
|
73
|
+
pointer-events: none;
|
|
74
|
+
opacity: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.${TABLE_SCROLL_CLASS}::before {
|
|
78
|
+
left: 0;
|
|
79
|
+
justify-self: start;
|
|
80
|
+
background: linear-gradient(to right, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);
|
|
81
|
+
animation: llm-table-scroll-start linear both;
|
|
82
|
+
animation-timeline: --llm-table-scroll;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.${TABLE_SCROLL_CLASS}::after {
|
|
86
|
+
right: 0;
|
|
87
|
+
justify-self: end;
|
|
88
|
+
background: linear-gradient(to left, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);
|
|
89
|
+
animation: llm-table-scroll-end linear both;
|
|
90
|
+
animation-timeline: --llm-table-scroll;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@keyframes llm-table-scroll-start {
|
|
95
|
+
0% { opacity: 0; }
|
|
96
|
+
6%, 100% { opacity: 1; }
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@keyframes llm-table-scroll-end {
|
|
100
|
+
0%, 94% { opacity: 1; }
|
|
101
|
+
100% { opacity: 0; }
|
|
102
|
+
}
|
|
103
|
+
`;export{TABLE_SCROLL_CLASS,TABLE_STYLES,wrapTables};//# sourceMappingURL=markdownTables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownTables.js","sources":["../../../src/components/messages-container-ui/markdownTables.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;AASG;AAEH;AACO,MAAM,kBAAkB,GAAG;AAElC;;;;AAIG;AACG,SAAU,UAAU,CAAC,IAAY,EAAA;AACnC,EAAA,OAAA,IAAO,CAAA,OAAI,CAAA,kBAAA,EAAA,IAAA,IAAA,CAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA,OAAA,CAAA,gBAAA,EAAA,KAAA,IAAA,CAAA,EAAA,KAAA,CAAA,MAAA,CAAA,CAAA;AACN;AACA;AACT;AAEA;;;;AAIG,KAAA,EAAA,kBAAA,CAAA;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCW,kBAAkB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@admin-layout/tailwind-chat-pro",
|
|
3
|
-
"version": "12.2.5-alpha.
|
|
3
|
+
"version": "12.2.5-alpha.20",
|
|
4
4
|
"description": "Customizable base chat / messages container UI (plan mode). The message renderer is injectable, so consumers plug in their own message-group component.",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -13,11 +13,9 @@
|
|
|
13
13
|
"build:clean": "rimraf lib",
|
|
14
14
|
"build:lib": "rollup -c rollup.config.mjs",
|
|
15
15
|
"build:lib:watch": "yarn build:lib -- --watch",
|
|
16
|
-
"jest": "./node_modules/.bin/jest",
|
|
17
16
|
"prepublish": "yarn build",
|
|
18
|
-
"test": "
|
|
19
|
-
"test:
|
|
20
|
-
"test:watch": "npm test -- --watch",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest",
|
|
21
19
|
"watch": "yarn build:lib:watch"
|
|
22
20
|
},
|
|
23
21
|
"dependencies": {
|
|
@@ -30,7 +28,8 @@
|
|
|
30
28
|
"remark-gfm": "^4.0.1"
|
|
31
29
|
},
|
|
32
30
|
"devDependencies": {
|
|
33
|
-
"common": "12.2.5-alpha.2"
|
|
31
|
+
"common": "12.2.5-alpha.2",
|
|
32
|
+
"vitest": "^3.0.4"
|
|
34
33
|
},
|
|
35
34
|
"peerDependencies": {
|
|
36
35
|
"@admin-layout/tailwind-ui": "12.2.5-alpha.15",
|
|
@@ -44,5 +43,5 @@
|
|
|
44
43
|
"typescript": {
|
|
45
44
|
"definition": "lib/index.d.ts"
|
|
46
45
|
},
|
|
47
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "2a5addfca653975a6d054b8254ede163d89a75b7"
|
|
48
47
|
}
|
|
@@ -10,6 +10,7 @@ import { MessengerSlotFillNameEnum } from './messenger-slot-fill-name-enum';
|
|
|
10
10
|
import { FilesList } from './FilesList';
|
|
11
11
|
import { ErrorFixCard } from './ErrorFixCard';
|
|
12
12
|
import { useBubbleEntrance } from './useBubbleEntrance';
|
|
13
|
+
import { TABLE_SCROLL_CLASS, TABLE_STYLES, wrapTables } from './markdownTables';
|
|
13
14
|
|
|
14
15
|
// Configure marked for better markdown rendering
|
|
15
16
|
marked.setOptions({
|
|
@@ -51,8 +52,8 @@ export function AssistantResponseWrapper({
|
|
|
51
52
|
);
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
// Enhanced CSS styles for HTML content rendering with prettification
|
|
55
|
-
const htmlContentStyles = `
|
|
55
|
+
// Enhanced CSS styles for HTML content rendering with prettification (exported for its tests)
|
|
56
|
+
export const htmlContentStyles = `
|
|
56
57
|
.html-content {
|
|
57
58
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
58
59
|
line-height: 1.6;
|
|
@@ -90,6 +91,7 @@ const htmlContentStyles = `
|
|
|
90
91
|
--llm-color-code-text: #d96b00;
|
|
91
92
|
--llm-color-code-block-border: #ebeef3;
|
|
92
93
|
--llm-shadow-soft: 0 1px 2px rgba(18, 25, 38, 0.04), 0 10px 32px rgba(18, 25, 38, 0.05);
|
|
94
|
+
--llm-table-scroll-shadow: rgba(18, 25, 38, 0.14);
|
|
93
95
|
--llm-radius-bubble: 1.5rem;
|
|
94
96
|
--llm-radius-code: 0.85rem;
|
|
95
97
|
--llm-line-height-body: 1.62;
|
|
@@ -103,8 +105,11 @@ const htmlContentStyles = `
|
|
|
103
105
|
background: transparent;
|
|
104
106
|
}
|
|
105
107
|
|
|
108
|
+
/* The app's dark mode is a \`dark\` class on <html> (design-pro toggles it); nothing sets
|
|
109
|
+
data-color-mode, so without \`.dark\` a reply's table stayed a white card on a dark page. */
|
|
106
110
|
.${ASSISTANT_RESPONSE_THEME_CLASS}[data-color-mode='dark'],
|
|
107
|
-
[data-color-mode='dark'] .${ASSISTANT_RESPONSE_THEME_CLASS}
|
|
111
|
+
[data-color-mode='dark'] .${ASSISTANT_RESPONSE_THEME_CLASS},
|
|
112
|
+
.dark .${ASSISTANT_RESPONSE_THEME_CLASS} {
|
|
108
113
|
--llm-color-bg: #0f1115;
|
|
109
114
|
--llm-color-surface: #171a20;
|
|
110
115
|
--llm-color-surface-2: #1f2530;
|
|
@@ -119,6 +124,7 @@ const htmlContentStyles = `
|
|
|
119
124
|
--llm-color-code-text: #ffb36b;
|
|
120
125
|
--llm-color-code-block-border: #262d39;
|
|
121
126
|
--llm-shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.28), 0 14px 36px rgba(0, 0, 0, 0.3);
|
|
127
|
+
--llm-table-scroll-shadow: rgba(0, 0, 0, 0.55);
|
|
122
128
|
}
|
|
123
129
|
|
|
124
130
|
.${ASSISTANT_RESPONSE_CLASS} {
|
|
@@ -139,7 +145,9 @@ const htmlContentStyles = `
|
|
|
139
145
|
min-height: 1.75rem;
|
|
140
146
|
border-radius: var(--llm-radius-bubble);
|
|
141
147
|
color: inherit;
|
|
142
|
-
|
|
148
|
+
/* Long tokens (paths, URLs) wrap rather than widen the chat. Same behaviour as the
|
|
149
|
+
legacy \`word-break: break-word\` this replaces; tables opt out (see TABLE_STYLES). */
|
|
150
|
+
overflow-wrap: anywhere;
|
|
143
151
|
}
|
|
144
152
|
|
|
145
153
|
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} {
|
|
@@ -304,15 +312,21 @@ const htmlContentStyles = `
|
|
|
304
312
|
-webkit-box-decoration-break: clone;
|
|
305
313
|
}
|
|
306
314
|
|
|
307
|
-
|
|
308
|
-
|
|
315
|
+
/* The card is the scroll box around the table, so a table wider than the reply scrolls
|
|
316
|
+
inside a card that keeps its rounded edges on screen. It is also the size container the
|
|
317
|
+
narrow-table rule below measures, and so never widens the reply. */
|
|
318
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} .${TABLE_SCROLL_CLASS} {
|
|
309
319
|
margin: 1rem 0 1.1rem;
|
|
310
|
-
border-collapse: separate;
|
|
311
|
-
border-spacing: 0;
|
|
312
320
|
border: 1px solid var(--llm-color-border);
|
|
313
321
|
border-radius: 1rem;
|
|
314
|
-
overflow: hidden;
|
|
315
322
|
box-shadow: var(--llm-shadow-soft);
|
|
323
|
+
container-type: inline-size;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} table {
|
|
327
|
+
width: 100%;
|
|
328
|
+
border-collapse: separate;
|
|
329
|
+
border-spacing: 0;
|
|
316
330
|
}
|
|
317
331
|
|
|
318
332
|
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} thead {
|
|
@@ -327,6 +341,17 @@ const htmlContentStyles = `
|
|
|
327
341
|
vertical-align: top;
|
|
328
342
|
}
|
|
329
343
|
|
|
344
|
+
/* A column the markdown aligns (\`|---:|\`, \`|:---:|\`) keeps that alignment. */
|
|
345
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th[align='right'],
|
|
346
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} td[align='right'] {
|
|
347
|
+
text-align: right;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th[align='center'],
|
|
351
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} td[align='center'] {
|
|
352
|
+
text-align: center;
|
|
353
|
+
}
|
|
354
|
+
|
|
330
355
|
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th {
|
|
331
356
|
font-size: 0.8rem;
|
|
332
357
|
font-weight: 600;
|
|
@@ -355,7 +380,20 @@ const htmlContentStyles = `
|
|
|
355
380
|
padding: 0.75rem 0.8rem;
|
|
356
381
|
}
|
|
357
382
|
}
|
|
358
|
-
|
|
383
|
+
|
|
384
|
+
/* The same tighter cells in a narrow chat pane on a wide screen, which the viewport query
|
|
385
|
+
above never sees: the table measures its own card. */
|
|
386
|
+
@container (max-width: 30rem) {
|
|
387
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} th,
|
|
388
|
+
.${ASSISTANT_RESPONSE_MARKDOWN_CLASS} td {
|
|
389
|
+
padding: 0.75rem 0.8rem;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/* The user pill is drawn by .user-message. A shared global class (.message-container, from
|
|
394
|
+
* @messenger-box/tailwind-ui-inbox) ships its own background and padding, so neutralize it
|
|
395
|
+
* inside the pill. (This comment had lost its opening, which turned the rule below into an
|
|
396
|
+
* invalid selector that never applied.)
|
|
359
397
|
*/
|
|
360
398
|
.user-message .message-container {
|
|
361
399
|
background: transparent !important;
|
|
@@ -374,7 +412,7 @@ const htmlContentStyles = `
|
|
|
374
412
|
max-width: 100%;
|
|
375
413
|
overflow-wrap: anywhere;
|
|
376
414
|
}
|
|
377
|
-
|
|
415
|
+
${TABLE_STYLES}
|
|
378
416
|
/* Assistant replies must read as plain text on the page — no card. A shared
|
|
379
417
|
global class (.message-container, from @messenger-box/tailwind-ui-inbox)
|
|
380
418
|
ships its own pill background/padding; neutralize it here the same way the
|
|
@@ -673,6 +711,7 @@ const prettifyHtmlContent = (htmlContent: string): string => {
|
|
|
673
711
|
prettified = prettified.replace(/<table>/g, '<table class="html-table">');
|
|
674
712
|
prettified = prettified.replace(/<th>/g, '<th class="html-table-header">');
|
|
675
713
|
prettified = prettified.replace(/<td>/g, '<td class="html-table-cell">');
|
|
714
|
+
prettified = wrapTables(prettified);
|
|
676
715
|
|
|
677
716
|
// Add info boxes for certain content patterns
|
|
678
717
|
prettified = prettified.replace(
|
|
@@ -1041,7 +1080,7 @@ export const FormattedMessageContent: React.FC<{
|
|
|
1041
1080
|
const parsed = marked.parse(trimmed, { async: false }) as string;
|
|
1042
1081
|
// Only return if parsing actually produced HTML (not just the same text)
|
|
1043
1082
|
if (parsed && parsed.trim() !== trimmed && parsed.includes('<')) {
|
|
1044
|
-
return { htmlContent: parsed, markdownSource: trimmed as string };
|
|
1083
|
+
return { htmlContent: wrapTables(parsed), markdownSource: trimmed as string };
|
|
1045
1084
|
}
|
|
1046
1085
|
}
|
|
1047
1086
|
|
|
@@ -1189,26 +1228,35 @@ export const FormattedMessageContent: React.FC<{
|
|
|
1189
1228
|
...props
|
|
1190
1229
|
}: React.TableHTMLAttributes<HTMLTableElement> & { children?: React.ReactNode }) =>
|
|
1191
1230
|
isUserVariant ? (
|
|
1192
|
-
<div className=
|
|
1231
|
+
<div className={`${TABLE_SCROLL_CLASS} my-4 w-full rounded-md border border-border`}>
|
|
1193
1232
|
<table className="w-full text-sm" {...props}>
|
|
1194
1233
|
{children}
|
|
1195
1234
|
</table>
|
|
1196
1235
|
</div>
|
|
1197
1236
|
) : (
|
|
1198
|
-
<div className=
|
|
1237
|
+
<div className={TABLE_SCROLL_CLASS}>
|
|
1199
1238
|
<table {...props}>{children}</table>
|
|
1200
1239
|
</div>
|
|
1201
1240
|
),
|
|
1202
1241
|
thead: ({ children }: { children?: React.ReactNode }) =>
|
|
1203
1242
|
isUserVariant ? <thead className="bg-muted text-left">{children}</thead> : <thead>{children}</thead>,
|
|
1204
|
-
|
|
1243
|
+
// `style` carries the column's markdown alignment (`|---:|` is text-align: right).
|
|
1244
|
+
th: ({ children, style }: { children?: React.ReactNode; style?: React.CSSProperties }) =>
|
|
1205
1245
|
isUserVariant ? (
|
|
1206
|
-
<th className={`px-3 py-2 text-left font-semibold ${userTextClass}`}
|
|
1246
|
+
<th className={`px-3 py-2 text-left font-semibold ${userTextClass}`} style={style}>
|
|
1247
|
+
{children}
|
|
1248
|
+
</th>
|
|
1249
|
+
) : (
|
|
1250
|
+
<th style={style}>{children}</th>
|
|
1251
|
+
),
|
|
1252
|
+
td: ({ children, style }: { children?: React.ReactNode; style?: React.CSSProperties }) =>
|
|
1253
|
+
isUserVariant ? (
|
|
1254
|
+
<td className={`px-3 py-2 ${userMutedTextClass}`} style={style}>
|
|
1255
|
+
{children}
|
|
1256
|
+
</td>
|
|
1207
1257
|
) : (
|
|
1208
|
-
<
|
|
1258
|
+
<td style={style}>{children}</td>
|
|
1209
1259
|
),
|
|
1210
|
-
td: ({ children }: { children?: React.ReactNode }) =>
|
|
1211
|
-
isUserVariant ? <td className={`px-3 py-2 ${userMutedTextClass}`}>{children}</td> : <td>{children}</td>,
|
|
1212
1260
|
pre: ({ children }: { children?: React.ReactNode }) => <>{children}</>,
|
|
1213
1261
|
code: ({ className, children, ...rest }: { className?: string; children?: React.ReactNode }) => {
|
|
1214
1262
|
const match = /language-(\w+)/.exec(className || '');
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { renderToStaticMarkup } from 'react-dom/server';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { marked } from 'marked';
|
|
5
|
+
import { TABLE_SCROLL_CLASS, TABLE_STYLES, wrapTables } from '../markdownTables';
|
|
6
|
+
import { FormattedMessageContent, htmlContentStyles } from '../ModernMessageGroup';
|
|
7
|
+
|
|
8
|
+
// The table from the report: in a 520px pane its numbers wrapped mid-digit ("2,00" / "0").
|
|
9
|
+
const BUDGET = [
|
|
10
|
+
"Here's the budget:",
|
|
11
|
+
'',
|
|
12
|
+
'| Category | Mar | Apr |',
|
|
13
|
+
'|---|---:|---:|',
|
|
14
|
+
'| Events & Promotions | 2,000 | 3,500 |',
|
|
15
|
+
'| Email Marketing | 600 | 750 |',
|
|
16
|
+
].join('\n');
|
|
17
|
+
|
|
18
|
+
/** The declarations of every rule whose selector list includes `selector`. */
|
|
19
|
+
function declarationsFor(css: string, selector: string): string {
|
|
20
|
+
const rules = css.matchAll(/([^{}]+)\{([^{}]*)\}/g);
|
|
21
|
+
return [...rules]
|
|
22
|
+
.filter(([, selectors]) => selectors.split(',').some((s) => s.trim() === selector))
|
|
23
|
+
.map(([, , body]) => body)
|
|
24
|
+
.join('\n');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe('wrapTables', () => {
|
|
28
|
+
it('puts a markdown table in its own scroll box', () => {
|
|
29
|
+
const html = wrapTables(marked.parse(BUDGET, { async: false }) as string);
|
|
30
|
+
expect(html).toMatch(new RegExp(`<div class="${TABLE_SCROLL_CLASS}"><table>[\\s\\S]*</table>\\s*</div>`));
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('keeps a table that has attributes, and nested tables, balanced', () => {
|
|
34
|
+
const html = wrapTables('<table class="x"><tr><td><table><tr><td>1</td></tr></table></td></tr></TABLE>');
|
|
35
|
+
expect(html.match(/<div class=/g)).toHaveLength(2);
|
|
36
|
+
expect(html.match(/<\/div>/g)).toHaveLength(2);
|
|
37
|
+
expect(html.startsWith(`<div class="${TABLE_SCROLL_CLASS}"><table class="x">`)).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('leaves a table written inside a code block alone', () => {
|
|
41
|
+
const html = marked.parse('```html\n<table><tr><td>1</td></tr></table>\n```', { async: false }) as string;
|
|
42
|
+
expect(wrapTables(html)).toBe(html);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
describe('FormattedMessageContent tables', () => {
|
|
47
|
+
for (const showCopyDownloadOnCodeBlock of [false, true]) {
|
|
48
|
+
const lane = showCopyDownloadOnCodeBlock ? 'react-markdown' : 'marked';
|
|
49
|
+
for (const variant of ['default', 'user'] as const) {
|
|
50
|
+
it(`a ${variant} message's table scrolls in its own box (${lane})`, () => {
|
|
51
|
+
const html = renderToStaticMarkup(
|
|
52
|
+
<FormattedMessageContent
|
|
53
|
+
content={BUDGET}
|
|
54
|
+
variant={variant}
|
|
55
|
+
showCopyDownloadOnCodeBlock={showCopyDownloadOnCodeBlock}
|
|
56
|
+
/>,
|
|
57
|
+
);
|
|
58
|
+
expect(html).toMatch(new RegExp(`<div class="${TABLE_SCROLL_CLASS}[^"]*"><table`));
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
it(`keeps the markdown's column alignment (${lane})`, () => {
|
|
63
|
+
const html = renderToStaticMarkup(
|
|
64
|
+
<FormattedMessageContent content={BUDGET} showCopyDownloadOnCodeBlock={showCopyDownloadOnCodeBlock} />,
|
|
65
|
+
);
|
|
66
|
+
// marked writes align="right"; react-markdown writes the same as a style.
|
|
67
|
+
expect(html).toMatch(/<td (align="right"|style="text-align:right")>2,000<\/td>/);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('table styles', () => {
|
|
73
|
+
// Declarations only: the comments name the rules they replace.
|
|
74
|
+
const css = `${htmlContentStyles}\n${TABLE_STYLES}`.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
75
|
+
|
|
76
|
+
it('lets no word inside a table break to fit, so a number never splits', () => {
|
|
77
|
+
const rule = declarationsFor(css, `.${TABLE_SCROLL_CLASS} table *`);
|
|
78
|
+
expect(rule).toMatch(/word-break:\s*normal/);
|
|
79
|
+
expect(rule).toMatch(/overflow-wrap:\s*normal/);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('wraps prose with overflow-wrap, not the legacy word-break keyword a table cannot opt out of', () => {
|
|
83
|
+
// `word-break: break-word` overrides every overflow-wrap below it, tables included.
|
|
84
|
+
expect(css).not.toMatch(/word-break:\s*break-word/);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('scrolls a table that does not fit', () => {
|
|
88
|
+
expect(declarationsFor(css, `.${TABLE_SCROLL_CLASS}`)).toMatch(/overflow-x:\s*auto/);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("follows the app's dark mode (a dark class on <html>)", () => {
|
|
92
|
+
expect(declarationsFor(css, '.dark .llm-response-theme')).toMatch(/--llm-color-bg:\s*#0f1115/);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown tables in a chat message: every table sits in its own box that scrolls sideways, and
|
|
3
|
+
* nothing inside a table may break a word to make it fit.
|
|
4
|
+
*
|
|
5
|
+
* A message's prose wraps anywhere (`overflow-wrap: anywhere`), so a long path or URL never
|
|
6
|
+
* pushes the chat wider. That rule also counts every character as a break when a table sizes its
|
|
7
|
+
* columns, so a table in a narrow pane squeezed its number columns to a few characters and split
|
|
8
|
+
* "2,000" into "2,00" / "0". Inside a table a line now breaks only where the text has a space,
|
|
9
|
+
* and a table still too wide for the message scrolls in its box instead.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** The box every rendered markdown table sits in. */
|
|
13
|
+
export const TABLE_SCROLL_CLASS = 'llm-table-scroll';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Put each `<table>` of rendered HTML in a {@link TABLE_SCROLL_CLASS} box. Every opening tag gets
|
|
17
|
+
* a box and every closing tag closes it, so well-formed HTML stays balanced (nested tables too).
|
|
18
|
+
* Escaped markup, such as a table inside a code block, is text and is left alone.
|
|
19
|
+
*/
|
|
20
|
+
export function wrapTables(html: string): string {
|
|
21
|
+
return html
|
|
22
|
+
.replace(/<table\b[^>]*>/gi, (open) => `<div class="${TABLE_SCROLL_CLASS}">${open}`)
|
|
23
|
+
.replace(/<\/table\s*>/gi, (close) => `${close}</div>`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The box, the no-split rule and the scroll cue, for both the assistant's reply and the person's
|
|
28
|
+
* own bubble. `.llm-table-scroll table *` outranks the bubbles' wrap-anywhere rules
|
|
29
|
+
* (`.user-message *`, the reply's bubble), which is what keeps a number whole.
|
|
30
|
+
*/
|
|
31
|
+
export const TABLE_STYLES = `
|
|
32
|
+
.${TABLE_SCROLL_CLASS} {
|
|
33
|
+
max-width: 100%;
|
|
34
|
+
overflow-x: auto;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* The box carries the spacing: a scroll box never collapses its child's margins, so a
|
|
38
|
+
table's own (prose gives it 1em) would show as an empty band inside the box. */
|
|
39
|
+
.${TABLE_SCROLL_CLASS} > table {
|
|
40
|
+
margin-top: 0;
|
|
41
|
+
margin-bottom: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.${TABLE_SCROLL_CLASS} table,
|
|
45
|
+
.${TABLE_SCROLL_CLASS} table * {
|
|
46
|
+
word-break: normal;
|
|
47
|
+
overflow-wrap: normal;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.${TABLE_SCROLL_CLASS} th,
|
|
51
|
+
.${TABLE_SCROLL_CLASS} td {
|
|
52
|
+
font-variant-numeric: tabular-nums;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* A cut-off column alone reads as a finished table (or as a number split in two), so a side
|
|
56
|
+
that has more columns to scroll to carries a soft shadow. Both shadows are pinned to the
|
|
57
|
+
box's edges (sticky, in the table's grid cell) and fade with the scroll position; a table
|
|
58
|
+
that fits has no scroll timeline, so neither shows. Where the browser cannot tie an
|
|
59
|
+
animation to scrolling, the box scrolls without the cue. */
|
|
60
|
+
@supports (animation-timeline: scroll()) {
|
|
61
|
+
.${TABLE_SCROLL_CLASS} {
|
|
62
|
+
display: grid;
|
|
63
|
+
scroll-timeline: --llm-table-scroll inline;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.${TABLE_SCROLL_CLASS} > table,
|
|
67
|
+
.${TABLE_SCROLL_CLASS}::before,
|
|
68
|
+
.${TABLE_SCROLL_CLASS}::after {
|
|
69
|
+
grid-area: 1 / 1;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.${TABLE_SCROLL_CLASS}::before,
|
|
73
|
+
.${TABLE_SCROLL_CLASS}::after {
|
|
74
|
+
content: '';
|
|
75
|
+
position: sticky;
|
|
76
|
+
z-index: 1;
|
|
77
|
+
width: 0.875rem;
|
|
78
|
+
pointer-events: none;
|
|
79
|
+
opacity: 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.${TABLE_SCROLL_CLASS}::before {
|
|
83
|
+
left: 0;
|
|
84
|
+
justify-self: start;
|
|
85
|
+
background: linear-gradient(to right, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);
|
|
86
|
+
animation: llm-table-scroll-start linear both;
|
|
87
|
+
animation-timeline: --llm-table-scroll;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.${TABLE_SCROLL_CLASS}::after {
|
|
91
|
+
right: 0;
|
|
92
|
+
justify-self: end;
|
|
93
|
+
background: linear-gradient(to left, var(--llm-table-scroll-shadow, rgba(18, 25, 38, 0.14)), transparent);
|
|
94
|
+
animation: llm-table-scroll-end linear both;
|
|
95
|
+
animation-timeline: --llm-table-scroll;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@keyframes llm-table-scroll-start {
|
|
100
|
+
0% { opacity: 0; }
|
|
101
|
+
6%, 100% { opacity: 1; }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@keyframes llm-table-scroll-end {
|
|
105
|
+
0%, 94% { opacity: 1; }
|
|
106
|
+
100% { opacity: 0; }
|
|
107
|
+
}
|
|
108
|
+
`;
|
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
// eslint-disable-next-line import/no-extraneous-dependencies -- the test runner's own config; vitest is a devDependency
|
|
3
|
+
import { defineConfig } from 'vitest/config';
|
|
4
|
+
|
|
5
|
+
const stub = (file: string) => fileURLToPath(new URL(`./src/__tests__/stubs/${file}`, import.meta.url));
|
|
6
|
+
|
|
7
|
+
// The renderer imports app packages: `common` (generated models and hooks, built separately) and
|
|
8
|
+
// components-pro. The tests stand in for them, so they run without building any.
|
|
9
|
+
export default defineConfig({
|
|
10
|
+
test: {
|
|
11
|
+
alias: [
|
|
12
|
+
{ find: /^common$/, replacement: stub('common.ts') },
|
|
13
|
+
{ find: /^common\/graphql$/, replacement: stub('common-graphql.ts') },
|
|
14
|
+
{ find: /^@common-stack\/components-pro$/, replacement: stub('components-pro.ts') },
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
});
|