@tylertech/forge-ai 0.5.0 → 0.6.0
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 +1329 -579
- package/dist/ai-artifact/ai-artifact.scss.mjs +1 -1
- package/dist/ai-attachment/ai-attachment.d.ts +4 -4
- package/dist/ai-chat-header/ai-chat-header.d.ts +4 -0
- package/dist/ai-chat-header/ai-chat-header.mjs +6 -0
- package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
- package/dist/ai-chatbot/ag-ui-adapter.mjs +34 -25
- package/dist/ai-chatbot/agent-adapter.d.ts +16 -8
- package/dist/ai-chatbot/agent-adapter.mjs +16 -16
- package/dist/ai-chatbot/agent-runner.mjs +3 -3
- package/dist/ai-chatbot/ai-chatbot-tool-call.d.ts +5 -2
- package/dist/ai-chatbot/ai-chatbot-tool-call.mjs +68 -5
- package/dist/ai-chatbot/ai-chatbot-tool-call.scss.mjs +1 -1
- package/dist/ai-chatbot/ai-chatbot.d.ts +1 -0
- package/dist/ai-chatbot/ai-chatbot.mjs +84 -23
- package/dist/ai-chatbot/create-tool-renderer.d.ts +1 -4
- package/dist/ai-chatbot/create-tool-renderer.mjs +1 -13
- package/dist/ai-chatbot/index.d.ts +1 -1
- package/dist/ai-chatbot/message-state-controller.d.ts +10 -6
- package/dist/ai-chatbot/message-state-controller.mjs +95 -6
- package/dist/ai-chatbot/types.d.ts +91 -2
- package/dist/ai-chatbot/utils.d.ts +2 -2
- package/dist/ai-chatbot/utils.mjs +3 -2
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.d.ts +1 -3
- package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +5 -6
- package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +7 -1
- package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
- package/dist/ai-dropdown-menu/selection-manager.mjs +3 -3
- package/dist/ai-embedded-chat/ai-embedded-chat.mjs +1 -0
- package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.d.ts +19 -0
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.mjs +164 -0
- package/dist/ai-event-stream-viewer/ai-event-stream-viewer.scss.mjs +4 -0
- package/dist/ai-event-stream-viewer/index.d.ts +1 -0
- package/dist/ai-event-stream-viewer/index.mjs +5 -0
- package/dist/ai-file-picker/ai-file-picker.d.ts +0 -13
- package/dist/ai-gradient-container/ai-gradient-container.scss.mjs +1 -1
- package/dist/ai-icon/ai-icon.scss.mjs +1 -1
- package/dist/ai-icon-button/ai-icon-button.d.ts +19 -0
- package/dist/ai-icon-button/ai-icon-button.mjs +63 -0
- package/dist/ai-icon-button/ai-icon-button.scss.mjs +4 -0
- package/dist/ai-icon-button/index.d.ts +1 -0
- package/dist/ai-icon-button/index.mjs +5 -0
- package/dist/ai-message-thread/ai-message-thread.d.ts +3 -2
- package/dist/ai-message-thread/ai-message-thread.mjs +23 -9
- package/dist/ai-prompt/ai-prompt.d.ts +21 -0
- package/dist/ai-prompt/ai-prompt.mjs +133 -10
- package/dist/ai-prompt/ai-prompt.scss.mjs +1 -1
- package/dist/ai-response-message/ai-response-message.d.ts +5 -0
- package/dist/ai-response-message/ai-response-message.mjs +61 -3
- package/dist/ai-response-message/ai-response-message.scss.mjs +1 -1
- package/dist/ai-slash-command-menu/ai-slash-command-menu.d.ts +33 -0
- package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +200 -0
- package/dist/ai-slash-command-menu/ai-slash-command-menu.scss.mjs +4 -0
- package/dist/ai-slash-command-menu/index.d.ts +1 -0
- package/dist/ai-slash-command-menu/index.mjs +5 -0
- package/dist/ai-spinner/ai-spinner.d.ts +2 -2
- package/dist/ai-suggestions/ai-suggestions.d.ts +2 -0
- package/dist/ai-suggestions/ai-suggestions.scss.mjs +1 -1
- package/dist/ai-thinking-indicator/ai-thinking-indicator.d.ts +3 -0
- package/dist/ai-thinking-indicator/ai-thinking-indicator.mjs +24 -15
- package/dist/ai-thinking-indicator/ai-thinking-indicator.scss.mjs +14 -11
- package/dist/core/overlay/index.d.ts +1 -1
- package/dist/core/overlay/overlay.d.ts +10 -5
- package/dist/core/overlay/overlay.mjs +7 -2
- package/dist/core/popover/index.d.ts +1 -1
- package/dist/core/popover/popover.d.ts +7 -6
- package/dist/core/popover/popover.mjs +5 -0
- package/dist/core/tooltip/tooltip.d.ts +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +6 -0
- package/dist/tools/ai-data-table/ai-data-table-definition.d.ts +2 -0
- package/dist/tools/ai-data-table/ai-data-table-definition.mjs +43 -0
- package/dist/tools/ai-data-table/ai-data-table.d.ts +33 -0
- package/dist/tools/ai-data-table/ai-data-table.mjs +206 -0
- package/dist/tools/ai-data-table/ai-data-table.scss.mjs +4 -0
- package/dist/tools/ai-data-table/index.d.ts +2 -0
- package/dist/tools/ai-data-table/index.mjs +6 -0
- package/dist/tools/ai-paginator/ai-paginator.d.ts +17 -0
- package/dist/tools/ai-paginator/ai-paginator.mjs +110 -0
- package/dist/tools/ai-paginator/ai-paginator.scss.mjs +4 -0
- package/dist/tools/ai-paginator/index.d.ts +1 -0
- package/dist/tools/ai-paginator/index.mjs +4 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.mjs +8 -0
- package/dist/utils/keyboard-navigation-controller.d.ts +13 -0
- package/dist/utils/keyboard-navigation-controller.mjs +71 -0
- package/package.json +64 -63
|
@@ -28,18 +28,34 @@ class MessageStateController {
|
|
|
28
28
|
this._messageItems = [...this._messageItems, item];
|
|
29
29
|
this.#notifyStateChange();
|
|
30
30
|
}
|
|
31
|
-
addMessage(message) {
|
|
31
|
+
addMessage(message, event) {
|
|
32
32
|
const existing = this.getMessage(message.id);
|
|
33
33
|
if (existing) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
this.addMessageItem({ type: "message", data: message });
|
|
37
|
+
if (event) {
|
|
38
|
+
this.#appendEventToMessage(message.id, {
|
|
39
|
+
type: "message-start",
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
data: event,
|
|
42
|
+
rawEvent: event.rawEvent
|
|
43
|
+
});
|
|
44
|
+
}
|
|
37
45
|
}
|
|
38
|
-
addToolCall(toolCall) {
|
|
46
|
+
addToolCall(toolCall, event) {
|
|
39
47
|
this._toolCalls.set(toolCall.id, toolCall);
|
|
40
48
|
this.addMessageItem({ type: "toolCall", data: toolCall });
|
|
49
|
+
if (event) {
|
|
50
|
+
this.#appendEventToToolCall(toolCall.id, {
|
|
51
|
+
type: "tool-call-start",
|
|
52
|
+
timestamp: Date.now(),
|
|
53
|
+
data: event,
|
|
54
|
+
rawEvent: event.rawEvent
|
|
55
|
+
});
|
|
56
|
+
}
|
|
41
57
|
}
|
|
42
|
-
updateToolCall(toolCallId, updates) {
|
|
58
|
+
updateToolCall(toolCallId, updates, eventData) {
|
|
43
59
|
const toolCall = this._toolCalls.get(toolCallId);
|
|
44
60
|
if (!toolCall) {
|
|
45
61
|
return;
|
|
@@ -52,28 +68,63 @@ class MessageStateController {
|
|
|
52
68
|
}
|
|
53
69
|
return item;
|
|
54
70
|
});
|
|
71
|
+
if (eventData) {
|
|
72
|
+
if (eventData.eventType === "tool-call-args") {
|
|
73
|
+
const argsEvent = eventData.event;
|
|
74
|
+
this.#appendEventToToolCall(toolCallId, {
|
|
75
|
+
type: "tool-call-args",
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
data: argsEvent,
|
|
78
|
+
rawEvent: argsEvent.rawEvent
|
|
79
|
+
});
|
|
80
|
+
} else {
|
|
81
|
+
const endEvent = eventData.event;
|
|
82
|
+
this.#appendEventToToolCall(toolCallId, {
|
|
83
|
+
type: "tool-call-end",
|
|
84
|
+
timestamp: Date.now(),
|
|
85
|
+
data: endEvent,
|
|
86
|
+
rawEvent: endEvent.rawEvent
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
55
90
|
this.#notifyStateChange();
|
|
56
91
|
}
|
|
57
|
-
appendToMessage(id, content) {
|
|
92
|
+
appendToMessage(id, content, event) {
|
|
58
93
|
this._messageItems = this._messageItems.map((item) => {
|
|
59
94
|
if (item.type === "message" && item.data.id === id) {
|
|
60
95
|
return { ...item, data: { ...item.data, content: item.data.content + content } };
|
|
61
96
|
}
|
|
62
97
|
return item;
|
|
63
98
|
});
|
|
99
|
+
if (event) {
|
|
100
|
+
this.#appendEventToMessage(id, {
|
|
101
|
+
type: "message-delta",
|
|
102
|
+
timestamp: Date.now(),
|
|
103
|
+
data: event,
|
|
104
|
+
rawEvent: event.rawEvent
|
|
105
|
+
});
|
|
106
|
+
}
|
|
64
107
|
this.#notifyStateChange();
|
|
65
108
|
}
|
|
66
109
|
getMessage(id) {
|
|
67
110
|
const item = this._messageItems.find((i) => i.type === "message" && i.data.id === id);
|
|
68
111
|
return item?.type === "message" ? item.data : void 0;
|
|
69
112
|
}
|
|
70
|
-
updateMessageStatus(id, status) {
|
|
113
|
+
updateMessageStatus(id, status, event) {
|
|
71
114
|
this._messageItems = this._messageItems.map((item) => {
|
|
72
115
|
if (item.type === "message" && item.data.id === id) {
|
|
73
116
|
return { ...item, data: { ...item.data, status } };
|
|
74
117
|
}
|
|
75
118
|
return item;
|
|
76
119
|
});
|
|
120
|
+
if (event) {
|
|
121
|
+
this.#appendEventToMessage(id, {
|
|
122
|
+
type: "message-end",
|
|
123
|
+
timestamp: Date.now(),
|
|
124
|
+
data: event,
|
|
125
|
+
rawEvent: event.rawEvent
|
|
126
|
+
});
|
|
127
|
+
}
|
|
77
128
|
this.#notifyStateChange();
|
|
78
129
|
}
|
|
79
130
|
removeMessageItem(index) {
|
|
@@ -126,11 +177,49 @@ class MessageStateController {
|
|
|
126
177
|
this._messageItems = messageItems;
|
|
127
178
|
this.#notifyStateChange();
|
|
128
179
|
}
|
|
129
|
-
|
|
180
|
+
#appendEventToMessage(id, event) {
|
|
181
|
+
const messageExists = this._messageItems.some((item) => item.type === "message" && item.data.id === id);
|
|
182
|
+
if (!messageExists) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
this._messageItems = this._messageItems.map((item) => {
|
|
186
|
+
if (item.type === "message" && item.data.id === id) {
|
|
187
|
+
const eventStream = [...item.data.eventStream || [], event];
|
|
188
|
+
return { ...item, data: { ...item.data, eventStream } };
|
|
189
|
+
}
|
|
190
|
+
return item;
|
|
191
|
+
});
|
|
192
|
+
this.#notifyStateChange();
|
|
193
|
+
}
|
|
194
|
+
#appendEventToToolCall(id, event) {
|
|
195
|
+
const toolCall = this._toolCalls.get(id);
|
|
196
|
+
if (!toolCall) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const eventStream = [...toolCall.eventStream || [], event];
|
|
200
|
+
const updated = { ...toolCall, eventStream };
|
|
201
|
+
this._toolCalls.set(id, updated);
|
|
202
|
+
this._messageItems = this._messageItems.map((item) => {
|
|
203
|
+
if (item.type === "toolCall" && item.data.id === id) {
|
|
204
|
+
return { ...item, data: updated };
|
|
205
|
+
}
|
|
206
|
+
return item;
|
|
207
|
+
});
|
|
208
|
+
this.#notifyStateChange();
|
|
209
|
+
}
|
|
210
|
+
completeToolCall(toolCallId, result, event) {
|
|
130
211
|
this.updateToolCall(toolCallId, {
|
|
131
212
|
result,
|
|
132
213
|
status: "complete"
|
|
133
214
|
});
|
|
215
|
+
if (event) {
|
|
216
|
+
this.#appendEventToToolCall(toolCallId, {
|
|
217
|
+
type: "tool-result",
|
|
218
|
+
timestamp: Date.now(),
|
|
219
|
+
data: event,
|
|
220
|
+
rawEvent: event.rawEvent
|
|
221
|
+
});
|
|
222
|
+
}
|
|
134
223
|
this.#tryReorderAssistantMessage(toolCallId);
|
|
135
224
|
}
|
|
136
225
|
/**
|
|
@@ -2,10 +2,28 @@
|
|
|
2
2
|
* Valid HTML heading levels for accessibility and semantic structure
|
|
3
3
|
*/
|
|
4
4
|
export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
5
|
+
export type SlashCommandId = 'clear' | 'export' | 'info' | 'debug';
|
|
6
|
+
export type SlashCommandGroup = 'Conversation' | 'Help';
|
|
7
|
+
export interface SlashCommand {
|
|
8
|
+
id: SlashCommandId;
|
|
9
|
+
name: string;
|
|
10
|
+
group: SlashCommandGroup;
|
|
11
|
+
}
|
|
12
|
+
export interface ForgeAiSlashCommandMenuSelectEventData {
|
|
13
|
+
command: SlashCommand;
|
|
14
|
+
index: number;
|
|
15
|
+
}
|
|
5
16
|
export interface ToolRenderer {
|
|
6
17
|
elementTag?: string;
|
|
7
18
|
render?: (toolCall: ToolCall) => HTMLElement | DocumentFragment;
|
|
8
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Interface that tool renderer components should implement for type-safe tool call handling.
|
|
22
|
+
* @template TArgs - Type of the tool call arguments
|
|
23
|
+
*/
|
|
24
|
+
export interface IToolRenderer<TArgs = Record<string, unknown>> {
|
|
25
|
+
toolCall: ToolCall<TArgs>;
|
|
26
|
+
}
|
|
9
27
|
/**
|
|
10
28
|
* Context provided to tool handlers when they are invoked.
|
|
11
29
|
* @template TArgs - Type of the tool call arguments
|
|
@@ -42,6 +60,75 @@ export interface ToolDefinition<THandlerArgs = Record<string, unknown>> {
|
|
|
42
60
|
*/
|
|
43
61
|
handler?: (context: HandlerContext<THandlerArgs>) => Promise<string | Record<string, unknown> | void> | string | Record<string, unknown> | void;
|
|
44
62
|
}
|
|
63
|
+
export interface MessageStartEvent {
|
|
64
|
+
messageId: string;
|
|
65
|
+
}
|
|
66
|
+
export interface MessageDeltaEvent {
|
|
67
|
+
messageId: string;
|
|
68
|
+
delta: string;
|
|
69
|
+
}
|
|
70
|
+
export interface MessageEndEvent {
|
|
71
|
+
messageId: string;
|
|
72
|
+
}
|
|
73
|
+
export interface ToolCallStartEvent {
|
|
74
|
+
id: string;
|
|
75
|
+
messageId: string;
|
|
76
|
+
name: string;
|
|
77
|
+
}
|
|
78
|
+
export interface ToolCallArgsEvent {
|
|
79
|
+
id: string;
|
|
80
|
+
messageId: string;
|
|
81
|
+
name: string;
|
|
82
|
+
argsBuffer: string;
|
|
83
|
+
partialArgs?: Record<string, unknown>;
|
|
84
|
+
}
|
|
85
|
+
export interface ToolCallEndEvent {
|
|
86
|
+
id: string;
|
|
87
|
+
messageId: string;
|
|
88
|
+
name: string;
|
|
89
|
+
args: Record<string, unknown>;
|
|
90
|
+
}
|
|
91
|
+
export interface ToolResultEvent {
|
|
92
|
+
toolCallId: string;
|
|
93
|
+
result: unknown;
|
|
94
|
+
message: ChatMessage;
|
|
95
|
+
}
|
|
96
|
+
export type StreamEvent = {
|
|
97
|
+
type: 'message-start';
|
|
98
|
+
timestamp: number;
|
|
99
|
+
data: MessageStartEvent;
|
|
100
|
+
rawEvent?: unknown;
|
|
101
|
+
} | {
|
|
102
|
+
type: 'message-delta';
|
|
103
|
+
timestamp: number;
|
|
104
|
+
data: MessageDeltaEvent;
|
|
105
|
+
rawEvent?: unknown;
|
|
106
|
+
} | {
|
|
107
|
+
type: 'message-end';
|
|
108
|
+
timestamp: number;
|
|
109
|
+
data: MessageEndEvent;
|
|
110
|
+
rawEvent?: unknown;
|
|
111
|
+
} | {
|
|
112
|
+
type: 'tool-call-start';
|
|
113
|
+
timestamp: number;
|
|
114
|
+
data: ToolCallStartEvent;
|
|
115
|
+
rawEvent?: unknown;
|
|
116
|
+
} | {
|
|
117
|
+
type: 'tool-call-args';
|
|
118
|
+
timestamp: number;
|
|
119
|
+
data: ToolCallArgsEvent;
|
|
120
|
+
rawEvent?: unknown;
|
|
121
|
+
} | {
|
|
122
|
+
type: 'tool-call-end';
|
|
123
|
+
timestamp: number;
|
|
124
|
+
data: ToolCallEndEvent;
|
|
125
|
+
rawEvent?: unknown;
|
|
126
|
+
} | {
|
|
127
|
+
type: 'tool-result';
|
|
128
|
+
timestamp: number;
|
|
129
|
+
data: ToolResultEvent;
|
|
130
|
+
rawEvent?: unknown;
|
|
131
|
+
};
|
|
45
132
|
export interface ChatMessage {
|
|
46
133
|
id: string;
|
|
47
134
|
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
@@ -50,16 +137,18 @@ export interface ChatMessage {
|
|
|
50
137
|
status: 'pending' | 'streaming' | 'complete' | 'error';
|
|
51
138
|
toolCalls?: ToolCall[];
|
|
52
139
|
toolCallId?: string;
|
|
140
|
+
eventStream?: StreamEvent[];
|
|
53
141
|
}
|
|
54
|
-
export interface ToolCall {
|
|
142
|
+
export interface ToolCall<TArgs = Record<string, unknown>> {
|
|
55
143
|
id: string;
|
|
56
144
|
messageId: string;
|
|
57
145
|
name: string;
|
|
58
|
-
args:
|
|
146
|
+
args: TArgs;
|
|
59
147
|
argsBuffer?: string;
|
|
60
148
|
result?: unknown;
|
|
61
149
|
status: 'pending' | 'parsing' | 'executing' | 'complete' | 'error';
|
|
62
150
|
type: ToolType;
|
|
151
|
+
eventStream?: StreamEvent[];
|
|
63
152
|
}
|
|
64
153
|
export interface FileAttachment {
|
|
65
154
|
id: string;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { marked } from "marked";
|
|
2
2
|
import DOMPurify from "dompurify";
|
|
3
3
|
import remend from "remend";
|
|
4
|
+
import { v4 } from "uuid";
|
|
4
5
|
const DOMPURIFY_CONFIG = {
|
|
5
6
|
FORBID_TAGS: ["script", "style", "iframe", "object", "embed"],
|
|
6
7
|
FORBID_ATTR: ["onerror", "onload", "onclick", "onmouseover"]
|
|
7
8
|
};
|
|
8
|
-
function generateId(
|
|
9
|
-
return
|
|
9
|
+
function generateId() {
|
|
10
|
+
return v4();
|
|
10
11
|
}
|
|
11
12
|
function renderMarkdown(content) {
|
|
12
13
|
const completedMarkdown = remend(content);
|
|
@@ -26,9 +26,7 @@ declare global {
|
|
|
26
26
|
* - **'click'**: Opens on click/tap
|
|
27
27
|
* - **'both'**: Opens on both hover and click
|
|
28
28
|
*
|
|
29
|
-
* @
|
|
30
|
-
* @cssprop --ai-dropdown-menu-item-submenu-close-delay - Delay before closing submenu when mouse leaves.
|
|
31
|
-
* @cssprop --ai-dropdown-menu-item-selection-icon-size - Size of selection and submenu icons.
|
|
29
|
+
* @cssproperty --forge-ai-dropdown-menu-item-selection-icon-size - Size of selection and submenu icons.
|
|
32
30
|
*
|
|
33
31
|
* @slot - The default slot for item text content.
|
|
34
32
|
* @slot description - The description slot for additional item details.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n:host {\n display: block;\n position: relative;\n outline: none;\n --ai-dropdown-menu-item-submenu-open-delay: 150ms;\n --ai-dropdown-menu-item-submenu-close-delay: 300ms;\n --ai-dropdown-menu-item-selection-icon-size: 16px;\n}\n\n@keyframes forge-focus-indicator-outward-grow {\n from {\n outline-width: 0;\n }\n to {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-outward-shrink {\n from {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-grow {\n from {\n border-width: 0;\n }\n to {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-shrink {\n from {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n:host(:focus) .focus-indicator {\n --_focus-indicator-display: var(--forge-focus-indicator-display, flex);\n --_focus-indicator-width: var(--forge-focus-indicator-width, var(--forge-border-medium, 2px));\n --_focus-indicator-active-width: var(--forge-focus-indicator-active-width, 6px);\n --_focus-indicator-color: var(--forge-focus-indicator-color, var(--forge-theme-primary, #3f51b5));\n --_focus-indicator-shape: var(--forge-focus-indicator-shape, calc(var(--forge-shape-extra-small, 1px) * var(--forge-shape-factor, 1)));\n --_focus-indicator-duration: var(--forge-focus-indicator-duration, var(--forge-animation-duration-long4, 600ms));\n --_focus-indicator-easing: var(--forge-focus-indicator-easing, var(--forge-animation-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)));\n --_focus-indicator-shape-start-start: var(--forge-focus-indicator-shape-start-start, var(--_focus-indicator-shape));\n --_focus-indicator-shape-start-end: var(--forge-focus-indicator-shape-start-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-end: var(--forge-focus-indicator-shape-end-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-start: var(--forge-focus-indicator-shape-end-start, var(--_focus-indicator-shape));\n --_focus-indicator-outward-offset: var(--forge-focus-indicator-outward-offset, var(--forge-spacing-xxsmall, 4px));\n --_focus-indicator-inward-offset: var(--forge-focus-indicator-inward-offset, 0px);\n --_focus-indicator-offset-block: var(--forge-focus-indicator-offset-block, 0);\n --_focus-indicator-offset-inline: var(--forge-focus-indicator-offset-inline, 0);\n animation-delay: 0s, calc(var(--_focus-indicator-duration) * 0.25);\n animation-duration: calc(var(--_focus-indicator-duration) * 0.25), calc(var(--_focus-indicator-duration) * 0.75);\n animation-timing-function: var(--_focus-indicator-easing);\n box-sizing: border-box;\n color: var(--_focus-indicator-color);\n display: none;\n pointer-events: none;\n position: absolute;\n margin-block: var(--_focus-indicator-offset-block);\n margin-inline: var(--_focus-indicator-offset-inline);\n animation-name: forge-focus-indicator-inward-grow, forge-focus-indicator-inward-shrink;\n border-end-end-radius: calc(var(--_focus-indicator-shape-end-end) - var(--_focus-indicator-inward-offset));\n border-end-start-radius: calc(var(--_focus-indicator-shape-end-start) - var(--_focus-indicator-inward-offset));\n border-start-end-radius: calc(var(--_focus-indicator-shape-start-end) - var(--_focus-indicator-inward-offset));\n border-start-start-radius: calc(var(--_focus-indicator-shape-start-start) - var(--_focus-indicator-inward-offset));\n border: var(--_focus-indicator-width) solid currentColor;\n inset: var(--_focus-indicator-inward-offset);\n}\n:host(:focus) .focus-indicator::before {\n content: "";\n}\n:host(:focus) .focus-indicator {\n display: block;\n --forge-focus-indicator-shape: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n}\n\n.ai-dropdown-menu-item {\n --_list-item-background: var(--forge-list-item-background, transparent);\n --_list-item-shape: var(--forge-list-item-shape, 0);\n --_list-item-padding: var(--forge-list-item-padding, 0 var(--forge-spacing-medium, 16px));\n --_list-item-margin: var(--forge-list-item-margin, 0);\n --_list-item-height: var(--forge-list-item-height, 48px);\n --_list-item-dense-height: var(--forge-list-item-dense-height, 32px);\n --_list-item-indent: var(--forge-list-item-indent, var(--forge-spacing-xxlarge, 48px));\n --_list-item-cursor: var(--forge-list-item-cursor, pointer);\n --_list-item-gap: var(--forge-list-item-gap, var(--forge-spacing-large, 24px));\n --_list-item-text-color: var(--forge-list-item-text-color, var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6)));\n --_list-item-text-font-size: var(--forge-list-item-text-font-size, var(--forge-typography-body2-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, 1))));\n --_list-item-text-font-weight: var(--forge-list-item-text-font-weight, var(--forge-typography-body2-font-weight, 400));\n --_list-item-text-line-height: var(--forge-list-item-text-line-height, 1.5rem);\n --_list-item-selected-color: var(--forge-list-item-selected-color, var(--forge-theme-primary, #3f51b5));\n --_list-item-selected-background: var(--forge-list-item-selected-background, var(--_list-item-selected-color));\n --_list-item-selected-opacity: var(--forge-list-item-selected-opacity, 0.08);\n --_list-item-selected-start-color: var(--forge-list-item-selected-start-color, var(--_list-item-selected-color));\n --_list-item-selected-end-color: var(--forge-list-item-selected-end-color, var(--_list-item-selected-color));\n --_list-item-selected-text-color: var(--forge-list-item-selected-text-color, var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6)));\n --_list-item-disabled-opacity: var(--forge-list-item-disabled-opacity, 0.38);\n --_list-item-disabled-cursor: var(--forge-list-item-disabled-cursor, not-allowed);\n --_list-item-one-line-height: var(--forge-list-item-one-line-height, var(--_list-item-height));\n --_list-item-two-line-height: var(--forge-list-item-two-line-height, var(--forge-list-item-height, 72px));\n --_list-item-three-line-height: var(--forge-list-item-three-line-height, var(--forge-list-item-height, 88px));\n --_list-item-dense-one-line-height: var(--forge-list-item-dense-one-line-height, var(--_list-item-dense-height));\n --_list-item-dense-two-line-height: var(--forge-list-item-dense-two-line-height, var(--forge-list-item-dense-height, 56px));\n --_list-item-dense-three-line-height: var(--forge-list-item-dense-three-line-height, var(--forge-list-item-dense-height, 72px));\n --_list-item-dense-font-size: var(--forge-list-item-dense-font-size, 0.875rem);\n --_list-item-dense-indent: var(--forge-list-item-dense-indent, var(--forge-spacing-xxlarge, 48px));\n --_list-item-dense-gap: var(--forge-list-item-dense-gap, var(--forge-spacing-xsmall, 8px));\n --_list-item-start-selected-color: var(--forge-list-item-start-selected-color, var(--_list-item-selected-color));\n --_list-item-end-selected-color: var(--forge-list-item-end-selected-color, var(--_list-item-selected-color));\n --_list-item-wrap-padding: var(--forge-list-item-wrap-padding, var(--forge-spacing-xsmall, 8px) var(--forge-spacing-medium, 16px));\n position: relative;\n display: flex;\n gap: var(--_list-item-gap);\n align-items: center;\n box-sizing: border-box;\n outline: none;\n text-decoration: none;\n border-radius: var(--_list-item-shape);\n -webkit-tap-highlight-color: transparent;\n background-color: var(--_list-item-background);\n height: var(--_list-item-height);\n min-height: var(--_list-item-height);\n padding: var(--_list-item-padding);\n margin: var(--_list-item-margin);\n --_list-item-gap: var(--_list-item-dense-gap);\n height: var(--_list-item-dense-one-line-height);\n min-height: var(--_list-item-dense-one-line-height);\n --_state-layer-display: var(--forge-state-layer-display, flex);\n --_state-layer-color: var(--forge-state-layer-color, var(--forge-theme-on-surface, #000000));\n --_state-layer-hover-color: var(--forge-state-layer-hover-color, var(--_state-layer-color));\n --_state-layer-hover-opacity: var(--forge-state-layer-hover-opacity, 0.08);\n --_state-layer-pressed-color: var(--forge-state-layer-pressed-color, var(--_state-layer-color));\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.12);\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 15ms);\n --_state-layer-pressed-duration: var(--forge-state-layer-pressed-duration, 105ms);\n --_state-layer-animation-duration: var(--forge-state-layer-animation-duration, 375ms);\n}\n.ai-dropdown-menu-item::before {\n opacity: 0;\n position: absolute;\n backface-visibility: hidden;\n transform: translateZ(0);\n background-color: var(--_state-layer-hover-color);\n inset: 0;\n transition: opacity var(--_state-layer-hover-duration) linear, background-color var(--_state-layer-hover-duration) linear;\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 100ms);\n content: "";\n opacity: 0;\n border-radius: inherit;\n}\n.ai-dropdown-menu-item:hover::before {\n background-color: var(--_state-layer-hover-color);\n opacity: var(--_state-layer-hover-opacity);\n}\n.ai-dropdown-menu-item:active::before {\n opacity: var(--_state-layer-pressed-opacity);\n transition-duration: var(--_state-layer-pressed-duration);\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.18);\n}\n.ai-dropdown-menu-item {\n cursor: pointer;\n}\n.ai-dropdown-menu-item ::slotted([slot=start]),\n.ai-dropdown-menu-item ::slotted([slot=end]) {\n color: var(--_list-item-text-color);\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n fill: currentColor;\n}\n.ai-dropdown-menu-item--with-selection {\n --forge-list-item-padding: 0 var(--forge-spacing-xxsmall, 4px);\n}\n.ai-dropdown-menu-item--with-description {\n height: var(--_list-item-dense-two-line-height);\n min-height: var(--_list-item-dense-two-line-height);\n}\n.ai-dropdown-menu-item--selected {\n color: var(--_list-item-selected-color);\n}\n.ai-dropdown-menu-item--selected::before {\n content: "";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n opacity: var(--_list-item-selected-opacity);\n background-color: var(--_list-item-selected-background);\n pointer-events: none;\n}\n.ai-dropdown-menu-item--selected {\n --forge-state-layer-color: var(--_list-item-selected-color);\n}\n.ai-dropdown-menu-item--selected ::slotted([slot=start]),\n.ai-dropdown-menu-item--selected ::slotted([slot=end]) {\n color: var(--_list-item-selected-color);\n}\n.ai-dropdown-menu-item--disabled {\n cursor: var(--_list-item-disabled-cursor);\n opacity: var(--_list-item-disabled-opacity);\n}\n.ai-dropdown-menu-item__content {\n flex: 1;\n min-width: 0;\n}\n.ai-dropdown-menu-item__text {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-body2-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n letter-spacing: var(--forge-typography-body2-letter-spacing, 0.015625em);\n text-transform: var(--forge-typography-body2-text-transform, inherit);\n text-decoration: var(--forge-typography-body2-text-decoration, inherit);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n isolation: isolate;\n font-size: var(--_list-item-text-font-size);\n font-weight: var(--_list-item-text-font-weight);\n line-height: var(--_list-item-text-line-height);\n flex: 1;\n contain: layout;\n font-size: var(--_list-item-dense-font-size);\n}\n.ai-dropdown-menu-item__description {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-body1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-body1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, 0.875)));\n font-weight: var(--forge-typography-body1-font-weight, 400);\n line-height: var(--forge-typography-body1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-line-height-scale, 1.125)));\n letter-spacing: var(--forge-typography-body1-letter-spacing, 0.0357142857em);\n text-transform: var(--forge-typography-body1-text-transform, inherit);\n text-decoration: var(--forge-typography-body1-text-decoration, inherit);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--_list-item-text-color);\n display: block;\n font-size: var(--_list-item-dense-font-size);\n}\n.ai-dropdown-menu-item__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.ai-dropdown-menu-item__selection-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--forge-spacing-small, 12px);\n}\n.ai-dropdown-menu-item__selection-svg {\n fill: currentColor;\n width: var(--ai-dropdown-menu-item-selection-icon-size);\n height: var(--ai-dropdown-menu-item-selection-icon-size);\n}\n.ai-dropdown-menu-item__submenu-arrow {\n width: var(--ai-dropdown-menu-item-selection-icon-size);\n height: var(--ai-dropdown-menu-item-selection-icon-size);\n fill: currentColor;\n}\n.ai-dropdown-menu-item__submenu-arrow-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}';
|
|
1
|
+
const styles = '/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/* prettier-ignore */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n/**\n * @license\n * Copyright Tyler Technologies, Inc. \n * License: Apache-2.0\n */\n:host {\n display: block;\n position: relative;\n outline: none;\n --_ai-dropdown-menu-item-selection-icon-size: var(--forge-ai-dropdown-menu-item-selection-icon-size, 16px);\n}\n\n@keyframes forge-focus-indicator-outward-grow {\n from {\n outline-width: 0;\n }\n to {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-outward-shrink {\n from {\n outline-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-grow {\n from {\n border-width: 0;\n }\n to {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n@keyframes forge-focus-indicator-inward-shrink {\n from {\n border-width: var(--_focus-indicator-active-width);\n }\n}\n:host(:focus) .focus-indicator {\n --_focus-indicator-display: var(--forge-focus-indicator-display, flex);\n --_focus-indicator-width: var(--forge-focus-indicator-width, var(--forge-border-medium, 2px));\n --_focus-indicator-active-width: var(--forge-focus-indicator-active-width, 6px);\n --_focus-indicator-color: var(--forge-focus-indicator-color, var(--forge-theme-primary, #3f51b5));\n --_focus-indicator-shape: var(--forge-focus-indicator-shape, calc(var(--forge-shape-extra-small, 1px) * var(--forge-shape-factor, 1)));\n --_focus-indicator-duration: var(--forge-focus-indicator-duration, var(--forge-animation-duration-long4, 600ms));\n --_focus-indicator-easing: var(--forge-focus-indicator-easing, var(--forge-animation-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)));\n --_focus-indicator-shape-start-start: var(--forge-focus-indicator-shape-start-start, var(--_focus-indicator-shape));\n --_focus-indicator-shape-start-end: var(--forge-focus-indicator-shape-start-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-end: var(--forge-focus-indicator-shape-end-end, var(--_focus-indicator-shape));\n --_focus-indicator-shape-end-start: var(--forge-focus-indicator-shape-end-start, var(--_focus-indicator-shape));\n --_focus-indicator-outward-offset: var(--forge-focus-indicator-outward-offset, var(--forge-spacing-xxsmall, 4px));\n --_focus-indicator-inward-offset: var(--forge-focus-indicator-inward-offset, 0px);\n --_focus-indicator-offset-block: var(--forge-focus-indicator-offset-block, 0);\n --_focus-indicator-offset-inline: var(--forge-focus-indicator-offset-inline, 0);\n animation-delay: 0s, calc(var(--_focus-indicator-duration) * 0.25);\n animation-duration: calc(var(--_focus-indicator-duration) * 0.25), calc(var(--_focus-indicator-duration) * 0.75);\n animation-timing-function: var(--_focus-indicator-easing);\n box-sizing: border-box;\n color: var(--_focus-indicator-color);\n display: none;\n pointer-events: none;\n position: absolute;\n margin-block: var(--_focus-indicator-offset-block);\n margin-inline: var(--_focus-indicator-offset-inline);\n animation-name: forge-focus-indicator-inward-grow, forge-focus-indicator-inward-shrink;\n border-end-end-radius: calc(var(--_focus-indicator-shape-end-end) - var(--_focus-indicator-inward-offset));\n border-end-start-radius: calc(var(--_focus-indicator-shape-end-start) - var(--_focus-indicator-inward-offset));\n border-start-end-radius: calc(var(--_focus-indicator-shape-start-end) - var(--_focus-indicator-inward-offset));\n border-start-start-radius: calc(var(--_focus-indicator-shape-start-start) - var(--_focus-indicator-inward-offset));\n border: var(--_focus-indicator-width) solid currentColor;\n inset: var(--_focus-indicator-inward-offset);\n}\n:host(:focus) .focus-indicator::before {\n content: "";\n}\n:host(:focus) .focus-indicator {\n display: block;\n --forge-focus-indicator-shape: calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1));\n}\n\n.ai-dropdown-menu-item {\n --_list-item-background: var(--forge-list-item-background, transparent);\n --_list-item-shape: var(--forge-list-item-shape, 0);\n --_list-item-padding: var(--forge-list-item-padding, 0 var(--forge-spacing-medium, 16px));\n --_list-item-margin: var(--forge-list-item-margin, 0);\n --_list-item-height: var(--forge-list-item-height, 48px);\n --_list-item-dense-height: var(--forge-list-item-dense-height, 32px);\n --_list-item-indent: var(--forge-list-item-indent, var(--forge-spacing-xxlarge, 48px));\n --_list-item-cursor: var(--forge-list-item-cursor, pointer);\n --_list-item-gap: var(--forge-list-item-gap, var(--forge-spacing-large, 24px));\n --_list-item-text-color: var(--forge-list-item-text-color, var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6)));\n --_list-item-text-font-size: var(--forge-list-item-text-font-size, var(--forge-typography-body2-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, 1))));\n --_list-item-text-font-weight: var(--forge-list-item-text-font-weight, var(--forge-typography-body2-font-weight, 400));\n --_list-item-text-line-height: var(--forge-list-item-text-line-height, 1.5rem);\n --_list-item-selected-color: var(--forge-list-item-selected-color, var(--forge-theme-primary, #3f51b5));\n --_list-item-selected-background: var(--forge-list-item-selected-background, var(--_list-item-selected-color));\n --_list-item-selected-opacity: var(--forge-list-item-selected-opacity, 0.08);\n --_list-item-selected-start-color: var(--forge-list-item-selected-start-color, var(--_list-item-selected-color));\n --_list-item-selected-end-color: var(--forge-list-item-selected-end-color, var(--_list-item-selected-color));\n --_list-item-selected-text-color: var(--forge-list-item-selected-text-color, var(--forge-theme-text-medium, rgba(0, 0, 0, 0.6)));\n --_list-item-disabled-opacity: var(--forge-list-item-disabled-opacity, 0.38);\n --_list-item-disabled-cursor: var(--forge-list-item-disabled-cursor, not-allowed);\n --_list-item-one-line-height: var(--forge-list-item-one-line-height, var(--_list-item-height));\n --_list-item-two-line-height: var(--forge-list-item-two-line-height, var(--forge-list-item-height, 72px));\n --_list-item-three-line-height: var(--forge-list-item-three-line-height, var(--forge-list-item-height, 88px));\n --_list-item-dense-one-line-height: var(--forge-list-item-dense-one-line-height, var(--_list-item-dense-height));\n --_list-item-dense-two-line-height: var(--forge-list-item-dense-two-line-height, var(--forge-list-item-dense-height, 56px));\n --_list-item-dense-three-line-height: var(--forge-list-item-dense-three-line-height, var(--forge-list-item-dense-height, 72px));\n --_list-item-dense-font-size: var(--forge-list-item-dense-font-size, 0.875rem);\n --_list-item-dense-indent: var(--forge-list-item-dense-indent, var(--forge-spacing-xxlarge, 48px));\n --_list-item-dense-gap: var(--forge-list-item-dense-gap, var(--forge-spacing-xsmall, 8px));\n --_list-item-start-selected-color: var(--forge-list-item-start-selected-color, var(--_list-item-selected-color));\n --_list-item-end-selected-color: var(--forge-list-item-end-selected-color, var(--_list-item-selected-color));\n --_list-item-wrap-padding: var(--forge-list-item-wrap-padding, var(--forge-spacing-xsmall, 8px) var(--forge-spacing-medium, 16px));\n position: relative;\n display: flex;\n gap: var(--_list-item-gap);\n align-items: center;\n box-sizing: border-box;\n outline: none;\n text-decoration: none;\n border-radius: var(--_list-item-shape);\n -webkit-tap-highlight-color: transparent;\n background-color: var(--_list-item-background);\n height: var(--_list-item-height);\n min-height: var(--_list-item-height);\n padding: var(--_list-item-padding);\n margin: var(--_list-item-margin);\n --_list-item-gap: var(--_list-item-dense-gap);\n height: var(--_list-item-dense-one-line-height);\n min-height: var(--_list-item-dense-one-line-height);\n --_state-layer-display: var(--forge-state-layer-display, flex);\n --_state-layer-color: var(--forge-state-layer-color, var(--forge-theme-on-surface, #000000));\n --_state-layer-hover-color: var(--forge-state-layer-hover-color, var(--_state-layer-color));\n --_state-layer-hover-opacity: var(--forge-state-layer-hover-opacity, 0.08);\n --_state-layer-pressed-color: var(--forge-state-layer-pressed-color, var(--_state-layer-color));\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.12);\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 15ms);\n --_state-layer-pressed-duration: var(--forge-state-layer-pressed-duration, 105ms);\n --_state-layer-animation-duration: var(--forge-state-layer-animation-duration, 375ms);\n}\n.ai-dropdown-menu-item::before {\n opacity: 0;\n position: absolute;\n backface-visibility: hidden;\n transform: translateZ(0);\n background-color: var(--_state-layer-hover-color);\n inset: 0;\n transition: opacity var(--_state-layer-hover-duration) linear, background-color var(--_state-layer-hover-duration) linear;\n --_state-layer-hover-duration: var(--forge-state-layer-hover-duration, 100ms);\n content: "";\n opacity: 0;\n border-radius: inherit;\n}\n.ai-dropdown-menu-item:hover::before {\n background-color: var(--_state-layer-hover-color);\n opacity: var(--_state-layer-hover-opacity);\n}\n.ai-dropdown-menu-item:active::before {\n opacity: var(--_state-layer-pressed-opacity);\n transition-duration: var(--_state-layer-pressed-duration);\n --_state-layer-pressed-opacity: var(--forge-state-layer-pressed-opacity, 0.18);\n}\n.ai-dropdown-menu-item {\n cursor: pointer;\n}\n.ai-dropdown-menu-item ::slotted([slot=start]),\n.ai-dropdown-menu-item ::slotted([slot=end]) {\n color: var(--_list-item-text-color);\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n fill: currentColor;\n}\n.ai-dropdown-menu-item--with-selection {\n --forge-list-item-padding: 0 var(--forge-spacing-xxsmall, 4px);\n}\n.ai-dropdown-menu-item--with-description {\n height: var(--_list-item-dense-two-line-height);\n min-height: var(--_list-item-dense-two-line-height);\n}\n.ai-dropdown-menu-item--selected {\n color: var(--_list-item-selected-color);\n}\n.ai-dropdown-menu-item--selected::before {\n content: "";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n opacity: var(--_list-item-selected-opacity);\n background-color: var(--_list-item-selected-background);\n pointer-events: none;\n}\n.ai-dropdown-menu-item--selected {\n --forge-state-layer-color: var(--_list-item-selected-color);\n}\n.ai-dropdown-menu-item--selected ::slotted([slot=start]),\n.ai-dropdown-menu-item--selected ::slotted([slot=end]) {\n color: var(--_list-item-selected-color);\n}\n.ai-dropdown-menu-item--disabled {\n cursor: var(--_list-item-disabled-cursor);\n opacity: var(--_list-item-disabled-opacity);\n}\n.ai-dropdown-menu-item__content {\n flex: 1;\n min-width: 0;\n}\n.ai-dropdown-menu-item__text {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-body2-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n letter-spacing: var(--forge-typography-body2-letter-spacing, 0.015625em);\n text-transform: var(--forge-typography-body2-text-transform, inherit);\n text-decoration: var(--forge-typography-body2-text-decoration, inherit);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n isolation: isolate;\n font-size: var(--_list-item-text-font-size);\n font-weight: var(--_list-item-text-font-weight);\n line-height: var(--_list-item-text-line-height);\n flex: 1;\n contain: layout;\n font-size: var(--_list-item-dense-font-size);\n}\n.ai-dropdown-menu-item__description {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n font-family: var(--forge-typography-body1-font-family, var(--forge-typography-font-family, "Roboto", sans-serif));\n font-size: var(--forge-typography-body1-font-size, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-font-size-scale, 0.875)));\n font-weight: var(--forge-typography-body1-font-weight, 400);\n line-height: var(--forge-typography-body1-line-height, calc(var(--forge-typography-font-size, 1rem) * var(--forge-typography-body-line-height-scale, 1.125)));\n letter-spacing: var(--forge-typography-body1-letter-spacing, 0.0357142857em);\n text-transform: var(--forge-typography-body1-text-transform, inherit);\n text-decoration: var(--forge-typography-body1-text-decoration, inherit);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--_list-item-text-color);\n display: block;\n font-size: var(--_list-item-dense-font-size);\n}\n.ai-dropdown-menu-item__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.ai-dropdown-menu-item__selection-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--forge-spacing-small, 12px);\n}\n.ai-dropdown-menu-item__selection-svg {\n fill: currentColor;\n width: var(--_ai-dropdown-menu-item-selection-icon-size);\n height: var(--_ai-dropdown-menu-item-selection-icon-size);\n}\n.ai-dropdown-menu-item__submenu-arrow {\n width: var(--_ai-dropdown-menu-item-selection-icon-size);\n height: var(--_ai-dropdown-menu-item-selection-icon-size);\n fill: currentColor;\n}\n.ai-dropdown-menu-item__submenu-arrow-container {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}';
|
|
2
2
|
export {
|
|
3
3
|
styles as default
|
|
4
4
|
};
|
|
@@ -46,12 +46,10 @@ export type DropdownMenuVariant = 'button' | 'icon-button';
|
|
|
46
46
|
* - **forge-ai-dropdown-menu-open**: Fired when dropdown opens
|
|
47
47
|
* - **forge-ai-dropdown-menu-close**: Fired when dropdown closes
|
|
48
48
|
*
|
|
49
|
-
* @
|
|
50
|
-
* @
|
|
51
|
-
* @
|
|
52
|
-
* @
|
|
53
|
-
* @cssprop --ai-dropdown-menu-trigger-width - The width of the trigger button.
|
|
54
|
-
* @cssprop --ai-dropdown-menu-trigger-height - The height of the trigger button.
|
|
49
|
+
* @cssproperty --forge-ai-dropdown-menu-min-width - Minimum width of the dropdown menu.
|
|
50
|
+
* @cssproperty --forge-ai-dropdown-menu-max-width - Maximum width of the dropdown menu.
|
|
51
|
+
* @cssproperty --forge-ai-dropdown-menu-max-height - Maximum height of the dropdown menu.
|
|
52
|
+
* @cssproperty --forge-ai-dropdown-menu-padding - Padding inside the dropdown menu.
|
|
55
53
|
*
|
|
56
54
|
* @slot - The default slot for dropdown menu items, item groups, and separators.
|
|
57
55
|
* @slot header - The header content displayed at the top of the dropdown menu.
|
|
@@ -137,6 +135,7 @@ export declare class ForgeAiDropdownMenuComponent extends LitElement {
|
|
|
137
135
|
private _onPopoverToggle;
|
|
138
136
|
private _onItemClick;
|
|
139
137
|
private _onFocusOut;
|
|
138
|
+
private _onDefaultSlotChange;
|
|
140
139
|
private get _dropdownRole();
|
|
141
140
|
private get _ariaHasPopup();
|
|
142
141
|
private get _ariaMultiSelectable();
|
|
@@ -47,7 +47,7 @@ let ForgeAiDropdownMenuComponent = class extends LitElement {
|
|
|
47
47
|
__privateAdd(this, _triggerTextSlot, html`<slot name="trigger-content">Choose...</slot>`);
|
|
48
48
|
__privateAdd(this, _dropdownContentTemplate, html`
|
|
49
49
|
<slot name="header"></slot>
|
|
50
|
-
<slot></slot>
|
|
50
|
+
<slot @slotchange=${this._onDefaultSlotChange}></slot>
|
|
51
51
|
`);
|
|
52
52
|
}
|
|
53
53
|
connectedCallback() {
|
|
@@ -201,6 +201,12 @@ let ForgeAiDropdownMenuComponent = class extends LitElement {
|
|
|
201
201
|
}
|
|
202
202
|
});
|
|
203
203
|
}
|
|
204
|
+
_onDefaultSlotChange() {
|
|
205
|
+
if (this._selectionManager) {
|
|
206
|
+
this._selectionManager.value = this.value;
|
|
207
|
+
this.requestUpdate();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
204
210
|
get _dropdownRole() {
|
|
205
211
|
switch (this.selectionMode) {
|
|
206
212
|
case "single":
|