@luzmo/analytics-components-kit 1.0.1-alpha.140 → 1.0.1-alpha.141

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +17 -5
  2. package/angular/components/ai-interaction-textarea.component.ts +2 -0
  3. package/angular/components/grid.component.ts +2 -2
  4. package/angular/esm/components/ai-interaction-textarea.component.d.ts +2 -1
  5. package/angular/esm/components/ai-interaction-textarea.component.js +7 -2
  6. package/angular/esm/components/grid.component.d.ts +2 -2
  7. package/angular/esm/types/ai-chat.types.d.ts +1 -0
  8. package/angular/types/ai-chat.types.ts +1 -0
  9. package/components/ai-chat/ai-chat.d.ts +21 -1
  10. package/components/ai-chat/index.cjs +1 -1
  11. package/components/ai-chat/index.d.ts +1 -0
  12. package/components/ai-chat/index.js +3 -3
  13. package/components/ai-chat/request-contract.d.ts +38 -0
  14. package/components/ai-chat-BrTAn0m-.cjs +62 -0
  15. package/components/{ai-chat-Dg2dvhDq.js → ai-chat-D6fPnWEi.js} +211 -151
  16. package/components/ai-interaction-textarea/ai-interaction-textarea.d.ts +6 -0
  17. package/components/ai-interaction-textarea/index.cjs +1 -1
  18. package/components/ai-interaction-textarea/index.js +1 -1
  19. package/components/{ai-interaction-textarea-DDVKMfTQ.cjs → ai-interaction-textarea-BGnQbDpJ.cjs} +2 -2
  20. package/components/{ai-interaction-textarea-ZDQPVgXC.js → ai-interaction-textarea-EdWcPK0w.js} +6 -3
  21. package/components/grid/grid.d.ts +4 -9
  22. package/components/grid/helpers/grid-effects.d.ts +1 -0
  23. package/components/grid/helpers/grid-events.d.ts +50 -0
  24. package/components/grid/helpers/grid-interactions.d.ts +91 -0
  25. package/components/grid/helpers/grid-item-management.d.ts +45 -0
  26. package/components/grid/helpers/grid-item-popover.d.ts +15 -0
  27. package/components/grid/helpers/grid-items.d.ts +9 -0
  28. package/components/grid/helpers/grid-keyboard-updates.d.ts +18 -0
  29. package/components/grid/helpers/grid-keydown-event.d.ts +18 -0
  30. package/components/grid/helpers/grid-popover-cleanup.d.ts +4 -0
  31. package/components/grid/helpers/grid-rendering.d.ts +63 -0
  32. package/components/grid/helpers/grid-stack-lifecycle.d.ts +26 -0
  33. package/components/grid/helpers/grid-theme.d.ts +16 -0
  34. package/components/grid/helpers/grid-update-cycle.d.ts +24 -0
  35. package/components/grid/index.cjs +1 -1
  36. package/components/grid/index.js +1 -1
  37. package/components/grid-BNbbl-9p.cjs +316 -0
  38. package/components/{grid-BW6LPvCu.js → grid-Ca-fxUK1.js} +2341 -1965
  39. package/components/index.cjs +1 -1
  40. package/components/index.js +5 -5
  41. package/components/item-data-picker-panel/index.cjs +1 -1
  42. package/components/item-data-picker-panel/index.js +1 -1
  43. package/components/slot-contents-picker/index.cjs +1 -1
  44. package/components/slot-contents-picker/index.js +1 -1
  45. package/components/slot-contents-picker/slot-contents-picker.d.ts +4 -2
  46. package/components/{slot-contents-picker-HRJuZQq5.cjs → slot-contents-picker-BO5lSTDz.cjs} +4 -4
  47. package/components/{slot-contents-picker-CgACNIVS.js → slot-contents-picker-Bw_G1BwZ.js} +112 -92
  48. package/custom-elements.json +1558 -17
  49. package/package.json +2 -2
  50. package/types/ai-chat.types.d.ts +1 -0
  51. package/components/ai-chat-CbqvVZDp.cjs +0 -60
  52. package/components/grid-xtLaTdhb.cjs +0 -316
package/README.md CHANGED
@@ -63,11 +63,12 @@ npm install @luzmo/analytics-components-kit
63
63
 
64
64
  ### Panel Components (Recommended)
65
65
 
66
- | Component | Import | Description |
67
- | --------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------------- |
68
- | Draggable Data Fields Panel | `@luzmo/analytics-components-kit/draggable-data-fields-panel` | Panel displaying draggable data fields from datasets |
69
- | Item Data Drop Panel | `@luzmo/analytics-components-kit/item-data-drop-panel` | Drop panel for chart slot configuration |
70
- | Item Data Picker Panel | `@luzmo/analytics-components-kit/item-data-picker-panel` | Dropdown-based panel for chart slot configuration (mobile-friendly) |
66
+ | Component | Import | Description |
67
+ | --------------------------- | ------------------------------------------------------------- | --------------------------------------------------------------------- |
68
+ | Draggable Data Fields Panel | `@luzmo/analytics-components-kit/draggable-data-fields-panel` | Panel displaying draggable data fields from datasets |
69
+ | Item Data Drop Panel | `@luzmo/analytics-components-kit/item-data-drop-panel` | Drop panel for chart slot configuration |
70
+ | Item Data Picker Panel | `@luzmo/analytics-components-kit/item-data-picker-panel` | Dropdown-based panel for chart slot configuration (mobile-friendly) |
71
+ | AI Chat | `@luzmo/analytics-components-kit/ai-chat` | AI chart prompting UI with internal or external request orchestration |
71
72
 
72
73
  > **Note**: Use `Draggable Data Fields Panel` together with `Item Data Drop Panel` for a complete drag & drop experience. Use `Item Data Picker Panel` as a mobile-friendly alternative; swap between them with media queries.
73
74
  >
