From fe974ad8c798ba9fd77cfd2e6ba4d2ec2e6f0b25 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 26 Jan 2026 17:43:40 -0600 Subject: [PATCH 01/22] HLD updates for message type --- .../src/chat/specs/README.md | 68 +++++++++++++------ 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/packages/spright-components/src/chat/specs/README.md b/packages/spright-components/src/chat/specs/README.md index 503e6f260e..618f3cb2fa 100644 --- a/packages/spright-components/src/chat/specs/README.md +++ b/packages/spright-components/src/chat/specs/README.md @@ -5,7 +5,10 @@ This spec describes a set of components that can be used to compose a chat interface. This includes: - chat input: a text input, button, and related components for users to compose and send new messages -- chat message: a single entry in a chat conversation, including some content and metadata about the message +- chat messages: each a single entry in a chat conversation, including some content and metadata about the message + - inbound + - system + - outbound - chat conversation: a layout component that allows slotting messages and an input ### Background @@ -40,12 +43,24 @@ The message component will allow slotting arbitrary content, but any efforts to #### Chat message -The `spright-chat-message` has the following slot elements. +##### Common features + +The all Spright chat messages have the following slot elements. 1. `default` slot displays arbitrary slotted content. For example: text, rich text, buttons, images, or a spinner. + +The components also contains the following features: + +1. Layout content to the right, center, or left of parent container depending on the type of the message +1. Size based on content size with maximum width (but not height) based on parent's width. +1. Change the styling of the message depending on the type of message. For example: render outbound messages in a bubble with the tail pointing to the right but render system messages with no styling. + +##### Inbound message additional features + +In addition, inbound messages will add support these slots: + 1. `footer-actions` slot which is used to add action buttons below the main content. 1. `end` slot which is used to add text buttons. They are below any action buttons. - Nimble will set the height of the action buttons to `$ni-nimble-control-slim-height`. All action buttons must meet the following criteria 1. They are `nimble-button`s or any other button variant (toggle button, menu button, etc) @@ -59,12 +74,6 @@ All end text buttons must meet the following criteria 1. The `apperance` attribute is set to `block` 1. The buttons only have text -The component also contains the following features: - -1. Layout content to the right, center, or left of parent container depending on metadata about who sent the message. -1. Size based on content size with maximum width (but not height) based on parent's width. -1. Change the styling of the message depending on metadata about who sent the message. For example: render user messages in a bubble with the tail pointing to the right but render system messages with no styling. - #### Chat conversation 1. Lays out messages vertically based on their order. @@ -118,15 +127,15 @@ These components are competing against possible implementations within applicati ```html - + Hi, how can I help? - - + + I need to analyze my data to find anomalies. - - + + - + + - + ``` @@ -150,10 +159,10 @@ richText.markdown = 'Welcome **Homer**, how can I help?'; ```html - + Help with my taxes Provide me some life advice - + ``` @@ -165,11 +174,18 @@ richText.markdown = 'Welcome **Homer**, how can I help?'; ### API -#### Message +#### Messages + +Message components will be created with the following names: +- `spright-chat-message-inbound` +- `spright-chat-message-outbound` +- `spright-chat-message-system` + +##### Messages common API + +All message types will share the following API: -- _Component Name_ `spright-chat-message` - _Props/Attrs_ - - `message-type = "inbound" | "outbound" | "system"` - _Methods_ - _Events_ - _CSS Classes and CSS Custom Properties that affect the component_ @@ -185,6 +201,14 @@ richText.markdown = 'Welcome **Homer**, how can I help?'; - `(default)` - arbitrary content can be added to the default slot to be displayed within the message +##### Inbound message additional API + +- _Slots_ + - `footer-actions` + - Action buttons to display after the main content. + - `end` + - Buttons with text that are displayed at the bottom after any action buttons. + #### Conversation - _Component Name_ `spright-chat-conversation` From 12b05d5dcfa04855cb0c76686d05103f0c3c2807 Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 26 Jan 2026 18:20:51 -0600 Subject: [PATCH 02/22] spright-components changes --- .../src/chat/message/base/index.ts | 9 +++ .../src/chat/message/inbound/index.ts | 53 ++++++++++++++ .../src/chat/message/inbound/styles.ts | 73 +++++++++++++++++++ .../src/chat/message/inbound/template.ts | 21 ++++++ .../src/chat/message/outbound/index.ts | 27 +++++++ .../src/chat/message/outbound/styles.ts | 45 ++++++++++++ .../src/chat/message/outbound/template.ts | 15 ++++ .../src/chat/message/system/index.ts | 27 +++++++ .../src/chat/message/system/styles.ts | 34 +++++++++ .../src/chat/message/system/template.ts | 15 ++++ 10 files changed, 319 insertions(+) create mode 100644 packages/spright-components/src/chat/message/base/index.ts create mode 100644 packages/spright-components/src/chat/message/inbound/index.ts create mode 100644 packages/spright-components/src/chat/message/inbound/styles.ts create mode 100644 packages/spright-components/src/chat/message/inbound/template.ts create mode 100644 packages/spright-components/src/chat/message/outbound/index.ts create mode 100644 packages/spright-components/src/chat/message/outbound/styles.ts create mode 100644 packages/spright-components/src/chat/message/outbound/template.ts create mode 100644 packages/spright-components/src/chat/message/system/index.ts create mode 100644 packages/spright-components/src/chat/message/system/styles.ts create mode 100644 packages/spright-components/src/chat/message/system/template.ts diff --git a/packages/spright-components/src/chat/message/base/index.ts b/packages/spright-components/src/chat/message/base/index.ts new file mode 100644 index 0000000000..d92bd765e7 --- /dev/null +++ b/packages/spright-components/src/chat/message/base/index.ts @@ -0,0 +1,9 @@ +import { + FoundationElement, +} from '@ni/fast-foundation'; + +/** + * A Spright component base class for displaying a chat message + */ +export abstract class ChatMessageBase extends FoundationElement { +} diff --git a/packages/spright-components/src/chat/message/inbound/index.ts b/packages/spright-components/src/chat/message/inbound/index.ts new file mode 100644 index 0000000000..08a66ac1c1 --- /dev/null +++ b/packages/spright-components/src/chat/message/inbound/index.ts @@ -0,0 +1,53 @@ +import { observable } from '@ni/fast-element'; +import { + applyMixins, + DesignSystem, + FoundationElement, + StartEnd, + type FoundationElementDefinition, + type StartEndOptions +} from '@ni/fast-foundation'; +import { styles } from './styles'; +import { template } from './template'; + +declare global { + interface HTMLElementTagNameMap { + 'spright-chat-message-inbound': ChatMessageInbound; + } +} + +/** + * SprightChatMessageInbound configuration options + * @public + */ +export type ChatMessageInboundOptions = FoundationElementDefinition & StartEndOptions; + +/** + * A Spright component for displaying a chat message + */ +export class ChatMessageInbound extends FoundationElement { + /** @internal */ + @observable + public footerActionsIsEmpty = true; + + /** @internal */ + @observable + public readonly slottedFooterActionsElements?: HTMLElement[]; + + public slottedFooterActionsElementsChanged( + _prev: HTMLElement[] | undefined, + next: HTMLElement[] | undefined + ): void { + this.footerActionsIsEmpty = !next?.length; + } +} +applyMixins(ChatMessageInbound, StartEnd); + +const sprightChatMessageInbound = ChatMessageInbound.compose({ + baseName: 'chat-message-inbound', + template, + styles +}); + +DesignSystem.getOrCreate().withPrefix('spright').register(sprightChatMessageInbound()); +export const chatMessageInboundTag = 'spright-chat-message-inbound'; diff --git a/packages/spright-components/src/chat/message/inbound/styles.ts b/packages/spright-components/src/chat/message/inbound/styles.ts new file mode 100644 index 0000000000..d1b90b7e8d --- /dev/null +++ b/packages/spright-components/src/chat/message/inbound/styles.ts @@ -0,0 +1,73 @@ +import { css } from '@ni/fast-element'; +import { anchorButtonTag } from '@ni/nimble-components/dist/esm/anchor-button'; +import { buttonTag } from '@ni/nimble-components/dist/esm/button'; +import { menuButtonTag } from '@ni/nimble-components/dist/esm/menu-button'; +import { toggleButtonTag } from '@ni/nimble-components/dist/esm/toggle-button'; + +import { + bodyFont, + bodyFontColor, + controlSlimHeight, + largePadding, + mediumPadding, + standardPadding +} from '@ni/nimble-components/dist/esm/theme-provider/design-tokens'; +import { display } from '../../../utilities/style/display'; + +export const styles = css` + ${display('flex')} + + :host { + min-width: 16px; + min-height: 16px; + + flex-direction: row; + justify-content: flex-start; + flex-shrink: 0; + font: ${bodyFont}; + color: ${bodyFontColor}; + } + + .container { + display: flex; + flex-direction: column; + max-width: calc(90%); + } + + [part='start'] { + display: none; + } + + .message-content { + width: fit-content; + height: fit-content; + overflow-x: auto; + } + + .footer-actions { + display: none; + } + + :host .footer-actions.has-content { + display: flex; + column-gap: ${standardPadding}; + margin-top: ${mediumPadding}; + } + + .footer-actions ::slotted(${buttonTag}), + .footer-actions ::slotted(${toggleButtonTag}), + .footer-actions ::slotted(${anchorButtonTag}), + .footer-actions ::slotted(${menuButtonTag}) { + height: ${controlSlimHeight}; + } + + .end { + display: none; + } + + :host .end { + display: flex; + column-gap: ${standardPadding}; + margin-top: ${largePadding}; + } +`; diff --git a/packages/spright-components/src/chat/message/inbound/template.ts b/packages/spright-components/src/chat/message/inbound/template.ts new file mode 100644 index 0000000000..3a4b5fdde3 --- /dev/null +++ b/packages/spright-components/src/chat/message/inbound/template.ts @@ -0,0 +1,21 @@ +import { html, slotted, ViewTemplate } from '@ni/fast-element'; +import { + type FoundationElementTemplate +} from '@ni/fast-foundation'; +import type { ChatMessageInbound } from '.'; + +export const template: FoundationElementTemplate< +ViewTemplate +> = () => html` +
+
+ +
+ +
+`; diff --git a/packages/spright-components/src/chat/message/outbound/index.ts b/packages/spright-components/src/chat/message/outbound/index.ts new file mode 100644 index 0000000000..ed7ea5342a --- /dev/null +++ b/packages/spright-components/src/chat/message/outbound/index.ts @@ -0,0 +1,27 @@ +import { + DesignSystem, +} from '@ni/fast-foundation'; +import { styles } from './styles'; +import { template } from './template'; +import { ChatMessageBase } from '../base'; + +declare global { + interface HTMLElementTagNameMap { + 'spright-chat-message-outbound': ChatMessageOutbound; + } +} + +/** + * A Spright component for displaying an outbound chat message + */ +export class ChatMessageOutbound extends ChatMessageBase { +} + +const sprightChatMessageOutbound = ChatMessageOutbound.compose({ + baseName: 'chat-message-outbound', + template, + styles +}); + +DesignSystem.getOrCreate().withPrefix('spright').register(sprightChatMessageOutbound()); +export const chatMessageOutboundTag = 'spright-chat-message-outbound'; diff --git a/packages/spright-components/src/chat/message/outbound/styles.ts b/packages/spright-components/src/chat/message/outbound/styles.ts new file mode 100644 index 0000000000..d8dff145e2 --- /dev/null +++ b/packages/spright-components/src/chat/message/outbound/styles.ts @@ -0,0 +1,45 @@ +import { css } from '@ni/fast-element'; + +import { + bodyFont, + bodyFontColor, + borderHoverColor, + borderWidth, + fillSelectedColor, + mediumPadding, +} from '@ni/nimble-components/dist/esm/theme-provider/design-tokens'; +import { display } from '../../../utilities/style/display'; + +export const styles = css` + ${display('flex')} + + :host { + min-width: 16px; + min-height: 16px; + + flex-direction: row; + justify-content: flex-end; + flex-shrink: 0; + font: ${bodyFont}; + color: ${bodyFontColor}; + } + + .container { + display: flex; + flex-direction: column; + max-width: calc(90%); + } + + .message-content { + width: fit-content; + height: fit-content; + overflow-x: auto; + } + + :host .message-content { + background: ${fillSelectedColor}; + border: ${borderWidth} solid ${borderHoverColor}; + border-radius: ${mediumPadding} ${mediumPadding} 0px ${mediumPadding}; + padding: ${mediumPadding}; + } +`; diff --git a/packages/spright-components/src/chat/message/outbound/template.ts b/packages/spright-components/src/chat/message/outbound/template.ts new file mode 100644 index 0000000000..59452b860a --- /dev/null +++ b/packages/spright-components/src/chat/message/outbound/template.ts @@ -0,0 +1,15 @@ +import { html, ViewTemplate } from '@ni/fast-element'; +import { + type FoundationElementTemplate +} from '@ni/fast-foundation'; +import type { ChatMessageOutbound } from '.'; + +export const template: FoundationElementTemplate< +ViewTemplate +> = () => html` +
+
+ +
+
+`; diff --git a/packages/spright-components/src/chat/message/system/index.ts b/packages/spright-components/src/chat/message/system/index.ts new file mode 100644 index 0000000000..06c5d8f182 --- /dev/null +++ b/packages/spright-components/src/chat/message/system/index.ts @@ -0,0 +1,27 @@ +import { + DesignSystem, +} from '@ni/fast-foundation'; +import { styles } from './styles'; +import { template } from './template'; +import { ChatMessageBase } from '../base'; + +declare global { + interface HTMLElementTagNameMap { + 'spright-chat-message-system': ChatMessageSystem; + } +} + +/** + * A Spright component for displaying an system chat message + */ +export class ChatMessageSystem extends ChatMessageBase { +} + +const sprightChatMessageSystem = ChatMessageSystem.compose({ + baseName: 'chat-message-system', + template, + styles +}); + +DesignSystem.getOrCreate().withPrefix('spright').register(sprightChatMessageSystem()); +export const chatMessageSystemTag = 'spright-chat-message-system'; diff --git a/packages/spright-components/src/chat/message/system/styles.ts b/packages/spright-components/src/chat/message/system/styles.ts new file mode 100644 index 0000000000..697bab64c2 --- /dev/null +++ b/packages/spright-components/src/chat/message/system/styles.ts @@ -0,0 +1,34 @@ +import { css } from '@ni/fast-element'; + +import { + bodyFont, + bodyFontColor, +} from '@ni/nimble-components/dist/esm/theme-provider/design-tokens'; +import { display } from '../../../utilities/style/display'; + +export const styles = css` + ${display('flex')} + + :host { + min-width: 16px; + min-height: 16px; + + flex-direction: row; + justify-content: center; + flex-shrink: 0; + font: ${bodyFont}; + color: ${bodyFontColor}; + } + + .container { + display: flex; + flex-direction: column; + max-width: calc(90%); + } + + .message-content { + width: fit-content; + height: fit-content; + overflow-x: auto; + } +`; diff --git a/packages/spright-components/src/chat/message/system/template.ts b/packages/spright-components/src/chat/message/system/template.ts new file mode 100644 index 0000000000..5f9fe81c9f --- /dev/null +++ b/packages/spright-components/src/chat/message/system/template.ts @@ -0,0 +1,15 @@ +import { html, ViewTemplate } from '@ni/fast-element'; +import { + type FoundationElementTemplate +} from '@ni/fast-foundation'; +import type { ChatMessageSystem } from '.'; + +export const template: FoundationElementTemplate< +ViewTemplate +> = () => html` +
+
+ +
+
+`; From f058079b0451a52a85b6cd9729af48f65530236a Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 26 Jan 2026 18:20:59 -0600 Subject: [PATCH 03/22] react wrappers --- .../spright-react/src/chat/message/inbound/index.ts | 4 ++++ .../spright-react/src/chat/message/outbound/index.ts | 4 ++++ .../spright-react/src/chat/message/system/index.ts | 4 ++++ 3 files changed, 12 insertions(+) create mode 100644 packages/react-workspace/spright-react/src/chat/message/inbound/index.ts create mode 100644 packages/react-workspace/spright-react/src/chat/message/outbound/index.ts create mode 100644 packages/react-workspace/spright-react/src/chat/message/system/index.ts diff --git a/packages/react-workspace/spright-react/src/chat/message/inbound/index.ts b/packages/react-workspace/spright-react/src/chat/message/inbound/index.ts new file mode 100644 index 0000000000..ca4eb54492 --- /dev/null +++ b/packages/react-workspace/spright-react/src/chat/message/inbound/index.ts @@ -0,0 +1,4 @@ +import { ChatMessageInbound } from '@ni/spright-components/dist/esm/chat/message/inbound'; +import { wrap } from '../../../utilities/react-wrapper'; + +export const SprightChatMessageInbound = wrap(ChatMessageInbound); diff --git a/packages/react-workspace/spright-react/src/chat/message/outbound/index.ts b/packages/react-workspace/spright-react/src/chat/message/outbound/index.ts new file mode 100644 index 0000000000..4e57115e69 --- /dev/null +++ b/packages/react-workspace/spright-react/src/chat/message/outbound/index.ts @@ -0,0 +1,4 @@ +import { ChatMessageOutbound } from '@ni/spright-components/dist/esm/chat/message/outbound'; +import { wrap } from '../../../utilities/react-wrapper'; + +export const SprightChatMessageOutbound = wrap(ChatMessageOutbound); diff --git a/packages/react-workspace/spright-react/src/chat/message/system/index.ts b/packages/react-workspace/spright-react/src/chat/message/system/index.ts new file mode 100644 index 0000000000..b87fa32e8a --- /dev/null +++ b/packages/react-workspace/spright-react/src/chat/message/system/index.ts @@ -0,0 +1,4 @@ +import { ChatMessageSystem } from '@ni/spright-components/dist/esm/chat/message/system'; +import { wrap } from '../../../utilities/react-wrapper'; + +export const SprightChatMessageSystem = wrap(ChatMessageSystem); From 7650e3adb7519586d140bf8f67d63e5726c8074f Mon Sep 17 00:00:00 2001 From: Jesse Attas Date: Mon, 26 Jan 2026 18:38:43 -0600 Subject: [PATCH 04/22] storybook --- .../chat/conversation/chat-conversation.mdx | 41 ++++++--- .../chat/message/chat-message.stories.ts | 89 ++++--------------- 2 files changed, 45 insertions(+), 85 deletions(-) diff --git a/packages/storybook/src/spright/chat/conversation/chat-conversation.mdx b/packages/storybook/src/spright/chat/conversation/chat-conversation.mdx index cde5ee5858..14e15afde4 100644 --- a/packages/storybook/src/spright/chat/conversation/chat-conversation.mdx +++ b/packages/storybook/src/spright/chat/conversation/chat-conversation.mdx @@ -5,7 +5,9 @@ import * as inputStories from '../input/chat-input.stories'; import ComponentApisLink from '../../../docs/component-apis-link.mdx'; import { chatConversationTag } from '@ni/spright-components/dist/esm/chat/conversation'; import { chatInputTag } from '@ni/spright-components/dist/esm/chat/input'; -import { chatMessageTag } from '@ni/spright-components/dist/esm/chat/message'; +import { chatMessageInboundTag } from '@ni/spright-components/dist/esm/chat/message/inbound'; +import { chatMessageOutboundTag } from '@ni/spright-components/dist/esm/chat/message/outbound'; +import { chatMessageSystemTag } from '@ni/spright-components/dist/esm/chat/message/system'; @@ -29,31 +31,42 @@ components, like the input. <Canvas of={conversationStories.chatConversation} /> <Controls of={conversationStories.chatConversation} /> -### Chat message +### Chat messages -Use the <Tag name={chatMessageTag} /> element to display content in a message. -Clients can place any HTML content within the message. +Use one of the message types below to display chat messages. Clients can place any HTML content within the message. -#### Text message content +#### Inbound message -<Canvas of={messageStories.chatMessageText} /> -<Controls of={messageStories.chatMessageText} /> +Use the <Tag name={chatMessageInboundTag} /> element to display content in an inbound message. -#### Rich text message content +##### Rich text inbound message content <Canvas of={messageStories.chatMessageRichText} /> <Controls of={messageStories.chatMessageRichText} /> -#### Spinner message content - -<Canvas of={messageStories.chatMessageSpinner} /> -<Controls of={messageStories.chatMessageSpinner} /> - -#### Image message content +##### Image inbound message content <Canvas of={messageStories.chatMessageImage} /> <Controls of={messageStories.chatMessageImage} /> +#### Outbound message + +Use the <Tag name={chatMessageOutboundTag} /> element to display content in an outbound message. + +##### Text outbound message content + +<Canvas of={messageStories.chatMessageText} /> +<Controls of={messageStories.chatMessageText} /> + +#### System message + +Use the <Tag name={chatMessageSystemTag} /> element to display content in a system message. + +##### Spinner system message content + +<Canvas of={messageStories.chatMessageSpinner} /> +<Controls of={messageStories.chatMessageSpinner} /> + ### Chat input Use the <Tag name={chatInputTag} /> element to allow the user to create and send diff --git a/packages/storybook/src/spright/chat/message/chat-message.stories.ts b/packages/storybook/src/spright/chat/message/chat-message.stories.ts index f3731c8458..8a14638643 100644 --- a/packages/storybook/src/spright/chat/message/chat-message.stories.ts +++ b/packages/storybook/src/spright/chat/message/chat-message.stories.ts @@ -2,8 +2,9 @@ import { html, when } from '@ni/fast-element'; import type { Meta, StoryObj } from '@storybook/html-vite'; import { buttonTag } from '@ni/nimble-components/dist/esm/button'; -import { chatMessageTag } from '@ni/spright-components/dist/esm/chat/message'; -import { ChatMessageType } from '@ni/spright-components/dist/esm/chat/message/types'; +import { chatMessageInboundTag } from '@ni/spright-components/dist/esm/chat/message/inbound'; +import { chatMessageOutboundTag } from '@ni/spright-components/dist/esm/chat/message/outbound'; +import { chatMessageSystemTag } from '@ni/spright-components/dist/esm/chat/message/system'; import { richTextViewerTag } from '@ni/nimble-components/dist/esm/rich-text/viewer'; import { spinnerTag } from '@ni/nimble-components/dist/esm/spinner'; import { SpinnerAppearance } from '@ni/nimble-components/dist/esm/spinner/types'; @@ -26,22 +27,14 @@ Nimble will set the height of the buttons to \`$ni-nimble-control-slim-height\`. const endButtonDescription = 'Place 0 or more buttons with text. They appear below any action buttons. End buttons should only be added to inbound messages.'; -interface ChatMessageArgs { - messageType: keyof typeof ChatMessageType; +interface ChatMessageInboundArgs { footerActions: boolean; endButtons: boolean; } -const metadata: Meta<ChatMessageArgs> = { +const metadata: Meta<ChatMessageInboundArgs> = { title: 'Internal/Chat Message', argTypes: { - messageType: { - name: 'message-type', - options: Object.keys(ChatMessageType), - control: { type: 'radio' }, - description: 'The type of the chat message.', - table: { category: apiCategory.attributes } - }, footerActions: { name: 'footer-actions', description: footerActionsDescription, @@ -60,33 +53,15 @@ const metadata: Meta<ChatMessageArgs> = { export default metadata; -interface ChatMessageTextArgs extends ChatMessageArgs { +interface ChatMessageTextArgs { text: string; } export const chatMessageText: StoryObj<ChatMessageTextArgs> = { render: createUserSelectedThemeStory(html` - <${chatMessageTag} message-type="${x => ChatMessageType[x.messageType]}"> + <${chatMessageOutboundTag}> ${x => x.text} - ${when(x => x.footerActions, html` - <${buttonTag} slot="footer-actions" appearance="ghost" title="Like" content-hidden> - <${iconThumbUpTag} slot="start"></${iconThumbUpTag}> - Like - </${buttonTag}> - <${buttonTag} slot="footer-actions" appearance="ghost" title="Dislike" content-hidden> - <${iconThumbDownTag} slot="start"></${iconThumbDownTag}> - Dislike - </${buttonTag}> - `)} - ${when(x => x.endButtons, html` - <${buttonTag} slot="end" appearance="block"> - Order a tab - </${buttonTag}> - <${buttonTag} slot="end" appearance="block"> - Check core temperature - </${buttonTag}> - `)} - </${chatMessageTag}> + </${chatMessageInboundTag}> `), argTypes: { text: { @@ -97,19 +72,16 @@ export const chatMessageText: StoryObj<ChatMessageTextArgs> = { }, args: { text: 'Aurora Borealis? At this time of year? At this time of day? In this part of the country? Localized entirely within your kitchen?', - messageType: 'outbound', - footerActions: false, - endButtons: false } }; -interface ChatMessageRichTextArgs extends ChatMessageArgs { +interface ChatMessageRichTextArgs extends ChatMessageInboundArgs { markdown: string; } export const chatMessageRichText: StoryObj<ChatMessageRichTextArgs> = { render: createUserSelectedThemeStory(html` - <${chatMessageTag} message-type="${x => ChatMessageType[x.messageType]}"> + <${chatMessageInboundTag}> <${richTextViewerTag} markdown="${x => x.markdown}"></${richTextViewerTag}> ${when(x => x.footerActions, html` <${buttonTag} slot="footer-actions" appearance="ghost" title="Like" content-hidden> @@ -129,7 +101,7 @@ export const chatMessageRichText: StoryObj<ChatMessageRichTextArgs> = { Check core temperature </${buttonTag}> `)} - </${chatMessageTag}> + </${chatMessageInboundTag}> `), argTypes: { markdown: { @@ -139,49 +111,25 @@ export const chatMessageRichText: StoryObj<ChatMessageRichTextArgs> = { }, args: { markdown: markdownExample, - messageType: 'outbound', footerActions: false, endButtons: false } }; -export const chatMessageSpinner: StoryObj<ChatMessageArgs> = { +export const chatMessageSpinner: StoryObj = { render: createUserSelectedThemeStory(html` - <${chatMessageTag} message-type="${x => ChatMessageType[x.messageType]}"> + <${chatMessageSystemTag}> <${spinnerTag} style="${isChromatic() ? '--ni-private-spinner-animation-play-state:paused' : ''}" appearance="${() => SpinnerAppearance.accent}" ></${spinnerTag}> - ${when(x => x.footerActions, html` - <${buttonTag} slot="footer-actions" appearance="ghost" title="Like" content-hidden> - <${iconThumbUpTag} slot="start"></${iconThumbUpTag}> - Like - </${buttonTag}> - <${buttonTag} slot="footer-actions" appearance="ghost" title="Dislike" content-hidden> - <${iconThumbDownTag} slot="start"></${iconThumbDownTag}> - Dislike - </${buttonTag}> - `)} - ${when(x => x.endButtons, html` - <${buttonTag} slot="end" appearance="block"> - Order a tab - </${buttonTag}> - <${buttonTag} slot="end" appearance="block"> - Check core temperature - </${buttonTag}> - `)} - </${chatMessageTag}> - `), - args: { - messageType: 'system', - footerActions: false, - endButtons: false - } + </${chatMessageSystemTag}> + `) }; -export const chatMessageImage: StoryObj<ChatMessageArgs> = { +export const chatMessageImage: StoryObj<ChatMessageInboundArgs> = { render: createUserSelectedThemeStory(html` - <${chatMessageTag} message-type="${x => ChatMessageType[x.messageType]}"> + <${chatMessageInboundTag}> <img width="100" height="100" :src="${() => imgBlobUrl}"> ${when(x => x.footerActions, html` <${buttonTag} slot="footer-actions" appearance="ghost" title="Like" content-hidden> @@ -201,10 +149,9 @@ export const chatMessageImage: StoryObj<ChatMessageArgs> = { Check core temperature </${buttonTag}> `)} - </${chatMessageTag}> + </${chatMessageInboundTag}> `), args: { - messageType: 'inbound', footerActions: false, endButtons: false } From 2a0ee7ee01be832894bb1673d9cbb48579b7ac73 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 08:51:19 -0600 Subject: [PATCH 05/22] Angular wrappers --- package-lock.json | 375 +++++++++++++----- .../chat/message/inbound/ng-package.json | 6 + .../chat/message/inbound/public-api.ts | 2 + .../spright-chat-message-inbound.directive.ts | 16 + .../spright-chat-message-inbound.module.ts | 16 + ...ght-chat-message-inbound.directive.spec.ts | 16 + .../chat/message/outbound/ng-package.json | 6 + .../chat/message/outbound/public-api.ts | 2 + ...spright-chat-message-outbound.directive.ts | 16 + .../spright-chat-message-outbound.module.ts | 16 + ...ht-chat-message-outbound.directive.spec.ts | 16 + .../chat/message/system/ng-package.json | 6 + .../chat/message/system/public-api.ts | 2 + .../spright-chat-message-system.directive.ts | 16 + .../spright-chat-message-system.module.ts | 16 + ...ight-chat-message-system.directive.spec.ts | 16 + 16 files changed, 441 insertions(+), 102 deletions(-) create mode 100644 packages/angular-workspace/spright-angular/chat/message/inbound/ng-package.json create mode 100644 packages/angular-workspace/spright-angular/chat/message/inbound/public-api.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.module.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/inbound/tests/spright-chat-message-inbound.directive.spec.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/outbound/ng-package.json create mode 100644 packages/angular-workspace/spright-angular/chat/message/outbound/public-api.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.module.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/outbound/tests/spright-chat-message-outbound.directive.spec.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/system/ng-package.json create mode 100644 packages/angular-workspace/spright-angular/chat/message/system/public-api.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.module.ts create mode 100644 packages/angular-workspace/spright-angular/chat/message/system/tests/spright-chat-message-system.directive.spec.ts diff --git a/package-lock.json b/package-lock.json index 1741932312..4a081bffe1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -235,6 +235,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -316,6 +317,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -405,6 +407,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -524,6 +527,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.8.1.tgz", "integrity": "sha512-NOMkw0xgDoDVCLkL5nkkvdd3ouDYkOGqtEmabTR7N4/kQnk1R4coOTWGCqAgMXCFdxlyjuxquDwuJ+yni81pRg==", "license": "MIT", + "peer": true, "dependencies": { "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", "@angular-devkit/core": ">= 19.0.0 < 20.0.0" @@ -537,13 +541,15 @@ "version": "19.8.1", "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.8.1.tgz", "integrity": "sha512-WXi1YbSs7SIQo48u+fCcc5Nt14/T4QzYQPLZUnjtsUXPgQG7ZoahhcGf7PPQ+n0V3pSopHOlSHwqK+tSsYK87A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@angular-eslint/eslint-plugin": { "version": "19.8.1", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.8.1.tgz", "integrity": "sha512-wZEBMPwD2TRhifG751hcj137EMIEaFmsxRB2EI+vfINCgPnFGSGGOHXqi8aInn9fXqHs7VbXkAzXYdBsvy1m4Q==", "license": "MIT", + "peer": true, "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.8.1", "@angular-eslint/utils": "19.8.1" @@ -559,6 +565,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.8.1.tgz", "integrity": "sha512-0ZVQldndLrDfB0tzFe/uIwvkUcakw8qGxvkEU0l7kSbv/ngNQ/qrkRi7P64otB15inIDUNZI2jtmVat52dqSfQ==", "license": "MIT", + "peer": true, "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.8.1", "@angular-eslint/utils": "19.8.1", @@ -578,6 +585,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.8.1.tgz", "integrity": "sha512-MKzfO3puOCuQFgP8XDUkEr5eaqcCQLAdYLLMcywEO/iRs1eRHL46+rkW+SjDp1cUqlxKtu+rLiTYr0T/O4fi9Q==", "license": "MIT", + "peer": true, "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", @@ -593,6 +601,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -602,6 +611,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -629,6 +639,7 @@ "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.8.1.tgz", "integrity": "sha512-gVDKYWmAjeTPtaYmddT/HS03fCebXJtrk8G1MouQIviZbHqLjap6TbVlzlkBigRzaF0WnFnrDduQslkJzEdceA==", "license": "MIT", + "peer": true, "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.8.1" }, @@ -643,7 +654,6 @@ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.18.tgz", "integrity": "sha512-c76x1t+OiSstPsvJdHmV8Q4taF+8SxWKqiY750fOjpd01it4jJbU6YQqIroC6Xie7154zZIxOTHH2uTj+nm5qA==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1109,7 +1119,6 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -1627,7 +1636,6 @@ "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.18.tgz", "integrity": "sha512-CrV02Omzw/QtfjlEVXVPJVXipdx83NuA+qSASZYrxrhKFusUZyK3P/Zznqg+wiAeNDbedQwMUVqoAARHf0xQrw==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1644,7 +1652,6 @@ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.18.tgz", "integrity": "sha512-3MscvODxRVxc3Cs0ZlHI5Pk5rEvE80otfvxZTMksOZuPlv1B+S8MjWfc3X3jk9SbyUEzODBEH55iCaBHD48V3g==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1657,7 +1664,6 @@ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.18.tgz", "integrity": "sha512-N4TMtLfImJIoMaRL6mx7885UBeQidywptHH6ACZj71Ar6++DBc1mMlcwuvbeJCd3r3y8MQ5nLv5PZSN/tHr13w==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -1731,7 +1737,6 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.18.tgz", "integrity": "sha512-+QRrf0Igt8ccUWXHA+7doK5W6ODyhHdqVyblSlcQ8OciwkzIIGGEYNZom5OZyWMh+oI54lcSeyV2O3xaDepSrQ==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1748,7 +1753,6 @@ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.18.tgz", "integrity": "sha512-pe40934jWhoS7DyGl7jyZdoj1gvBgur2t1zrJD+csEkTitYnW14+La2Pv6SW1pNX5nIzFsgsS9Nex1KcH5S6Tw==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1767,7 +1771,6 @@ "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-19.2.18.tgz", "integrity": "sha512-FEZLbpFgCyoRB5Qv30msDb1tJYpwwmkrQTOUUdcB6j0RjHDiSe9jEsArC2Qy0glofjzu9cPoBOcdxY5UocBvdg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "7.26.9", "@types/babel__core": "7.20.5", @@ -1837,7 +1840,6 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.18.tgz", "integrity": "sha512-eahtsHPyXTYLARs9YOlXhnXGgzw0wcyOcDkBvNWK/3lA0NHIgIHmQgXAmBo+cJ+g9skiEQTD2OmSrrwbFKWJkw==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1878,7 +1880,6 @@ "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.18.tgz", "integrity": "sha512-7cimxtPODSwokFQ0TRYzX0ad8Yjrl0MJfzaDCJejd1n/q7RZ7KZmHd0DS/LkDNXVMEh4swr00fK+3YWG/Szsrg==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1920,7 +1921,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -4061,6 +4061,7 @@ "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" @@ -4072,6 +4073,7 @@ "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -4082,6 +4084,7 @@ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -4097,6 +4100,7 @@ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.71.0.tgz", "integrity": "sha512-2p9+dXWNQnp5Kq/V0XVWZiVAabzlX6rUW8vXXvtX8Yc1CkKgD93IPDEnv1sYZFkkS6HMvg6H0RMZfob/Co0YXA==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "^1.0.8", "@typescript-eslint/types": "^8.46.0", @@ -4530,6 +4534,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "license": "MIT", + "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -4548,6 +4553,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4560,6 +4566,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "license": "MIT", + "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -4569,6 +4576,7 @@ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", @@ -4583,6 +4591,7 @@ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/core": "^0.17.0" }, @@ -4595,6 +4604,7 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -4607,6 +4617,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "license": "MIT", + "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -4630,6 +4641,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4646,6 +4658,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4658,6 +4671,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -4674,13 +4688,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@eslint/js": { "version": "9.39.2", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4717,6 +4733,7 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -4726,6 +4743,7 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -4795,6 +4813,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18.0" } @@ -4804,6 +4823,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" @@ -4817,6 +4837,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=12.22" }, @@ -4830,6 +4851,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18" }, @@ -5164,7 +5186,6 @@ "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@inquirer/checkbox": "^4.1.2", "@inquirer/confirm": "^5.1.6", @@ -6077,6 +6098,7 @@ "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-3.0.2.tgz", "integrity": "sha512-anFGls154h0iVzUt5O43EaqYvPwzfUxQ34QpNQsUQML7pbEJMhcgkRNvYw9hZBspab+/TP45agdPw5joh6/BBA==", "license": "MIT", + "peer": true, "dependencies": { "@mdit-vue/types": "3.0.2", "@types/markdown-it": "^14.1.2", @@ -6091,6 +6113,7 @@ "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-3.0.2.tgz", "integrity": "sha512-00aAZ0F0NLik6I6Yba2emGbHLxv+QYrPH00qQ5dFKXlAo1Ll2RHDXwY7nN2WAfrx2pP+WrvSRFTGFCNGdzBDHw==", "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" } @@ -6526,6 +6549,7 @@ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", @@ -6593,7 +6617,6 @@ "resolved": "https://registry.npmjs.org/@ni/eslint-config-angular/-/eslint-config-angular-11.0.1.tgz", "integrity": "sha512-722/NeHcTrTCJUTAB00LnH0/McggEQewbPvXl7DYT5KfXsuzA83D2XTSouUM6CMe7dajSBW50S1rQpcZA8tb/Q==", "license": "MIT", - "peer": true, "peerDependencies": { "@ni/eslint-config-javascript": "^5.1.4", "@ni/eslint-config-typescript": "^5.0.5", @@ -6605,7 +6628,6 @@ "resolved": "https://registry.npmjs.org/@ni/eslint-config-javascript/-/eslint-config-javascript-5.1.4.tgz", "integrity": "sha512-UvWMiPlRmTqS4GH4efxP/M6R2Mw2IEBpibgVSMU/0vrPqhs32BBKoIyewTPrMcxNEA0EAMYZETQqK+g5WrskgQ==", "license": "MIT", - "peer": true, "peerDependencies": { "@stylistic/eslint-plugin": "^5.4.0", "eslint": "^9.36.0", @@ -7114,6 +7136,7 @@ "hasInstallScript": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", @@ -7156,6 +7179,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7177,6 +7201,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7198,6 +7223,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7219,6 +7245,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7240,6 +7267,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7261,6 +7289,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7282,6 +7311,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7303,6 +7333,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7324,6 +7355,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7345,6 +7377,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7366,6 +7399,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7387,6 +7421,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7408,6 +7443,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10.0.0" }, @@ -7422,7 +7458,8 @@ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/@paulirish/trace_engine": { "version": "0.0.53", @@ -7451,6 +7488,7 @@ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "license": "MIT", + "peer": true, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -7484,7 +7522,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.47", @@ -8036,7 +8075,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@schematics/angular": { "version": "19.2.19", @@ -8986,6 +9026,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -9005,6 +9046,7 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -9052,7 +9094,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.15.3.tgz", "integrity": "sha512-bmXydIHfm2rEtGju39FiQNfzkFx9CDvJe+xem1dgEZ2P6Dj7nQX9LnA1ZscW7TuzbBRkL5p3dwuBIi3f62A66A==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -9235,7 +9276,6 @@ "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.15.3.tgz", "integrity": "sha512-+CbaHhPfKUe+fNpUIQaOPhh6xI+xL5jbK1zw++U+CZIRrVAAmHRhO+D0O2HdiE1RK7596y8bRqMiB2CRHF7emA==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -9328,6 +9368,7 @@ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -9336,7 +9377,8 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9414,13 +9456,15 @@ "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/command-line-usage": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/connect": { "version": "3.4.38", @@ -9633,13 +9677,15 @@ "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/katex": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/linkify-it": { "version": "5.0.0", @@ -9698,7 +9744,6 @@ "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -9760,7 +9805,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -9898,6 +9942,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz", "integrity": "sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.53.0", @@ -9926,6 +9971,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -9960,6 +10006,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.0.tgz", "integrity": "sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==", "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.53.0", "@typescript-eslint/types": "^8.53.0", @@ -9981,6 +10028,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz", "integrity": "sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==", "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/visitor-keys": "8.53.0" @@ -9998,6 +10046,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz", "integrity": "sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==", "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -10014,6 +10063,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz", "integrity": "sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==", "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/types": "8.53.0", "@typescript-eslint/typescript-estree": "8.53.0", @@ -10052,6 +10102,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz", "integrity": "sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==", "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/project-service": "8.53.0", "@typescript-eslint/tsconfig-utils": "8.53.0", @@ -10079,6 +10130,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -10088,6 +10140,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10127,6 +10180,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz", "integrity": "sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==", "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/types": "8.53.0", "eslint-visitor-keys": "^4.2.1" @@ -10144,6 +10198,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -10162,7 +10217,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-android-arm64": { "version": "1.11.1", @@ -10175,7 +10231,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.11.1", @@ -10188,7 +10245,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.11.1", @@ -10201,7 +10259,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-freebsd-x64": { "version": "1.11.1", @@ -10214,7 +10273,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.11.1", @@ -10227,7 +10287,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.11.1", @@ -10240,7 +10301,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.11.1", @@ -10253,7 +10315,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.11.1", @@ -10266,7 +10329,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.11.1", @@ -10279,7 +10343,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.11.1", @@ -10292,7 +10357,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.11.1", @@ -10305,7 +10371,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.11.1", @@ -10318,7 +10385,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.11.1", @@ -10331,7 +10399,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.11.1", @@ -10344,7 +10413,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { "version": "1.11.1", @@ -10355,6 +10425,7 @@ ], "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, @@ -10373,7 +10444,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.11.1", @@ -10386,7 +10458,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { "version": "1.11.1", @@ -10399,7 +10472,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@vitejs/plugin-react-swc": { "version": "4.2.2", @@ -10742,7 +10816,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -10755,6 +10828,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", + "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -10833,7 +10907,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -10990,6 +11063,7 @@ "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-21.1.0.tgz", "integrity": "sha512-kQrYLxhC+NTVVZ4CCzGF6L/uPVOzJmD1T3XgbiUnP7oTeVFOFgEUu6IKNwCDkpFoBVqDKQivlX4RUFqqnWFlEA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/helpers": "^0.5.11", "@types/command-line-args": "^5.2.3", @@ -11010,6 +11084,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -11019,6 +11094,7 @@ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "license": "MIT", + "peer": true, "engines": { "node": ">=14" } @@ -11043,6 +11119,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.17" } @@ -11128,6 +11205,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", @@ -11331,6 +11409,7 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">= 0.4" } @@ -11794,7 +11873,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -12042,6 +12120,7 @@ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.2" }, @@ -12526,6 +12605,7 @@ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz", "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==", "license": "MIT", + "peer": true, "dependencies": { "array-back": "^6.2.2", "find-replace": "^5.0.2", @@ -12549,6 +12629,7 @@ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", "license": "MIT", + "peer": true, "dependencies": { "array-back": "^6.2.2", "chalk-template": "^0.4.0", @@ -12574,6 +12655,7 @@ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 12.0.0" } @@ -13109,14 +13191,14 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cross-env": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "license": "MIT", - "peer": true, "dependencies": { "@epic-web/invariant": "^1.0.0", "cross-spawn": "^7.0.6" @@ -13411,7 +13493,6 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } @@ -13615,7 +13696,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -13804,8 +13886,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1467305.tgz", "integrity": "sha512-LxwMLqBoPPGpMdRL4NkLFRNy3QLp6Uqa7GNp1v6JaBheop2QrB9Q7q0A/q/CYYP9sBfZdHOyszVx4gc9zyk7ow==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/di": { "version": "0.0.1", @@ -13819,6 +13900,7 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "license": "MIT", + "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -13865,7 +13947,8 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/dom-serialize": { "version": "2.2.1", @@ -14053,6 +14136,7 @@ "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" } @@ -14267,6 +14351,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "prr": "~1.0.1" }, @@ -14649,6 +14734,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", "license": "MIT", + "peer": true, "dependencies": { "get-tsconfig": "^4.10.1", "stable-hash-x": "^0.2.0" @@ -14673,6 +14759,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -14684,6 +14771,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -14728,6 +14816,7 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^3.2.7" }, @@ -14745,6 +14834,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -14788,6 +14878,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -14797,6 +14888,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -14806,6 +14898,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-60.8.3.tgz", "integrity": "sha512-4191bTMvnd5WUtopCdzNhQchvv/MxtPD86ZGl3vem8Ibm22xJhKuIyClmgSxw+YERtorVc/NhG+bGjfFVa6+VQ==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@es-joy/jsdoccomment": "~0.71.0", "are-docs-informative": "^0.0.2", @@ -14832,6 +14925,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -14844,6 +14938,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -14856,6 +14951,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -14873,6 +14969,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-markdown-links/-/eslint-plugin-markdown-links-0.7.1.tgz", "integrity": "sha512-c6HAhdS3GmNLOzEuauGZ1+kkr20ruAHuF5rzwT48PdfZLTvPLeXa1Mb6HLdG8koLvwiLaIsXd8CntO/dt6UZug==", "license": "MIT", + "peer": true, "dependencies": { "@mdit-vue/shared": "^3.0.2", "entities": "^7.0.0", @@ -14898,6 +14995,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz", "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==", "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=0.12" }, @@ -14910,6 +15008,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-markdown-preferences/-/eslint-plugin-markdown-preferences-0.38.0.tgz", "integrity": "sha512-7DQ60sgg/y7xXghkrNIrTHIiwNcMKWiAXTygwWgtgIb8tHL0zrDCDNEJwUOEgIilOCNRUYQUEj7dKYWjw4rjrQ==", "license": "MIT", + "peer": true, "dependencies": { "diff-sequences": "^29.6.3", "emoji-regex-xs": "^2.0.1", @@ -14941,6 +15040,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "license": "MIT", + "peer": true, "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" @@ -15062,6 +15162,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -15078,6 +15179,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, @@ -15090,6 +15192,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15106,6 +15209,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -15118,6 +15222,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -15130,6 +15235,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -15147,6 +15253,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -15158,13 +15265,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/espree": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/espree/-/espree-11.0.0.tgz", "integrity": "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -15195,6 +15304,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -15483,7 +15593,8 @@ "url": "https://opencollective.com/fastify" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -15518,13 +15629,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-uri": { "version": "3.1.0", @@ -15556,6 +15669,7 @@ "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", "license": "MIT", + "peer": true, "dependencies": { "format": "^0.2.0" }, @@ -15622,6 +15736,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "license": "MIT", + "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -15709,6 +15824,7 @@ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=14" }, @@ -15726,6 +15842,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -15762,6 +15879,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "license": "MIT", + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -15774,7 +15892,8 @@ "version": "25.9.23", "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/flatted": { "version": "3.3.3", @@ -16119,6 +16238,7 @@ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "license": "MIT", + "peer": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -16166,7 +16286,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/glob": { "version": "10.5.0", @@ -16266,7 +16387,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -16580,7 +16700,8 @@ "url": "https://patreon.com/mdevils" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/html-escaper": { "version": "2.0.2", @@ -16867,6 +16988,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "bin": { "image-size": "bin/image-size.js" }, @@ -17355,6 +17477,7 @@ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "license": "MIT", + "peer": true, "dependencies": { "semver": "^7.7.1" } @@ -18093,7 +18216,6 @@ "integrity": "sha512-oLCXIhEb5e0zzjn9GyuvcuisvLBwUjmgz7a0RNGWKwQtJCDld4m+vwKUpAIJVLB5vbmQFdtKhT86/tIZlJ5gYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "glob": "^10.2.2", "jasmine-core": "~5.13.0" @@ -18107,8 +18229,7 @@ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.13.0.tgz", "integrity": "sha512-vsYjfh7lyqvZX5QgqKc4YH8phs7g96Z8bsdIFNEU3VqXhlHaq+vov/Fgn/sr6MiUczdZkyXRC3TX369Ll4Nzbw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jest-worker": { "version": "27.5.1", @@ -18147,7 +18268,6 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "devOptional": true, "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -18271,6 +18391,7 @@ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.6.0.tgz", "integrity": "sha512-3hSD14nXx66Rspx1RMnz1Pj4JacrMBAsC0CrF9lZYO/Qsp5/oIr6KqujVUNhQu94B6mMip2ukki8MpEWZwyhKA==", "license": "MIT", + "peer": true, "engines": { "node": ">=20.0.0" } @@ -18291,6 +18412,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "peer": true, "engines": { "node": ">=0.8" } @@ -18299,7 +18421,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -18338,7 +18461,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json5": { "version": "2.2.3", @@ -18413,7 +18537,6 @@ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -18548,7 +18671,6 @@ "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jasmine-core": "^4.1.0" }, @@ -18888,6 +19010,7 @@ "https://github.com/sponsors/katex" ], "license": "MIT", + "peer": true, "dependencies": { "commander": "^8.3.0" }, @@ -18900,6 +19023,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "license": "MIT", + "peer": true, "engines": { "node": ">= 12" } @@ -18909,6 +19033,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "license": "MIT", + "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -18967,7 +19092,6 @@ "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -19023,6 +19147,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "bin": { "mime": "cli.js" }, @@ -19037,6 +19162,7 @@ "dev": true, "license": "BSD-3-Clause", "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -19046,6 +19172,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -19425,6 +19552,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -19473,7 +19601,8 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.snakecase": { "version": "4.1.1", @@ -19782,6 +19911,7 @@ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -19946,6 +20076,7 @@ "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -19964,6 +20095,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -20077,6 +20209,7 @@ "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", "license": "MIT", + "peer": true, "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -20298,6 +20431,7 @@ "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", "license": "MIT", + "peer": true, "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -20435,6 +20569,7 @@ "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", "license": "MIT", + "peer": true, "dependencies": { "@types/katex": "^0.16.0", "devlop": "^1.0.0", @@ -21284,6 +21419,7 @@ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "license": "MIT", + "peer": true, "bin": { "napi-postinstall": "lib/cli.js" }, @@ -21298,7 +21434,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/needle": { "version": "3.3.1", @@ -21307,6 +21444,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.3", "sax": "^1.2.4" @@ -21351,7 +21489,6 @@ "integrity": "sha512-dFuwFsDJMBSd1YtmLLcX5bNNUCQUlRqgf34aXA+79PmkOP+0eF8GP2949wq3+jMjmFTNm80Oo8IUYiSLwklKCQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rollup/plugin-json": "^6.1.0", "@rollup/wasm-node": "^4.24.0", @@ -22139,6 +22276,7 @@ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-1.0.5.tgz", "integrity": "sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==", "license": "MIT", + "peer": true, "dependencies": { "type-fest": "4.2.0" } @@ -22240,6 +22378,7 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -22344,6 +22483,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "license": "MIT", + "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -22493,6 +22633,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -23021,6 +23162,7 @@ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", "license": "MIT", + "peer": true, "dependencies": { "parse-statements": "1.0.11" } @@ -23068,7 +23210,8 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/parse-url": { "version": "9.2.0", @@ -23517,7 +23660,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -23655,6 +23797,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -23680,6 +23823,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -23694,6 +23838,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -23703,6 +23848,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -23714,7 +23860,8 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/prismjs": { "version": "1.30.0", @@ -23819,6 +23966,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", "integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-transform": "^1.0.0" } @@ -23828,6 +23976,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-state": "^1.0.0" } @@ -23837,6 +23986,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -23848,6 +23998,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0", @@ -23859,6 +24010,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.0.tgz", "integrity": "sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", @@ -23871,6 +24023,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", @@ -23883,6 +24036,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.0.0" @@ -23893,6 +24047,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" @@ -23914,6 +24069,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz", "integrity": "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==", "license": "MIT", + "peer": true, "dependencies": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", @@ -23926,7 +24082,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", "license": "MIT", - "peer": true, "dependencies": { "orderedmap": "^2.0.0" } @@ -23936,6 +24091,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-model": "^1.25.0" } @@ -23945,6 +24101,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -23956,7 +24113,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -23968,6 +24124,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", "license": "MIT", + "peer": true, "dependencies": { "prosemirror-keymap": "^1.2.3", "prosemirror-model": "^1.25.4", @@ -23981,6 +24138,7 @@ "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", "license": "MIT", + "peer": true, "dependencies": { "@remirror/core-constants": "3.0.0", "escape-string-regexp": "^4.0.0" @@ -23996,6 +24154,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -24017,7 +24176,6 @@ "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.5.tgz", "integrity": "sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==", "license": "MIT", - "peer": true, "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", @@ -24138,7 +24296,8 @@ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/pump": { "version": "3.0.3", @@ -24315,7 +24474,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -24325,7 +24483,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -24702,6 +24859,7 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -24837,6 +24995,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", @@ -24854,6 +25013,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "license": "BlueOak-1.0.0", + "peer": true, "engines": { "node": "20 || >=22" } @@ -24863,6 +25023,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -24878,6 +25039,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", + "peer": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -24887,6 +25049,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -24914,7 +25077,6 @@ "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -25003,7 +25165,8 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/run-applescript": { "version": "7.1.0", @@ -25055,7 +25218,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -25145,7 +25307,6 @@ "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -25260,6 +25421,7 @@ "resolved": "https://registry.npmjs.org/sdbm/-/sdbm-3.0.0.tgz", "integrity": "sha512-9FHNk9qJKuRxkUeQQdRp8WLCFaL4hvPtYz/2xNAOkuZzQ3ZqMMkZ1CrkKPDA4lxbenMml0JRKHGyTyucK/JBBg==", "license": "MIT", + "peer": true, "engines": { "node": ">=20" }, @@ -25961,6 +26123,7 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "license": "MIT", + "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -26054,6 +26217,7 @@ "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.0.0" } @@ -26086,7 +26250,6 @@ "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.1.11.tgz", "integrity": "sha512-pKP5jXJYM4OjvNklGuHKO53wOCAwfx79KvZyOWHoi9zXUH5WVMFUe/ZfWyxXG/GTcj0maRgHGUjq/0I43r0dDQ==", "license": "MIT", - "peer": true, "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.0", @@ -26454,6 +26617,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -26485,6 +26649,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -26730,6 +26895,7 @@ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "license": "MIT", + "peer": true, "dependencies": { "@pkgr/core": "^0.2.9" }, @@ -26751,6 +26917,7 @@ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "license": "MIT", + "peer": true, "dependencies": { "array-back": "^6.2.2", "wordwrapjs": "^5.1.0" @@ -26899,7 +27066,6 @@ "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -27193,6 +27359,7 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.12" }, @@ -27215,6 +27382,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "license": "MIT", + "peer": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -27227,6 +27395,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "license": "MIT", + "peer": true, "dependencies": { "minimist": "^1.2.0" }, @@ -27238,8 +27407,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tuf-js": { "version": "3.1.0", @@ -27593,6 +27761,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -27605,6 +27774,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.2.0.tgz", "integrity": "sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=16" }, @@ -27729,7 +27899,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -27767,6 +27936,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.17" } @@ -27827,6 +27997,7 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", "license": "MIT", + "peer": true, "engines": { "node": ">=20.18.1" } @@ -27971,6 +28142,7 @@ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", "license": "MIT", + "peer": true, "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" @@ -28128,6 +28300,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -28137,6 +28310,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -28282,7 +28456,6 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -29000,7 +29173,8 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/watchpack": { "version": "2.4.2", @@ -29063,7 +29237,6 @@ "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -29141,7 +29314,6 @@ "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -29574,6 +29746,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -29583,6 +29756,7 @@ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.17" } @@ -29822,7 +29996,6 @@ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -29943,7 +30116,6 @@ "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -29965,8 +30137,7 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/zwitch": { "version": "2.0.4", diff --git a/packages/angular-workspace/spright-angular/chat/message/inbound/ng-package.json b/packages/angular-workspace/spright-angular/chat/message/inbound/ng-package.json new file mode 100644 index 0000000000..39cd55ac3e --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/inbound/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "public-api.ts" + } +} diff --git a/packages/angular-workspace/spright-angular/chat/message/inbound/public-api.ts b/packages/angular-workspace/spright-angular/chat/message/inbound/public-api.ts new file mode 100644 index 0000000000..6fd3ca1925 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/inbound/public-api.ts @@ -0,0 +1,2 @@ +export * from './spright-chat-message-inbound.directive'; +export * from './spright-chat-message-inbound.module'; diff --git a/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts b/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts new file mode 100644 index 0000000000..a3604e48f7 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts @@ -0,0 +1,16 @@ +import { Directive, ElementRef, Renderer2 } from '@angular/core'; +import { type ChatMessageInbound, chatMessageInboundTag } from '@ni/spright-components/dist/esm/chat/message/inbound'; + +export type { ChatMessageInbound }; +export { chatMessageInboundTag }; + +/** + * Directive to provide Angular integration for the chat inbound message. + */ +@Directive({ + selector: 'spright-chat-message', + standalone: false +}) +export class SprightChatMessageInboundDirective { + public constructor(private readonly renderer: Renderer2, private readonly elementRef: ElementRef<ChatMessageInbound>) {} +} diff --git a/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.module.ts b/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.module.ts new file mode 100644 index 0000000000..2f9899777a --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SprightChatMessageInboundDirective } from './spright-chat-message-inbound.directive'; + +import '@ni/spright-components/dist/esm/chat/message/inbound'; + +@NgModule({ + declarations: [ + SprightChatMessageInboundDirective + ], + imports: [CommonModule], + exports: [ + SprightChatMessageInboundDirective + ] +}) +export class SprightChatMessageInboundModule { } diff --git a/packages/angular-workspace/spright-angular/chat/message/inbound/tests/spright-chat-message-inbound.directive.spec.ts b/packages/angular-workspace/spright-angular/chat/message/inbound/tests/spright-chat-message-inbound.directive.spec.ts new file mode 100644 index 0000000000..cc2abef909 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/inbound/tests/spright-chat-message-inbound.directive.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; +import { SprightChatMessageInboundModule } from '../spright-chat-message-inbound.module'; + +describe('Spright chat message inbound', () => { + describe('module', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [SprightChatMessageInboundModule] + }); + }); + + it('custom element is defined', () => { + expect(customElements.get('spright-chat-message-inbound')).not.toBeUndefined(); + }); + }); +}); diff --git a/packages/angular-workspace/spright-angular/chat/message/outbound/ng-package.json b/packages/angular-workspace/spright-angular/chat/message/outbound/ng-package.json new file mode 100644 index 0000000000..39cd55ac3e --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/outbound/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "public-api.ts" + } +} diff --git a/packages/angular-workspace/spright-angular/chat/message/outbound/public-api.ts b/packages/angular-workspace/spright-angular/chat/message/outbound/public-api.ts new file mode 100644 index 0000000000..999ce64c9f --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/outbound/public-api.ts @@ -0,0 +1,2 @@ +export * from './spright-chat-message-outbound.directive'; +export * from './spright-chat-message-outbound.module'; diff --git a/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts b/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts new file mode 100644 index 0000000000..8704effee3 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts @@ -0,0 +1,16 @@ +import { Directive, ElementRef, Renderer2 } from '@angular/core'; +import { type ChatMessageOutbound, chatMessageOutboundTag } from '@ni/spright-components/dist/esm/chat/message/outbound'; + +export type { ChatMessageOutbound }; +export { chatMessageOutboundTag }; + +/** + * Directive to provide Angular integration for the chat outbound message. + */ +@Directive({ + selector: 'spright-chat-message', + standalone: false +}) +export class SprightChatMessageOutboundDirective { + public constructor(private readonly renderer: Renderer2, private readonly elementRef: ElementRef<ChatMessageOutbound>) {} +} diff --git a/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.module.ts b/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.module.ts new file mode 100644 index 0000000000..40aad2bbc6 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SprightChatMessageOutboundDirective } from './spright-chat-message-outbound.directive'; + +import '@ni/spright-components/dist/esm/chat/message/outbound'; + +@NgModule({ + declarations: [ + SprightChatMessageOutboundDirective + ], + imports: [CommonModule], + exports: [ + SprightChatMessageOutboundDirective + ] +}) +export class SprightChatMessageOutboundModule { } diff --git a/packages/angular-workspace/spright-angular/chat/message/outbound/tests/spright-chat-message-outbound.directive.spec.ts b/packages/angular-workspace/spright-angular/chat/message/outbound/tests/spright-chat-message-outbound.directive.spec.ts new file mode 100644 index 0000000000..01bfab0889 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/outbound/tests/spright-chat-message-outbound.directive.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; +import { SprightChatMessageOutboundModule } from '../spright-chat-message-outbound.module'; + +describe('Spright chat message outbound', () => { + describe('module', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [SprightChatMessageOutboundModule] + }); + }); + + it('custom element is defined', () => { + expect(customElements.get('spright-chat-message-outbound')).not.toBeUndefined(); + }); + }); +}); diff --git a/packages/angular-workspace/spright-angular/chat/message/system/ng-package.json b/packages/angular-workspace/spright-angular/chat/message/system/ng-package.json new file mode 100644 index 0000000000..39cd55ac3e --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/system/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "public-api.ts" + } +} diff --git a/packages/angular-workspace/spright-angular/chat/message/system/public-api.ts b/packages/angular-workspace/spright-angular/chat/message/system/public-api.ts new file mode 100644 index 0000000000..5555d7ee22 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/system/public-api.ts @@ -0,0 +1,2 @@ +export * from './spright-chat-message-system.directive'; +export * from './spright-chat-message-system.module'; diff --git a/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts b/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts new file mode 100644 index 0000000000..e4d0612fac --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts @@ -0,0 +1,16 @@ +import { Directive, ElementRef, Renderer2 } from '@angular/core'; +import { type ChatMessageSystem, chatMessageSystemTag } from '@ni/spright-components/dist/esm/chat/message/system'; + +export type { ChatMessageSystem }; +export { chatMessageSystemTag }; + +/** + * Directive to provide Angular integration for the chat system message. + */ +@Directive({ + selector: 'spright-chat-message', + standalone: false +}) +export class SprightChatMessageSystemDirective { + public constructor(private readonly renderer: Renderer2, private readonly elementRef: ElementRef<ChatMessageSystem>) {} +} diff --git a/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.module.ts b/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.module.ts new file mode 100644 index 0000000000..9896c52f87 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SprightChatMessageSystemDirective } from './spright-chat-message-system.directive'; + +import '@ni/spright-components/dist/esm/chat/message/system'; + +@NgModule({ + declarations: [ + SprightChatMessageSystemDirective + ], + imports: [CommonModule], + exports: [ + SprightChatMessageSystemDirective + ] +}) +export class SprightChatMessageSystemModule { } diff --git a/packages/angular-workspace/spright-angular/chat/message/system/tests/spright-chat-message-system.directive.spec.ts b/packages/angular-workspace/spright-angular/chat/message/system/tests/spright-chat-message-system.directive.spec.ts new file mode 100644 index 0000000000..b63860a256 --- /dev/null +++ b/packages/angular-workspace/spright-angular/chat/message/system/tests/spright-chat-message-system.directive.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; +import { SprightChatMessageSystemModule } from '../spright-chat-message-system.module'; + +describe('Spright chat message system', () => { + describe('module', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [SprightChatMessageSystemModule] + }); + }); + + it('custom element is defined', () => { + expect(customElements.get('spright-chat-message-system')).not.toBeUndefined(); + }); + }); +}); From d3c62286766c9945ef56c84ddbcefd7da1f1dea6 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 13:12:14 -0600 Subject: [PATCH 06/22] Angular example app --- .../example-client-app/src/app/app.module.ts | 8 ++++++-- .../src/app/customapp/customapp.component.html | 14 +++++++------- .../spright-chat-message-inbound.directive.ts | 2 +- .../spright-chat-message-outbound.directive.ts | 2 +- .../spright-chat-message-system.directive.ts | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/angular-workspace/example-client-app/src/app/app.module.ts b/packages/angular-workspace/example-client-app/src/app/app.module.ts index c3742ceb2d..eebeec029d 100644 --- a/packages/angular-workspace/example-client-app/src/app/app.module.ts +++ b/packages/angular-workspace/example-client-app/src/app/app.module.ts @@ -35,7 +35,9 @@ import { NimbleRichTextMentionUsersModule } from '@ni/nimble-angular/rich-text-m import { OkButtonModule } from 'ok-angular/button/ok-button.module'; import { SprightChatConversationModule } from '@ni/spright-angular/chat/conversation'; import { SprightChatInputModule } from '@ni/spright-angular/chat/input'; -import { SprightChatMessageModule } from '@ni/spright-angular/chat/message'; +import { SprightChatMessageInboundModule } from '@ni/spright-angular/chat/message/inbound'; +import { SprightChatMessageOutboundModule } from '@ni/spright-angular/chat/message/outbound'; +import { SprightChatMessageSystemModule } from '@ni/spright-angular/chat/message/system'; import { SprightRectangleModule } from '@ni/spright-angular/rectangle'; import { AppComponent } from './app.component'; import { CustomAppComponent } from './customapp/customapp.component'; @@ -116,7 +118,9 @@ import { CustomAppComponent } from './customapp/customapp.component'; OkButtonModule, SprightChatConversationModule, SprightChatInputModule, - SprightChatMessageModule, + SprightChatMessageInboundModule, + SprightChatMessageOutboundModule, + SprightChatMessageSystemModule, SprightRectangleModule, RouterModule.forRoot( [ diff --git a/packages/angular-workspace/example-client-app/src/app/customapp/customapp.component.html b/packages/angular-workspace/example-client-app/src/app/customapp/customapp.component.html index 735eedaa49..f6e504bbf5 100644 --- a/packages/angular-workspace/example-client-app/src/app/customapp/customapp.component.html +++ b/packages/angular-workspace/example-client-app/src/app/customapp/customapp.component.html @@ -471,12 +471,12 @@ <div class="sub-container"> <div class="container-label">Chat Conversation and Messages (Spright)</div> <spright-chat-conversation> - <spright-chat-message>To start, press any key.</spright-chat-message> - <spright-chat-message message-type="outbound">Where is the Any key?</spright-chat-message> - <spright-chat-message> + <spright-chat-message-system>To start, press any key.</spright-chat-message-system> + <spright-chat-message-outbound>Where is the Any key?</spright-chat-message-outbound> + <spright-chat-message-system> <nimble-spinner appearance="accent"></nimble-spinner> - </spright-chat-message> - <spright-chat-message message-type="inbound"> + </spright-chat-message-system> + <spright-chat-message-inbound> <nimble-button slot="footer-actions" appearance='ghost' content-hidden> <nimble-icon-copy-text slot="start"></nimble-icon-copy-text> Copy @@ -486,8 +486,8 @@ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div> <nimble-button slot="end" appearance="block">Order a tab</nimble-button> <nimble-button slot="end" appearance="block">Check core temperature</nimble-button> - </spright-chat-message> - <spright-chat-message message-type="outbound" *ngFor="let message of chatUserMessages"><span>{{message}}</span></spright-chat-message> + </spright-chat-message-inbound> + <spright-chat-message-outbound *ngFor="let message of chatUserMessages"><span>{{message}}</span></spright-chat-message-outbound> <spright-chat-input slot="input" placeholder="Type here" (send)="onChatInputSend($event)"></spright-chat-input> </spright-chat-conversation> </div> diff --git a/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts b/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts index a3604e48f7..cd3c2b0c31 100644 --- a/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts +++ b/packages/angular-workspace/spright-angular/chat/message/inbound/spright-chat-message-inbound.directive.ts @@ -8,7 +8,7 @@ export { chatMessageInboundTag }; * Directive to provide Angular integration for the chat inbound message. */ @Directive({ - selector: 'spright-chat-message', + selector: 'spright-chat-message-inbound', standalone: false }) export class SprightChatMessageInboundDirective { diff --git a/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts b/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts index 8704effee3..cb70d04fe7 100644 --- a/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts +++ b/packages/angular-workspace/spright-angular/chat/message/outbound/spright-chat-message-outbound.directive.ts @@ -8,7 +8,7 @@ export { chatMessageOutboundTag }; * Directive to provide Angular integration for the chat outbound message. */ @Directive({ - selector: 'spright-chat-message', + selector: 'spright-chat-message-outbound', standalone: false }) export class SprightChatMessageOutboundDirective { diff --git a/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts b/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts index e4d0612fac..a39abbf632 100644 --- a/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts +++ b/packages/angular-workspace/spright-angular/chat/message/system/spright-chat-message-system.directive.ts @@ -8,7 +8,7 @@ export { chatMessageSystemTag }; * Directive to provide Angular integration for the chat system message. */ @Directive({ - selector: 'spright-chat-message', + selector: 'spright-chat-message-system', standalone: false }) export class SprightChatMessageSystemDirective { From 08cf0bbd206efa53cd5fe856d6a989dde11abf97 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 13:28:55 -0600 Subject: [PATCH 07/22] Blazor --- .../Demo.Shared/Pages/ComponentsDemo.razor | 20 +++++----- .../SprightChatMessageInbound.razor | 5 +++ .../SprightChatMessageInbound.razor.cs | 18 +++++++++ .../SprightChatMessageOutbound.razor | 5 +++ .../SprightChatMessageOutbound.razor.cs | 18 +++++++++ .../Components/SprightChatMessageSystem.cs | 18 +++++++++ .../Components/SprightChatMessageSystem.razor | 5 +++ .../SprightChatMessageInboundTests.cs | 40 +++++++++++++++++++ .../SprightChatMessageOutboundTests.cs | 40 +++++++++++++++++++ .../SprightChatMessageSystemTests.cs | 40 +++++++++++++++++++ 10 files changed, 199 insertions(+), 10 deletions(-) create mode 100644 packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor create mode 100644 packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor.cs create mode 100644 packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor create mode 100644 packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor.cs create mode 100644 packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.cs create mode 100644 packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.razor create mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs create mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs create mode 100644 packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs diff --git a/packages/blazor-workspace/Examples/Demo.Shared/Pages/ComponentsDemo.razor b/packages/blazor-workspace/Examples/Demo.Shared/Pages/ComponentsDemo.razor index 8d9fcaa690..029c47227c 100644 --- a/packages/blazor-workspace/Examples/Demo.Shared/Pages/ComponentsDemo.razor +++ b/packages/blazor-workspace/Examples/Demo.Shared/Pages/ComponentsDemo.razor @@ -435,16 +435,16 @@ <div class="sub-container"> <div class="container-label">Chat Conversation and Messages (Spright)</div> <SprightChatConversation class="conversation"> - <SprightChatMessage message-type="system"> + <SprightChatMessageSystem> To start, press any key. - </SprightChatMessage> - <SprightChatMessage message-type="outbound"> + </SprightChatMessageSystem> + <SprightChatMessageOutbound> Where is the Any key? - </SprightChatMessage> - <SprightChatMessage> + </SprightChatMessageOutbound> + <SprightChatMessageSystem> <NimbleSpinner Appearance="SpinnerAppearance.Accent"></NimbleSpinner> - </SprightChatMessage> - <SprightChatMessage message-type="inbound"> + </SprightChatMessageSystem> + <SprightChatMessageInbound> <NimbleButton slot="footer-actions" Appearance=ButtonAppearance.Ghost ContentHidden="true"> <NimbleIconCopyText slot="start"></NimbleIconCopyText> Copy @@ -458,12 +458,12 @@ <NimbleButton slot="end" Appearance=ButtonAppearance.Block> Check core temperature </NimbleButton> - </SprightChatMessage> + </SprightChatMessageInbound> @foreach(var message in _userMessages) { - <SprightChatMessage MessageType="ChatMessageType.Outbound"> + <SprightChatMessageOutbound> @message - </SprightChatMessage> + </SprightChatMessageOutbound> } <SprightChatInput slot="input" Placeholder="Type here" Send="UpdateUserMessages"></SprightChatInput> </SprightChatConversation> diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor new file mode 100644 index 0000000000..98bd13cbeb --- /dev/null +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor @@ -0,0 +1,5 @@ +@namespace SprightBlazor +<spright-chat-message-inbound + @attributes="AdditionalAttributes"> + @ChildContent +</spright-chat-message-inbound> diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor.cs b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor.cs new file mode 100644 index 0000000000..531e24da51 --- /dev/null +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageInbound.razor.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Components; + +namespace SprightBlazor; + +public partial class SprightChatMessageInbound : ComponentBase +{ + /// <summary> + /// The child content of the element. + /// </summary> + [Parameter] + public RenderFragment? ChildContent { get; set; } + + /// <summary> + /// Any additional attributes that did not match known properties. + /// </summary> + [Parameter(CaptureUnmatchedValues = true)] + public IDictionary<string, object>? AdditionalAttributes { get; set; } +} diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor new file mode 100644 index 0000000000..0e63f5a181 --- /dev/null +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor @@ -0,0 +1,5 @@ +@namespace SprightBlazor +<spright-chat-message-outbound + @attributes="AdditionalAttributes"> + @ChildContent +</spright-chat-message-outbound> diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor.cs b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor.cs new file mode 100644 index 0000000000..2fd8e80623 --- /dev/null +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageOutbound.razor.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Components; + +namespace SprightBlazor; + +public partial class SprightChatMessageOutbound : ComponentBase +{ + /// <summary> + /// The child content of the element. + /// </summary> + [Parameter] + public RenderFragment? ChildContent { get; set; } + + /// <summary> + /// Any additional attributes that did not match known properties. + /// </summary> + [Parameter(CaptureUnmatchedValues = true)] + public IDictionary<string, object>? AdditionalAttributes { get; set; } +} diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.cs b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.cs new file mode 100644 index 0000000000..17323ff131 --- /dev/null +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Components; + +namespace SprightBlazor; + +public partial class SprightChatMessageSystem : ComponentBase +{ + /// <summary> + /// The child content of the element. + /// </summary> + [Parameter] + public RenderFragment? ChildContent { get; set; } + + /// <summary> + /// Any additional attributes that did not match known properties. + /// </summary> + [Parameter(CaptureUnmatchedValues = true)] + public IDictionary<string, object>? AdditionalAttributes { get; set; } +} diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.razor b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.razor new file mode 100644 index 0000000000..37629390a7 --- /dev/null +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessageSystem.razor @@ -0,0 +1,5 @@ +@namespace SprightBlazor +<spright-chat-message-system + @attributes="AdditionalAttributes"> + @ChildContent +</spright-chat-message-system> diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs new file mode 100644 index 0000000000..ffe5e171af --- /dev/null +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs @@ -0,0 +1,40 @@ +using System; +using System.Linq.Expressions; +using Bunit; +using Xunit; + +namespace SprightBlazor.Tests.Unit.Components; + +/// <summary> +/// Test for <see cref="SprightChatMessageInbound"/>. +/// </summary> +public class SprightChatMessageInboundTests +{ + [Fact] + public void SprightChatMessageInbound_Render_HasChatMessageMarkup() + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + var expectedMarkup = "spright-chat-message-inbound"; + + var component = context.RenderComponent<SprightChatMessageInbound>(); + + Assert.Contains(expectedMarkup, component.Markup); + } + + [Fact] + public void SprightChatMessageInbound_SupportsAdditionalAttributes() + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + var exception = Record.Exception(() => context.RenderComponent<SprightChatMessageInbound>(ComponentParameter.CreateParameter("class", "foo"))); + Assert.Null(exception); + } + + private IRenderedComponent<SprightChatMessageInbound> RenderWithPropertySet<TProperty>(Expression<Func<SprightChatMessageInbound, TProperty>> propertyGetter, TProperty propertyValue) + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + return context.RenderComponent<SprightChatMessageInbound>(p => p.Add(propertyGetter, propertyValue)); + } +} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs new file mode 100644 index 0000000000..26a8f7611b --- /dev/null +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs @@ -0,0 +1,40 @@ +using System; +using System.Linq.Expressions; +using Bunit; +using Xunit; + +namespace SprightBlazor.Tests.Unit.Components; + +/// <summary> +/// Test for <see cref="SprightChatMessageOutbound"/>. +/// </summary> +public class SprightChatMessageOutboundTests +{ + [Fact] + public void SprightChatMessageOutbound_Render_HasChatMessageMarkup() + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + var expectedMarkup = "spright-chat-message-outbound"; + + var component = context.RenderComponent<SprightChatMessageOutbound>(); + + Assert.Contains(expectedMarkup, component.Markup); + } + + [Fact] + public void SprightChatMessageOutbound_SupportsAdditionalAttributes() + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + var exception = Record.Exception(() => context.RenderComponent<SprightChatMessageOutbound>(ComponentParameter.CreateParameter("class", "foo"))); + Assert.Null(exception); + } + + private IRenderedComponent<SprightChatMessageOutbound> RenderWithPropertySet<TProperty>(Expression<Func<SprightChatMessageOutbound, TProperty>> propertyGetter, TProperty propertyValue) + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + return context.RenderComponent<SprightChatMessageOutbound>(p => p.Add(propertyGetter, propertyValue)); + } +} diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs new file mode 100644 index 0000000000..e21bf4f530 --- /dev/null +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs @@ -0,0 +1,40 @@ +using System; +using System.Linq.Expressions; +using Bunit; +using Xunit; + +namespace SprightBlazor.Tests.Unit.Components; + +/// <summary> +/// Test for <see cref="SprightChatMessageSystem"/>. +/// </summary> +public class SprightChatMessageSystemTests +{ + [Fact] + public void SprightChatMessageSystem_Render_HasChatMessageMarkup() + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + var expectedMarkup = "spright-chat-message-system"; + + var component = context.RenderComponent<SprightChatMessageSystem>(); + + Assert.Contains(expectedMarkup, component.Markup); + } + + [Fact] + public void SprightChatMessageSystem_SupportsAdditionalAttributes() + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + var exception = Record.Exception(() => context.RenderComponent<SprightChatMessageSystem>(ComponentParameter.CreateParameter("class", "foo"))); + Assert.Null(exception); + } + + private IRenderedComponent<SprightChatMessageSystem> RenderWithPropertySet<TProperty>(Expression<Func<SprightChatMessageSystem, TProperty>> propertyGetter, TProperty propertyValue) + { + var context = new TestContext(); + context.JSInterop.Mode = JSRuntimeMode.Loose; + return context.RenderComponent<SprightChatMessageSystem>(p => p.Add(propertyGetter, propertyValue)); + } +} From fc53d45ed46d088fb22ac0224e114456c71605b6 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 14:02:04 -0600 Subject: [PATCH 08/22] React app --- .../react-client-app/src/components/App.tsx | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/react-workspace/react-client-app/src/components/App.tsx b/packages/react-workspace/react-client-app/src/components/App.tsx index 7c923fa814..a14c98fd53 100644 --- a/packages/react-workspace/react-client-app/src/components/App.tsx +++ b/packages/react-workspace/react-client-app/src/components/App.tsx @@ -58,7 +58,9 @@ import { NimbleMappingUser } from '@ni/nimble-react/mapping/user'; import { NimbleRichTextViewer } from '@ni/nimble-react/rich-text/viewer'; import { SprightChatConversation } from '@ni/spright-react/chat/conversation'; import { SprightChatInput } from '@ni/spright-react/chat/input'; -import { SprightChatMessage } from '@ni/spright-react/chat/message'; +import { SprightChatMessageInbound } from '@ni/spright-react/chat/message/inbound'; +import { SprightChatMessageOutbound } from '@ni/spright-react/chat/message/outbound'; +import { SprightChatMessageSystem } from '@ni/spright-react/chat/message/system'; import { NimbleIconCopyText } from '@ni/nimble-react/icons/copy-text'; import { NimbleIconWebviCustom } from '@ni/nimble-react/icons/webvi-custom'; @@ -1161,12 +1163,12 @@ export function App(): React.JSX.Element { <div className="sub-container"> <div className="container-label">Chat Conversation and Messages (Spright)</div> <SprightChatConversation> - <SprightChatMessage>To start, press any key.</SprightChatMessage> - <SprightChatMessage messageType="outbound">Where is the Any key?</SprightChatMessage> - <SprightChatMessage> + <SprightChatMessageSystem>To start, press any key.</SprightChatMessageSystem> + <SprightChatMessageOutbound>Where is the Any key?</SprightChatMessageOutbound> + <SprightChatMessageSystem> <NimbleSpinner appearance="accent"></NimbleSpinner> - </SprightChatMessage> - <SprightChatMessage messageType="inbound"> + </SprightChatMessageSystem> + <SprightChatMessageInbound> <NimbleButton slot="footer-actions" appearance='ghost' contentHidden> <NimbleIconCopyText slot="start"></NimbleIconCopyText> Copy @@ -1176,11 +1178,11 @@ export function App(): React.JSX.Element { Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div> <NimbleButton slot="end" appearance="block">Order a tab</NimbleButton> <NimbleButton slot="end" appearance="block">Check core temperature</NimbleButton> - </SprightChatMessage> + </SprightChatMessageInbound> {chatUserMessages.map((message, index) => ( - <SprightChatMessage key={index} messageType="outbound"> + <SprightChatMessageOutbound key={index}> <span>{message}</span> - </SprightChatMessage> + </SprightChatMessageOutbound> ))} <SprightChatInput slot="input" From 9893b63b3c02628aedaf082d761be8c100bf9fbe Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 14:07:02 -0600 Subject: [PATCH 09/22] Mark old message as deprecated --- .../chat/message/spright-chat-message.directive.ts | 1 + .../SprightBlazor/Components/SprightChatMessage.razor.cs | 1 + packages/spright-components/src/chat/message/index.ts | 1 + packages/spright-components/src/chat/message/types.ts | 1 + 4 files changed, 4 insertions(+) diff --git a/packages/angular-workspace/spright-angular/chat/message/spright-chat-message.directive.ts b/packages/angular-workspace/spright-angular/chat/message/spright-chat-message.directive.ts index dba9a2bb47..3d1b7241f3 100644 --- a/packages/angular-workspace/spright-angular/chat/message/spright-chat-message.directive.ts +++ b/packages/angular-workspace/spright-angular/chat/message/spright-chat-message.directive.ts @@ -8,6 +8,7 @@ export { chatMessageTag }; /** * Directive to provide Angular integration for the chat message. + * @deprecated Use specific message component types instead */ @Directive({ selector: 'spright-chat-message', diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs index ecebd30af3..ae14501acb 100644 --- a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs @@ -2,6 +2,7 @@ namespace SprightBlazor; +[Obsolete("Use specific message component types instead")] public partial class SprightChatMessage : ComponentBase { /// <summary> diff --git a/packages/spright-components/src/chat/message/index.ts b/packages/spright-components/src/chat/message/index.ts index eee80ed989..0ba315a586 100644 --- a/packages/spright-components/src/chat/message/index.ts +++ b/packages/spright-components/src/chat/message/index.ts @@ -25,6 +25,7 @@ export type ChatMessageOptions = FoundationElementDefinition & StartEndOptions; /** * A Spright component for displaying a chat message + * @deprecated Use specific message component types instead */ export class ChatMessage extends FoundationElement { /** diff --git a/packages/spright-components/src/chat/message/types.ts b/packages/spright-components/src/chat/message/types.ts index f4f93e0ba8..6e6d1101ee 100644 --- a/packages/spright-components/src/chat/message/types.ts +++ b/packages/spright-components/src/chat/message/types.ts @@ -1,6 +1,7 @@ /** * A message type in a chat conversation. * @public + * @deprecated Use specific message component types instead */ export const ChatMessageType = { system: undefined, From 5104b6dfde0c2e9fdb3710af3e6ffe7130336d13 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 14:09:17 -0600 Subject: [PATCH 10/22] Change files --- ...right-angular-31b29e46-9695-49c8-9525-c7e1fb7513ac.json | 7 +++++++ ...pright-blazor-879621d4-9813-47ca-9a37-46b18fbec175.json | 7 +++++++ ...ht-components-0983404e-2334-4d3f-94cf-6e96e6d643a8.json | 7 +++++++ ...spright-react-d00d1016-6e7f-4584-bd00-1209e4781ffa.json | 7 +++++++ 4 files changed, 28 insertions(+) create mode 100644 change/@ni-spright-angular-31b29e46-9695-49c8-9525-c7e1fb7513ac.json create mode 100644 change/@ni-spright-blazor-879621d4-9813-47ca-9a37-46b18fbec175.json create mode 100644 change/@ni-spright-components-0983404e-2334-4d3f-94cf-6e96e6d643a8.json create mode 100644 change/@ni-spright-react-d00d1016-6e7f-4584-bd00-1209e4781ffa.json diff --git a/change/@ni-spright-angular-31b29e46-9695-49c8-9525-c7e1fb7513ac.json b/change/@ni-spright-angular-31b29e46-9695-49c8-9525-c7e1fb7513ac.json new file mode 100644 index 0000000000..8055e27fde --- /dev/null +++ b/change/@ni-spright-angular-31b29e46-9695-49c8-9525-c7e1fb7513ac.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add dedicated chat message components for inbound, outbound, and system messages. The original chat message component is deprecated and will be removed in a future release.", + "packageName": "@ni/spright-angular", + "email": "jattasNI@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-spright-blazor-879621d4-9813-47ca-9a37-46b18fbec175.json b/change/@ni-spright-blazor-879621d4-9813-47ca-9a37-46b18fbec175.json new file mode 100644 index 0000000000..9c00f4f560 --- /dev/null +++ b/change/@ni-spright-blazor-879621d4-9813-47ca-9a37-46b18fbec175.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add dedicated chat message components for inbound, outbound, and system messages. The original chat message component is deprecated and will be removed in a future release.", + "packageName": "@ni/spright-blazor", + "email": "jattasNI@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-spright-components-0983404e-2334-4d3f-94cf-6e96e6d643a8.json b/change/@ni-spright-components-0983404e-2334-4d3f-94cf-6e96e6d643a8.json new file mode 100644 index 0000000000..d9510408dc --- /dev/null +++ b/change/@ni-spright-components-0983404e-2334-4d3f-94cf-6e96e6d643a8.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add dedicated chat message components for inbound, outbound, and system messages. The original chat message component is deprecated and will be removed in a future release.", + "packageName": "@ni/spright-components", + "email": "jattasNI@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@ni-spright-react-d00d1016-6e7f-4584-bd00-1209e4781ffa.json b/change/@ni-spright-react-d00d1016-6e7f-4584-bd00-1209e4781ffa.json new file mode 100644 index 0000000000..f5efda3dba --- /dev/null +++ b/change/@ni-spright-react-d00d1016-6e7f-4584-bd00-1209e4781ffa.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add dedicated chat message components for inbound, outbound, and system messages. The original chat message component is deprecated and will be removed in a future release.", + "packageName": "@ni/spright-react", + "email": "jattasNI@users.noreply.github.com", + "dependentChangeType": "patch" +} From 982f0ccf319e365caac075377d24331eb1bbc474 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:10:59 -0600 Subject: [PATCH 11/22] Don't use [Obsolete] tag, it causes errors --- .../SprightBlazor/Components/SprightChatMessage.razor.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs index ae14501acb..5b89566781 100644 --- a/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs +++ b/packages/blazor-workspace/SprightBlazor/Components/SprightChatMessage.razor.cs @@ -2,7 +2,9 @@ namespace SprightBlazor; -[Obsolete("Use specific message component types instead")] +/// <summary> +/// SprightChatMessage is deprecated. Use specific message component types instead. +/// </summary> public partial class SprightChatMessage : ComponentBase { /// <summary> From befc5f145680a1b0a9247ed954c372eba4abc70e Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:12:17 -0600 Subject: [PATCH 12/22] delete unused --- .../Unit/Components/SprightChatMessageInboundTests.cs | 7 ------- .../Unit/Components/SprightChatMessageOutboundTests.cs | 7 ------- .../Unit/Components/SprightChatMessageSystemTests.cs | 9 +-------- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs index ffe5e171af..c89f18a1a5 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageInboundTests.cs @@ -30,11 +30,4 @@ public void SprightChatMessageInbound_SupportsAdditionalAttributes() var exception = Record.Exception(() => context.RenderComponent<SprightChatMessageInbound>(ComponentParameter.CreateParameter("class", "foo"))); Assert.Null(exception); } - - private IRenderedComponent<SprightChatMessageInbound> RenderWithPropertySet<TProperty>(Expression<Func<SprightChatMessageInbound, TProperty>> propertyGetter, TProperty propertyValue) - { - var context = new TestContext(); - context.JSInterop.Mode = JSRuntimeMode.Loose; - return context.RenderComponent<SprightChatMessageInbound>(p => p.Add(propertyGetter, propertyValue)); - } } diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs index 26a8f7611b..769347f650 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageOutboundTests.cs @@ -30,11 +30,4 @@ public void SprightChatMessageOutbound_SupportsAdditionalAttributes() var exception = Record.Exception(() => context.RenderComponent<SprightChatMessageOutbound>(ComponentParameter.CreateParameter("class", "foo"))); Assert.Null(exception); } - - private IRenderedComponent<SprightChatMessageOutbound> RenderWithPropertySet<TProperty>(Expression<Func<SprightChatMessageOutbound, TProperty>> propertyGetter, TProperty propertyValue) - { - var context = new TestContext(); - context.JSInterop.Mode = JSRuntimeMode.Loose; - return context.RenderComponent<SprightChatMessageOutbound>(p => p.Add(propertyGetter, propertyValue)); - } } diff --git a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs index e21bf4f530..8dac4dd8f1 100644 --- a/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs +++ b/packages/blazor-workspace/Tests/SprightBlazor.Tests/Unit/Components/SprightChatMessageSystemTests.cs @@ -30,11 +30,4 @@ public void SprightChatMessageSystem_SupportsAdditionalAttributes() var exception = Record.Exception(() => context.RenderComponent<SprightChatMessageSystem>(ComponentParameter.CreateParameter("class", "foo"))); Assert.Null(exception); } - - private IRenderedComponent<SprightChatMessageSystem> RenderWithPropertySet<TProperty>(Expression<Func<SprightChatMessageSystem, TProperty>> propertyGetter, TProperty propertyValue) - { - var context = new TestContext(); - context.JSInterop.Mode = JSRuntimeMode.Loose; - return context.RenderComponent<SprightChatMessageSystem>(p => p.Add(propertyGetter, propertyValue)); - } -} +} \ No newline at end of file From d465fa7b08191c602c87142d5938747ee66e8a4e Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:56:31 -0600 Subject: [PATCH 13/22] all-components --- packages/spright-components/src/all-components.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/spright-components/src/all-components.ts b/packages/spright-components/src/all-components.ts index bb4833f10c..911c43293f 100644 --- a/packages/spright-components/src/all-components.ts +++ b/packages/spright-components/src/all-components.ts @@ -9,4 +9,7 @@ import '@ni/nimble-components/dist/esm/all-components'; import './chat/conversation'; import './chat/input'; import './chat/message'; +import './chat/message/inbound'; +import './chat/message/outbound'; +import './chat/message/system'; import './rectangle'; From b8e5d7b88984859d5d7a28c99e7590046c8e086a Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 22:46:02 -0600 Subject: [PATCH 14/22] remove base class --- .../spright-components/src/chat/message/base/index.ts | 9 --------- .../src/chat/message/outbound/index.ts | 4 ++-- .../spright-components/src/chat/message/system/index.ts | 4 ++-- 3 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 packages/spright-components/src/chat/message/base/index.ts diff --git a/packages/spright-components/src/chat/message/base/index.ts b/packages/spright-components/src/chat/message/base/index.ts deleted file mode 100644 index d92bd765e7..0000000000 --- a/packages/spright-components/src/chat/message/base/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { - FoundationElement, -} from '@ni/fast-foundation'; - -/** - * A Spright component base class for displaying a chat message - */ -export abstract class ChatMessageBase extends FoundationElement { -} diff --git a/packages/spright-components/src/chat/message/outbound/index.ts b/packages/spright-components/src/chat/message/outbound/index.ts index ed7ea5342a..30eb9e1818 100644 --- a/packages/spright-components/src/chat/message/outbound/index.ts +++ b/packages/spright-components/src/chat/message/outbound/index.ts @@ -1,9 +1,9 @@ import { DesignSystem, + FoundationElement, } from '@ni/fast-foundation'; import { styles } from './styles'; import { template } from './template'; -import { ChatMessageBase } from '../base'; declare global { interface HTMLElementTagNameMap { @@ -14,7 +14,7 @@ declare global { /** * A Spright component for displaying an outbound chat message */ -export class ChatMessageOutbound extends ChatMessageBase { +export class ChatMessageOutbound extends FoundationElement { } const sprightChatMessageOutbound = ChatMessageOutbound.compose({ diff --git a/packages/spright-components/src/chat/message/system/index.ts b/packages/spright-components/src/chat/message/system/index.ts index 06c5d8f182..cde64f992f 100644 --- a/packages/spright-components/src/chat/message/system/index.ts +++ b/packages/spright-components/src/chat/message/system/index.ts @@ -1,9 +1,9 @@ import { DesignSystem, + FoundationElement, } from '@ni/fast-foundation'; import { styles } from './styles'; import { template } from './template'; -import { ChatMessageBase } from '../base'; declare global { interface HTMLElementTagNameMap { @@ -14,7 +14,7 @@ declare global { /** * A Spright component for displaying an system chat message */ -export class ChatMessageSystem extends ChatMessageBase { +export class ChatMessageSystem extends FoundationElement { } const sprightChatMessageSystem = ChatMessageSystem.compose({ From 64ebc2cec2834f46c5680b841fb57e7c2cb26d1c Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 23:07:29 -0600 Subject: [PATCH 15/22] hidden and text customized stories --- .../message/chat-message-matrix.stories.ts | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/storybook/src/spright/chat/message/chat-message-matrix.stories.ts b/packages/storybook/src/spright/chat/message/chat-message-matrix.stories.ts index 8c23b7c650..06fc7a851f 100644 --- a/packages/storybook/src/spright/chat/message/chat-message-matrix.stories.ts +++ b/packages/storybook/src/spright/chat/message/chat-message-matrix.stories.ts @@ -1,6 +1,9 @@ import type { StoryFn, Meta } from '@storybook/html-vite'; import { html } from '@ni/fast-element'; import { chatMessageTag } from '@ni/spright-components/dist/esm/chat/message'; +import { chatMessageInboundTag } from '@ni/spright-components/dist/esm/chat/message/inbound'; +import { chatMessageOutboundTag } from '@ni/spright-components/dist/esm/chat/message/outbound'; +import { chatMessageSystemTag } from '@ni/spright-components/dist/esm/chat/message/system'; import { sharedMatrixParameters, createMatrixThemeStory @@ -18,14 +21,50 @@ const metadata: Meta = { export default metadata; -export const hidden: StoryFn = createStory( +export const messageHidden: StoryFn = createStory( hiddenWrapper( html`<${chatMessageTag} hidden>Hidden Chat Message</${chatMessageTag}>` ) ); -export const textCustomized: StoryFn = createMatrixThemeStory( +export const messageTextCustomized: StoryFn = createMatrixThemeStory( textCustomizationWrapper( html`<${chatMessageTag}>Message</${chatMessageTag}>` ) ); + +export const messageInboundHidden: StoryFn = createStory( + hiddenWrapper( + html`<${chatMessageInboundTag} hidden>Hidden Chat Inbound Message</${chatMessageInboundTag}>` + ) +); + +export const messageInboundTextCustomized: StoryFn = createMatrixThemeStory( + textCustomizationWrapper( + html`<${chatMessageInboundTag}>Inbound Message</${chatMessageInboundTag}>` + ) +); + +export const messageOutboundHidden: StoryFn = createStory( + hiddenWrapper( + html`<${chatMessageOutboundTag} hidden>Hidden Chat Outbound Message</${chatMessageOutboundTag}>` + ) +); + +export const messageOutboundTextCustomized: StoryFn = createMatrixThemeStory( + textCustomizationWrapper( + html`<${chatMessageOutboundTag}>Outbound Message</${chatMessageOutboundTag}>` + ) +); + +export const messageSystemHidden: StoryFn = createStory( + hiddenWrapper( + html`<${chatMessageSystemTag} hidden>Hidden Chat System Message</${chatMessageSystemTag}>` + ) +); + +export const messageSystemTextCustomized: StoryFn = createMatrixThemeStory( + textCustomizationWrapper( + html`<${chatMessageSystemTag}>System Message</${chatMessageSystemTag}>` + ) +); From 4f1a8c8fb6a1d7d5841dadb6262971a89829ed06 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Tue, 27 Jan 2026 23:27:42 -0600 Subject: [PATCH 16/22] conversation matrix test uses new message components --- .../chat-conversation-matrix.stories.ts | 165 +++++++++++++++--- 1 file changed, 145 insertions(+), 20 deletions(-) diff --git a/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts b/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts index 73c7b1e7ca..095fdaab7b 100644 --- a/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts +++ b/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts @@ -2,6 +2,9 @@ import type { StoryFn, Meta } from '@storybook/html-vite'; import { html, repeat, ViewTemplate } from '@ni/fast-element'; import { chatInputTag } from '@ni/spright-components/dist/esm/chat/input'; import { chatMessageTag } from '@ni/spright-components/dist/esm/chat/message'; +import { chatMessageInboundTag } from '@ni/spright-components/dist/esm/chat/message/inbound'; +import { chatMessageOutboundTag } from '@ni/spright-components/dist/esm/chat/message/outbound'; +import { chatMessageSystemTag } from '@ni/spright-components/dist/esm/chat/message/system'; import { ChatMessageType } from '@ni/spright-components/dist/esm/chat/message/types'; import { chatConversationTag } from '@ni/spright-components/dist/esm/chat/conversation'; import { @@ -25,9 +28,19 @@ const messageTypeStates = [ ['system', ChatMessageType.system] ] as const; type MessageTypeStates = (typeof messageTypeStates)[number]; -const outboundState = messageTypeStates[0]; -const inboundState = messageTypeStates[1]; -const systemState = messageTypeStates[2]; +const outboundTypeState = messageTypeStates[0]; +const inboundTypeState = messageTypeStates[1]; +const systemTypeState = messageTypeStates[2]; + +const messageComponentStates = [ + ['outbound', chatMessageOutboundTag], + ['inbound', chatMessageInboundTag], + ['system', chatMessageSystemTag] +] as const; +type MessageComponentStates = (typeof messageComponentStates)[number]; +const outboundComponentState = messageComponentStates[0]; +const inboundComponentState = messageComponentStates[1]; +const systemComponentState = messageComponentStates[2]; const metadata: Meta = { title: 'Tests Spright/Chat Conversation', @@ -64,7 +77,7 @@ const appearanceStates = [ ] as const; type AppearanceStates = (typeof appearanceStates)[number]; -const componentSizing = ( +const messageTypeSizing = ( [_messageTypeLabel, messageType]: MessageTypeStates, [viewportLabel, viewportWidth, viewportHeight]: ViewportStates, [contentWidthLabel, contentWidth]: ContentWidthStates, @@ -102,8 +115,8 @@ const componentSizing = ( `; export const outboundSizing: StoryFn = createStory(html` - ${createMatrix(componentSizing, [ - [outboundState], + ${createMatrix(messageTypeSizing, [ + [outboundTypeState], viewportStates, contentWidthStates, contentHeightStates @@ -111,8 +124,8 @@ export const outboundSizing: StoryFn = createStory(html` `); export const inboundSizing: StoryFn = createStory(html` - ${createMatrix(componentSizing, [ - [inboundState], + ${createMatrix(messageTypeSizing, [ + [inboundTypeState], viewportStates, contentWidthStates, contentHeightStates @@ -120,8 +133,72 @@ export const inboundSizing: StoryFn = createStory(html` `); export const systemSizing: StoryFn = createStory(html` - ${createMatrix(componentSizing, [ - [systemState], + ${createMatrix(messageTypeSizing, [ + [systemTypeState], + viewportStates, + contentWidthStates, + contentHeightStates + ])} +`); + +const messageComponentSizing = ( + [_messageTypeLabel, messageComponentType]: MessageComponentStates, + [viewportLabel, viewportWidth, viewportHeight]: ViewportStates, + [contentWidthLabel, contentWidth]: ContentWidthStates, + [contentHeightLabel, contentHeight]: ContentHeightStates +): ViewTemplate => html` + <p + style=" + font: var(${bodyFont.cssCustomProperty}); + color: var(${bodyFontColor.cssCustomProperty}); + margin-bottom: 0px; + " + > + viewport:${() => viewportLabel}, content:${() => contentWidthLabel},${() => contentHeightLabel} + </p> + <div style=" + width: ${viewportWidth}; + height: ${viewportHeight}; + border: 1px dashed red; + "> + <${chatConversationTag} style=" + width: 100%; + height: 100%; + "> + <${() => messageComponentType}> + <div style=" + width: ${contentWidth}; + height: ${contentHeight}; + background: blue; + display: inline-block; + " + ></div> + </${() => messageComponentType}> + </${chatConversationTag}> + </div> +`; + +export const outboundMessageSizing: StoryFn = createStory(html` + ${createMatrix(messageComponentSizing, [ + [outboundComponentState], + viewportStates, + contentWidthStates, + contentHeightStates + ])} +`); + +export const inboundMessageSizing: StoryFn = createStory(html` + ${createMatrix(messageComponentSizing, [ + [inboundComponentState], + viewportStates, + contentWidthStates, + contentHeightStates + ])} +`); + +export const systemMessageSizing: StoryFn = createStory(html` + ${createMatrix(messageComponentSizing, [ + [systemComponentState], viewportStates, contentWidthStates, contentHeightStates @@ -144,7 +221,7 @@ const endButtonStates = [ ] as const; type EndButtonStates = (typeof endButtonStates)[number]; -const slottedButtons = ( +const slottedButtonsMessageTypes = ( [_messageTypeLabel, messageType]: MessageTypeStates, [footerActionsLabel, footerActions]: FooterActionsStates, [endButtonsLabel, endButtons]: EndButtonStates @@ -187,13 +264,61 @@ const slottedButtons = ( `; export const slottedButtonsSizing: StoryFn = createMatrixThemeStory(html` - ${createMatrix(slottedButtons, [ + ${createMatrix(slottedButtonsMessageTypes, [ messageTypeStates, footerActionsStates, endButtonStates ])} `); +const slottedButtonsInboundMessageComponent = ( + [footerActionsLabel, footerActions]: FooterActionsStates, + [endButtonsLabel, endButtons]: EndButtonStates +): ViewTemplate => html` + <p + style=" + font: var(${bodyFont.cssCustomProperty}); + color: var(${bodyFontColor.cssCustomProperty}); + margin-bottom: 0px; + " + > + footer-actions:${() => footerActionsLabel}, end:${() => endButtonsLabel} + </p> + <div style="width: 600px;"> + <${chatConversationTag} style=" + width: 100%; + height: 100%; + "> + <${chatMessageInboundTag}"> + <div style=" + width: 100px; + border: 1px blue solid; + display: inline-block; + " + >Placeholder text</div> + ${repeat(() => footerActions, html<string>` + <${buttonTag} content-hidden slot="footer-actions" appearance="ghost"> + <${iconThumbUpTag} slot="start"></${iconThumbUpTag}> + ${x => x} + </${buttonTag}> + `)} + ${repeat(() => endButtons, html<string>` + <${buttonTag} slot="end" appearance="block"> + ${x => x} + </${buttonTag}> + `)} + </${chatMessageInboundTag}> + </${chatConversationTag}> + </div> +`; + +export const slottedButtonsInboundMessageSizing: StoryFn = createMatrixThemeStory(html` + ${createMatrix(slottedButtonsInboundMessageComponent, [ + footerActionsStates, + endButtonStates + ])} +`); + const heightStates = [ ['shorter', '200px'], ['taller', '300px'] @@ -208,12 +333,12 @@ const conversationWithInput = ( width: 100%; height: ${height}; "> - <${chatMessageTag} message-type="inbound"> + <${chatMessageInboundTag}> <span>Conversation is ${heightLabel} than the height of the messages.</span> - </${chatMessageTag}> - <${chatMessageTag} message-type="outbound"> + </${chatMessageInboundTag}> + <${chatMessageOutboundTag} message-type="outbound"> <span>Conversation is ${heightLabel} than the height of the messages.</span> - </${chatMessageTag}> + </${chatMessageOutboundTag}> <${chatInputTag} slot='input'></${chatInputTag}> </${chatConversationTag}> </div> @@ -237,12 +362,12 @@ const conversationWithAppearance = ([ appearance: ${() => appearanceLabel} </p> <${chatConversationTag} appearance="${() => appearance}"> - <${chatMessageTag} message-type="inbound"> + <${chatMessageInboundTag}> <span>Hello.</span> - </${chatMessageTag}> - <${chatMessageTag} message-type="outbound"> + </${chatMessageInboundTag}> + <${chatMessageOutboundTag}> <span>Greetings!</span> - </${chatMessageTag}> + </${chatMessageOutboundTag}> <${chatInputTag} slot='input'></${chatInputTag}> </${chatConversationTag}> `; From 93e4f0192004f21cd8917c3fc3ebf596f4c567a0 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Sun, 1 Feb 2026 22:51:47 +0200 Subject: [PATCH 17/22] Use standardPadding for message min width and height --- .../spright-components/src/chat/message/inbound/styles.ts | 4 ++-- .../spright-components/src/chat/message/outbound/styles.ts | 5 +++-- packages/spright-components/src/chat/message/styles.ts | 4 ++-- .../spright-components/src/chat/message/system/styles.ts | 5 +++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/spright-components/src/chat/message/inbound/styles.ts b/packages/spright-components/src/chat/message/inbound/styles.ts index d1b90b7e8d..90f202ebeb 100644 --- a/packages/spright-components/src/chat/message/inbound/styles.ts +++ b/packages/spright-components/src/chat/message/inbound/styles.ts @@ -18,8 +18,8 @@ export const styles = css` ${display('flex')} :host { - min-width: 16px; - min-height: 16px; + min-width: ${standardPadding}; + min-height: ${standardPadding}; flex-direction: row; justify-content: flex-start; diff --git a/packages/spright-components/src/chat/message/outbound/styles.ts b/packages/spright-components/src/chat/message/outbound/styles.ts index d8dff145e2..412c3b0667 100644 --- a/packages/spright-components/src/chat/message/outbound/styles.ts +++ b/packages/spright-components/src/chat/message/outbound/styles.ts @@ -7,6 +7,7 @@ import { borderWidth, fillSelectedColor, mediumPadding, + standardPadding, } from '@ni/nimble-components/dist/esm/theme-provider/design-tokens'; import { display } from '../../../utilities/style/display'; @@ -14,8 +15,8 @@ export const styles = css` ${display('flex')} :host { - min-width: 16px; - min-height: 16px; + min-width: ${standardPadding}; + min-height: ${standardPadding}; flex-direction: row; justify-content: flex-end; diff --git a/packages/spright-components/src/chat/message/styles.ts b/packages/spright-components/src/chat/message/styles.ts index e68c8c3a86..4c9c38362e 100644 --- a/packages/spright-components/src/chat/message/styles.ts +++ b/packages/spright-components/src/chat/message/styles.ts @@ -22,8 +22,8 @@ export const styles = css` ${display('flex')} :host { - min-width: 16px; - min-height: 16px; + min-width: ${standardPadding}}; + min-height: ${standardPadding}; flex-direction: row; justify-content: center; diff --git a/packages/spright-components/src/chat/message/system/styles.ts b/packages/spright-components/src/chat/message/system/styles.ts index 697bab64c2..30126d0d32 100644 --- a/packages/spright-components/src/chat/message/system/styles.ts +++ b/packages/spright-components/src/chat/message/system/styles.ts @@ -3,6 +3,7 @@ import { css } from '@ni/fast-element'; import { bodyFont, bodyFontColor, + standardPadding, } from '@ni/nimble-components/dist/esm/theme-provider/design-tokens'; import { display } from '../../../utilities/style/display'; @@ -10,8 +11,8 @@ export const styles = css` ${display('flex')} :host { - min-width: 16px; - min-height: 16px; + min-width: ${standardPadding}; + min-height: ${standardPadding}; flex-direction: row; justify-content: center; From 66203987d1799b1eddd418581f4c3e86a2098b17 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Sun, 1 Feb 2026 23:14:18 +0200 Subject: [PATCH 18/22] Fix misaligned messages in tests --- .../chat-conversation-matrix.stories.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts b/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts index 095fdaab7b..495be5fec0 100644 --- a/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts +++ b/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts @@ -165,15 +165,15 @@ const messageComponentSizing = ( width: 100%; height: 100%; "> - <${() => messageComponentType}> - <div style=" - width: ${contentWidth}; - height: ${contentHeight}; - background: blue; - display: inline-block; - " - ></div> - </${() => messageComponentType}> + <${messageComponentType}> + <div style=" + width: ${contentWidth}; + height: ${contentHeight}; + background: blue; + display: inline-block; + " + ></div> + </${messageComponentType}> </${chatConversationTag}> </div> `; From a43d6baeb8838ef0f63e3b7db701ede7ebe929c5 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Mon, 2 Feb 2026 07:46:41 +0200 Subject: [PATCH 19/22] Add start and end slot to inbound message template --- .../src/chat/message/inbound/template.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/spright-components/src/chat/message/inbound/template.ts b/packages/spright-components/src/chat/message/inbound/template.ts index 3a4b5fdde3..f50a0de330 100644 --- a/packages/spright-components/src/chat/message/inbound/template.ts +++ b/packages/spright-components/src/chat/message/inbound/template.ts @@ -1,13 +1,16 @@ import { html, slotted, ViewTemplate } from '@ni/fast-element'; import { + endSlotTemplate, + startSlotTemplate, type FoundationElementTemplate } from '@ni/fast-foundation'; -import type { ChatMessageInbound } from '.'; +import type { ChatMessageInbound, ChatMessageInboundOptions } from '.'; export const template: FoundationElementTemplate< -ViewTemplate<ChatMessageInbound> -> = () => html<ChatMessageInbound>` +ViewTemplate<ChatMessageInbound>, +ChatMessageInboundOptions> = (context, definition) => html<ChatMessageInbound>` <div class="container"> + ${startSlotTemplate(context, definition)} <section class="message-content"> <slot></slot> </section> @@ -17,5 +20,6 @@ ViewTemplate<ChatMessageInbound> ${slotted({ property: 'slottedFooterActionsElements' })} ></slot> </section> + ${endSlotTemplate(context, definition)} </div> `; From 58a9373799085fa8724b87b6d88e77dd81af8ea8 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Mon, 2 Feb 2026 07:53:11 +0200 Subject: [PATCH 20/22] typo that broke all the styles --- packages/spright-components/src/chat/message/styles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/spright-components/src/chat/message/styles.ts b/packages/spright-components/src/chat/message/styles.ts index 4c9c38362e..ffa78b65c8 100644 --- a/packages/spright-components/src/chat/message/styles.ts +++ b/packages/spright-components/src/chat/message/styles.ts @@ -22,7 +22,7 @@ export const styles = css` ${display('flex')} :host { - min-width: ${standardPadding}}; + min-width: ${standardPadding}; min-height: ${standardPadding}; flex-direction: row; From 2051de02b938adfa40a56093cc8e137c371bada6 Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Mon, 2 Feb 2026 07:54:08 +0200 Subject: [PATCH 21/22] Use new messages in story --- .../conversation/chat-conversation.stories.ts | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts b/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts index 7eca6ccccf..c6e70e78b0 100644 --- a/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts +++ b/packages/storybook/src/spright/chat/conversation/chat-conversation.stories.ts @@ -14,8 +14,9 @@ import { chatInputTag } from '@ni/spright-components/dist/esm/chat/input'; import type { ChatInputSendEventDetail } from '@ni/spright-components/dist/esm/chat/input/types'; -import { ChatMessageType } from '@ni/spright-components/dist/esm/chat/message/types'; -import { chatMessageTag } from '@ni/spright-components/dist/esm/chat/message'; +import { chatMessageInboundTag } from '@ni/spright-components/dist/esm/chat/message/inbound'; +import { chatMessageOutboundTag } from '@ni/spright-components/dist/esm/chat/message/outbound'; +import { chatMessageSystemTag } from '@ni/spright-components/dist/esm/chat/message/system'; import { richTextViewerTag } from '@ni/nimble-components/dist/esm/rich-text/viewer'; import { spinnerTag } from '@ni/nimble-components/dist/esm/spinner'; import { iconCopyTextTag } from '@ni/nimble-components/dist/esm/icons/copy-text'; @@ -59,22 +60,22 @@ export const chatConversation: StoryObj<ChatConversationArgs> = { } </style> <${chatConversationTag} ${ref('conversationRef')} appearance="${x => x.appearance}"> - <${chatMessageTag} message-type="${() => ChatMessageType.system}"> + <${chatMessageSystemTag}> To start, press any key. - </${chatMessageTag}> - <${chatMessageTag} message-type="${() => ChatMessageType.outbound}"> + </${chatMessageSystemTag}> + <${chatMessageOutboundTag}> Where is the Any key? - </${chatMessageTag}> - <${chatMessageTag} message-type="${() => ChatMessageType.outbound}"> + </${chatMessageOutboundTag}> + <${chatMessageOutboundTag}> <${richTextViewerTag} markdown="${() => markdownExample}"></${richTextViewerTag}> - </${chatMessageTag}> - <${chatMessageTag} message-type="${() => ChatMessageType.system}"> + </${chatMessageOutboundTag}> + <${chatMessageSystemTag}> <${spinnerTag} style="${isChromatic() ? '--ni-private-spinner-animation-play-state:paused' : ''}" appearance="${() => SpinnerAppearance.accent}" ></${spinnerTag}> - </${chatMessageTag}> - <${chatMessageTag} message-type="${() => ChatMessageType.inbound}"> + </${chatMessageSystemTag}> + <${chatMessageInboundTag}> <${buttonTag} slot='footer-actions' appearance='ghost' title='Copy' content-hidden> <${iconCopyTextTag} slot='start'></${iconCopyTextTag}> Copy @@ -107,7 +108,7 @@ export const chatConversation: StoryObj<ChatConversationArgs> = { <${buttonTag} slot='end' appearance='block'> Check core temperature </${buttonTag}> - </${chatMessageTag}> + </${chatMessageInboundTag}> ${when(x => x.input, html<ChatConversationArgs, ChatInput>` <${chatInputTag} slot='input' placeholder='Type a message' send-button-label='Send' @send="${(x2, c2) => x2.sendMessage(c2.event as CustomEvent<ChatInputSendEventDetail>, x2.conversationRef)}" @@ -140,8 +141,7 @@ export const chatConversation: StoryObj<ChatConversationArgs> = { appearance: 'default', input: true, sendMessage: (event, conversationRef) => { - const message = document.createElement(chatMessageTag); - message.messageType = ChatMessageType.outbound; + const message = document.createElement(chatMessageOutboundTag); const span = document.createElement('span'); span.textContent = event.detail.text; // Preserves new lines and trailing spaces that the user entered From bff86fcc0aa6e18f3589bf4c0ee9b5bc52605b3d Mon Sep 17 00:00:00 2001 From: Jesse Attas <jattasNI@users.noreply.github.com> Date: Mon, 2 Feb 2026 14:22:37 +0200 Subject: [PATCH 22/22] Fix typo in slotted story --- .../chat/conversation/chat-conversation-matrix.stories.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts b/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts index 495be5fec0..02b07ce688 100644 --- a/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts +++ b/packages/storybook/src/spright/chat/conversation/chat-conversation-matrix.stories.ts @@ -289,7 +289,7 @@ const slottedButtonsInboundMessageComponent = ( width: 100%; height: 100%; "> - <${chatMessageInboundTag}"> + <${chatMessageInboundTag}> <div style=" width: 100px; border: 1px blue solid;