@tylertech/forge-ai 0.13.0 → 0.13.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 (91) hide show
  1. package/custom-elements.json +5083 -3159
  2. package/dist/ai-agent-info/ai-agent-info.d.ts +1 -1
  3. package/dist/ai-agent-info/ai-agent-info.mjs +17 -62
  4. package/dist/ai-agent-info/ai-agent-info.scss.mjs +1 -1
  5. package/dist/ai-assistant-response/ai-assistant-response.scss.mjs +1 -1
  6. package/dist/ai-chat-header/ai-chat-header.d.ts +7 -0
  7. package/dist/ai-chat-header/ai-chat-header.mjs +52 -7
  8. package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
  9. package/dist/ai-chatbot/ai-chatbot-base.d.ts +37 -3
  10. package/dist/ai-chatbot/ai-chatbot-base.mjs +83 -24
  11. package/dist/ai-chatbot/ai-chatbot.d.ts +41 -1
  12. package/dist/ai-chatbot/ai-chatbot.mjs +242 -43
  13. package/dist/ai-chatbot/ai-chatbot.scss.mjs +1 -1
  14. package/dist/ai-chatbot/index.d.ts +1 -1
  15. package/dist/ai-chatbot/types.d.ts +39 -0
  16. package/dist/ai-chatbot/utils.d.ts +5 -0
  17. package/dist/ai-chatbot/utils.mjs +28 -0
  18. package/dist/ai-chatbot-launcher/ai-chatbot-launcher.d.ts +29 -2
  19. package/dist/ai-chatbot-launcher/ai-chatbot-launcher.mjs +156 -10
  20. package/dist/ai-chatbot-launcher/ai-chatbot-launcher.scss.mjs +1 -1
  21. package/dist/ai-confirmation-prompt/ai-confirmation-prompt.d.ts +6 -0
  22. package/dist/ai-confirmation-prompt/ai-confirmation-prompt.mjs +64 -19
  23. package/dist/ai-confirmation-prompt/ai-confirmation-prompt.scss.mjs +1 -1
  24. package/dist/ai-context-chip/ai-context-chip.d.ts +45 -0
  25. package/dist/ai-context-chip/ai-context-chip.mjs +169 -0
  26. package/dist/ai-context-chip/ai-context-chip.scss.mjs +4 -0
  27. package/dist/ai-context-chip/index.d.ts +2 -0
  28. package/dist/ai-context-chip/index.mjs +5 -0
  29. package/dist/ai-context-items/ai-context-items.d.ts +20 -0
  30. package/dist/ai-context-items/ai-context-items.mjs +78 -0
  31. package/dist/ai-context-items/ai-context-items.scss.mjs +4 -0
  32. package/dist/ai-context-items/index.d.ts +1 -0
  33. package/dist/ai-context-items/index.mjs +5 -0
  34. package/dist/ai-conversations-panel/ai-conversations-panel.d.ts +86 -0
  35. package/dist/ai-conversations-panel/ai-conversations-panel.mjs +558 -0
  36. package/dist/ai-conversations-panel/ai-conversations-panel.scss.mjs +4 -0
  37. package/dist/ai-conversations-panel/index.d.ts +2 -0
  38. package/dist/ai-conversations-panel/index.mjs +5 -0
  39. package/dist/ai-copy-button/ai-copy-button.d.ts +32 -0
  40. package/dist/ai-copy-button/ai-copy-button.mjs +116 -0
  41. package/dist/ai-copy-button/ai-copy-button.scss.mjs +4 -0
  42. package/dist/ai-copy-button/index.d.ts +1 -0
  43. package/dist/ai-copy-button/index.mjs +5 -0
  44. package/dist/ai-dialog/ai-dialog.scss.mjs +1 -1
  45. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
  46. package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +6 -1
  47. package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +20 -8
  48. package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
  49. package/dist/ai-edit-thread/ai-edit-thread.d.ts +34 -0
  50. package/dist/ai-edit-thread/ai-edit-thread.mjs +130 -0
  51. package/dist/ai-edit-thread/ai-edit-thread.scss.mjs +4 -0
  52. package/dist/ai-edit-thread/index.d.ts +1 -0
  53. package/dist/ai-edit-thread/index.mjs +5 -0
  54. package/dist/ai-message-thread/ai-message-thread.scss.mjs +1 -1
  55. package/dist/ai-modal/ai-modal.d.ts +11 -2
  56. package/dist/ai-modal/ai-modal.mjs +31 -6
  57. package/dist/ai-prompt/ai-prompt.d.ts +7 -1
  58. package/dist/ai-prompt/ai-prompt.mjs +29 -2
  59. package/dist/ai-sidebar/ai-sidebar.d.ts +11 -0
  60. package/dist/ai-sidebar/ai-sidebar.mjs +94 -4
  61. package/dist/ai-sidebar/ai-sidebar.scss.mjs +1 -1
  62. package/dist/ai-sidebar-chat/ai-sidebar-chat.d.ts +1 -0
  63. package/dist/ai-sidebar-chat/ai-sidebar-chat.mjs +5 -0
  64. package/dist/ai-spinner/ai-spinner.d.ts +1 -1
  65. package/dist/ai-spinner/ai-spinner.scss.mjs +1 -1
  66. package/dist/ai-thread-actions-menu/ai-thread-actions-menu.d.ts +44 -0
  67. package/dist/ai-thread-actions-menu/ai-thread-actions-menu.mjs +136 -0
  68. package/dist/ai-thread-actions-menu/ai-thread-actions-menu.scss.mjs +4 -0
  69. package/dist/ai-thread-actions-menu/index.d.ts +1 -0
  70. package/dist/ai-thread-actions-menu/index.mjs +5 -0
  71. package/dist/ai-threads/ai-threads.d.ts +45 -16
  72. package/dist/ai-threads/ai-threads.mjs +256 -98
  73. package/dist/ai-threads/ai-threads.scss.mjs +1 -1
  74. package/dist/ai-threads-search/ai-threads-search.d.ts +81 -0
  75. package/dist/ai-threads-search/ai-threads-search.mjs +414 -0
  76. package/dist/ai-threads-search/ai-threads-search.scss.mjs +4 -0
  77. package/dist/ai-threads-search/index.d.ts +1 -0
  78. package/dist/ai-threads-search/index.mjs +5 -0
  79. package/dist/core/index.d.ts +1 -0
  80. package/dist/core/index.mjs +3 -1
  81. package/dist/core/resize-controller.d.ts +25 -0
  82. package/dist/core/resize-controller.mjs +144 -0
  83. package/dist/index.d.ts +7 -0
  84. package/dist/index.mjs +21 -0
  85. package/dist/utils/delete-thread-controller.d.ts +14 -0
  86. package/dist/utils/delete-thread-controller.mjs +80 -0
  87. package/dist/utils/index.d.ts +3 -0
  88. package/dist/utils/index.mjs +8 -0
  89. package/dist/utils/infinite-scroll-controller.d.ts +33 -0
  90. package/dist/utils/infinite-scroll-controller.mjs +95 -0
  91. package/package.json +15 -14
