@salla.sa/ui-ai-kit-core 2.2.0 → 2.2.2

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 (105) hide show
  1. package/dist/cjs/ai-agent-error.cjs.entry.js +2 -2
  2. package/dist/cjs/ai-card.cjs.entry.js +3 -3
  3. package/dist/cjs/ai-chat-container.cjs.entry.js +29 -3
  4. package/dist/cjs/ai-chat-header.cjs.entry.js +73 -11
  5. package/dist/cjs/ai-chat-message.cjs.entry.js +1 -1
  6. package/dist/cjs/ai-conversation-list.cjs.entry.js +11 -5
  7. package/dist/cjs/ai-conversation-summary.cjs.entry.js +1 -1
  8. package/dist/cjs/ai-icon.cjs.entry.js +1 -1
  9. package/dist/cjs/ai-in-chat-browser.cjs.entry.js +5 -23
  10. package/dist/cjs/ai-link.cjs.entry.js +2 -2
  11. package/dist/cjs/ai-loading.cjs.entry.js +2 -2
  12. package/dist/cjs/ai-message-input.cjs.entry.js +1 -1
  13. package/dist/cjs/ai-rating.cjs.entry.js +1 -1
  14. package/dist/cjs/ai-route-decision.cjs.entry.js +2 -2
  15. package/dist/cjs/ai-suggestion.cjs.entry.js +3 -3
  16. package/dist/cjs/ai-voice-input.cjs.entry.js +2 -2
  17. package/dist/cjs/{index-BQ8Az7-D.js → index-Cc05u4ND.js} +15 -0
  18. package/dist/cjs/loader.cjs.js +2 -2
  19. package/dist/cjs/ui-ai-kit.cjs.js +2 -2
  20. package/dist/collection/collection-manifest.json +1 -1
  21. package/dist/collection/components/ai-agent-error/ai-agent-error.js +1 -1
  22. package/dist/collection/components/ai-card/ai-card.js +2 -2
  23. package/dist/collection/components/ai-chat-container/ai-chat-container.js +110 -7
  24. package/dist/collection/components/ai-chat-header/ai-chat-header.js +204 -33
  25. package/dist/collection/components/ai-conversation-list/ai-conversation-list.css +20 -0
  26. package/dist/collection/components/ai-conversation-list/ai-conversation-list.js +29 -3
  27. package/dist/collection/components/ai-in-chat-browser/ai-in-chat-browser.css +0 -10
  28. package/dist/collection/components/ai-in-chat-browser/ai-in-chat-browser.js +5 -74
  29. package/dist/collection/components/ai-link/ai-link.js +1 -1
  30. package/dist/collection/components/ai-loading/ai-loading.js +1 -1
  31. package/dist/collection/components/ai-route-decision/ai-route-decision.js +1 -1
  32. package/dist/collection/components/ai-suggestion/ai-suggestion.js +2 -2
  33. package/dist/collection/components/ai-voice-input/ai-voice-input.js +1 -1
  34. package/dist/components/ai-agent-error.js +1 -1
  35. package/dist/components/ai-card.js +1 -1
  36. package/dist/components/ai-chat-container.js +1 -1
  37. package/dist/components/ai-chat-header.js +1 -1
  38. package/dist/components/ai-chat-message.js +2 -2
  39. package/dist/components/ai-conversation-list.js +1 -1
  40. package/dist/components/ai-conversation-summary.js +1 -1
  41. package/dist/components/ai-icon.js +1 -1
  42. package/dist/components/ai-in-chat-browser.js +1 -1
  43. package/dist/components/ai-link.js +1 -1
  44. package/dist/components/ai-loading.js +1 -1
  45. package/dist/components/ai-message-input.js +1 -1
  46. package/dist/components/ai-rating.js +1 -1
  47. package/dist/components/ai-route-decision.js +1 -1
  48. package/dist/components/ai-suggestion.js +1 -1
  49. package/dist/components/ai-voice-input.js +1 -1
  50. package/dist/components/index.js +1 -1
  51. package/dist/components/{p-CXJ3iEt8.js → p-BPkf7wZg.js} +1 -1
  52. package/dist/components/{p-B3gdcdCK.js → p-Ba0urr6Q.js} +1 -1
  53. package/dist/components/p-CFSr3KcL.js +1 -0
  54. package/dist/components/{p-C2LB8D3t.js → p-DZuBxUde.js} +1 -1
  55. package/dist/components/{p-NKAwri_g.js → p-bGFmyIp1.js} +1 -1
  56. package/dist/esm/ai-agent-error.entry.js +2 -2
  57. package/dist/esm/ai-card.entry.js +3 -3
  58. package/dist/esm/ai-chat-container.entry.js +29 -3
  59. package/dist/esm/ai-chat-header.entry.js +73 -11
  60. package/dist/esm/ai-chat-message.entry.js +1 -1
  61. package/dist/esm/ai-conversation-list.entry.js +11 -5
  62. package/dist/esm/ai-conversation-summary.entry.js +1 -1
  63. package/dist/esm/ai-icon.entry.js +1 -1
  64. package/dist/esm/ai-in-chat-browser.entry.js +5 -23
  65. package/dist/esm/ai-link.entry.js +2 -2
  66. package/dist/esm/ai-loading.entry.js +2 -2
  67. package/dist/esm/ai-message-input.entry.js +1 -1
  68. package/dist/esm/ai-rating.entry.js +1 -1
  69. package/dist/esm/ai-route-decision.entry.js +2 -2
  70. package/dist/esm/ai-suggestion.entry.js +3 -3
  71. package/dist/esm/ai-voice-input.entry.js +2 -2
  72. package/dist/esm/{index-BSQ0GkzI.js → index-VMEwYfaX.js} +15 -0
  73. package/dist/esm/loader.js +3 -3
  74. package/dist/esm/ui-ai-kit.js +3 -3
  75. package/dist/types/components/ai-chat-container/ai-chat-container.d.ts +21 -1
  76. package/dist/types/components/ai-chat-header/ai-chat-header.d.ts +28 -3
  77. package/dist/types/components/ai-conversation-list/ai-conversation-list.d.ts +2 -0
  78. package/dist/types/components/ai-in-chat-browser/ai-in-chat-browser.d.ts +1 -10
  79. package/dist/types/components.d.ts +107 -53
  80. package/dist/types/index.d.ts +1 -0
  81. package/dist/ui-ai-kit/{p-1e8e6440.entry.js → p-062cad02.entry.js} +1 -1
  82. package/dist/ui-ai-kit/p-17e5d542.entry.js +1 -0
  83. package/dist/ui-ai-kit/{p-b88808a4.entry.js → p-187db371.entry.js} +1 -1
  84. package/dist/ui-ai-kit/p-1b247096.entry.js +1 -0
  85. package/dist/ui-ai-kit/p-278895fd.entry.js +1 -0
  86. package/dist/ui-ai-kit/{p-39a2d4c3.entry.js → p-338d55d3.entry.js} +1 -1
  87. package/dist/ui-ai-kit/{p-dac67692.entry.js → p-4359a116.entry.js} +1 -1
  88. package/dist/ui-ai-kit/{p-3a86919b.entry.js → p-5f005ec5.entry.js} +1 -1
  89. package/dist/ui-ai-kit/{p-849cd7e2.entry.js → p-6a4b66ed.entry.js} +1 -1
  90. package/dist/ui-ai-kit/{p-47797619.entry.js → p-6b644d32.entry.js} +1 -1
  91. package/dist/ui-ai-kit/{p-658d8b24.entry.js → p-6bd54e29.entry.js} +1 -1
  92. package/dist/ui-ai-kit/{p-eb40ffd0.entry.js → p-83f46030.entry.js} +2 -2
  93. package/dist/ui-ai-kit/{p-c9dca99e.entry.js → p-8fabdbe8.entry.js} +1 -1
  94. package/dist/ui-ai-kit/{p-BSQ0GkzI.js → p-VMEwYfaX.js} +2 -2
  95. package/dist/ui-ai-kit/{p-73cbb80b.entry.js → p-cae762e0.entry.js} +1 -1
  96. package/dist/ui-ai-kit/p-d02f2db5.entry.js +1 -0
  97. package/dist/ui-ai-kit/{p-78fb4ceb.entry.js → p-e6236df2.entry.js} +1 -1
  98. package/dist/ui-ai-kit/ui-ai-kit.esm.js +1 -1
  99. package/package.json +1 -1
  100. package/dist/components/p-D4mVoP6B.js +0 -1
  101. package/dist/components/p-DKsh1ZQX.js +0 -1
  102. package/dist/ui-ai-kit/p-29d84924.entry.js +0 -1
  103. package/dist/ui-ai-kit/p-77ef8015.entry.js +0 -1
  104. package/dist/ui-ai-kit/p-8cb807f3.entry.js +0 -1
  105. package/dist/ui-ai-kit/p-abd68089.entry.js +0 -1