@@ -151,6 +152,17 @@ import type {
151
152
  import type { SlotConfig } from '@luzmo/dashboard-contents-types';
152
153
  ```
153
154
 
155
+ Import AI chat types from the ai-chat component:
156
+
157
+ ```typescript
158
+ import type {
159
+ AiMessageRequestBody,
160
+ LuzmoPromptSubmittedEventDetail,
161
+ BuildAiMessageRequestOptions
162
+ } from '@luzmo/analytics-components-kit/ai-chat';
163
+ import { buildAiMessageRequest } from '@luzmo/analytics-components-kit/ai-chat';
164
+ ```
165
+
154
166
  Runtime values are exported from the main package (or via `@luzmo/analytics-components-kit/utils`):
155
167
 
156
168
  ```typescript
@@ -18,6 +18,7 @@ import type { Dataset } from '../types';
18
18
  [attr.hide-dataset-button]="hideDatasetButton"
19
19
  [attr.is-generating]="isGenerating"
20
20
  [attr.value]="value"
21
+ [attr.retain-on-submit]="retainOnSubmit"
21
22
  (prompt-submitted)="promptSubmitted.emit($event)">
22
23
  <ng-content></ng-content>
23
24
  </luzmo-ai-interaction-textarea>`
@@ -35,5 +36,6 @@ export class AiInteractionTextareaComponent {
35
36
  @Input() hideDatasetButton?: boolean;
36
37
  @Input() isGenerating?: boolean;
37
38
  @Input() value?: string;
39
+ @Input() retainOnSubmit?: boolean;
38
40
  @Output() promptSubmitted = new EventEmitter<CustomEvent>();
39
41
  }
@@ -1,5 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
- import type { Placement, InputActionGroup, GridItemData, GridItemRenderer } from '../types';
2
+ import type { Placement, InputActionGroup, ThemeConfig, GridItemData, GridItemRenderer } from '../types';
3
3
 
4
4
  @Component({
5
5
  selector: 'luzmo-grid',
@@ -40,7 +40,7 @@ export class GridComponent {
40
40
  @Input() viewMode?: boolean;
41
41
  @Input() placementItemActionsMenu?: Placement;
42
42
  @Input() defaultItemActionsMenu?: InputActionGroup[];
43
- @Input() theme?: any;
43
+ @Input() theme?: ThemeConfig;
44
44
  @Input() items?: GridItemData[];
45
45
  @Input() renderers?: Record<string, GridItemRenderer>;
46
46
  @Output() luzmoGridItemAction = new EventEmitter<CustomEvent>();
@@ -14,7 +14,8 @@ export declare class AiInteractionTextareaComponent {
14
14
  hideDatasetButton?: boolean;
15
15
  isGenerating?: boolean;
16
16
  value?: string;
17
+ retainOnSubmit?: boolean;
17
18
  promptSubmitted: EventEmitter<CustomEvent<any>>;
18
19
  static ɵfac: i0.ɵɵFactoryDeclaration<AiInteractionTextareaComponent, never>;
19
- static ɵcmp: i0.ɵɵComponentDeclaration<AiInteractionTextareaComponent, "luzmo-ai-interaction-textarea", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "selectedDatasets": { "alias": "selectedDatasets"; "required": false; }; "authKey": { "alias": "authKey"; "required": false; }; "authToken": { "alias": "authToken"; "required": false; }; "apiUrl": { "alias": "apiUrl"; "required": false; }; "appServer": { "alias": "appServer"; "required": false; }; "flagOpendata": { "alias": "flagOpendata"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "singleLine": { "alias": "singleLine"; "required": false; }; "hideDatasetButton": { "alias": "hideDatasetButton"; "required": false; }; "isGenerating": { "alias": "isGenerating"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "promptSubmitted": "promptSubmitted"; }, never, ["*"], true, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<AiInteractionTextareaComponent, "luzmo-ai-interaction-textarea", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "selectedDatasets": { "alias": "selectedDatasets"; "required": false; }; "authKey": { "alias": "authKey"; "required": false; }; "authToken": { "alias": "authToken"; "required": false; }; "apiUrl": { "alias": "apiUrl"; "required": false; }; "appServer": { "alias": "appServer"; "required": false; }; "flagOpendata": { "alias": "flagOpendata"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "singleLine": { "alias": "singleLine"; "required": false; }; "hideDatasetButton": { "alias": "hideDatasetButton"; "required": false; }; "isGenerating": { "alias": "isGenerating"; "required": false; }; "value": { "alias": "value"; "required": false; }; "retainOnSubmit": { "alias": "retainOnSubmit"; "required": false; }; }, { "promptSubmitted": "promptSubmitted"; }, never, ["*"], true, never>;
20
21
  }
@@ -13,9 +13,10 @@ export class AiInteractionTextareaComponent {
13
13
  hideDatasetButton;
14
14
  isGenerating;
15
15
  value;
16
+ retainOnSubmit;
16
17
  promptSubmitted = new EventEmitter();
17
18
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: AiInteractionTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.3", type: AiInteractionTextareaComponent, isStandalone: true, selector: "luzmo-ai-interaction-textarea", inputs: { placeholder: "placeholder", selectedDatasets: "selectedDatasets", authKey: "authKey", authToken: "authToken", apiUrl: "apiUrl", appServer: "appServer", flagOpendata: "flagOpendata", disabled: "disabled", singleLine: "singleLine", hideDatasetButton: "hideDatasetButton", isGenerating: "isGenerating", value: "value" }, outputs: { promptSubmitted: "promptSubmitted" }, ngImport: i0, template: `<luzmo-ai-interaction-textarea
19
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.3", type: AiInteractionTextareaComponent, isStandalone: true, selector: "luzmo-ai-interaction-textarea", inputs: { placeholder: "placeholder", selectedDatasets: "selectedDatasets", authKey: "authKey", authToken: "authToken", apiUrl: "apiUrl", appServer: "appServer", flagOpendata: "flagOpendata", disabled: "disabled", singleLine: "singleLine", hideDatasetButton: "hideDatasetButton", isGenerating: "isGenerating", value: "value", retainOnSubmit: "retainOnSubmit" }, outputs: { promptSubmitted: "promptSubmitted" }, ngImport: i0, template: `<luzmo-ai-interaction-textarea
19
20
  [attr.placeholder]="placeholder"
20
21
  [attr.selectedDatasets]="selectedDatasets"
21
22
  [attr.auth-key]="authKey"
@@ -28,9 +29,10 @@ export class AiInteractionTextareaComponent {
28
29
  [attr.hide-dataset-button]="hideDatasetButton"
29
30
  [attr.is-generating]="isGenerating"
30
31
  [attr.value]="value"
32
+ [attr.retain-on-submit]="retainOnSubmit"
31
33
  (prompt-submitted)="promptSubmitted.emit($event)">
32
34
  <ng-content></ng-content>
33
- </luzmo-ai-interaction-textarea>`, isInline: true, dependencies: [{ kind: "component", type: AiInteractionTextareaComponent, selector: "luzmo-ai-interaction-textarea", inputs: ["placeholder", "selectedDatasets", "authKey", "authToken", "apiUrl", "appServer", "flagOpendata", "disabled", "singleLine", "hideDatasetButton", "isGenerating", "value"], outputs: ["promptSubmitted"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
35
+ </luzmo-ai-interaction-textarea>`, isInline: true, dependencies: [{ kind: "component", type: AiInteractionTextareaComponent, selector: "luzmo-ai-interaction-textarea", inputs: ["placeholder", "selectedDatasets", "authKey", "authToken", "apiUrl", "appServer", "flagOpendata", "disabled", "singleLine", "hideDatasetButton", "isGenerating", "value", "retainOnSubmit"], outputs: ["promptSubmitted"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
34
36
  }
35
37
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: AiInteractionTextareaComponent, decorators: [{
36
38
  type: Component,
@@ -51,6 +53,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImpor
51
53
  [attr.hide-dataset-button]="hideDatasetButton"
52
54
  [attr.is-generating]="isGenerating"
53
55
  [attr.value]="value"
56
+ [attr.retain-on-submit]="retainOnSubmit"
54
57
  (prompt-submitted)="promptSubmitted.emit($event)">
55
58
  <ng-content></ng-content>
56
59
  </luzmo-ai-interaction-textarea>`
@@ -79,6 +82,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImpor
79
82
  type: Input
80
83
  }], value: [{
81
84
  type: Input
85
+ }], retainOnSubmit: [{
86
+ type: Input
82
87
  }], promptSubmitted: [{
83
88
  type: Output
84
89
  }] } });
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter } from '@angular/core';
2
- import type { Placement, InputActionGroup, GridItemData, GridItemRenderer } from '../types';
2
+ import type { Placement, InputActionGroup, ThemeConfig, GridItemData, GridItemRenderer } from '../types';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class GridComponent {
5
5
  appServer?: string;
@@ -14,7 +14,7 @@ export declare class GridComponent {
14
14
  viewMode?: boolean;
15
15
  placementItemActionsMenu?: Placement;
16
16
  defaultItemActionsMenu?: InputActionGroup[];
17
- theme?: any;
17
+ theme?: ThemeConfig;
18
18
  items?: GridItemData[];
19
19
  renderers?: Record<string, GridItemRenderer>;
20
20
  luzmoGridItemAction: EventEmitter<CustomEvent<any>>;
@@ -40,4 +40,5 @@ export interface AISampleChart {
40
40
  feedback: unknown;
41
41
  conversationId?: string;
42
42
  message?: string;
43
+ clarificationQuestion?: string;
43
44
  }
@@ -40,4 +40,5 @@ export interface AISampleChart {
40
40
  feedback: unknown;
41
41
  conversationId?: string;
42
42
  message?: string;
43
+ clarificationQuestion?: string;
43
44
  }
@@ -7,6 +7,7 @@ import '../ai-interaction-textarea';
7
7
  * @name luzmo-ai-chat
8
8
  * @summary A complete AI chat interface combining messages display and input
9
9
  * @fires luzmo-message-sent - Fired when a user sends a message
10
+ * @fires luzmo-prompt-submitted - Fired when request-mode is set to external so the host can execute the API request lifecycle.
10
11
  * @fires luzmo-response-received - Fired when an AI text response is received. For chart responses, this event is only fired if the response includes a `message` field. For error responses, this event is always fired with the error explanation.
11
12
  * @fires luzmo-chart-generated - Fired when the AI generates a chart (includes generatedChart in response)
12
13
  */
@@ -64,6 +65,16 @@ export declare class LuzmoAiChat extends LuzmoElement {
64
65
  * @default 'performance'
65
66
  */
66
67
  modelPreference: 'performance' | 'quality';
68
+ /**
69
+ * Controls if API calls are handled internally or by the host application.
70
+ * @default 'internal'
71
+ */
72
+ requestMode: 'internal' | 'external';
73
+ /**
74
+ * Used only in external request mode to reflect request lifecycle in the UI.
75
+ * @default false
76
+ */
77
+ isGenerating: boolean;
67
78
  /**
68
79
  * Conversation ID
69
80
  * @default null
@@ -74,9 +85,15 @@ export declare class LuzmoAiChat extends LuzmoElement {
74
85
  * @default null
75
86
  */
76
87
  chart: LuzmoChart | null;
77
- private _isGenerating;
88
+ /**
89
+ * API version
90
+ * @default '0.1.0'
91
+ */
92
+ apiVersion: string;
93
+ private _isGeneratingInternal;
78
94
  private _textareaValue;
79
95
  private _generateMessageId;
96
+ private _buildRequestBody;
80
97
  private _sendMessage;
81
98
  private _addUserMessage;
82
99
  private _prepareForAIResponse;
@@ -85,6 +102,9 @@ export declare class LuzmoAiChat extends LuzmoElement {
85
102
  private _processAIResponse;
86
103
  private _handleAPIError;
87
104
  private _finalizeAIResponse;
105
+ private _handleDatasetSelected;
106
+ private _handleDatasetRemoved;
107
+ private _emitDatasetsChanged;
88
108
  private _handlePromptSubmitted;
89
109
  private _scrollToBottom;
90
110
  /**
@@ -17,4 +17,4 @@
17
17
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
18
  * SOFTWARE.
19
19
  * */
20
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../base-C_azywlB.cjs`),require(`../focus-visible-3ACCHno4.cjs`),require(`../set-locale-CKjJZRH6.cjs`),require(`../localized-mixin-DTvVLuXW.cjs`);const e=require(`../ai-chat-CbqvVZDp.cjs`);require(`../dataset-icon-BbNgugDA.cjs`),require(`../data-broker-BUIUM5hr.cjs`),require(`../dataset-selector-list-BdeJlo0u.cjs`),require(`../dataset-selector-row-CAlRVIk_.cjs`),require(`../ai-interaction-textarea-DDVKMfTQ.cjs`),exports.LuzmoAiChat=e.t;
20
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../base-C_azywlB.cjs`),require(`../focus-visible-3ACCHno4.cjs`),require(`../set-locale-CKjJZRH6.cjs`),require(`../localized-mixin-DTvVLuXW.cjs`);const e=require(`../ai-chat-BrTAn0m-.cjs`);require(`../dataset-icon-BbNgugDA.cjs`),require(`../data-broker-BUIUM5hr.cjs`),require(`../dataset-selector-list-BdeJlo0u.cjs`),require(`../dataset-selector-row-CAlRVIk_.cjs`),require(`../ai-interaction-textarea-BGnQbDpJ.cjs`),exports.LuzmoAiChat=e.t,exports.buildAiMessageRequest=e.n;
@@ -5,3 +5,4 @@ declare global {
5
5
  }
6
6
  }
7
7
  export { LuzmoAiChat } from './ai-chat';
8
+ export * from './request-contract';
@@ -27,10 +27,10 @@ import "../base-rg2x95aL.js";
27
27
  import "../focus-visible-D1pJhWEh.js";
28
28
  import "../set-locale-Uv6F4uSq.js";
29
29
  import "../localized-mixin-cLT0UbaF.js";
30
- import { t as LuzmoAiChat } from "../ai-chat-Dg2dvhDq.js";
30
+ import { n as buildAiMessageRequest, t as LuzmoAiChat } from "../ai-chat-D6fPnWEi.js";
31
31
  import "../dataset-icon-x6Q8nhYc.js";
32
32
  import "../data-broker-cLR-t5LM.js";
33
33
  import "../dataset-selector-list-DO_ExOrO.js";
34
34
  import "../dataset-selector-row-VsvdrVDf.js";
35
- import "../ai-interaction-textarea-ZDQPVgXC.js";
36
- export { LuzmoAiChat };
35
+ import "../ai-interaction-textarea-EdWcPK0w.js";
36
+ export { LuzmoAiChat, buildAiMessageRequest };
@@ -0,0 +1,38 @@
1
+ import type { Dataset, LuzmoChart } from '../../types';
2
+ export interface AiMessageRequestBody {
3
+ key: string;
4
+ token: string;
5
+ action: 'create';
6
+ version: string;
7
+ properties: {
8
+ content: {
9
+ role: 'user';
10
+ content: string;
11
+ };
12
+ conversation_id?: string;
13
+ };
14
+ options: {
15
+ available_datasets: string[];
16
+ dataset_id?: string;
17
+ chart?: Record<string, unknown>;
18
+ model_preference: 'performance' | 'quality';
19
+ };
20
+ }
21
+ export interface BuildAiMessageRequestOptions {
22
+ prompt: string;
23
+ datasetIds: string[];
24
+ authKey: string;
25
+ authToken: string;
26
+ conversationId: string | null;
27
+ chart: LuzmoChart | null;
28
+ modelPreference: 'performance' | 'quality';
29
+ apiVersion?: string;
30
+ }
31
+ export interface LuzmoPromptSubmittedEventDetail {
32
+ prompt: string;
33
+ selectedDatasets: Dataset[];
34
+ datasetIds: string[];
35
+ request: AiMessageRequestBody;
36
+ url: string;
37
+ }
38
+ export declare function buildAiMessageRequest(options: BuildAiMessageRequestOptions): AiMessageRequestBody;
@@ -0,0 +1,62 @@
1
+ /*! * A kit of modern Luzmo Web Components for analytics in your web application.
2
+ *
3
+ * Copyright © 2026 Luzmo
4
+ * All rights reserved.
5
+ * Luzmo web components (“Luzmo Web Components”)
6
+ * must be used according to the Luzmo Terms of Service.
7
+ * This license allows users with a current active Luzmo account
8
+ * to use the Luzmo Web Components. This license terminates
9
+ * automatically if a user no longer has an active Luzmo account.
10
+ * Please view the Luzmo Terms of Service at: https://www.luzmo.com/information-pages/terms-of-use.
11
+ *
12
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
+ * SOFTWARE.
19
+ * */
20
+ const e=require(`./chunk-350yNsax.cjs`),t=require(`./base-C_azywlB.cjs`),n=require(`./decorate-Dq4-zbi1.cjs`);require(`@luzmo/lucero/chat-message`);let r=require(`lit`),i=require(`lit/decorators.js`),a=require(`lit/directives/unsafe-html.js`);var{entries:o,setPrototypeOf:s,isFrozen:c,getPrototypeOf:l,getOwnPropertyDescriptor:u}=Object,{freeze:d,seal:f,create:ee}=Object,{apply:te,construct:ne}=typeof Reflect<`u`&&Reflect;d||=function(e){return e},f||=function(e){return e},te||=function(e,t){for(var n=arguments.length,r=Array(n>2?n-2:0),i=2;i<n;i++)r[i-2]=arguments[i];return e.apply(t,r)},ne||=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return new e(...n)};var p=b(Array.prototype.forEach),re=b(Array.prototype.lastIndexOf),ie=b(Array.prototype.pop),m=b(Array.prototype.push),ae=b(Array.prototype.splice),h=b(String.prototype.toLowerCase),oe=b(String.prototype.toString),se=b(String.prototype.match),g=b(String.prototype.replace),ce=b(String.prototype.indexOf),le=b(String.prototype.trim),_=b(Object.prototype.hasOwnProperty),v=b(RegExp.prototype.test),y=x(TypeError);function b(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,r=Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];return te(e,t,r)}}function x(e){return function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return ne(e,n)}}function S(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:h;s&&s(e,null);let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(c(t)||(t[r]=e),i=e)}e[i]=!0}return e}function ue(e){for(let t=0;t<e.length;t++)_(e,t)||(e[t]=null);return e}function C(e){let t=ee(null);for(let[n,r]of o(e))_(e,n)&&(Array.isArray(r)?t[n]=ue(r):r&&typeof r==`object`&&r.constructor===Object?t[n]=C(r):t[n]=r);return t}function w(e,t){for(;e!==null;){let n=u(e,t);if(n){if(n.get)return b(n.get);if(typeof n.value==`function`)return b(n.value)}e=l(e)}function n(){return null}return n}var de=d(`a.abbr.acronym.address.area.article.aside.audio.b.bdi.bdo.big.blink.blockquote.body.br.button.canvas.caption.center.cite.code.col.colgroup.content.data.datalist.dd.decorator.del.details.dfn.dialog.dir.div.dl.dt.element.em.fieldset.figcaption.figure.font.footer.form.h1.h2.h3.h4.h5.h6.head.header.hgroup.hr.html.i.img.input.ins.kbd.label.legend.li.main.map.mark.marquee.menu.menuitem.meter.nav.nobr.ol.optgroup.option.output.p.picture.pre.progress.q.rp.rt.ruby.s.samp.search.section.select.shadow.slot.small.source.spacer.span.strike.strong.style.sub.summary.sup.table.tbody.td.template.textarea.tfoot.th.thead.time.tr.track.tt.u.ul.var.video.wbr`.split(`.`)),fe=d(`svg.a.altglyph.altglyphdef.altglyphitem.animatecolor.animatemotion.animatetransform.circle.clippath.defs.desc.ellipse.enterkeyhint.exportparts.filter.font.g.glyph.glyphref.hkern.image.inputmode.line.lineargradient.marker.mask.metadata.mpath.part.path.pattern.polygon.polyline.radialgradient.rect.stop.style.switch.symbol.text.textpath.title.tref.tspan.view.vkern`.split(`.`)),pe=d([`feBlend`,`feColorMatrix`,`feComponentTransfer`,`feComposite`,`feConvolveMatrix`,`feDiffuseLighting`,`feDisplacementMap`,`feDistantLight`,`feDropShadow`,`feFlood`,`feFuncA`,`feFuncB`,`feFuncG`,`feFuncR`,`feGaussianBlur`,`feImage`,`feMerge`,`feMergeNode`,`feMorphology`,`feOffset`,`fePointLight`,`feSpecularLighting`,`feSpotLight`,`feTile`,`feTurbulence`]),me=d([`animate`,`color-profile`,`cursor`,`discard`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`foreignobject`,`hatch`,`hatchpath`,`mesh`,`meshgradient`,`meshpatch`,`meshrow`,`missing-glyph`,`script`,`set`,`solidcolor`,`unknown`,`use`]),he=d(`math.menclose.merror.mfenced.mfrac.mglyph.mi.mlabeledtr.mmultiscripts.mn.mo.mover.mpadded.mphantom.mroot.mrow.ms.mspace.msqrt.mstyle.msub.msup.msubsup.mtable.mtd.mtext.mtr.munder.munderover.mprescripts`.split(`.`)),ge=d([`maction`,`maligngroup`,`malignmark`,`mlongdiv`,`mscarries`,`mscarry`,`msgroup`,`mstack`,`msline`,`msrow`,`semantics`,`annotation`,`annotation-xml`,`mprescripts`,`none`]),_e=d([`#text`]),ve=d(`accept.action.align.alt.autocapitalize.autocomplete.autopictureinpicture.autoplay.background.bgcolor.border.capture.cellpadding.cellspacing.checked.cite.class.clear.color.cols.colspan.controls.controlslist.coords.crossorigin.datetime.decoding.default.dir.disabled.disablepictureinpicture.disableremoteplayback.download.draggable.enctype.enterkeyhint.exportparts.face.for.headers.height.hidden.high.href.hreflang.id.inert.inputmode.integrity.ismap.kind.label.lang.list.loading.loop.low.max.maxlength.media.method.min.minlength.multiple.muted.name.nonce.noshade.novalidate.nowrap.open.optimum.part.pattern.placeholder.playsinline.popover.popovertarget.popovertargetaction.poster.preload.pubdate.radiogroup.readonly.rel.required.rev.reversed.role.rows.rowspan.spellcheck.scope.selected.shape.size.sizes.slot.span.srclang.start.src.srcset.step.style.summary.tabindex.title.translate.type.usemap.valign.value.width.wrap.xmlns.slot`.split(`.`)),ye=d(`accent-height.accumulate.additive.alignment-baseline.amplitude.ascent.attributename.attributetype.azimuth.basefrequency.baseline-shift.begin.bias.by.class.clip.clippathunits.clip-path.clip-rule.color.color-interpolation.color-interpolation-filters.color-profile.color-rendering.cx.cy.d.dx.dy.diffuseconstant.direction.display.divisor.dur.edgemode.elevation.end.exponent.fill.fill-opacity.fill-rule.filter.filterunits.flood-color.flood-opacity.font-family.font-size.font-size-adjust.font-stretch.font-style.font-variant.font-weight.fx.fy.g1.g2.glyph-name.glyphref.gradientunits.gradienttransform.height.href.id.image-rendering.in.in2.intercept.k.k1.k2.k3.k4.kerning.keypoints.keysplines.keytimes.lang.lengthadjust.letter-spacing.kernelmatrix.kernelunitlength.lighting-color.local.marker-end.marker-mid.marker-start.markerheight.markerunits.markerwidth.maskcontentunits.maskunits.max.mask.mask-type.media.method.mode.min.name.numoctaves.offset.operator.opacity.order.orient.orientation.origin.overflow.paint-order.path.pathlength.patterncontentunits.patterntransform.patternunits.points.preservealpha.preserveaspectratio.primitiveunits.r.rx.ry.radius.refx.refy.repeatcount.repeatdur.restart.result.rotate.scale.seed.shape-rendering.slope.specularconstant.specularexponent.spreadmethod.startoffset.stddeviation.stitchtiles.stop-color.stop-opacity.stroke-dasharray.stroke-dashoffset.stroke-linecap.stroke-linejoin.stroke-miterlimit.stroke-opacity.stroke.stroke-width.style.surfacescale.systemlanguage.tabindex.tablevalues.targetx.targety.transform.transform-origin.text-anchor.text-decoration.text-rendering.textlength.type.u1.u2.unicode.values.viewbox.visibility.version.vert-adv-y.vert-origin-x.vert-origin-y.width.word-spacing.wrap.writing-mode.xchannelselector.ychannelselector.x.x1.x2.xmlns.y.y1.y2.z.zoomandpan`.split(`.`)),be=d(`accent.accentunder.align.bevelled.close.columnsalign.columnlines.columnspan.denomalign.depth.dir.display.displaystyle.encoding.fence.frame.height.href.id.largeop.length.linethickness.lspace.lquote.mathbackground.mathcolor.mathsize.mathvariant.maxsize.minsize.movablelimits.notation.numalign.open.rowalign.rowlines.rowspacing.rowspan.rspace.rquote.scriptlevel.scriptminsize.scriptsizemultiplier.selection.separator.separators.stretchy.subscriptshift.supscriptshift.symmetric.voffset.width.xmlns`.split(`.`)),T=d([`xlink:href`,`xml:id`,`xlink:title`,`xml:space`,`xmlns:xlink`]),xe=f(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Se=f(/<%[\w\W]*|[\w\W]*%>/gm),Ce=f(/\$\{[\w\W]*/gm),E=f(/^data-[\-\w.\u00B7-\uFFFF]+$/),D=f(/^aria-[\-\w]+$/),we=f(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),O=f(/^(?:\w+script|data):/i),k=f(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Te=f(/^html$/i),Ee=f(/^[a-z][.\w]*(-[.\w]+)+$/i),De=Object.freeze({__proto__:null,ARIA_ATTR:D,ATTR_WHITESPACE:k,CUSTOM_ELEMENT:Ee,DATA_ATTR:E,DOCTYPE_NAME:Te,ERB_EXPR:Se,IS_ALLOWED_URI:we,IS_SCRIPT_OR_DATA:O,MUSTACHE_EXPR:xe,TMPLIT_EXPR:Ce}),A={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},Oe=function(){return typeof window>`u`?null:window},ke=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},Ae=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function je(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Oe(),t=e=>je(e);if(t.version=`3.3.1`,t.removed=[],!e||!e.document||e.document.nodeType!==A.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e,r=n,i=r.currentScript,{DocumentFragment:a,HTMLTemplateElement:s,Node:c,Element:l,NodeFilter:u,NamedNodeMap:f=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:te,DOMParser:ne,trustedTypes:b}=e,x=l.prototype,ue=w(x,`cloneNode`),xe=w(x,`remove`),Se=w(x,`nextSibling`),Ce=w(x,`childNodes`),E=w(x,`parentNode`);if(typeof s==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let D,O=``,{implementation:k,createNodeIterator:Ee,createDocumentFragment:Me,getElementsByTagName:Ne}=n,{importNode:Pe}=r,j=Ae();t.isSupported=typeof o==`function`&&typeof E==`function`&&k&&k.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:Fe,ERB_EXPR:Ie,TMPLIT_EXPR:Le,DATA_ATTR:Re,ARIA_ATTR:ze,IS_SCRIPT_OR_DATA:Be,ATTR_WHITESPACE:Ve,CUSTOM_ELEMENT:He}=De,{IS_ALLOWED_URI:Ue}=De,M=null,We=S({},[...de,...fe,...pe,...he,..._e]),N=null,Ge=S({},[...ve,...ye,...be,...T]),P=Object.seal(ee(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),F=null,Ke=null,I=Object.seal(ee(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),qe=!0,Je=!0,Ye=!1,Xe=!0,L=!1,R=!0,z=!1,Ze=!1,Qe=!1,B=!1,V=!1,H=!1,$e=!0,et=!1,tt=!0,U=!1,W={},G=null,nt=S({},[`annotation-xml`,`audio`,`colgroup`,`desc`,`foreignobject`,`head`,`iframe`,`math`,`mi`,`mn`,`mo`,`ms`,`mtext`,`noembed`,`noframes`,`noscript`,`plaintext`,`script`,`style`,`svg`,`template`,`thead`,`title`,`video`,`xmp`]),rt=null,it=S({},[`audio`,`video`,`img`,`source`,`image`,`track`]),at=null,ot=S({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),st=`http://www.w3.org/1998/Math/MathML`,ct=`http://www.w3.org/2000/svg`,K=`http://www.w3.org/1999/xhtml`,q=K,lt=!1,ut=null,dt=S({},[st,ct,K],oe),ft=S({},[`mi`,`mo`,`mn`,`ms`,`mtext`]),pt=S({},[`annotation-xml`]),mt=S({},[`title`,`style`,`font`,`a`,`script`]),J=null,ht=[`application/xhtml+xml`,`text/html`],Y=null,X=null,gt=n.createElement(`form`),_t=function(e){return e instanceof RegExp||e instanceof Function},vt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(X&&X===e)){if((!e||typeof e!=`object`)&&(e={}),e=C(e),J=ht.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,Y=J===`application/xhtml+xml`?oe:h,M=_(e,`ALLOWED_TAGS`)?S({},e.ALLOWED_TAGS,Y):We,N=_(e,`ALLOWED_ATTR`)?S({},e.ALLOWED_ATTR,Y):Ge,ut=_(e,`ALLOWED_NAMESPACES`)?S({},e.ALLOWED_NAMESPACES,oe):dt,at=_(e,`ADD_URI_SAFE_ATTR`)?S(C(ot),e.ADD_URI_SAFE_ATTR,Y):ot,rt=_(e,`ADD_DATA_URI_TAGS`)?S(C(it),e.ADD_DATA_URI_TAGS,Y):it,G=_(e,`FORBID_CONTENTS`)?S({},e.FORBID_CONTENTS,Y):nt,F=_(e,`FORBID_TAGS`)?S({},e.FORBID_TAGS,Y):C({}),Ke=_(e,`FORBID_ATTR`)?S({},e.FORBID_ATTR,Y):C({}),W=_(e,`USE_PROFILES`)?e.USE_PROFILES:!1,qe=e.ALLOW_ARIA_ATTR!==!1,Je=e.ALLOW_DATA_ATTR!==!1,Ye=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Xe=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,L=e.SAFE_FOR_TEMPLATES||!1,R=e.SAFE_FOR_XML!==!1,z=e.WHOLE_DOCUMENT||!1,B=e.RETURN_DOM||!1,V=e.RETURN_DOM_FRAGMENT||!1,H=e.RETURN_TRUSTED_TYPE||!1,Qe=e.FORCE_BODY||!1,$e=e.SANITIZE_DOM!==!1,et=e.SANITIZE_NAMED_PROPS||!1,tt=e.KEEP_CONTENT!==!1,U=e.IN_PLACE||!1,Ue=e.ALLOWED_URI_REGEXP||we,q=e.NAMESPACE||K,ft=e.MATHML_TEXT_INTEGRATION_POINTS||ft,pt=e.HTML_INTEGRATION_POINTS||pt,P=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&_t(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(P.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&_t(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(P.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements==`boolean`&&(P.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),L&&(Je=!1),V&&(B=!0),W&&(M=S({},_e),N=[],W.html===!0&&(S(M,de),S(N,ve)),W.svg===!0&&(S(M,fe),S(N,ye),S(N,T)),W.svgFilters===!0&&(S(M,pe),S(N,ye),S(N,T)),W.mathMl===!0&&(S(M,he),S(N,be),S(N,T))),e.ADD_TAGS&&(typeof e.ADD_TAGS==`function`?I.tagCheck=e.ADD_TAGS:(M===We&&(M=C(M)),S(M,e.ADD_TAGS,Y))),e.ADD_ATTR&&(typeof e.ADD_ATTR==`function`?I.attributeCheck=e.ADD_ATTR:(N===Ge&&(N=C(N)),S(N,e.ADD_ATTR,Y))),e.ADD_URI_SAFE_ATTR&&S(at,e.ADD_URI_SAFE_ATTR,Y),e.FORBID_CONTENTS&&(G===nt&&(G=C(G)),S(G,e.FORBID_CONTENTS,Y)),e.ADD_FORBID_CONTENTS&&(G===nt&&(G=C(G)),S(G,e.ADD_FORBID_CONTENTS,Y)),tt&&(M[`#text`]=!0),z&&S(M,[`html`,`head`,`body`]),M.table&&(S(M,[`tbody`]),delete F.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw y(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw y(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);D=e.TRUSTED_TYPES_POLICY,O=D.createHTML(``)}else D===void 0&&(D=ke(b,i)),D!==null&&typeof O==`string`&&(O=D.createHTML(``));d&&d(e),X=e}},yt=S({},[...fe,...pe,...me]),bt=S({},[...he,...ge]),xt=function(e){let t=E(e);(!t||!t.tagName)&&(t={namespaceURI:q,tagName:`template`});let n=h(e.tagName),r=h(t.tagName);return ut[e.namespaceURI]?e.namespaceURI===ct?t.namespaceURI===K?n===`svg`:t.namespaceURI===st?n===`svg`&&(r===`annotation-xml`||ft[r]):!!yt[n]:e.namespaceURI===st?t.namespaceURI===K?n===`math`:t.namespaceURI===ct?n===`math`&&pt[r]:!!bt[n]:e.namespaceURI===K?t.namespaceURI===ct&&!pt[r]||t.namespaceURI===st&&!ft[r]?!1:!bt[n]&&(mt[n]||!yt[n]):!!(J===`application/xhtml+xml`&&ut[e.namespaceURI]):!1},Z=function(e){m(t.removed,{element:e});try{E(e).removeChild(e)}catch{xe(e)}},Q=function(e,n){try{m(t.removed,{attribute:n.getAttributeNode(e),from:n})}catch{m(t.removed,{attribute:null,from:n})}if(n.removeAttribute(e),e===`is`)if(B||V)try{Z(n)}catch{}else try{n.setAttribute(e,``)}catch{}},St=function(e){let t=null,r=null;if(Qe)e=`<remove></remove>`+e;else{let t=se(e,/^[\r\n\t ]+/);r=t&&t[0]}J===`application/xhtml+xml`&&q===K&&(e=`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>`+e+`</body></html>`);let i=D?D.createHTML(e):e;if(q===K)try{t=new ne().parseFromString(i,J)}catch{}if(!t||!t.documentElement){t=k.createDocument(q,`template`,null);try{t.documentElement.innerHTML=lt?O:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),q===K?Ne.call(t,z?`html`:`body`)[0]:z?t.documentElement:a},Ct=function(e){return Ee.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT|u.SHOW_PROCESSING_INSTRUCTION|u.SHOW_CDATA_SECTION,null)},wt=function(e){return e instanceof te&&(typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||!(e.attributes instanceof f)||typeof e.removeAttribute!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`)},Tt=function(e){return typeof c==`function`&&e instanceof c};function $(e,n,r){p(e,e=>{e.call(t,n,r,X)})}let Et=function(e){let n=null;if($(j.beforeSanitizeElements,e,null),wt(e))return Z(e),!0;let r=Y(e.nodeName);if($(j.uponSanitizeElement,e,{tagName:r,allowedTags:M}),R&&e.hasChildNodes()&&!Tt(e.firstElementChild)&&v(/<[/\w!]/g,e.innerHTML)&&v(/<[/\w!]/g,e.textContent)||e.nodeType===A.progressingInstruction||R&&e.nodeType===A.comment&&v(/<[/\w]/g,e.data))return Z(e),!0;if(!(I.tagCheck instanceof Function&&I.tagCheck(r))&&(!M[r]||F[r])){if(!F[r]&&Ot(r)&&(P.tagNameCheck instanceof RegExp&&v(P.tagNameCheck,r)||P.tagNameCheck instanceof Function&&P.tagNameCheck(r)))return!1;if(tt&&!G[r]){let t=E(e)||e.parentNode,n=Ce(e)||e.childNodes;if(n&&t){let r=n.length;for(let i=r-1;i>=0;--i){let r=ue(n[i],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,Se(e))}}}return Z(e),!0}return e instanceof l&&!xt(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&v(/<\/no(script|embed|frames)/i,e.innerHTML)?(Z(e),!0):(L&&e.nodeType===A.text&&(n=e.textContent,p([Fe,Ie,Le],e=>{n=g(n,e,` `)}),e.textContent!==n&&(m(t.removed,{element:e.cloneNode()}),e.textContent=n)),$(j.afterSanitizeElements,e,null),!1)},Dt=function(e,t,r){if($e&&(t===`id`||t===`name`)&&(r in n||r in gt))return!1;if(!(Je&&!Ke[t]&&v(Re,t))&&!(qe&&v(ze,t))&&!(I.attributeCheck instanceof Function&&I.attributeCheck(t,e))){if(!N[t]||Ke[t]){if(!(Ot(e)&&(P.tagNameCheck instanceof RegExp&&v(P.tagNameCheck,e)||P.tagNameCheck instanceof Function&&P.tagNameCheck(e))&&(P.attributeNameCheck instanceof RegExp&&v(P.attributeNameCheck,t)||P.attributeNameCheck instanceof Function&&P.attributeNameCheck(t,e))||t===`is`&&P.allowCustomizedBuiltInElements&&(P.tagNameCheck instanceof RegExp&&v(P.tagNameCheck,r)||P.tagNameCheck instanceof Function&&P.tagNameCheck(r))))return!1}else if(!at[t]&&!v(Ue,g(r,Ve,``))&&!((t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&ce(r,`data:`)===0&&rt[e])&&!(Ye&&!v(Be,g(r,Ve,``)))&&r)return!1}return!0},Ot=function(e){return e!==`annotation-xml`&&se(e,He)},kt=function(e){$(j.beforeSanitizeAttributes,e,null);let{attributes:n}=e;if(!n||wt(e))return;let r={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:N,forceKeepAttr:void 0},i=n.length;for(;i--;){let{name:a,namespaceURI:o,value:s}=n[i],c=Y(a),l=s,u=a===`value`?l:le(l);if(r.attrName=c,r.attrValue=u,r.keepAttr=!0,r.forceKeepAttr=void 0,$(j.uponSanitizeAttribute,e,r),u=r.attrValue,et&&(c===`id`||c===`name`)&&(Q(a,e),u=`user-content-`+u),R&&v(/((--!?|])>)|<\/(style|title|textarea)/i,u)){Q(a,e);continue}if(c===`attributename`&&se(u,`href`)){Q(a,e);continue}if(r.forceKeepAttr)continue;if(!r.keepAttr){Q(a,e);continue}if(!Xe&&v(/\/>/i,u)){Q(a,e);continue}L&&p([Fe,Ie,Le],e=>{u=g(u,e,` `)});let d=Y(e.nodeName);if(!Dt(d,c,u)){Q(a,e);continue}if(D&&typeof b==`object`&&typeof b.getAttributeType==`function`&&!o)switch(b.getAttributeType(d,c)){case`TrustedHTML`:u=D.createHTML(u);break;case`TrustedScriptURL`:u=D.createScriptURL(u);break}if(u!==l)try{o?e.setAttributeNS(o,a,u):e.setAttribute(a,u),wt(e)?Z(e):ie(t.removed)}catch{Q(a,e)}}$(j.afterSanitizeAttributes,e,null)},At=function e(t){let n=null,r=Ct(t);for($(j.beforeSanitizeShadowDOM,t,null);n=r.nextNode();)$(j.uponSanitizeShadowNode,n,null),Et(n),kt(n),n.content instanceof a&&e(n.content);$(j.afterSanitizeShadowDOM,t,null)};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,o=null,s=null,l=null;if(lt=!e,lt&&(e=`<!-->`),typeof e!=`string`&&!Tt(e))if(typeof e.toString==`function`){if(e=e.toString(),typeof e!=`string`)throw y(`dirty is not a string, aborting`)}else throw y(`toString is not a function`);if(!t.isSupported)return e;if(Ze||vt(n),t.removed=[],typeof e==`string`&&(U=!1),U){if(e.nodeName){let t=Y(e.nodeName);if(!M[t]||F[t])throw y(`root node is forbidden and cannot be sanitized in-place`)}}else if(e instanceof c)i=St(`<!---->`),o=i.ownerDocument.importNode(e,!0),o.nodeType===A.element&&o.nodeName===`BODY`||o.nodeName===`HTML`?i=o:i.appendChild(o);else{if(!B&&!L&&!z&&e.indexOf(`<`)===-1)return D&&H?D.createHTML(e):e;if(i=St(e),!i)return B?null:H?O:``}i&&Qe&&Z(i.firstChild);let u=Ct(U?e:i);for(;s=u.nextNode();)Et(s),kt(s),s.content instanceof a&&At(s.content);if(U)return e;if(B){if(V)for(l=Me.call(i.ownerDocument);i.firstChild;)l.appendChild(i.firstChild);else l=i;return(N.shadowroot||N.shadowrootmode)&&(l=Pe.call(r,l,!0)),l}let d=z?i.outerHTML:i.innerHTML;return z&&M[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&v(Te,i.ownerDocument.doctype.name)&&(d=`<!DOCTYPE `+i.ownerDocument.doctype.name+`>
21
+ `+d),L&&p([Fe,Ie,Le],e=>{d=g(d,e,` `)}),D&&H?D.createHTML(d):d},t.setConfig=function(){vt(arguments.length>0&&arguments[0]!==void 0?arguments[0]:{}),Ze=!0},t.clearConfig=function(){X=null,Ze=!1},t.isValidAttribute=function(e,t,n){return X||vt({}),Dt(Y(e),Y(t),n)},t.addHook=function(e,t){typeof t==`function`&&m(j[e],t)},t.removeHook=function(e,t){if(t!==void 0){let n=re(j[e],t);return n===-1?void 0:ae(j[e],n,1)[0]}return ie(j[e])},t.removeHooks=function(e){j[e]=[]},t.removeAllHooks=function(){j=Ae()},t}var Me=je(),Ne=`:host{box-sizing:border-box;flex-direction:column;width:100%;height:100%;display:flex}:host .chat-container{background:var(--luzmo-ai-chat-background,var(--ai-chat-background));border-radius:var(--luzmo-ai-chat-border-radius,var(--ai-chat-border-radius));width:100%;height:100%;min-height:0;padding:var(--luzmo-ai-chat-padding,var(--ai-chat-padding));gap:var(--luzmo-ai-chat-gap,var(--ai-chat-gap));border:var(--luzmo-ai-chat-border,var(--ai-chat-border));box-shadow:var(--luzmo-ai-chat-box-shadow,var(--ai-chat-box-shadow));flex-direction:column;flex:1;display:flex;overflow:hidden}:host .chat-messages-container{gap:var(--luzmo-ai-chat-gap,var(--ai-chat-gap));flex-direction:column;flex:1;display:flex;overflow:auto}:host luzmo-chat-message{--luzmo-primary:rgba(var(--luzmo-primary-rgb),.08);--chat-message-primary-text-color:var(--luzmo-font-color);--chat-message-primary-border-color:transparent}:host luzmo-ai-interaction-textarea{flex-grow:0;flex-shrink:0}:host{--ai-chat-background:var(--luzmo-background-color);--ai-chat-border-radius:0;--ai-chat-padding:0;--ai-chat-gap:1rem;--ai-chat-max-height:none;--ai-chat-messages-flex:1;--ai-chat-border:none;--ai-chat-box-shadow:none}`;function Pe(e){let{prompt:t,datasetIds:n,authKey:r,authToken:i,conversationId:a,chart:o,modelPreference:s,apiVersion:c=`0.1.0`}=e;return{key:r,token:i,action:`create`,version:c,properties:{content:{role:`user`,content:t},...a?{conversation_id:a}:{}},options:{available_datasets:n,...n.length>0?{dataset_id:n[0]}:{},...o?{chart:{...o,title:o.title||o.options.title,filters:o.filterGroups||[],aichartId:o.aichartId||``}}:{},model_preference:s}}}var j=class extends t.i{constructor(...e){super(...e),this.messages=[],this.selectedDatasets=[],this.placeholder=`Describe your change`,this.disabled=!1,this.showAssistantContextMenu=!1,this.authKey=``,this.authToken=``,this.apiUrl=`https://api.luzmo.com`,this.appServer=`https://app.luzmo.com`,this.flagOpendata=!1,this.hideDatasetButton=!1,this.modelPreference=`performance`,this.requestMode=`internal`,this.isGenerating=!1,this.conversationId=null,this.chart=null,this.apiVersion=`0.1.0`,this._isGeneratingInternal=!1,this._textareaValue=``}static{this.styles=(0,r.unsafeCSS)(Ne)}static{this.tagName=`luzmo-ai-chat`}_generateMessageId(){return`msg-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}_buildRequestBody(e,t){return Pe({prompt:e,datasetIds:t,authKey:this.authKey,authToken:this.authToken,conversationId:this.conversationId,chart:this.chart,modelPreference:this.modelPreference,apiVersion:this.apiVersion})}async _sendMessage(e){let t=`${this.apiUrl}/${this.apiVersion}/aimessage`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},mode:`cors`,body:JSON.stringify(e)});if(!n.ok){let e=await n.json().catch(()=>null);throw Error(e?.message||`API request failed with status ${n.status}`)}return await n.json()}async _addUserMessage(e,t){let n={id:this._generateMessageId(),type:`user`,message:e};this.messages=[...this.messages,n],this._textareaValue=``,this.dispatchEvent(new CustomEvent(`luzmo-message-sent`,{detail:{message:n,selectedDatasets:t},bubbles:!0,composed:!0})),await this.updateComplete,this._scrollToBottom()}_prepareForAIResponse(){this._isGeneratingInternal=!0;let e={id:this._generateMessageId(),type:`ai`,message:``};return this.messages=[...this.messages,e],e}_handleChartResponse(e,t){this.dispatchEvent(new CustomEvent(`luzmo-chart-generated`,{detail:{aiSampleChart:e},bubbles:!0,composed:!0}));let n=e.message||e.error||e.clarificationQuestion;n&&(t.message=n,this.messages=[...this.messages.slice(0,-1),{...t}],this.dispatchEvent(new CustomEvent(`luzmo-response-received`,{detail:{message:t,done:!0},bubbles:!0,composed:!0})))}_handleErrorResponse(e,t){let n=null;if(e.functionResponse?.error){let t=e.functionResponse.explanation;t&&typeof t==`string`&&(n=e.functionResponse.explanation)}else n=e.functionResponse;n||=e.message||e.error||e.clarificationQuestion||null,n&&(t.message=n,this.messages=[...this.messages.slice(0,-1),{...t}]),this.dispatchEvent(new CustomEvent(`luzmo-response-received`,{detail:{message:t,done:!0},bubbles:!0,composed:!0}))}_processAIResponse(e,t){e.generatedChart===void 0?(e.functionResponse?.error!==void 0||typeof e.functionResponse==`string`||e.clarificationQuestion===`string`)&&this._handleErrorResponse(e,t):this._handleChartResponse(e,t)}_handleAPIError(e){console.error(`AI Chart Generation Error:`,e);let t={id:this._generateMessageId(),type:`ai`,message:`${e instanceof Error?e.message:`Unknown error`}`};this.messages=[...this.messages,t],this.dispatchEvent(new CustomEvent(`luzmo-response-received`,{detail:{message:t,error:e},bubbles:!0,composed:!0}))}async _finalizeAIResponse(){this._isGeneratingInternal=!1,await this.updateComplete,this._scrollToBottom()}_handleDatasetSelected(e){let t=e.detail;this.selectedDatasets.some(e=>e.id===t.id)||(this.selectedDatasets=[...this.selectedDatasets,t],this._emitDatasetsChanged())}_handleDatasetRemoved(e){let t=e.detail;this.selectedDatasets=this.selectedDatasets.filter(e=>e.id!==t.id),this._emitDatasetsChanged()}_emitDatasetsChanged(){this.dispatchEvent(new CustomEvent(`luzmo-datasets-changed`,{detail:{selectedDatasets:this.selectedDatasets},bubbles:!0,composed:!0}))}async _handlePromptSubmitted(e){let{prompt:t,selectedDatasets:n}=e.detail,r=n.map(e=>e.id),i=this._buildRequestBody(t,r);if(await this._addUserMessage(t,n),this.requestMode===`external`){let e={prompt:t,selectedDatasets:n,datasetIds:r,request:i,url:`${this.apiUrl}/${this.apiVersion}/aimessage`};this.dispatchEvent(new CustomEvent(`luzmo-prompt-submitted`,{detail:e,bubbles:!0,composed:!0}));return}let a=await this._prepareForAIResponse();try{let e=await this._sendMessage(i);this._processAIResponse(e,a)}catch(e){this._handleAPIError(e)}finally{await this._finalizeAIResponse()}}_scrollToBottom(){let e=this.shadowRoot?.querySelector(`.chat-messages-container`);e&&requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight})})}_sanitizeMessage(e){return Me.sanitize(e,{ALLOWED_TAGS:[`p`,`br`,`strong`,`em`,`b`,`i`,`u`,`s`,`code`,`pre`,`blockquote`,`ul`,`ol`,`li`,`a`],ALLOWED_ATTR:[`href`,`title`,`target`,`rel`],ALLOW_DATA_ATTR:!1,FORBID_TAGS:[`script`,`iframe`,`object`,`embed`,`form`,`input`,`button`],FORBID_ATTR:[`onerror`,`onload`,`onclick`,`onmouseover`,`onfocus`,`onblur`]})}_renderMessages(){return this.messages.map(e=>e.type===`user`?r.html`
22
+ <luzmo-chat-message
23
+ avatar-placement="bottom"
24
+ position="right"
25
+ variant="primary"
26
+ size="s"
27
+ >
28
+ ${e.message}
29
+ </luzmo-chat-message>
30
+ `:r.html`
31
+ <luzmo-chat-message
32
+ avatar-placement="bottom"
33
+ position="left"
34
+ quiet
35
+ size="s"
36
+ >
37
+ ${(0,a.unsafeHTML)(this._sanitizeMessage(e.message))}
38
+ </luzmo-chat-message>
39
+ `)}render(){let e=this.requestMode===`external`?this.isGenerating:this._isGeneratingInternal;return r.html`
40
+ <div class="chat-container">
41
+ <div class="chat-messages-container">
42
+ ${this._renderMessages()}
43
+ </div>
44
+
45
+ <luzmo-ai-interaction-textarea
46
+ .value=${this._textareaValue}
47
+ .selectedDatasets=${this.selectedDatasets}
48
+ .placeholder=${this.placeholder}
49
+ ?disabled=${this.disabled}
50
+ ?is-generating=${e}
51
+ ?hide-dataset-button=${this.hideDatasetButton}
52
+ auth-key=${this.authKey}
53
+ auth-token=${this.authToken}
54
+ api-url=${this.apiUrl}
55
+ app-server=${this.appServer}
56
+ ?flag-opendata=${this.flagOpendata}
57
+ @prompt-submitted=${this._handlePromptSubmitted}
58
+ @dataset-selected=${this._handleDatasetSelected}
59
+ @dataset-removed=${this._handleDatasetRemoved}
60
+ ></luzmo-ai-interaction-textarea>
61
+ </div>
62
+ `}};n.t([(0,i.property)({type:Array})],j.prototype,`messages`,void 0),n.t([(0,i.property)({type:Array,attribute:`selected-datasets`})],j.prototype,`selectedDatasets`,void 0),n.t([(0,i.property)({type:String})],j.prototype,`placeholder`,void 0),n.t([(0,i.property)({type:Boolean,reflect:!0})],j.prototype,`disabled`,void 0),n.t([(0,i.property)({type:Boolean,attribute:`show-assistant-context-menu`})],j.prototype,`showAssistantContextMenu`,void 0),n.t([(0,i.property)({type:String,attribute:`auth-key`})],j.prototype,`authKey`,void 0),n.t([(0,i.property)({type:String,attribute:`auth-token`})],j.prototype,`authToken`,void 0),n.t([(0,i.property)({type:String,attribute:`api-url`})],j.prototype,`apiUrl`,void 0),n.t([(0,i.property)({type:String,attribute:`app-server`})],j.prototype,`appServer`,void 0),n.t([(0,i.property)({type:Boolean,attribute:`flag-opendata`})],j.prototype,`flagOpendata`,void 0),n.t([(0,i.property)({type:Boolean,attribute:`hide-dataset-button`})],j.prototype,`hideDatasetButton`,void 0),n.t([(0,i.property)({type:String,attribute:`model-preference`})],j.prototype,`modelPreference`,void 0),n.t([(0,i.property)({type:String,attribute:`request-mode`})],j.prototype,`requestMode`,void 0),n.t([(0,i.property)({type:Boolean,attribute:`is-generating`})],j.prototype,`isGenerating`,void 0),n.t([(0,i.property)({type:String,attribute:`conversation-id`})],j.prototype,`conversationId`,void 0),n.t([(0,i.property)({type:Object,attribute:`chart`})],j.prototype,`chart`,void 0),n.t([(0,i.property)({type:String,attribute:`api-version`})],j.prototype,`apiVersion`,void 0),n.t([(0,i.state)()],j.prototype,`_isGeneratingInternal`,void 0),n.t([(0,i.state)()],j.prototype,`_textareaValue`,void 0),customElements.get(`luzmo-ai-chat`)||customElements.define(`luzmo-ai-chat`,j),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return j}});