@@ -1,11 +1,14 @@
1
1
  import { LitElement, PropertyValues, TemplateResult, CSSResult } from 'lit';
2
+ export type AiModalSizeStrategy = 'auto' | 'fixed';
2
3
  declare global {
3
4
  interface HTMLElementTagNameMap {
4
5
  'forge-ai-modal': AiModalComponent;
5
6
  }
6
7
  interface HTMLElementEventMap {
7
8
  'forge-ai-modal-open': CustomEvent<void>;
8
- 'forge-ai-modal-close': CustomEvent<void>;
9
+ 'forge-ai-modal-close': CustomEvent<{
10
+ reason: 'backdrop' | 'escape' | 'programmatic';
11
+ }>;
9
12
  'forge-ai-modal-fullscreen-change': CustomEvent<{
10
13
  isFullscreen: boolean;
11
14
  }>;
@@ -17,7 +20,7 @@ declare global {
17
20
  * @slot - Default slot for modal content
18
21
  *
19
22
  * @event {CustomEvent<void>} forge-ai-modal-open - Fired when the modal is opened
20
- * @event {CustomEvent<void>} forge-ai-modal-close - Fired when the modal is closed
23
+ * @event {CustomEvent<{ reason: 'backdrop' | 'escape' | 'programmatic' }>} forge-ai-modal-close - Fired when the modal is closed. Detail includes reason for closing.
21
24
  * @event {CustomEvent<{ isFullscreen: boolean }>} forge-ai-modal-fullscreen-change - Fired when the fullscreen state changes
22
25
  *
23
26
  * @cssproperty --forge-ai-modal-width - Width of the modal in non-fullscreen mode
@@ -38,6 +41,12 @@ export declare class AiModalComponent extends LitElement {
38
41
  * When not explicitly set, this will be automatically determined based on viewport size.
39
42
  */
40
43
  fullscreen?: boolean;
44
+ /**
45
+ * Controls the modal sizing strategy.
46
+ * - 'auto' (default): Automatically switches to fullscreen on viewports < 768px
47
+ * - 'fixed': Maintains defined size regardless of viewport, never auto-fullscreens
48
+ */
49
+ sizeStrategy: AiModalSizeStrategy;
41
50
  private _autoFullscreen;
42
51
  constructor();
43
52
  render(): TemplateResult;
@@ -21,16 +21,18 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
21
21
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
22
22
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
23
23
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
24
- var _mediaQuery, _internals, _AiModalComponent_instances, updateFullscreenState_fn, handleDialogClose_fn, handleDialogClick_fn, setupMediaQuery_fn, cleanupMediaQuery_fn, _handleMediaChange;
24
+ var _mediaQuery, _internals, _closeReason, _AiModalComponent_instances, updateFullscreenState_fn, handleDialogClose_fn, handleDialogClick_fn, handleDialogKeydown_fn, setupMediaQuery_fn, cleanupMediaQuery_fn, _handleMediaChange;
25
25
  const FULLSCREEN_WIDTH_THRESHOLD = 768;
26
26
  let AiModalComponent = class extends LitElement {
27
27
  constructor() {
28
28
  super();
29
29
  __privateAdd(this, _AiModalComponent_instances);
30
30
  this.open = false;
31
+ this.sizeStrategy = "auto";
31
32
  this._autoFullscreen = window.innerWidth <= FULLSCREEN_WIDTH_THRESHOLD;
32
33
  __privateAdd(this, _mediaQuery);
33
34
  __privateAdd(this, _internals);
35
+ __privateAdd(this, _closeReason, "programmatic");
34
36
  __privateAdd(this, _handleMediaChange, (e) => {
35
37
  const previousFullscreen = this._autoFullscreen;
36
38
  this._autoFullscreen = e.matches;
@@ -50,7 +52,7 @@ let AiModalComponent = class extends LitElement {
50
52
  __privateMethod(this, _AiModalComponent_instances, updateFullscreenState_fn).call(this);
51
53
  }
52
54
  render() {
53
- const isFullscreen = this.fullscreen ?? this._autoFullscreen;
55
+ const isFullscreen = this.sizeStrategy === "fixed" ? this.fullscreen ?? false : this.fullscreen ?? this._autoFullscreen;
54
56
  const classes = {
55
57
  "forge-dialog": true,
56
58
  "forge-dialog--fullscreen": isFullscreen
@@ -60,7 +62,8 @@ let AiModalComponent = class extends LitElement {
60
62
  class=${classMap(classes)}
61
63
  aria-labelledby="chat-interface-title"
62
64
  @close=${__privateMethod(this, _AiModalComponent_instances, handleDialogClose_fn)}
63
- @click=${__privateMethod(this, _AiModalComponent_instances, handleDialogClick_fn)}>
65
+ @click=${__privateMethod(this, _AiModalComponent_instances, handleDialogClick_fn)}
66
+ @keydown=${__privateMethod(this, _AiModalComponent_instances, handleDialogKeydown_fn)}>
64
67
  <slot></slot>
65
68
  </dialog>
66
69
  `;
@@ -77,17 +80,26 @@ let AiModalComponent = class extends LitElement {
77
80
  if (changedProperties.has("open")) {
78
81
  if (this.open) {
79
82
  if (this._dialog && !this._dialog.open) {
83
+ this.setAttribute("data-handles-escape", "");
80
84
  this._dialog.showModal();
81
85
  this.dispatchEvent(new CustomEvent("forge-ai-modal-open", { bubbles: true, composed: true }));
82
86
  }
83
87
  } else {
84
88
  if (this._dialog?.open) {
85
89
  this._dialog.close();
86
- this.dispatchEvent(new CustomEvent("forge-ai-modal-close", { bubbles: true, composed: true }));
87
90
  }
91
+ this.removeAttribute("data-handles-escape");
92
+ this.dispatchEvent(
93
+ new CustomEvent("forge-ai-modal-close", {
94
+ bubbles: true,
95
+ composed: true,
96
+ detail: { reason: __privateGet(this, _closeReason) }
97
+ })
98
+ );
99
+ __privateSet(this, _closeReason, "programmatic");
88
100
  }
89
101
  }
90
- if (changedProperties.has("fullscreen")) {
102
+ if (changedProperties.has("fullscreen") || changedProperties.has("sizeStrategy")) {
91
103
  __privateMethod(this, _AiModalComponent_instances, updateFullscreenState_fn).call(this);
92
104
  }
93
105
  }
@@ -101,24 +113,34 @@ let AiModalComponent = class extends LitElement {
101
113
  * Closes the modal dialog.
102
114
  */
103
115
  close() {
116
+ __privateSet(this, _closeReason, "programmatic");
104
117
  this.open = false;
105
118
  }
106
119
  };
107
120
  _mediaQuery = /* @__PURE__ */ new WeakMap();
108
121
  _internals = /* @__PURE__ */ new WeakMap();
122
+ _closeReason = /* @__PURE__ */ new WeakMap();
109
123
  _AiModalComponent_instances = /* @__PURE__ */ new WeakSet();
110
124
  updateFullscreenState_fn = function() {
111
- const isFullscreen = this.fullscreen ?? this._autoFullscreen;
125
+ const isFullscreen = this.sizeStrategy === "fixed" ? this.fullscreen ?? false : this.fullscreen ?? this._autoFullscreen;
112
126
  toggleState(__privateGet(this, _internals), "fullscreen", isFullscreen);
113
127
  };
114
128
  handleDialogClose_fn = function() {
129
+ __privateSet(this, _closeReason, "escape");
115
130
  this.open = false;
116
131
  };
117
132
  handleDialogClick_fn = function(event) {
118
133
  if (event.target === this._dialog) {
134
+ event.stopPropagation();
135
+ __privateSet(this, _closeReason, "backdrop");
119
136
  this.close();
120
137
  }
121
138
  };
139
+ handleDialogKeydown_fn = function(event) {
140
+ if (event.key === "Escape") {
141
+ event.stopPropagation();
142
+ }
143
+ };
122
144
  setupMediaQuery_fn = function() {
123
145
  __privateSet(this, _mediaQuery, window.matchMedia(`(max-width: ${FULLSCREEN_WIDTH_THRESHOLD}px)`));
124
146
  __privateGet(this, _mediaQuery).addEventListener("change", __privateGet(this, _handleMediaChange));
@@ -138,6 +160,9 @@ __decorateClass([
138
160
  __decorateClass([
139
161
  property({ type: Boolean })
140
162
  ], AiModalComponent.prototype, "fullscreen", 2);
163
+ __decorateClass([
164
+ property({ type: String, attribute: "size-strategy" })
165
+ ], AiModalComponent.prototype, "sizeStrategy", 2);
141
166
  __decorateClass([
142
167
  state()
143
168
  ], AiModalComponent.prototype, "_autoFullscreen", 2);
@@ -1,5 +1,5 @@
1
1
  import { LitElement, PropertyValues, TemplateResult, CSSResult } from 'lit';
2
- import { SlashCommand } from '../ai-chatbot/types.js';
2
+ import { SlashCommand, ContextItem } from '../ai-chatbot/types.js';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
5
  'forge-ai-prompt': AiPromptComponent;
@@ -11,6 +11,10 @@ declare global {
11
11
  'forge-ai-prompt-stop': CustomEvent<void>;
12
12
  'forge-ai-prompt-debug-toggle': CustomEvent<void>;
13
13
  'forge-ai-prompt-command': CustomEvent<ForgeAiPromptCommandEventData>;
14
+ 'forge-ai-prompt-context-remove': CustomEvent<{
15
+ id: string;
16
+ item: ContextItem;
17
+ }>;
14
18
  }
15
19
  }
16
20
  export interface ForgeAiPromptSendEventData {
@@ -65,6 +69,8 @@ export declare class AiPromptComponent extends LitElement {
65
69
  debugMode: boolean;
66
70
  /** Available slash commands */
67
71
  slashCommands: SlashCommand[];
72
+ /** Context items to display above the input */
73
+ contextItems: ContextItem[];
68
74
  private _slashMenuOpen;
69
75
  private _slashMenuQuery;
70
76
  private _inputElement;
@@ -1,10 +1,11 @@
1
- import { unsafeCSS, LitElement, html } from "lit";
1
+ import { unsafeCSS, LitElement, html, nothing } from "lit";
2
2
  import { property, state, query, customElement } from "lit/decorators.js";
3
3
  import { when } from "lit/directives/when.js";
4
4
  import { toggleState } from "../utils.mjs";
5
5
  import styles from "./ai-prompt.scss.mjs";
6
6
  import "../ai-slash-command-menu/ai-slash-command-menu.mjs";
7
7
  import "../core/tooltip/tooltip.mjs";
8
+ import "../ai-context-items/ai-context-items.mjs";
8
9
  var __defProp = Object.defineProperty;
9
10
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
11
  var __typeError = (msg) => {
@@ -31,7 +32,7 @@ var __privateWrapper = (obj, member, setter, getter) => ({
31
32
  return __privateGet(obj, member, getter);
32
33
  }
33
34
  });
34
- var _internals, _messageHistory, _historyIndex, _draftMessage, _AiPromptComponent_instances, setCssState_fn, resetHistoryNavigation_fn, isCursorOnFirstLine_fn, isCursorOnLastLine_fn, isCursorAtStart_fn, isCursorAtEnd_fn, moveCursorToStart_fn, moveCursorToEnd_fn, navigateHistory_fn, _actionsStartSlot, _actionsEndSlot, shouldShowStopButton_get, actions_get, handleSlashCommandSelect_fn, handleSlashCommandClose_fn, textArea_get, sendButton_get, debugButton_get, slashCommandMenu_get;
35
+ var _internals, _messageHistory, _historyIndex, _draftMessage, _AiPromptComponent_instances, setCssState_fn, resetHistoryNavigation_fn, isCursorOnFirstLine_fn, isCursorOnLastLine_fn, isCursorAtStart_fn, isCursorAtEnd_fn, moveCursorToStart_fn, moveCursorToEnd_fn, navigateHistory_fn, _actionsStartSlot, _actionsEndSlot, shouldShowStopButton_get, actions_get, handleSlashCommandSelect_fn, handleSlashCommandClose_fn, handleContextItemRemove_fn, contextItemsTemplate_get, textArea_get, sendButton_get, debugButton_get, slashCommandMenu_get;
35
36
  const MAX_HISTORY_SIZE = 50;
36
37
  const AiPromptComponentTagName = "forge-ai-prompt";
37
38
  let AiPromptComponent = class extends LitElement {
@@ -48,6 +49,7 @@ let AiPromptComponent = class extends LitElement {
48
49
  this.running = false;
49
50
  this.debugMode = false;
50
51
  this.slashCommands = [];
52
+ this.contextItems = [];
51
53
  this._slashMenuOpen = false;
52
54
  this._slashMenuQuery = "";
53
55
  __privateAdd(this, _internals);
@@ -260,6 +262,7 @@ let AiPromptComponent = class extends LitElement {
260
262
  () => html`
261
263
  <div class="input-container">
262
264
  <div class="forge-card">
265
+ ${__privateGet(this, _AiPromptComponent_instances, contextItemsTemplate_get)}
263
266
  <div class="forge-field">
264
267
  ${__privateGet(this, _AiPromptComponent_instances, textArea_get)} ${when(this.debugMode, () => html` ${__privateGet(this, _AiPromptComponent_instances, debugButton_get)} `)}
265
268
  </div>
@@ -274,6 +277,7 @@ let AiPromptComponent = class extends LitElement {
274
277
  () => html`
275
278
  <div class="input-container">
276
279
  <div class="forge-card">
280
+ ${__privateGet(this, _AiPromptComponent_instances, contextItemsTemplate_get)}
277
281
  <div class="forge-field">
278
282
  ${__privateGet(this, _actionsStartSlot)} ${__privateGet(this, _AiPromptComponent_instances, textArea_get)} ${when(this.debugMode, () => html` ${__privateGet(this, _AiPromptComponent_instances, debugButton_get)} `)}
279
283
  <div class="actions-end-container">${__privateGet(this, _actionsEndSlot)} ${__privateGet(this, _AiPromptComponent_instances, sendButton_get)}</div>
@@ -394,6 +398,26 @@ handleSlashCommandClose_fn = function() {
394
398
  this._slashMenuOpen = false;
395
399
  this._slashMenuQuery = "";
396
400
  };
401
+ handleContextItemRemove_fn = function(evt) {
402
+ this.dispatchEvent(
403
+ new CustomEvent("forge-ai-prompt-context-remove", {
404
+ detail: { id: evt.detail.id, item: evt.detail.item },
405
+ bubbles: true,
406
+ composed: true
407
+ })
408
+ );
409
+ };
410
+ contextItemsTemplate_get = function() {
411
+ if (this.contextItems.length === 0) {
412
+ return nothing;
413
+ }
414
+ return html`
415
+ <forge-ai-context-items
416
+ .items=${this.contextItems}
417
+ @forge-ai-context-items-remove=${__privateMethod(this, _AiPromptComponent_instances, handleContextItemRemove_fn)}>
418
+ </forge-ai-context-items>
419
+ `;
420
+ };
397
421
  textArea_get = function() {
398
422
  return html` <textarea
399
423
  id="chat-input"
@@ -486,6 +510,9 @@ __decorateClass([
486
510
  __decorateClass([
487
511
  property({ type: Array, attribute: false })
488
512
  ], AiPromptComponent.prototype, "slashCommands", 2);
513
+ __decorateClass([
514
+ property({ attribute: false })
515
+ ], AiPromptComponent.prototype, "contextItems", 2);
489
516
  __decorateClass([
490
517
  state()
491
518
  ], AiPromptComponent.prototype, "_slashMenuOpen", 2);
@@ -24,6 +24,11 @@ export declare class AiSidebarComponent extends LitElement {
24
24
  * Indicates whether the sidebar is open.
25
25
  */
26
26
  open: boolean;
27
+ /**
28
+ * Enables sidebar resizing.
29
+ */
30
+ resizable: boolean;
31
+ private _width;
27
32
  /**
28
33
  * Indicates whether the sidebar is in a closing animation state.
29
34
  */
@@ -32,6 +37,10 @@ export declare class AiSidebarComponent extends LitElement {
32
37
  * Indicates whether the animation container is in a closing state.
33
38
  */
34
39
  private _containerClosing;
40
+ /**
41
+ * Indicates whether the sidebar is being resized.
42
+ */
43
+ private _isResizing;
35
44
  render(): TemplateResult;
36
45
  /**
37
46
  * Opens the sidebar.
@@ -45,4 +54,6 @@ export declare class AiSidebarComponent extends LitElement {
45
54
  * Toggles the sidebar open state.
46
55
  */
47
56
  toggle(): void;
57
+ firstUpdated(): void;
58
+ updated(changedProperties: Map<string, unknown>): void;
48
59
  }
@@ -1,6 +1,10 @@
1
1
  import { unsafeCSS, LitElement, html } from "lit";
2
2
  import { property, state, customElement } from "lit/decorators.js";
3
3
  import { classMap } from "lit/directives/class-map.js";
4
+ import { styleMap } from "lit/directives/style-map.js";
5
+ import { createRef, ref } from "lit/directives/ref.js";
6
+ import { when } from "lit/directives/when.js";
7
+ import { ResizeController } from "../core/resize-controller.mjs";
4
8
  import styles from "./ai-sidebar.scss.mjs";
5
9
  var __defProp = Object.defineProperty;
6
10
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -16,39 +20,83 @@ var __decorateClass = (decorators, target, key, kind) => {
16
20
  return result;
17
21
  };
18
22
  var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
23
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
19
24
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
25
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
20
26
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
21
- var _AiSidebarComponent_instances, handleContainerTransitionEnd_fn, handleDrawerTransitionEnd_fn, dispatchEvent_fn;
27
+ var _resizeHandleRef, _drawerRef, _containerRef, _resizeController, _AiSidebarComponent_instances, handleContainerTransitionEnd_fn, handleDrawerTransitionEnd_fn, handleResizePointerDown_fn, handleResizeKeyDown_fn, dispatchEvent_fn;
28
+ const DEFAULT_WIDTH = 420;
29
+ const MIN_WIDTH = 360;
30
+ const MAX_WIDTH = 800;
22
31
  const AiSidebarComponentTagName = "forge-ai-sidebar";
23
32
  let AiSidebarComponent = class extends LitElement {
24
33
  constructor() {
25
34
  super(...arguments);
26
35
  __privateAdd(this, _AiSidebarComponent_instances);
27
36
  this.open = false;
37
+ this.resizable = true;
38
+ this._width = DEFAULT_WIDTH;
28
39
  this._closing = false;
29
40
  this._containerClosing = false;
41
+ this._isResizing = false;
42
+ __privateAdd(this, _resizeHandleRef, createRef());
43
+ __privateAdd(this, _drawerRef, createRef());
44
+ __privateAdd(this, _containerRef, createRef());
45
+ __privateAdd(this, _resizeController);
30
46
  }
31
47
  render() {
32
48
  const containerClasses = {
33
49
  "animation-container": true,
34
50
  "animation-container--open": this.open && !this._containerClosing,
35
51
  "animation-container--closing": this._containerClosing,
36
- "animation-container--closed": !this.open && !this._containerClosing
52
+ "animation-container--closed": !this.open && !this._containerClosing,
53
+ "animation-container--resizing": this._isResizing
37
54
  };
38
55
  const drawerClasses = {
39
56
  "forge-drawer": true,
40
57
  "forge-drawer--right": true,
41
58
  "forge-drawer--closing": this._closing,
42
- "forge-drawer--closed": !this.open && !this._closing
59
+ "forge-drawer--closed": !this.open && !this._closing,
60
+ "forge-drawer--resizing": this._isResizing
61
+ };
62
+ const handleClasses = {
63
+ "resize-handle": true,
64
+ "resize-handle--active": this._isResizing
65
+ };
66
+ const containerStyles = {
67
+ "--forge-drawer-width": `${this._width}px`
43
68
  };
44
69
  return html`
45
- <div class=${classMap(containerClasses)} @transitionend=${__privateMethod(this, _AiSidebarComponent_instances, handleContainerTransitionEnd_fn)}>
70
+ <div
71
+ ${ref(__privateGet(this, _containerRef))}
72
+ class=${classMap(containerClasses)}
73
+ style=${styleMap(containerStyles)}
74
+ @transitionend=${__privateMethod(this, _AiSidebarComponent_instances, handleContainerTransitionEnd_fn)}>
46
75
  <aside
76
+ ${ref(__privateGet(this, _drawerRef))}
47
77
  class=${classMap(drawerClasses)}
48
78
  ?open=${this.open}
49
79
  role="complementary"
50
80
  aria-hidden=${!this.open}
51
81
  @transitionend=${__privateMethod(this, _AiSidebarComponent_instances, handleDrawerTransitionEnd_fn)}>
82
+ ${when(
83
+ this.resizable,
84
+ () => html`
85
+ <div
86
+ ${ref(__privateGet(this, _resizeHandleRef))}
87
+ class=${classMap(handleClasses)}
88
+ role="separator"
89
+ aria-orientation="vertical"
90
+ aria-label="Resize sidebar"
91
+ aria-valuemin="${MIN_WIDTH}"
92
+ aria-valuemax="${MAX_WIDTH}"
93
+ aria-valuenow=${this._width}
94
+ aria-valuetext="${this._width} pixels"
95
+ tabindex="0"
96
+ @pointerdown=${__privateMethod(this, _AiSidebarComponent_instances, handleResizePointerDown_fn)}
97
+ @keydown=${__privateMethod(this, _AiSidebarComponent_instances, handleResizeKeyDown_fn)}></div>
98
+ `
99
+ )}
52
100
  <slot></slot>
53
101
  </aside>
54
102
  </div>
@@ -84,7 +132,34 @@ let AiSidebarComponent = class extends LitElement {
84
132
  this.show();
85
133
  }
86
134
  }
135
+ firstUpdated() {
136
+ __privateSet(this, _resizeController, new ResizeController(this, {
137
+ targetElementRef: __privateGet(this, _containerRef),
138
+ resizeHandleRef: __privateGet(this, _resizeHandleRef),
139
+ minWidth: MIN_WIDTH,
140
+ maxWidth: MAX_WIDTH,
141
+ defaultWidth: DEFAULT_WIDTH,
142
+ onResize: (width) => {
143
+ this._width = width;
144
+ },
145
+ onResizeStart: () => {
146
+ this._isResizing = true;
147
+ },
148
+ onResizeEnd: () => {
149
+ this._isResizing = false;
150
+ }
151
+ }));
152
+ }
153
+ updated(changedProperties) {
154
+ if (changedProperties.has("resizable") && !this.resizable) {
155
+ this._width = DEFAULT_WIDTH;
156
+ }
157
+ }
87
158
  };
159
+ _resizeHandleRef = /* @__PURE__ */ new WeakMap();
160
+ _drawerRef = /* @__PURE__ */ new WeakMap();
161
+ _containerRef = /* @__PURE__ */ new WeakMap();
162
+ _resizeController = /* @__PURE__ */ new WeakMap();
88
163
  _AiSidebarComponent_instances = /* @__PURE__ */ new WeakSet();
89
164
  handleContainerTransitionEnd_fn = function(evt) {
90
165
  if (evt.target === evt.currentTarget && this._containerClosing) {
@@ -98,6 +173,12 @@ handleDrawerTransitionEnd_fn = function(evt) {
98
173
  __privateMethod(this, _AiSidebarComponent_instances, dispatchEvent_fn).call(this, "forge-ai-sidebar-close");
99
174
  }
100
175
  };
176
+ handleResizePointerDown_fn = function(event) {
177
+ __privateGet(this, _resizeController)?.handlePointerDown(event);
178
+ };
179
+ handleResizeKeyDown_fn = function(event) {
180
+ __privateGet(this, _resizeController)?.handleKeyDown(event);
181
+ };
101
182
  dispatchEvent_fn = function(type) {
102
183
  const event = new CustomEvent(type, {
103
184
  bubbles: true,
@@ -109,12 +190,21 @@ AiSidebarComponent.styles = unsafeCSS(styles);
109
190
  __decorateClass([
110
191
  property({ type: Boolean })
111
192
  ], AiSidebarComponent.prototype, "open", 2);
193
+ __decorateClass([
194
+ property({ type: Boolean })
195
+ ], AiSidebarComponent.prototype, "resizable", 2);
196
+ __decorateClass([
197
+ state()
198
+ ], AiSidebarComponent.prototype, "_width", 2);
112
199
  __decorateClass([
113
200
  state()
114
201
  ], AiSidebarComponent.prototype, "_closing", 2);
115
202
  __decorateClass([
116
203
  state()
117
204
  ], AiSidebarComponent.prototype, "_containerClosing", 2);
205
+ __decorateClass([
206
+ state()
207
+ ], AiSidebarComponent.prototype, "_isResizing", 2);
118
208
  AiSidebarComponent = __decorateClass([
119
209
  customElement(AiSidebarComponentTagName)
120
210
  ], AiSidebarComponent);
@@ -1,4 +1,4 @@
1
- const styles = "/**\n * @license\n * Copyright Tyler Technologies, Inc.\n * License: Apache-2.0\n */\n.forge-drawer {\n --_drawer-background:var(--forge-drawer-background, var(--forge-theme-surface, #ffffff));\n --_drawer-border-color:var(--forge-drawer-border-color, var(--forge-theme-outline, #e0e0e0));\n --_drawer-width:var(--forge-drawer-width, 256px);\n --_drawer-border-width:var(--forge-drawer-border-width, var(--forge-border-thin, 1px));\n --_drawer-transition-duration:var(--forge-drawer-transition-duration, var(--forge-animation-duration-medium1, 250ms));\n --_drawer-transition-easing:var(--forge-drawer-transition-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_drawer-transition-duration-close:var(--forge-drawer-transition-duration-close, var(--forge-animation-duration-short4, 200ms));\n}\n\n.forge-drawer {\n width: var(--_drawer-width);\n height: 100%;\n box-sizing: border-box;\n overflow: hidden;\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n background-color: var(--_drawer-background);\n border-color: var(--_drawer-border-color);\n transition-property: transform;\n transition-duration: var(--_drawer-transition-duration);\n transition-timing-function: var(--_drawer-transition-easing);\n border-right-width: var(--_drawer-border-width);\n border-right-style: solid;\n}\n\n.forge-drawer--closing {\n transform: translateX(-100%);\n left: 0;\n z-index: var(--forge-z-index-surface, 1);\n position: absolute;\n top: 0;\n right: 0;\n transition-duration: var(--_drawer-transition-duration-close);\n}\n\n.forge-drawer--closed {\n transform: translateX(-100%);\n left: 0;\n width: 0;\n border: none;\n}\n\n.forge-drawer--right {\n border-left-width: var(--_drawer-border-width);\n border-left-style: solid;\n border-right: none;\n}\n\n.forge-drawer--right.forge-drawer--closing {\n transform: translateX(100%);\n right: 0;\n left: auto;\n z-index: var(--forge-z-index-surface, 1);\n position: absolute;\n top: 0;\n right: 0;\n transition-duration: var(--_drawer-transition-duration-close);\n}\n\n.forge-drawer--right.forge-drawer--closed {\n transform: translateX(100%);\n right: 0;\n left: auto;\n width: 0;\n border: none;\n}\n\n.forge-drawer--mini {\n width: var(--_mini-drawer-width);\n z-index: var(--forge-z-index-surface, 1);\n transition: width var(--_mini-drawer-transition-duration) var(--_mini-drawer-transition-easing);\n}\n\n:host {\n display: block;\n width: auto;\n height: 100%;\n overflow: hidden;\n}\n\n.animation-container {\n --forge-drawer-width: 420px; /* Default value, can be overridden */\n width: var(--forge-drawer-width);\n height: 100%;\n position: relative;\n transition: width 250ms cubic-bezier(0.2, 0, 0, 1);\n overflow: hidden;\n}\n.animation-container--closed {\n width: 0;\n}\n.animation-container--closing {\n width: 0;\n}\n.animation-container--open {\n width: var(--forge-drawer-width);\n}\n\n.forge-drawer {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n width: var(--forge-drawer-width);\n height: 100%;\n position: absolute;\n top: 0;\n right: 0;\n}";
1
+ const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc.\n * License: Apache-2.0\n */\n.forge-drawer {\n --_drawer-background:var(--forge-drawer-background, var(--forge-theme-surface, #ffffff));\n --_drawer-border-color:var(--forge-drawer-border-color, var(--forge-theme-outline, #e0e0e0));\n --_drawer-width:var(--forge-drawer-width, 256px);\n --_drawer-border-width:var(--forge-drawer-border-width, var(--forge-border-thin, 1px));\n --_drawer-transition-duration:var(--forge-drawer-transition-duration, var(--forge-animation-duration-medium1, 250ms));\n --_drawer-transition-easing:var(--forge-drawer-transition-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_drawer-transition-duration-close:var(--forge-drawer-transition-duration-close, var(--forge-animation-duration-short4, 200ms));\n}\n\n.forge-drawer {\n width: var(--_drawer-width);\n height: 100%;\n box-sizing: border-box;\n overflow: hidden;\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: auto 1fr auto;\n background-color: var(--_drawer-background);\n border-color: var(--_drawer-border-color);\n transition-property: transform;\n transition-duration: var(--_drawer-transition-duration);\n transition-timing-function: var(--_drawer-transition-easing);\n border-right-width: var(--_drawer-border-width);\n border-right-style: solid;\n}\n\n.forge-drawer--closing {\n transform: translateX(-100%);\n left: 0;\n z-index: var(--forge-z-index-surface, 1);\n position: absolute;\n top: 0;\n right: 0;\n transition-duration: var(--_drawer-transition-duration-close);\n}\n\n.forge-drawer--closed {\n transform: translateX(-100%);\n left: 0;\n width: 0;\n border: none;\n}\n\n.forge-drawer--right {\n border-left-width: var(--_drawer-border-width);\n border-left-style: solid;\n border-right: none;\n}\n\n.forge-drawer--right.forge-drawer--closing {\n transform: translateX(100%);\n right: 0;\n left: auto;\n z-index: var(--forge-z-index-surface, 1);\n position: absolute;\n top: 0;\n right: 0;\n transition-duration: var(--_drawer-transition-duration-close);\n}\n\n.forge-drawer--right.forge-drawer--closed {\n transform: translateX(100%);\n right: 0;\n left: auto;\n width: 0;\n border: none;\n}\n\n.forge-drawer--mini {\n width: var(--_mini-drawer-width);\n z-index: var(--forge-z-index-surface, 1);\n transition: width var(--_mini-drawer-transition-duration) var(--_mini-drawer-transition-easing);\n}\n\n:host {\n display: block;\n width: auto;\n height: 100%;\n overflow: hidden;\n}\n\n.animation-container {\n --forge-drawer-width: 420px;\n width: var(--forge-drawer-width);\n height: 100%;\n position: relative;\n transition: width 250ms cubic-bezier(0.2, 0, 0, 1);\n overflow: hidden;\n}\n.animation-container--closed {\n width: 0;\n}\n.animation-container--closing {\n width: 0;\n}\n.animation-container--open {\n width: var(--forge-drawer-width);\n}\n.animation-container--resizing {\n transition: none;\n}\n\n.forge-drawer {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n width: var(--forge-drawer-width);\n height: 100%;\n position: absolute;\n top: 0;\n right: 0;\n}\n.forge-drawer--resizing {\n user-select: none;\n transition: none;\n}\n\n.resize-handle {\n position: absolute;\n top: 0;\n left: 0;\n width: 8px;\n height: 100%;\n cursor: ew-resize;\n z-index: 10;\n}\n.resize-handle::before {\n content: "";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 1px;\n background-color: var(--forge-theme-outline, #e0e0e0);\n opacity: 0;\n transition: all var(--forge-animation-duration-short4, 200ms) var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1));\n}\n.resize-handle:hover::before {\n opacity: 0.4;\n width: 2px;\n background-color: var(--forge-theme-primary, #3f51b5);\n}\n.resize-handle:focus-visible {\n outline: 2px solid var(--forge-theme-primary, #3f51b5);\n outline-offset: -2px;\n}\n.resize-handle:focus-visible::before {\n opacity: 0.6;\n width: 2px;\n background-color: var(--forge-theme-primary, #3f51b5);\n}\n.resize-handle--active::before {\n opacity: 0.8;\n width: 3px;\n background-color: var(--forge-theme-primary, #3f51b5);\n}\n\n:host([resizable=false]) .resize-handle {\n display: none;\n}';
2
2
  export {
3
3
  styles as default
4
4
  };
@@ -31,6 +31,7 @@ export declare class AiSidebarChatComponent extends LitElement {
31
31
  static styles: CSSResult;
32
32
  open: boolean;
33
33
  expanded: boolean;
34
+ resizable: boolean;
34
35
  render(): TemplateResult;
35
36
  show(): void;
36
37
  close(): void;
@@ -30,6 +30,7 @@ let AiSidebarChatComponent = class extends LitElement {
30
30
  __privateAdd(this, _AiSidebarChatComponent_instances);
31
31
  this.open = false;
32
32
  this.expanded = false;
33
+ this.resizable = true;
33
34
  __privateAdd(this, _sidebarRef, createRef());
34
35
  __privateAdd(this, _modalRef, createRef());
35
36
  __privateAdd(this, _slotContent, html`
@@ -55,6 +56,7 @@ let AiSidebarChatComponent = class extends LitElement {
55
56
  <forge-ai-sidebar
56
57
  ${ref(__privateGet(this, _sidebarRef))}
57
58
  ?open=${this.open && !this.expanded}
59
+ ?resizable=${this.resizable}
58
60
  @forge-ai-sidebar-open=${__privateMethod(this, _AiSidebarChatComponent_instances, handleSidebarOpen_fn)}
59
61
  @forge-ai-sidebar-close=${__privateMethod(this, _AiSidebarChatComponent_instances, handleSidebarClose_fn)}>
60
62
  ${__privateGet(this, _slotContent)}
@@ -145,6 +147,9 @@ __decorateClass([
145
147
  __decorateClass([
146
148
  property({ type: Boolean })
147
149
  ], AiSidebarChatComponent.prototype, "expanded", 2);
150
+ __decorateClass([
151
+ property({ type: Boolean })
152
+ ], AiSidebarChatComponent.prototype, "resizable", 2);
148
153
  AiSidebarChatComponent = __decorateClass([
149
154
  customElement(AiSidebarChatComponentTagName)
150
155
  ], AiSidebarChatComponent);
@@ -5,7 +5,7 @@ declare global {
5
5
  }
6
6
  }
7
7
  export declare const AiSpinnerComponentTagName: keyof HTMLElementTagNameMap;
8
- export type SpinnerSize = 'small' | 'medium' | 'large';
8
+ export type SpinnerSize = 'extra-small' | 'small' | 'medium' | 'large';
9
9
  /**
10
10
  * @tag forge-ai-spinner
11
11
  *
@@ -1,4 +1,4 @@
1
- const styles = ":host {\n display: inline-block;\n}\n\n.spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.spinner svg {\n animation: rotate 1.4s linear infinite;\n}\n.spinner--small {\n width: 24px;\n height: 24px;\n}\n.spinner--medium {\n width: 32px;\n height: 32px;\n}\n.spinner--large {\n width: 48px;\n height: 48px;\n}\n\n.track {\n stroke: var(--forge-ai-spinner-track-color, var(--forge-theme-outline-low, #9e9e9e));\n opacity: 0.2;\n}\n\n.indicator {\n stroke: var(--forge-ai-spinner-color, var(--forge-theme-primary, #3f51b5));\n stroke-linecap: round;\n stroke-dasharray: 125.6;\n stroke-dashoffset: 125.6;\n transform-origin: center;\n animation: dash 1.4s ease-in-out infinite;\n}\n\n@keyframes rotate {\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes dash {\n 0% {\n stroke-dashoffset: 125.6;\n transform: rotate(0deg);\n }\n 50% {\n stroke-dashoffset: 31.4;\n transform: rotate(240deg);\n }\n 100% {\n stroke-dashoffset: 125.6;\n transform: rotate(720deg);\n }\n}";
1
+ const styles = ":host {\n display: inline-block;\n}\n\n.spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.spinner svg {\n animation: rotate 1.4s linear infinite;\n}\n.spinner--extra-small {\n width: 16px;\n height: 16px;\n}\n.spinner--small {\n width: 24px;\n height: 24px;\n}\n.spinner--medium {\n width: 32px;\n height: 32px;\n}\n.spinner--large {\n width: 48px;\n height: 48px;\n}\n\n.track {\n stroke: var(--forge-ai-spinner-track-color, var(--forge-theme-outline-low, #9e9e9e));\n opacity: 0.2;\n}\n\n.indicator {\n stroke: var(--forge-ai-spinner-color, var(--forge-theme-primary, #3f51b5));\n stroke-linecap: round;\n stroke-dasharray: 125.6;\n stroke-dashoffset: 125.6;\n transform-origin: center;\n animation: dash 1.4s ease-in-out infinite;\n}\n\n@keyframes rotate {\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes dash {\n 0% {\n stroke-dashoffset: 125.6;\n transform: rotate(0deg);\n }\n 50% {\n stroke-dashoffset: 31.4;\n transform: rotate(240deg);\n }\n 100% {\n stroke-dashoffset: 125.6;\n transform: rotate(720deg);\n }\n}";
2
2
  export {
3
3
  styles as default
4
4
  };
@@ -0,0 +1,44 @@
1
+ import { LitElement, TemplateResult, CSSResult } from 'lit';
2
+ import { Thread } from '../ai-threads';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'forge-ai-thread-actions-menu': AiThreadActionsMenuComponent;
6
+ }
7
+ interface HTMLElementEventMap {
8
+ 'forge-ai-thread-actions-menu-rename': CustomEvent<ForgeAiThreadActionsMenuRenameEventData>;
9
+ 'forge-ai-thread-actions-menu-delete-click': CustomEvent<ForgeAiThreadActionsMenuDeleteClickEventData>;
10
+ 'forge-ai-thread-actions-menu-open': CustomEvent<ForgeAiThreadActionsMenuOpenEventData>;
11
+ 'forge-ai-thread-actions-menu-close': CustomEvent<void>;
12
+ }
13
+ }
14
+ export interface ForgeAiThreadActionsMenuRenameEventData {
15
+ id: string;
16
+ }
17
+ export interface ForgeAiThreadActionsMenuDeleteClickEventData {
18
+ id: string;
19
+ }
20
+ export interface ForgeAiThreadActionsMenuOpenEventData {
21
+ id: string;
22
+ }
23
+ export declare const AiThreadActionsMenuComponentTagName: keyof HTMLElementTagNameMap;
24
+ /**
25
+ * @tag forge-ai-thread-actions-menu
26
+ *
27
+ * @slot trigger-icon - Slot for custom trigger icon (default: three-dot menu icon)
28
+ *
29
+ * @event {CustomEvent<ForgeAiThreadActionsMenuRenameEventData>} forge-ai-thread-actions-menu-rename - Fired when rename menu item is clicked.
30
+ * @event {CustomEvent<ForgeAiThreadActionsMenuDeleteClickEventData>} forge-ai-thread-actions-menu-delete-click - Fired when delete menu item is clicked. Parent should show confirmation modal.
31
+ * @event {CustomEvent<ForgeAiThreadActionsMenuOpenEventData>} forge-ai-thread-actions-menu-open - Fired when the dropdown menu is opened.
32
+ * @event {CustomEvent<void>} forge-ai-thread-actions-menu-close - Fired when the dropdown menu is closed.
33
+ *
34
+ * @description A reusable three-dot actions menu for thread items with rename and delete actions.
35
+ * Emits events for all actions. Parent components handle confirmation modals.
36
+ */
37
+ export declare class AiThreadActionsMenuComponent extends LitElement {
38
+ #private;
39
+ static styles: CSSResult;
40
+ thread: Thread;
41
+ showRename: boolean;
42
+ showDelete: boolean;
43
+ render(): TemplateResult;
44
+ }