@@ -14,7 +14,6 @@ export class AiChatHeader {
14
14
  agentAvatar = '';
15
15
  /** Human mode: show the back button */
16
16
  showBack = true;
17
- isDraggable = false;
18
17
  /** Human mode: status indicator variant */
19
18
  statusIndicator = 'online';
20
19
  /** Browser mode: page title shown in the header */
@@ -27,18 +26,36 @@ export class AiChatHeader {
27
26
  conversationActiveId = '';
28
27
  /** Conversation list: show skeleton loading state */
29
28
  conversationLoading = false;
29
+ /** Conversation list: show error state */
30
+ conversationError = false;
31
+ /** Conversation list: error message text */
32
+ conversationErrorText = 'تعذّر تحميل المحادثات';
33
+ /** Conversation list: retry button label */
34
+ conversationRetryLabel = 'إعادة المحاولة';
35
+ /** Conversation list: empty state label */
36
+ conversationEmptyText = 'لا توجد محادثات';
37
+ /** Conversation list: ID of the conversation currently being deleted — shows a spinner on that item */
38
+ conversationDeletingId = '';
30
39
  /** Show a shimmer skeleton in place of the conversation title (e.g. while loading conversation) */
31
40
  titleLoading = false;
32
41
  avatarError = false;
33
42
  dropdownOpen = false;
43
+ /** Internally managed — true when the parent ai-chat-container has position="float" */
44
+ isFloating = false;
45
+ parentPositionObserver = null;
34
46
  /** Cancel / close button */
35
47
  closeClick;
36
48
  /** Pencil-edit button (agent mode) */
37
- editClick;
49
+ newChatClick;
38
50
  /** Title / chevron click → open conversation list (agent mode) */
39
51
  dropdownClick;
40
- /** More options button */
52
+ /** More options button — also fires a composed event so ai-chat-container can auto-cycle position */
41
53
  positionClick;
54
+ /**
55
+ * Composed + bubbling event that ai-chat-container listens to internally
56
+ * to automatically cycle its position. Fires alongside positionClick.
57
+ */
58
+ headerPositionClick;
42
59
  /** Back-arrow button (human mode) */
43
60
  backClick;
44
61
  /**
@@ -52,11 +69,50 @@ export class AiChatHeader {
52
69
  conversationSelect;
53
70
  /** Fired when a conversation delete button is clicked */
54
71
  conversationDelete;
72
+ /** Fired when the retry button is clicked in the conversation list error state */
73
+ conversationRetry;
55
74
  handleDocumentClick(event) {
56
75
  if (this.dropdownOpen && !this.el.contains(event.target)) {
57
76
  this.dropdownOpen = false;
58
77
  }
59
78
  }
79
+ connectedCallback() {
80
+ // Initial sync will happen in componentDidLoad
81
+ }
82
+ componentDidLoad() {
83
+ // By this point, the element is fully in the DOM and parent relationships are established
84
+ // Small delay to ensure parent custom elements are fully upgraded
85
+ requestAnimationFrame(() => {
86
+ this.syncFloatingState();
87
+ this.observeParentPosition();
88
+ });
89
+ }
90
+ disconnectedCallback() {
91
+ this.parentPositionObserver?.disconnect();
92
+ this.parentPositionObserver = null;
93
+ }
94
+ observeParentPosition() {
95
+ if (this.parentPositionObserver)
96
+ return; // Already observing
97
+ const container = this.el.closest('ai-chat-container');
98
+ if (container) {
99
+ this.parentPositionObserver = new MutationObserver(() => this.syncFloatingState());
100
+ this.parentPositionObserver.observe(container, { attributes: true, attributeFilter: ['position'] });
101
+ }
102
+ }
103
+ syncFloatingState() {
104
+ const container = this.el.closest('ai-chat-container');
105
+ if (container) {
106
+ const newState = container.getAttribute('position') === 'float';
107
+ if (this.isFloating !== newState) {
108
+ this.isFloating = newState;
109
+ }
110
+ return;
111
+ }
112
+ if (this.isFloating !== false) {
113
+ this.isFloating = false;
114
+ }
115
+ }
60
116
  renderIcon(name, width, height) {
61
117
  const icon = iconRegistry[name];
62
118
  if (!icon)
@@ -74,7 +130,7 @@ export class AiChatHeader {
74
130
  } }));
