@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 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;AA+B5D,wBAAgB,wBAAwB,CAAC,EACrC,QAAQ,EACR,eAAe,GAClB,EAAE;IACC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,2CAUA;AAuYD,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;AAsWF,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,CA4SA,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
+ {"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
- word-break: break-word;
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
- .${ASSISTANT_RESPONSE_MARKDOWN_CLASS} table {
292
- width: 100%;
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
- * we must neutralize it so it doesn't override the pill background/padding.
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: "overflow-x-auto my-4 w-full rounded-md border border-border",
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: "overflow-x-auto my-4 w-full",
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":"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"}
1
+ {"version":3,"file":"ModernMessageGroup.js","sources":["../../../src/components/messages-container-ui/ModernMessageGroup.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -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.16",
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": "cross-env ENV_FILE=../../config/test/test.env jest",
19
- "test:debug": "npm test -- --runInBand",
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": "6fd3c58cef337a7f83d2673a0f52542c5ff81241"
46
+ "gitHead": "2a5addfca653975a6d054b8254ede163d89a75b7"
48
47
  }
@@ -0,0 +1,2 @@
1
+ /** Test stand-in for `common/graphql`: the one hook the renderer's file list calls, with no data. */
2
+ export const useFileUrlQuery = (): { data: undefined; loading: boolean } => ({ data: undefined, loading: false });
@@ -0,0 +1,5 @@
1
+ /** Test stand-in for the generated `common` package: only what the renderer reads at runtime. */
2
+ export enum AiAgentMessageRole {
3
+ Assistant = 'ASSISTANT',
4
+ User = 'USER',
5
+ }
@@ -0,0 +1,2 @@
1
+ /** Test stand-in for `@common-stack/components-pro`: a slot with nothing plugged in. */
2
+ export const Slot = (): null => null;
@@ -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
- word-break: break-word;
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
- .${ASSISTANT_RESPONSE_MARKDOWN_CLASS} table {
308
- width: 100%;
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
- * we must neutralize it so it doesn't override the pill background/padding.
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="overflow-x-auto my-4 w-full rounded-md border border-border">
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="overflow-x-auto my-4 w-full">
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
- th: ({ children }: { children?: React.ReactNode }) =>
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}`}>{children}</th>
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
- <th>{children}</th>
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
+ `;
@@ -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
+ });