@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.
Files changed (89) hide show
  1. package/custom-elements.json +1329 -579
  2. package/dist/ai-artifact/ai-artifact.scss.mjs +1 -1
  3. package/dist/ai-attachment/ai-attachment.d.ts +4 -4
  4. package/dist/ai-chat-header/ai-chat-header.d.ts +4 -0
  5. package/dist/ai-chat-header/ai-chat-header.mjs +6 -0
  6. package/dist/ai-chat-header/ai-chat-header.scss.mjs +1 -1
  7. package/dist/ai-chatbot/ag-ui-adapter.mjs +34 -25
  8. package/dist/ai-chatbot/agent-adapter.d.ts +16 -8
  9. package/dist/ai-chatbot/agent-adapter.mjs +16 -16
  10. package/dist/ai-chatbot/agent-runner.mjs +3 -3
  11. package/dist/ai-chatbot/ai-chatbot-tool-call.d.ts +5 -2
  12. package/dist/ai-chatbot/ai-chatbot-tool-call.mjs +68 -5
  13. package/dist/ai-chatbot/ai-chatbot-tool-call.scss.mjs +1 -1
  14. package/dist/ai-chatbot/ai-chatbot.d.ts +1 -0
  15. package/dist/ai-chatbot/ai-chatbot.mjs +84 -23
  16. package/dist/ai-chatbot/create-tool-renderer.d.ts +1 -4
  17. package/dist/ai-chatbot/create-tool-renderer.mjs +1 -13
  18. package/dist/ai-chatbot/index.d.ts +1 -1
  19. package/dist/ai-chatbot/message-state-controller.d.ts +10 -6
  20. package/dist/ai-chatbot/message-state-controller.mjs +95 -6
  21. package/dist/ai-chatbot/types.d.ts +91 -2
  22. package/dist/ai-chatbot/utils.d.ts +2 -2
  23. package/dist/ai-chatbot/utils.mjs +3 -2
  24. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.d.ts +1 -3
  25. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +1 -1
  26. package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +5 -6
  27. package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +7 -1
  28. package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +1 -1
  29. package/dist/ai-dropdown-menu/selection-manager.mjs +3 -3
  30. package/dist/ai-embedded-chat/ai-embedded-chat.mjs +1 -0
  31. package/dist/ai-empty-state/ai-empty-state.scss.mjs +1 -1
  32. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.d.ts +19 -0
  33. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.mjs +164 -0
  34. package/dist/ai-event-stream-viewer/ai-event-stream-viewer.scss.mjs +4 -0
  35. package/dist/ai-event-stream-viewer/index.d.ts +1 -0
  36. package/dist/ai-event-stream-viewer/index.mjs +5 -0
  37. package/dist/ai-file-picker/ai-file-picker.d.ts +0 -13
  38. package/dist/ai-gradient-container/ai-gradient-container.scss.mjs +1 -1
  39. package/dist/ai-icon/ai-icon.scss.mjs +1 -1
  40. package/dist/ai-icon-button/ai-icon-button.d.ts +19 -0
  41. package/dist/ai-icon-button/ai-icon-button.mjs +63 -0
  42. package/dist/ai-icon-button/ai-icon-button.scss.mjs +4 -0
  43. package/dist/ai-icon-button/index.d.ts +1 -0
  44. package/dist/ai-icon-button/index.mjs +5 -0
  45. package/dist/ai-message-thread/ai-message-thread.d.ts +3 -2
  46. package/dist/ai-message-thread/ai-message-thread.mjs +23 -9
  47. package/dist/ai-prompt/ai-prompt.d.ts +21 -0
  48. package/dist/ai-prompt/ai-prompt.mjs +133 -10
  49. package/dist/ai-prompt/ai-prompt.scss.mjs +1 -1
  50. package/dist/ai-response-message/ai-response-message.d.ts +5 -0
  51. package/dist/ai-response-message/ai-response-message.mjs +61 -3
  52. package/dist/ai-response-message/ai-response-message.scss.mjs +1 -1
  53. package/dist/ai-slash-command-menu/ai-slash-command-menu.d.ts +33 -0
  54. package/dist/ai-slash-command-menu/ai-slash-command-menu.mjs +200 -0
  55. package/dist/ai-slash-command-menu/ai-slash-command-menu.scss.mjs +4 -0
  56. package/dist/ai-slash-command-menu/index.d.ts +1 -0
  57. package/dist/ai-slash-command-menu/index.mjs +5 -0
  58. package/dist/ai-spinner/ai-spinner.d.ts +2 -2
  59. package/dist/ai-suggestions/ai-suggestions.d.ts +2 -0
  60. package/dist/ai-suggestions/ai-suggestions.scss.mjs +1 -1
  61. package/dist/ai-thinking-indicator/ai-thinking-indicator.d.ts +3 -0
  62. package/dist/ai-thinking-indicator/ai-thinking-indicator.mjs +24 -15
  63. package/dist/ai-thinking-indicator/ai-thinking-indicator.scss.mjs +14 -11
  64. package/dist/core/overlay/index.d.ts +1 -1
  65. package/dist/core/overlay/overlay.d.ts +10 -5
  66. package/dist/core/overlay/overlay.mjs +7 -2
  67. package/dist/core/popover/index.d.ts +1 -1
  68. package/dist/core/popover/popover.d.ts +7 -6
  69. package/dist/core/popover/popover.mjs +5 -0
  70. package/dist/core/tooltip/tooltip.d.ts +2 -2
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.mjs +6 -0
  73. package/dist/tools/ai-data-table/ai-data-table-definition.d.ts +2 -0
  74. package/dist/tools/ai-data-table/ai-data-table-definition.mjs +43 -0
  75. package/dist/tools/ai-data-table/ai-data-table.d.ts +33 -0
  76. package/dist/tools/ai-data-table/ai-data-table.mjs +206 -0
  77. package/dist/tools/ai-data-table/ai-data-table.scss.mjs +4 -0
  78. package/dist/tools/ai-data-table/index.d.ts +2 -0
  79. package/dist/tools/ai-data-table/index.mjs +6 -0
  80. package/dist/tools/ai-paginator/ai-paginator.d.ts +17 -0
  81. package/dist/tools/ai-paginator/ai-paginator.mjs +110 -0
  82. package/dist/tools/ai-paginator/ai-paginator.scss.mjs +4 -0
  83. package/dist/tools/ai-paginator/index.d.ts +1 -0
  84. package/dist/tools/ai-paginator/index.mjs +4 -0
  85. package/dist/tools/index.d.ts +2 -0
  86. package/dist/tools/index.mjs +8 -0
  87. package/dist/utils/keyboard-navigation-controller.d.ts +13 -0
  88. package/dist/utils/keyboard-navigation-controller.mjs +71 -0
  89. 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
- completeToolCall(toolCallId, result) {
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: Record<string, unknown>;
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,7 +1,7 @@
1
1
  /**
2
- * Generates a unique ID with a given prefix
2
+ * Generates a unique ID using UUID v4
3
3
  */
4
- export declare function generateId(prefix: string): string;
4
+ export declare function generateId(): string;
5
5
  /**
6
6
  * Renders markdown content to sanitized HTML
7
7
  */
@@ -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(prefix) {
9
- return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
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
- * @cssprop --ai-dropdown-menu-item-submenu-open-delay - Delay before opening submenu on hover.
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
- * @cssprop --ai-dropdown-menu-min-width - Minimum width of the dropdown menu.
50
- * @cssprop --ai-dropdown-menu-max-width - Maximum width of the dropdown menu.
51
- * @cssprop --ai-dropdown-menu-max-height - Maximum height of the dropdown menu.
52
- * @cssprop --ai-dropdown-menu-padding - Padding inside the dropdown menu.
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":