@tylertech/forge-ai 0.13.1 → 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.
- package/custom-elements.json +3409 -1497
- package/dist/ai-agent-info/ai-agent-info.d.ts +1 -1
- package/dist/ai-agent-info/ai-agent-info.mjs +17 -62
- package/dist/ai-agent-info/ai-agent-info.scss.mjs +1 -1
- package/dist/ai-assistant-response/ai-assistant-response.scss.mjs +1 -1
- package/dist/ai-chat-header/ai-chat-header.d.ts +6 -0
- package/dist/ai-chat-header/ai-chat-header.mjs +51 -7
- package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
- package/dist/ai-chatbot/ai-chatbot-base.d.ts +37 -3
- package/dist/ai-chatbot/ai-chatbot-base.mjs +83 -24
- package/dist/ai-chatbot/ai-chatbot.d.ts +40 -1
- package/dist/ai-chatbot/ai-chatbot.mjs +242 -44
- package/dist/ai-chatbot/ai-chatbot.scss.mjs +1 -1
- package/dist/ai-chatbot/index.d.ts +1 -1
- package/dist/ai-chatbot/types.d.ts +39 -0
- package/dist/ai-chatbot/utils.d.ts +5 -0
- package/dist/ai-chatbot/utils.mjs +28 -0
- package/dist/ai-chatbot-launcher/ai-chatbot-launcher.d.ts +26 -0
- package/dist/ai-chatbot-launcher/ai-chatbot-launcher.mjs +155 -10
- package/dist/ai-chatbot-launcher/ai-chatbot-launcher.scss.mjs +1 -1
- package/dist/ai-confirmation-prompt/ai-confirmation-prompt.d.ts +6 -0
- package/dist/ai-confirmation-prompt/ai-confirmation-prompt.mjs +64 -19
- package/dist/ai-confirmation-prompt/ai-confirmation-prompt.scss.mjs +1 -1
- package/dist/ai-context-chip/ai-context-chip.d.ts +45 -0
- package/dist/ai-context-chip/ai-context-chip.mjs +169 -0
- package/dist/ai-context-chip/ai-context-chip.scss.mjs +4 -0
- package/dist/ai-context-chip/index.d.ts +2 -0
- package/dist/ai-context-chip/index.mjs +5 -0
- package/dist/ai-context-items/ai-context-items.d.ts +20 -0
- package/dist/ai-context-items/ai-context-items.mjs +78 -0
- package/dist/ai-context-items/ai-context-items.scss.mjs +4 -0
- package/dist/ai-context-items/index.d.ts +1 -0
- package/dist/ai-context-items/index.mjs +5 -0
- package/dist/ai-conversations-panel/ai-conversations-panel.d.ts +86 -0
- package/dist/ai-conversations-panel/ai-conversations-panel.mjs +558 -0
- package/dist/ai-conversations-panel/ai-conversations-panel.scss.mjs +4 -0
- package/dist/ai-conversations-panel/index.d.ts +2 -0
- package/dist/ai-conversations-panel/index.mjs +5 -0
- package/dist/ai-copy-button/ai-copy-button.d.ts +32 -0
- package/dist/ai-copy-button/ai-copy-button.mjs +116 -0
- package/dist/ai-copy-button/ai-copy-button.scss.mjs +4 -0
- package/dist/ai-copy-button/index.d.ts +1 -0
- package/dist/ai-copy-button/index.mjs +5 -0
- package/dist/ai-dialog/ai-dialog.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +6 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +14 -2
- package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
- package/dist/ai-edit-thread/ai-edit-thread.d.ts +34 -0
- package/dist/ai-edit-thread/ai-edit-thread.mjs +130 -0
- package/dist/ai-edit-thread/ai-edit-thread.scss.mjs +4 -0
- package/dist/ai-edit-thread/index.d.ts +1 -0
- package/dist/ai-edit-thread/index.mjs +5 -0
- package/dist/ai-message-thread/ai-message-thread.scss.mjs +1 -1
- package/dist/ai-modal/ai-modal.d.ts +11 -2
- package/dist/ai-modal/ai-modal.mjs +31 -6
- package/dist/ai-prompt/ai-prompt.d.ts +7 -1
- package/dist/ai-prompt/ai-prompt.mjs +29 -2
- package/dist/ai-sidebar/ai-sidebar.d.ts +11 -0
- package/dist/ai-sidebar/ai-sidebar.mjs +94 -4
- package/dist/ai-sidebar/ai-sidebar.scss.mjs +1 -1
- package/dist/ai-sidebar-chat/ai-sidebar-chat.d.ts +1 -0
- package/dist/ai-sidebar-chat/ai-sidebar-chat.mjs +5 -0
- package/dist/ai-spinner/ai-spinner.d.ts +1 -1
- package/dist/ai-spinner/ai-spinner.scss.mjs +1 -1
- package/dist/ai-thread-actions-menu/ai-thread-actions-menu.d.ts +44 -0
- package/dist/ai-thread-actions-menu/ai-thread-actions-menu.mjs +136 -0
- package/dist/ai-thread-actions-menu/ai-thread-actions-menu.scss.mjs +4 -0
- package/dist/ai-thread-actions-menu/index.d.ts +1 -0
- package/dist/ai-thread-actions-menu/index.mjs +5 -0
- package/dist/ai-threads/ai-threads.d.ts +45 -16
- package/dist/ai-threads/ai-threads.mjs +256 -98
- package/dist/ai-threads/ai-threads.scss.mjs +1 -1
- package/dist/ai-threads-search/ai-threads-search.d.ts +81 -0
- package/dist/ai-threads-search/ai-threads-search.mjs +414 -0
- package/dist/ai-threads-search/ai-threads-search.scss.mjs +4 -0
- package/dist/ai-threads-search/index.d.ts +1 -0
- package/dist/ai-threads-search/index.mjs +5 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.mjs +3 -1
- package/dist/core/resize-controller.d.ts +25 -0
- package/dist/core/resize-controller.mjs +144 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.mjs +21 -0
- package/dist/utils/delete-thread-controller.d.ts +14 -0
- package/dist/utils/delete-thread-controller.mjs +80 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.mjs +8 -0
- package/dist/utils/infinite-scroll-controller.d.ts +33 -0
- package/dist/utils/infinite-scroll-controller.mjs +95 -0
- package/package.json +14 -14
|
@@ -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
|
|
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 =
|
|
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
|
};
|
|
@@ -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
|
+
}
|