75
131
  }
76
132
  renderDragBtn() {
77
- return (this.isDraggable && (h("button", { class: "action-btn drag-btn", "aria-label": "\u0633\u062D\u0628 / Drag", onPointerDown: (e) => {
133
+ return (this.isFloating && (h("button", { class: "action-btn drag-btn", "aria-label": "\u0633\u062D\u0628 / Drag", onPointerDown: (e) => {
78
134
  e.preventDefault();
79
135
  this.headerDragStart.emit({ clientX: e.clientX, clientY: e.clientY });
80
136
  } }, this.renderIcon('drag', 11, 15))));
@@ -88,10 +144,14 @@ export class AiChatHeader {
88
144
  e.stopPropagation();
89
145
  this.conversationDelete.emit(e.detail);
90
146
  };
147
+ handleConversationRetry = (e) => {
148
+ e.stopPropagation();
149
+ this.conversationRetry.emit();
150
+ };
91
151
  renderConversationDropdown() {
92
152
  if (!this.dropdownOpen || this.mode !== 'agent')
93
153
  return null;
94
- return (h("div", { class: "conversation-dropdown" }, h("ai-conversation-list", { items: this.conversationItems, activeId: this.conversationActiveId, loading: this.conversationLoading, onConversationSelect: this.handleConversationSelect, onConversationDelete: this.handleConversationDelete })));
154
+ return (h("div", { class: "conversation-dropdown" }, h("ai-conversation-list", { items: this.conversationItems, activeId: this.conversationActiveId, loading: this.conversationLoading, error: this.conversationError, errorText: this.conversationErrorText, retryLabel: this.conversationRetryLabel, emptyText: this.conversationEmptyText, deletingId: this.conversationDeletingId, onConversationSelect: this.handleConversationSelect, onConversationDelete: this.handleConversationDelete, onRetryClick: this.handleConversationRetry })));
95
155
  }
96
156
  renderAgentMode() {
97
157
  return [
@@ -102,25 +162,25 @@ export class AiChatHeader {
102
162
  this.dropdownOpen = !this.dropdownOpen;
103
163
  this.dropdownClick.emit();
104
164
  }, "aria-haspopup": "listbox", "aria-expanded": this.dropdownOpen, "aria-label": `${this.conversation}, افتح قائمة المحادثات` }, this.titleLoading ? (h("span", { class: "title-skeleton", "aria-busy": "true", "aria-label": "\u062C\u0627\u0631\u064A \u0627\u0644\u062A\u062D\u0645\u064A\u0644" })) : (h("span", { class: "title" }, this.conversation)), !this.titleLoading && (h("span", { class: `dropdown-chevron${this.dropdownOpen ? ' open' : ''}` }, this.renderIcon('chevron-down', 24, 24)))),
105
- h("div", { class: "actions" }, h("button", { class: "action-btn", "aria-label": "\u062A\u0639\u062F\u064A\u0644 / Edit", onClick: () => this.editClick.emit() }, this.renderIcon('pencil-edit', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0627\u0644\u0639\u0631\u0636 / Position", onClick: () => this.positionClick.emit() }, this.renderIcon('hand', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0625\u063A\u0644\u0627\u0642 / Close", onClick: () => this.closeClick.emit() }, this.renderIcon('cancel', 22, 22))),
165
+ h("div", { class: "actions" }, h("button", { class: "action-btn", "aria-label": "\u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629 / New Chat", onClick: () => this.newChatClick.emit() }, this.renderIcon('pencil-edit', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0627\u0644\u0639\u0631\u0636 / Position", onClick: () => { this.positionClick.emit(); this.headerPositionClick.emit(); } }, this.renderIcon('hand', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0625\u063A\u0644\u0627\u0642 / Close", onClick: () => this.closeClick.emit() }, this.renderIcon('cancel', 22, 22))),
106
166
  ];
107
167
  }
108
168
  renderHumanMode() {
109
169
  return [
110
170
  this.renderDragBtn(),
111
171
  h("div", { class: "content human" }, this.showBack && (h("button", { class: "back-btn", "aria-label": "\u0631\u062C\u0648\u0639 / Back", onClick: () => this.backClick.emit() }, this.renderIcon('arrow-right', 24, 24))), h("div", { class: "avatar-wrapper" }, this.renderAvatar(), h("span", { class: `online-dot status-${this.statusIndicator}` }, this.renderIcon('online-dot', 10, 10))), h("div", { class: "text-block" }, h("span", { class: "agent-name" }, this.agentName), this.agentStatus && h("span", { class: "agent-status" }, this.agentStatus))),
112
- h("div", { class: "actions" }, h("button", { class: "action-btn", "aria-label": "\u0627\u0644\u0639\u0631\u0636 / Position", onClick: () => this.positionClick.emit() }, this.renderIcon('hand', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0625\u063A\u0644\u0627\u0642 / Close", onClick: () => this.closeClick.emit() }, this.renderIcon('cancel', 22, 22))),
172
+ h("div", { class: "actions" }, h("button", { class: "action-btn", "aria-label": "\u0627\u0644\u0639\u0631\u0636 / Position", onClick: () => { this.positionClick.emit(); this.headerPositionClick.emit(); } }, this.renderIcon('hand', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0625\u063A\u0644\u0627\u0642 / Close", onClick: () => this.closeClick.emit() }, this.renderIcon('cancel', 22, 22))),
113
173
  ];
114
174
  }
115
175
  renderBrowserMode() {
116
176
  return [
117
177
  this.renderDragBtn(),
118
178
  h("div", { class: "content browser" }, h("button", { class: "back-btn", "aria-label": "\u0631\u062C\u0648\u0639 / Back", onClick: () => this.backClick.emit() }, this.renderIcon('arrow-right', 24, 24)), h("span", { class: "browser-title" }, this.pageTitle), h("button", { class: "browser-link-btn", "aria-label": "\u0641\u062A\u062D \u0641\u064A \u0646\u0627\u0641\u0630\u0629 \u062C\u062F\u064A\u062F\u0629 / Open externally", onClick: () => this.openExternal.emit(this.pageUrl) }, this.renderIcon('link', 14, 14))),
119
- h("div", { class: "actions" }, h("button", { class: "action-btn", "aria-label": "\u0627\u0644\u0639\u0631\u0636 / Position", onClick: () => this.positionClick.emit() }, this.renderIcon('hand', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0625\u063A\u0644\u0627\u0642 / Close", onClick: () => this.closeClick.emit() }, this.renderIcon('cancel', 22, 22))),
179
+ h("div", { class: "actions" }, h("button", { class: "action-btn", "aria-label": "\u0627\u0644\u0639\u0631\u0636 / Position", onClick: () => { this.positionClick.emit(); this.headerPositionClick.emit(); } }, this.renderIcon('hand', 22, 22)), h("button", { class: "action-btn", "aria-label": "\u0625\u063A\u0644\u0627\u0642 / Close", onClick: () => this.closeClick.emit() }, this.renderIcon('cancel', 22, 22))),
120
180
  ];
121
181
  }
122
182
  render() {
123
- return (h(Host, { key: '8e1fe67030a0cb1eb94327f093327fb23d4faf01' }, h("div", { key: '14766bd663e5fe027f1a3320bd3f16d79e9feb45', class: "header-wrapper" }, h("div", { key: 'bef30f621ba3b148f4af055347eb707bc8f64b15', class: "header-container" }, this.mode === 'agent' ? this.renderAgentMode() : this.mode === 'human' ? this.renderHumanMode() : this.renderBrowserMode()), this.renderConversationDropdown())));
183
+ return (h(Host, { key: '874ee1e0eb62a59a4c9713111856594ef03dd435' }, h("div", { key: 'd8887800ad270c7878f41bdc930b2ca6b1280935', class: "header-wrapper" }, h("div", { key: 'a4fc7e86851cc1cdce6c686880b9f4ee33342fb7', class: "header-container" }, this.mode === 'agent' ? this.renderAgentMode() : this.mode === 'human' ? this.renderHumanMode() : this.renderBrowserMode()), this.renderConversationDropdown())));
124
184
  }
125
185
  static get is() { return "ai-chat-header"; }
126
186
  static get encapsulation() { return "shadow"; }
@@ -256,26 +316,6 @@ export class AiChatHeader {
256
316
  "attribute": "show-back",
257
317
  "defaultValue": "true"
258
318
  },
259
- "isDraggable": {
260
- "type": "boolean",
261
- "mutable": false,
262
- "complexType": {
263
- "original": "boolean",
264
- "resolved": "boolean",
265
- "references": {}
266
- },
267
- "required": false,
268
- "optional": false,
269
- "docs": {
270
- "tags": [],
271
- "text": ""
272
- },
273
- "getter": false,
274
- "setter": false,
275
- "reflect": false,
276
- "attribute": "is-draggable",
277
- "defaultValue": "false"
278
- },
279
319
  "statusIndicator": {
280
320
  "type": "string",
281
321
  "mutable": false,
@@ -401,6 +441,106 @@ export class AiChatHeader {
401
441
  "attribute": "conversation-loading",
402
442
  "defaultValue": "false"
403
443
  },
444
+ "conversationError": {
445
+ "type": "boolean",
446
+ "mutable": false,
447
+ "complexType": {
448
+ "original": "boolean",
449
+ "resolved": "boolean",
450
+ "references": {}
451
+ },
452
+ "required": false,
453
+ "optional": false,
454
+ "docs": {
455
+ "tags": [],
456
+ "text": "Conversation list: show error state"
457
+ },
458
+ "getter": false,
459
+ "setter": false,
460
+ "reflect": false,
461
+ "attribute": "conversation-error",
462
+ "defaultValue": "false"
463
+ },
464
+ "conversationErrorText": {
465
+ "type": "string",
466
+ "mutable": false,
467
+ "complexType": {
468
+ "original": "string",
469
+ "resolved": "string",
470
+ "references": {}
471
+ },
472
+ "required": false,
473
+ "optional": false,
474
+ "docs": {
475
+ "tags": [],
476
+ "text": "Conversation list: error message text"
477
+ },
478
+ "getter": false,
479
+ "setter": false,
480
+ "reflect": false,
481
+ "attribute": "conversation-error-text",
482
+ "defaultValue": "'\u062A\u0639\u0630\u0651\u0631 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0627\u062A'"
483
+ },
484
+ "conversationRetryLabel": {
485
+ "type": "string",
486
+ "mutable": false,
487
+ "complexType": {
488
+ "original": "string",
489
+ "resolved": "string",
490
+ "references": {}
491
+ },
492
+ "required": false,
493
+ "optional": false,
494
+ "docs": {
495
+ "tags": [],
496
+ "text": "Conversation list: retry button label"
497
+ },
498
+ "getter": false,
499
+ "setter": false,
500
+ "reflect": false,
501
+ "attribute": "conversation-retry-label",
502
+ "defaultValue": "'\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629'"
503
+ },
504
+ "conversationEmptyText": {
505
+ "type": "string",
506
+ "mutable": false,
507
+ "complexType": {
508
+ "original": "string",
509
+ "resolved": "string",
510
+ "references": {}
511
+ },
512
+ "required": false,
513
+ "optional": false,
514
+ "docs": {
515
+ "tags": [],
516
+ "text": "Conversation list: empty state label"
517
+ },
518
+ "getter": false,
519
+ "setter": false,
520
+ "reflect": false,
521
+ "attribute": "conversation-empty-text",
522
+ "defaultValue": "'\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u062D\u0627\u062F\u062B\u0627\u062A'"
523
+ },
524
+ "conversationDeletingId": {
525
+ "type": "string",
526
+ "mutable": false,
527
+ "complexType": {
528
+ "original": "string",
529
+ "resolved": "string",
530
+ "references": {}
531
+ },
532
+ "required": false,
533
+ "optional": false,
534
+ "docs": {
535
+ "tags": [],
536
+ "text": "Conversation list: ID of the conversation currently being deleted \u2014 shows a spinner on that item"
537
+ },
538
+ "getter": false,
539
+ "setter": false,
540
+ "reflect": false,
541
+ "attribute": "conversation-deleting-id",
542
+ "defaultValue": "''"
543
+ },
404
544
  "titleLoading": {
405
545
  "type": "boolean",
406
546
  "mutable": false,
@@ -426,7 +566,8 @@ export class AiChatHeader {
426
566
  static get states() {
427
567
  return {
428
568
  "avatarError": {},
429
- "dropdownOpen": {}
569
+ "dropdownOpen": {},
570
+ "isFloating": {}
430
571
  };
431
572
  }
432
573
  static get events() {
@@ -446,8 +587,8 @@ export class AiChatHeader {
446
587
  "references": {}
447
588
  }
448
589
  }, {
449
- "method": "editClick",
450
- "name": "editClick",
590
+ "method": "newChatClick",
591
+ "name": "newChatClick",
451
592
  "bubbles": true,
452
593
  "cancelable": true,
453
594
  "composed": true,
@@ -483,7 +624,22 @@ export class AiChatHeader {
483
624
  "composed": true,
484
625
  "docs": {
485
626
  "tags": [],
486
- "text": "More options button"
627
+ "text": "More options button \u2014 also fires a composed event so ai-chat-container can auto-cycle position"
628
+ },
629
+ "complexType": {
630
+ "original": "void",
631
+ "resolved": "void",
632
+ "references": {}
633
+ }
634
+ }, {
635
+ "method": "headerPositionClick",
636
+ "name": "headerPositionClick",
637
+ "bubbles": true,
638
+ "cancelable": true,
639
+ "composed": true,
640
+ "docs": {
641
+ "tags": [],
642
+ "text": "Composed + bubbling event that ai-chat-container listens to internally\nto automatically cycle its position. Fires alongside positionClick."
487
643
  },
488
644
  "complexType": {
489
645
  "original": "void",
@@ -565,6 +721,21 @@ export class AiChatHeader {
565
721
  "resolved": "string",
566
722
  "references": {}
567
723
  }
724
+ }, {
725
+ "method": "conversationRetry",
726
+ "name": "conversationRetry",
727
+ "bubbles": true,
728
+ "cancelable": true,
729
+ "composed": true,
730
+ "docs": {
731
+ "tags": [],
732
+ "text": "Fired when the retry button is clicked in the conversation list error state"
733
+ },
734
+ "complexType": {
735
+ "original": "void",
736
+ "resolved": "void",
737
+ "references": {}
738
+ }
568
739
  }];
569
740
  }
570
741
  static get elementRef() { return "el"; }
@@ -161,6 +161,26 @@
161
161
  line-height: 0;
162
162
  }
163
163
 
164
+ .delete-btn--deleting {
165
+ opacity: 1;
166
+ cursor: default;
167
+ pointer-events: none;
168
+ }
169
+
170
+ .delete-spinner {
171
+ display: block;
172
+ width: 12px;
173
+ height: 12px;
174
+ border: 2px solid var(--ai-border-default);
175
+ border-top-color: var(--ai-text-muted);
176
+ border-radius: 50%;
177
+ animation: delete-spin 0.7s linear infinite;
178
+ }
179
+
180
+ @keyframes delete-spin {
181
+ to { transform: rotate(360deg); }
182
+ }
183
+
164
184
  /* ── Empty state ───────────────────────────────────────── */
165
185
 
166
186
  .empty-state {
@@ -15,6 +15,8 @@ export class AiConversationList {
15
15
  errorText = 'تعذّر تحميل المحادثات';
16
16
  /** Retry button label for error state */
17
17
  retryLabel = 'إعادة المحاولة';
18
+ /** ID of the conversation currently being deleted — shows a spinner on that item */
19
+ deletingId = '';
18
20
  conversationSelect;
19
21
  conversationDelete;
20
22
  retryClick;
@@ -65,7 +67,7 @@ export class AiConversationList {
65
67
  }
66
68
  render() {
67
69
  const showEmpty = !this.loading && !this.error && this.items.length === 0;
68
- return (h(Host, { key: 'f869a0422848385a43512486a021e3932e51589d' }, h("div", { key: 'b0f78202691e6329b9a73987f499c20d89b86c4b', class: "conversation-list" }, h("div", { key: '5a007fffa3fe9ef16445395966b1e14d2f516cf9', class: "list-scroll", role: "list" }, this.loading
70
+ return (h(Host, { key: '8cf17cedd5c41f0d6ffd2d06e557dc370041d1aa' }, h("div", { key: '50f5eeb57228f55d72acf517ed5eeb5d79e13a4b', class: "conversation-list" }, h("div", { key: '763f7cb557fb9abea75e08379d0ea9090b00ac1e', class: "list-scroll", role: "list" }, this.loading
69
71
  ? this.renderSkeleton()
70
72
  : this.error
71
73
  ? this.renderError()
@@ -73,10 +75,14 @@ export class AiConversationList {
73
75
  ? this.renderEmpty()
74
76
  : this.items.map(item => {
75
77
  const isActive = item.id === this.activeId;
76
- return (h("div", { key: item.id, class: { 'conv-item': true, 'conv-item--active': isActive }, role: "listitem", "aria-current": isActive ? 'true' : undefined, onClick: () => this.conversationSelect.emit(item.id) }, h("div", { class: "conv-item__body" }, h("p", { class: "conv-item__title" }, item.title), h("p", { class: "conv-item__preview" }, item.preview), h("div", { class: "conv-item__meta" }, h("span", { class: "conv-item__time" }, this.formatRelativeTime(item.timestamp)), item.rating != null && this.renderRatingDots(item.rating))), h("button", { class: "delete-btn", "aria-label": "\u062D\u0630\u0641 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629", onClick: e => {
78
+ return (h("div", { key: item.id, class: { 'conv-item': true, 'conv-item--active': isActive }, role: "listitem", "aria-current": isActive ? 'true' : undefined, onClick: () => this.conversationSelect.emit(item.id) }, h("div", { class: "conv-item__body" }, h("p", { class: "conv-item__title" }, item.title), h("p", { class: "conv-item__preview" }, item.preview), h("div", { class: "conv-item__meta" }, h("span", { class: "conv-item__time" }, this.formatRelativeTime(item.timestamp)), item.rating != null && this.renderRatingDots(item.rating))), h("button", { class: { 'delete-btn': true, 'delete-btn--deleting': this.deletingId === item.id }, "aria-label": "\u062D\u0630\u0641 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629", disabled: this.deletingId === item.id, onClick: e => {
77
79
  e.stopPropagation();
80
+ if (this.deletingId === item.id)
81
+ return;
78
82
  this.conversationDelete.emit(item.id);
79
- } }, this.renderIcon('cancel', 14, 14))));
83
+ } }, this.deletingId === item.id
84
+ ? h("span", { class: "delete-spinner", "aria-label": "\u062C\u0627\u0631\u064A \u0627\u0644\u062D\u0630\u0641" })
85
+ : this.renderIcon('cancel', 14, 14))));
80
86
  })))));
81
87
  }
82
88
  static get is() { return "ai-conversation-list"; }
@@ -236,6 +242,26 @@ export class AiConversationList {
236
242
  "reflect": false,
237
243
  "attribute": "retry-label",
238
244
  "defaultValue": "'\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629'"
245
+ },
246
+ "deletingId": {
247
+ "type": "string",
248
+ "mutable": false,
249
+ "complexType": {
250
+ "original": "string",
251
+ "resolved": "string",
252
+ "references": {}
253
+ },
254
+ "required": false,
255
+ "optional": false,
256
+ "docs": {
257
+ "tags": [],
258
+ "text": "ID of the conversation currently being deleted \u2014 shows a spinner on that item"
259
+ },
260
+ "getter": false,
261
+ "setter": false,
262
+ "reflect": false,
263
+ "attribute": "deleting-id",
264
+ "defaultValue": "''"
239
265
  }
240
266
  };
241
267
  }
@@ -6,16 +6,6 @@
6
6
  margin: calc(-1 * var(--ai-spacing-2xl, 16px));
7
7
  }
8
8
 
9
- /* ── Container ──────────────────────────────────────────────────── */
10
- .browser-container {
11
- display: flex;
12
- flex-direction: column;
13
- width: 100%;
14
- height: 100%;
15
- background: var(--ai-bg-card);
16
- overflow: hidden;
17
- }
18
-
19
9
  /* ── Content Area ───────────────────────────────────────────────── */
20
10
  .browser-content {
21
11
  flex: 1;
@@ -2,14 +2,8 @@ import { Host, h } from "@stencil/core";
2
2
  export class AiInChatBrowser {
3
3
  /** The URL to display inside the in-chat browser iframe */
4
4
  url = '';
5
- /** Page title shown in the browser header. Defaults to the URL hostname when empty. */
5
+ /** Page title used as the iframe's accessible title. Defaults to the URL hostname when empty. */
6
6
  pageTitle = '';
7
- /** Show the drag handle in the header (for floating containers) */
8
- isDraggable = false;
9
- /** Fired when the user clicks the back / close button to dismiss the browser */
10
- browserClose;
11
- /** Fired when the user clicks the external-link button */
12
- browserOpenExternal;
13
7
  isLoading = true;
14
8
  hasError = false;
15
9
  onUrlChange() {
@@ -20,8 +14,7 @@ export class AiInChatBrowser {
20
14
  if (this.pageTitle)
21
15
  return this.pageTitle;
22
16
  try {
23
- const parsed = new URL(this.url);
24
- return parsed.hostname;
17
+ return new URL(this.url).hostname;
25
18
  }
26
19
  catch {
27
20
  return this.url || '';
@@ -34,18 +27,9 @@ export class AiInChatBrowser {
34
27
  this.isLoading = false;
35
28
  this.hasError = true;
36
29
  };
37
- handleBack = () => {
38
- this.browserClose.emit();
39
- };
40
- handleOpenExternal = () => {
41
- if (this.url) {
42
- window.open(this.url, '_blank', 'noopener,noreferrer');
43
- }
44
- this.browserOpenExternal.emit(this.url);
45
- };
46
30
  render() {
47
31
  const displayTitle = this.getDisplayTitle();
48
- return (h(Host, { key: '8486b7a1506c0eb22dea066adfc98ede9e2542c4' }, h("div", { key: '8781447cadcc8f33dba9b6eb6b63e1e1cb6c0cfd', class: "browser-container" }, h("ai-chat-header", { key: 'f30265b9050991ccbe61e0eeb53015f9b56c113b', mode: "browser", pageTitle: displayTitle, pageUrl: this.url, isDraggable: this.isDraggable, onBackClick: this.handleBack, onOpenExternal: () => this.handleOpenExternal() }), h("div", { key: '2d1ecf5b11e882ab1632278edacf55fa264e1a08', class: "browser-content" }, this.isLoading && (h("div", { key: '0e3fc77efa82fb52c5a531b3b30fb81fcee339d8', class: "browser-loading" }, h("div", { key: '09db30ff5f494eedfaf7928389abda72dceb9597', class: "loading-bar" }))), this.hasError ? (h("div", { class: "browser-error" }, h("span", { class: "error-text" }, "\u062A\u0639\u0630\u0651\u0631 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0635\u0641\u062D\u0629"), h("span", { class: "error-url" }, this.url))) : (this.url && (h("iframe", { class: "browser-iframe", src: this.url, onLoad: this.handleIframeLoad, onError: this.handleIframeError, sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", referrerPolicy: "no-referrer", title: displayTitle })))))));
32
+ return (h(Host, { key: '2d3bb12516396aaf8ca4df1e63e954cc06b2f01d' }, h("div", { key: '3c6f179eb59c982ab299910b5a1941d9b9d17d09', class: "browser-content" }, this.isLoading && (h("div", { key: '0228954a8cfaafed42f1efb5eb1ca5f160bc29e0', class: "browser-loading" }, h("div", { key: 'ccc49943a0af13afdbf1dcee8be0e3d712ac54d6', class: "loading-bar" }))), this.hasError ? (h("div", { class: "browser-error" }, h("span", { class: "error-text" }, "\u062A\u0639\u0630\u0651\u0631 \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0635\u0641\u062D\u0629"), h("span", { class: "error-url" }, this.url))) : (this.url && (h("iframe", { class: "browser-iframe", src: this.url, onLoad: this.handleIframeLoad, onError: this.handleIframeError, sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", referrerPolicy: "no-referrer", title: displayTitle }))))));
49
33
  }
50
34
  static get is() { return "ai-in-chat-browser"; }
51
35
  static get encapsulation() { return "shadow"; }
@@ -83,7 +67,7 @@ export class AiInChatBrowser {
83
67
  },
84
68
  "pageTitle": {
85
69
  "type": "string",
86
- "mutable": true,
70
+ "mutable": false,
87
71
  "complexType": {
88
72
  "original": "string",
89
73
  "resolved": "string",
@@ -93,33 +77,13 @@ export class AiInChatBrowser {
93
77
  "optional": false,
94
78
  "docs": {
95
79
  "tags": [],
96
- "text": "Page title shown in the browser header. Defaults to the URL hostname when empty."
80
+ "text": "Page title used as the iframe's accessible title. Defaults to the URL hostname when empty."
97
81
  },
98
82
  "getter": false,
99
83
  "setter": false,
100
84
  "reflect": false,
101
85
  "attribute": "page-title",
102
86
  "defaultValue": "''"
103
- },
104
- "isDraggable": {
105
- "type": "boolean",
106
- "mutable": false,
107
- "complexType": {
108
- "original": "boolean",
109
- "resolved": "boolean",
110
- "references": {}
111
- },
112
- "required": false,
113
- "optional": false,
114
- "docs": {
115
- "tags": [],
116
- "text": "Show the drag handle in the header (for floating containers)"
117
- },
118
- "getter": false,
119
- "setter": false,
120
- "reflect": false,
121
- "attribute": "is-draggable",
122
- "defaultValue": "false"
123
87
  }
124
88
  };
125
89
  }
@@ -129,39 +93,6 @@ export class AiInChatBrowser {
129
93
  "hasError": {}
130
94
  };
131
95
  }
132
- static get events() {
133
- return [{
134
- "method": "browserClose",
135
- "name": "browserClose",
136
- "bubbles": true,
137
- "cancelable": true,
138
- "composed": true,
139
- "docs": {
140
- "tags": [],
141
- "text": "Fired when the user clicks the back / close button to dismiss the browser"
142
- },
143
- "complexType": {
144
- "original": "void",
145
- "resolved": "void",
146
- "references": {}
147
- }
148
- }, {
149
- "method": "browserOpenExternal",
150
- "name": "browserOpenExternal",
151
- "bubbles": true,
152
- "cancelable": true,
153
- "composed": true,
154
- "docs": {
155
- "tags": [],
156
- "text": "Fired when the user clicks the external-link button"
157
- },
158
- "complexType": {
159
- "original": "string",
160
- "resolved": "string",
161
- "references": {}
162
- }
163
- }];
164
- }
165
96
  static get watchers() {
166
97
  return [{
167
98
  "propName": "url",
@@ -18,7 +18,7 @@ export class AiLink {
18
18
  }
19
19
  render() {
20
20
  const rel = this.rel || (this.target === '_blank' ? 'noopener noreferrer' : undefined);
21
- return (h(Host, { key: 'e0e34a4c2a3534a3b449bac613c6f7cb512420d3' }, h("span", { key: '5776ddc64676ecaabb4f36a0e9833026dc730c23', class: "link__label" }, this.label, h("slot", { key: '436a334a51bea342b839d5fad9743aaf6b66a94d' })), h("a", { key: '3880c1429a8a24a9dee700c9f0592ac673ce68f0', class: "link", href: this.href, target: this.target, rel: rel }, this.renderShareIcon())));
21
+ return (h(Host, { key: '98087503b9a0803425b23f7ee00c95025493679d' }, h("span", { key: '41495d6375d1c539b777b3cd38e7b7af8fcbbb9b', class: "link__label" }, this.label, h("slot", { key: 'f416955b31900039f03b0e7ee2e537a22964d553' })), h("a", { key: '4f1d74ff6c600d17fcf80686aeebc5a92a4c7305', class: "link", href: this.href, target: this.target, rel: rel }, this.renderShareIcon())));
22
22
  }
23
23
  static get is() { return "ai-link"; }
24
24
  static get encapsulation() { return "shadow"; }
@@ -72,7 +72,7 @@ export class AiLoading {
72
72
  return (h("div", { class: "steps-card" }, h("div", { class: `steps-header ${this.collapsible ? 'collapsible' : ''}`, onClick: () => this.handleToggle() }, this.renderSparkleAvatar(this.currentAgent || undefined), h("div", { class: "steps-header-center" }, h("span", { class: "steps-title" }, this.headerTitle), headerBadge()), this.collapsible && h("button", { class: `collapse-btn ${this._expanded ? 'expanded' : ''}` }, this.renderIcon('chevron-down', 20, 20))), this._expanded && total === 0 && this.renderPlanningShimmer(), this._expanded && total > 0 && (h("div", { class: "steps-body" }, this.steps.map((step, i) => (h("div", { class: `step-row ${step.status}`, onClick: () => this.stepClick.emit(step) }, h("div", { class: "step-badge-col" }, this.renderStepBadge(step, i), i < this.steps.length - 1 && h("div", { class: "step-separator" })), h("div", { class: "step-content" }, h("span", { class: "step-text" }, step.action), step.reason && h("span", { class: "step-description" }, step.reason)))))))));
73
73
  }
74
74
  render() {
75
- return h(Host, { key: 'f4523c26d9ce0d9bf14b313e4b10cadd2fc2b95f' }, this.mode === 'thinking' ? this.renderThinkingMode() : this.renderStepsMode());
75
+ return h(Host, { key: '2053fe1e8a1fcb1ec7441a5d32952ec1f186a5bb' }, this.mode === 'thinking' ? this.renderThinkingMode() : this.renderStepsMode());
76
76
  }
77
77
  static get is() { return "ai-loading"; }
78
78
  static get encapsulation() { return "shadow"; }
@@ -31,7 +31,7 @@ export class AiRouteDecision {
31
31
  this.routeExpand.emit(this._expanded);
32
32
  }
33
33
  render() {
34
- return (h(Host, { key: 'f12718d142cff27d62c0a0299b029be2e2d88b86' }, h("div", { key: '4fcef90f887300c4884cd981737bf8ce8b796eca', class: `route-pill ${this._expanded ? 'expanded' : ''}` }, h("button", { key: '09eadc07b41b96fb56b4bcd937165de92507ac84', class: "route-pill-main", onClick: () => this.handleToggle() }, h("span", { key: 'd13744692a45c74976f89b582142ae09339015f5', class: "route-icon" }, this.renderIcon('route', 14, 14)), h("span", { key: '4f995cc09a72ba74310df17cf78735c27a910314', class: "agent-label" }, this.agentIcon && h("span", { key: '272dd78f38bbbb4ef845b7a41530d205368faf7e', class: "agent-emoji", "aria-hidden": "true" }, this.agentIcon), this.selectedAgent), this.confidence > 0 && (h("span", { key: 'a061317c9d5b8dad243dce0bb80e927eae04eb3d', class: "confidence-badge" }, this.confidence, "%")), h("span", { key: '4342bdf38aa85a5c5d6bd054504c91bccc7901e9', class: `expand-icon ${this._expanded ? 'expanded' : ''}` }, this.renderIcon('arrow-right', 12, 12))), this._expanded && (h("div", { key: 'ab5340148e832baafdd38e17a748a52b83b25c96', class: "route-details" }, this.reason && h("p", { key: '7854838ea405c5fdb5ebe11fb3df36a9898be445', class: "reason-text" }, this.reason), this.confidence > 0 && (h("div", { key: 'baf946426ad7cda94d2acfbb9f8945b5b40a823c', class: "confidence-bar-wrap" }, h("div", { key: 'a6e08f412706ce18e16030dd4d475d57befdd9e7', class: "confidence-bar", style: { width: `${this.confidence}%` } }))), this.detectedLanguage && (h("div", { key: '58af2dbca56082dcf2910cc44ac553d6f2af015a', class: "meta-row" }, this.renderIcon('list', 12, 12), h("span", { key: '63517ed8802764542de330897372c6a01348d0a6', class: "lang-chip" }, this.detectedLanguage))))))));
34
+ return (h(Host, { key: 'fa9b966cf28225fa458fb00d1114fade995258c5' }, h("div", { key: '5263c969fd1672e1d302f06173dcdbe4450b162e', class: `route-pill ${this._expanded ? 'expanded' : ''}` }, h("button", { key: 'bf7800e828b0b61174f75343fcf9bca3134dfb2a', class: "route-pill-main", onClick: () => this.handleToggle() }, h("span", { key: '8531aeab0872f59417a37294e780d46962b21ead', class: "route-icon" }, this.renderIcon('route', 14, 14)), h("span", { key: '754529860d90a3ceb4f226ff85b1aecb40f4649e', class: "agent-label" }, this.agentIcon && h("span", { key: '39682d3a761d2cd6fae794fcb6036b0044f8f2dc', class: "agent-emoji", "aria-hidden": "true" }, this.agentIcon), this.selectedAgent), this.confidence > 0 && (h("span", { key: '36b3a921ab75c1faa0ece5f286703bf1b0aaca16', class: "confidence-badge" }, this.confidence, "%")), h("span", { key: 'c5199e986bf35d187cad16027f23e62addc45ecb', class: `expand-icon ${this._expanded ? 'expanded' : ''}` }, this.renderIcon('arrow-right', 12, 12))), this._expanded && (h("div", { key: '2a18ae8297ad0d71b14d01d250e15cff452c4b07', class: "route-details" }, this.reason && h("p", { key: '55f5123399929c590fc5c2122fd7220209e5ecac', class: "reason-text" }, this.reason), this.confidence > 0 && (h("div", { key: 'fbc69e8cb7820c87764f46630af8f4a77d2d879b', class: "confidence-bar-wrap" }, h("div", { key: '1db1d454ef64dcf9e4c673d0a26780bd55f563d2', class: "confidence-bar", style: { width: `${this.confidence}%` } }))), this.detectedLanguage && (h("div", { key: '8553d1a20678252b8d4f9a1e9f8b64ce3f509ae5', class: "meta-row" }, this.renderIcon('list', 12, 12), h("span", { key: 'ec104948a04498d06ed73be89778c5b6d84582a2', class: "lang-chip" }, this.detectedLanguage))))))));
35
35
  }
36
36
  static get is() { return "ai-route-decision"; }
37
37
  static get encapsulation() { return "shadow"; }
@@ -11,10 +11,10 @@ export class AiSuggestion {
11
11
  this.suggestionClick.emit(this.label);
12
12
  }
13
13
  render() {
14
- return (h(Host, { key: 'c2eb388d152586755e9cc10ac57b519e8ff84b4d' }, h("button", { key: '0b9f6ec6d8c57365e2c29bfe1bfc33993d3cb498', class: {
14
+ return (h(Host, { key: '510e649f8778e2298270d320f0555c4d960fb056' }, h("button", { key: 'a4ee17cbd432596804279d8a852635608125452a', class: {
15
15
  chip: true,
16
16
  'chip--disabled': this.disabled,
17
- }, disabled: this.disabled, onClick: () => this.handleClick() }, h("span", { key: 'd4fabc4c8176cd6837e609bad369e8edfc779855', class: "chip__label" }, this.label, h("slot", { key: 'a1074453e53982f10fd2115c2b15d7a7b20eda07' })))));
17
+ }, disabled: this.disabled, onClick: () => this.handleClick() }, h("span", { key: 'cb2d97459b0dd6effe83bbfb81a0af9144759477', class: "chip__label" }, this.label, h("slot", { key: 'ce84f07883f24c216c45da9266af5160baea9cdc' })))));
18
18
  }
19
19
  static get is() { return "ai-suggestion"; }
20
20
  static get encapsulation() { return "shadow"; }