@tylertech/forge-ai 0.1.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 (200) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +3 -0
  3. package/custom-elements.json +4963 -0
  4. package/dist/ai-actions-toolbar/ai-actions-toolbar.d.ts +25 -0
  5. package/dist/ai-actions-toolbar/ai-actions-toolbar.mjs +74 -0
  6. package/dist/ai-actions-toolbar/ai-actions-toolbar.scss.mjs +4 -0
  7. package/dist/ai-actions-toolbar/index.d.ts +1 -0
  8. package/dist/ai-actions-toolbar/index.mjs +5 -0
  9. package/dist/ai-artifact/ai-artifact.d.ts +20 -0
  10. package/dist/ai-artifact/ai-artifact.mjs +39 -0
  11. package/dist/ai-artifact/ai-artifact.scss.mjs +4 -0
  12. package/dist/ai-artifact/index.d.ts +1 -0
  13. package/dist/ai-artifact/index.mjs +5 -0
  14. package/dist/ai-button/ai-button.d.ts +21 -0
  15. package/dist/ai-button/ai-button.mjs +67 -0
  16. package/dist/ai-button/ai-button.scss.mjs +4 -0
  17. package/dist/ai-button/index.d.ts +1 -0
  18. package/dist/ai-button/index.mjs +5 -0
  19. package/dist/ai-chain-of-thought/ai-chain-of-thought.d.ts +17 -0
  20. package/dist/ai-chain-of-thought/ai-chain-of-thought.mjs +45 -0
  21. package/dist/ai-chain-of-thought/ai-chain-of-thought.scss.mjs +4 -0
  22. package/dist/ai-chain-of-thought/index.d.ts +5 -0
  23. package/dist/ai-chain-of-thought/index.mjs +17 -0
  24. package/dist/ai-chain-of-thought/thought-base/index.d.ts +1 -0
  25. package/dist/ai-chain-of-thought/thought-base/index.mjs +5 -0
  26. package/dist/ai-chain-of-thought/thought-base/thought-base.d.ts +20 -0
  27. package/dist/ai-chain-of-thought/thought-base/thought-base.mjs +43 -0
  28. package/dist/ai-chain-of-thought/thought-base/thought-base.scss.mjs +4 -0
  29. package/dist/ai-chain-of-thought/thought-detail/index.d.ts +1 -0
  30. package/dist/ai-chain-of-thought/thought-detail/index.mjs +5 -0
  31. package/dist/ai-chain-of-thought/thought-detail/thought-detail.d.ts +14 -0
  32. package/dist/ai-chain-of-thought/thought-detail/thought-detail.mjs +34 -0
  33. package/dist/ai-chain-of-thought/thought-detail/thought-detail.scss.mjs +4 -0
  34. package/dist/ai-chain-of-thought/thought-image/index.d.ts +1 -0
  35. package/dist/ai-chain-of-thought/thought-image/index.mjs +5 -0
  36. package/dist/ai-chain-of-thought/thought-image/thought-image.d.ts +16 -0
  37. package/dist/ai-chain-of-thought/thought-image/thought-image.mjs +43 -0
  38. package/dist/ai-chain-of-thought/thought-image/thought-image.scss.mjs +4 -0
  39. package/dist/ai-chain-of-thought/thought-search-result/index.d.ts +1 -0
  40. package/dist/ai-chain-of-thought/thought-search-result/index.mjs +5 -0
  41. package/dist/ai-chain-of-thought/thought-search-result/thought-search-result.d.ts +22 -0
  42. package/dist/ai-chain-of-thought/thought-search-result/thought-search-result.mjs +62 -0
  43. package/dist/ai-chain-of-thought/thought-search-result/thought-search-result.scss.mjs +4 -0
  44. package/dist/ai-chat-header/ai-chat-header.d.ts +54 -0
  45. package/dist/ai-chat-header/ai-chat-header.mjs +198 -0
  46. package/dist/ai-chat-header/ai-chat-header.scss.mjs +4 -0
  47. package/dist/ai-chat-header/index.d.ts +1 -0
  48. package/dist/ai-chat-header/index.mjs +5 -0
  49. package/dist/ai-chat-interface/ai-chat-interface.d.ts +38 -0
  50. package/dist/ai-chat-interface/ai-chat-interface.mjs +117 -0
  51. package/dist/ai-chat-interface/ai-chat-interface.scss.mjs +4 -0
  52. package/dist/ai-chat-interface/index.d.ts +1 -0
  53. package/dist/ai-chat-interface/index.mjs +5 -0
  54. package/dist/ai-dialog/ai-dialog.d.ts +56 -0
  55. package/dist/ai-dialog/ai-dialog.mjs +270 -0
  56. package/dist/ai-dialog/ai-dialog.scss.mjs +4 -0
  57. package/dist/ai-dialog/index.d.ts +1 -0
  58. package/dist/ai-dialog/index.mjs +5 -0
  59. package/dist/ai-dropdown-menu/ai-dropdown-menu-item-group.d.ts +26 -0
  60. package/dist/ai-dropdown-menu/ai-dropdown-menu-item-group.mjs +80 -0
  61. package/dist/ai-dropdown-menu/ai-dropdown-menu-item-group.scss.mjs +4 -0
  62. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.d.ts +133 -0
  63. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.mjs +335 -0
  64. package/dist/ai-dropdown-menu/ai-dropdown-menu-item.scss.mjs +4 -0
  65. package/dist/ai-dropdown-menu/ai-dropdown-menu-separator.d.ts +18 -0
  66. package/dist/ai-dropdown-menu/ai-dropdown-menu-separator.mjs +26 -0
  67. package/dist/ai-dropdown-menu/ai-dropdown-menu-separator.scss.mjs +4 -0
  68. package/dist/ai-dropdown-menu/ai-dropdown-menu.d.ts +143 -0
  69. package/dist/ai-dropdown-menu/ai-dropdown-menu.mjs +327 -0
  70. package/dist/ai-dropdown-menu/ai-dropdown-menu.scss.mjs +4 -0
  71. package/dist/ai-dropdown-menu/index.d.ts +4 -0
  72. package/dist/ai-dropdown-menu/index.mjs +10 -0
  73. package/dist/ai-dropdown-menu/navigation-controller.d.ts +79 -0
  74. package/dist/ai-dropdown-menu/navigation-controller.mjs +205 -0
  75. package/dist/ai-dropdown-menu/selection-manager.d.ts +145 -0
  76. package/dist/ai-dropdown-menu/selection-manager.mjs +183 -0
  77. package/dist/ai-embedded-chat/ai-embedded-chat.d.ts +47 -0
  78. package/dist/ai-embedded-chat/ai-embedded-chat.mjs +139 -0
  79. package/dist/ai-embedded-chat/ai-embedded-chat.scss.mjs +4 -0
  80. package/dist/ai-embedded-chat/index.d.ts +1 -0
  81. package/dist/ai-embedded-chat/index.mjs +5 -0
  82. package/dist/ai-empty-state/ai-empty-state.d.ts +19 -0
  83. package/dist/ai-empty-state/ai-empty-state.mjs +136 -0
  84. package/dist/ai-empty-state/ai-empty-state.scss.mjs +4 -0
  85. package/dist/ai-empty-state/index.d.ts +1 -0
  86. package/dist/ai-empty-state/index.mjs +5 -0
  87. package/dist/ai-fab/ai-fab.d.ts +23 -0
  88. package/dist/ai-fab/ai-fab.mjs +75 -0
  89. package/dist/ai-fab/ai-fab.scss.mjs +4 -0
  90. package/dist/ai-fab/index.d.ts +1 -0
  91. package/dist/ai-fab/index.mjs +5 -0
  92. package/dist/ai-file-picker/ai-file-picker.d.ts +77 -0
  93. package/dist/ai-file-picker/ai-file-picker.mjs +176 -0
  94. package/dist/ai-file-picker/ai-file-picker.scss.mjs +4 -0
  95. package/dist/ai-file-picker/index.d.ts +1 -0
  96. package/dist/ai-file-picker/index.mjs +4 -0
  97. package/dist/ai-floating-chat/ai-floating-chat.d.ts +65 -0
  98. package/dist/ai-floating-chat/ai-floating-chat.mjs +153 -0
  99. package/dist/ai-floating-chat/ai-floating-chat.scss.mjs +4 -0
  100. package/dist/ai-floating-chat/index.d.ts +1 -0
  101. package/dist/ai-floating-chat/index.mjs +5 -0
  102. package/dist/ai-gradient-container/ai-gradient-container.d.ts +26 -0
  103. package/dist/ai-gradient-container/ai-gradient-container.mjs +61 -0
  104. package/dist/ai-gradient-container/ai-gradient-container.scss.mjs +4 -0
  105. package/dist/ai-gradient-container/index.d.ts +1 -0
  106. package/dist/ai-gradient-container/index.mjs +5 -0
  107. package/dist/ai-icon/ai-icon.d.ts +22 -0
  108. package/dist/ai-icon/ai-icon.mjs +71 -0
  109. package/dist/ai-icon/ai-icon.scss.mjs +4 -0
  110. package/dist/ai-icon/index.d.ts +1 -0
  111. package/dist/ai-icon/index.mjs +5 -0
  112. package/dist/ai-modal/ai-modal.d.ts +49 -0
  113. package/dist/ai-modal/ai-modal.mjs +132 -0
  114. package/dist/ai-modal/ai-modal.scss.mjs +4 -0
  115. package/dist/ai-modal/index.d.ts +1 -0
  116. package/dist/ai-modal/index.mjs +4 -0
  117. package/dist/ai-prompt/ai-prompt.d.ts +42 -0
  118. package/dist/ai-prompt/ai-prompt.mjs +123 -0
  119. package/dist/ai-prompt/ai-prompt.scss.mjs +4 -0
  120. package/dist/ai-prompt/index.d.ts +1 -0
  121. package/dist/ai-prompt/index.mjs +5 -0
  122. package/dist/ai-prompt/prompt-button/index.d.ts +1 -0
  123. package/dist/ai-prompt/prompt-button/index.mjs +5 -0
  124. package/dist/ai-prompt/prompt-button/prompt-button.d.ts +16 -0
  125. package/dist/ai-prompt/prompt-button/prompt-button.mjs +40 -0
  126. package/dist/ai-prompt/prompt-button/prompt-button.scss.mjs +4 -0
  127. package/dist/ai-reasoning/ai-reasoning.d.ts +17 -0
  128. package/dist/ai-reasoning/ai-reasoning.mjs +44 -0
  129. package/dist/ai-reasoning/ai-reasoning.scss.mjs +4 -0
  130. package/dist/ai-reasoning/index.d.ts +2 -0
  131. package/dist/ai-reasoning/index.mjs +8 -0
  132. package/dist/ai-reasoning/reasoning-content/index.d.ts +1 -0
  133. package/dist/ai-reasoning/reasoning-content/index.mjs +5 -0
  134. package/dist/ai-reasoning/reasoning-content/reasoning-content.d.ts +22 -0
  135. package/dist/ai-reasoning/reasoning-content/reasoning-content.mjs +90 -0
  136. package/dist/ai-reasoning/reasoning-content/reasoning-content.scss.mjs +4 -0
  137. package/dist/ai-reasoning-header/ai-reasoning-header.d.ts +24 -0
  138. package/dist/ai-reasoning-header/ai-reasoning-header.mjs +68 -0
  139. package/dist/ai-reasoning-header/ai-reasoning-header.scss.mjs +4 -0
  140. package/dist/ai-reasoning-header/index.d.ts +1 -0
  141. package/dist/ai-reasoning-header/index.mjs +5 -0
  142. package/dist/ai-response-message/ai-response-message.d.ts +40 -0
  143. package/dist/ai-response-message/ai-response-message.mjs +137 -0
  144. package/dist/ai-response-message/ai-response-message.scss.mjs +4 -0
  145. package/dist/ai-response-message/index.d.ts +1 -0
  146. package/dist/ai-response-message/index.mjs +5 -0
  147. package/dist/ai-sidebar/ai-sidebar.d.ts +44 -0
  148. package/dist/ai-sidebar/ai-sidebar.mjs +105 -0
  149. package/dist/ai-sidebar/ai-sidebar.scss.mjs +4 -0
  150. package/dist/ai-sidebar/index.d.ts +1 -0
  151. package/dist/ai-sidebar/index.mjs +5 -0
  152. package/dist/ai-sidebar-chat/ai-sidebar-chat.d.ts +64 -0
  153. package/dist/ai-sidebar-chat/ai-sidebar-chat.mjs +170 -0
  154. package/dist/ai-sidebar-chat/ai-sidebar-chat.scss.mjs +4 -0
  155. package/dist/ai-sidebar-chat/index.d.ts +1 -0
  156. package/dist/ai-sidebar-chat/index.mjs +5 -0
  157. package/dist/ai-suggestions/ai-suggestions.d.ts +39 -0
  158. package/dist/ai-suggestions/ai-suggestions.mjs +96 -0
  159. package/dist/ai-suggestions/ai-suggestions.scss.mjs +4 -0
  160. package/dist/ai-suggestions/index.d.ts +1 -0
  161. package/dist/ai-suggestions/index.mjs +5 -0
  162. package/dist/ai-threads/ai-threads.d.ts +48 -0
  163. package/dist/ai-threads/ai-threads.mjs +203 -0
  164. package/dist/ai-threads/ai-threads.scss.mjs +4 -0
  165. package/dist/ai-threads/index.d.ts +1 -0
  166. package/dist/ai-threads/index.mjs +5 -0
  167. package/dist/ai-user-message/ai-user-message.d.ts +15 -0
  168. package/dist/ai-user-message/ai-user-message.mjs +43 -0
  169. package/dist/ai-user-message/ai-user-message.scss.mjs +4 -0
  170. package/dist/ai-user-message/index.d.ts +1 -0
  171. package/dist/ai-user-message/index.mjs +5 -0
  172. package/dist/ai-voice-input/ai-voice-input.d.ts +68 -0
  173. package/dist/ai-voice-input/ai-voice-input.mjs +107 -0
  174. package/dist/ai-voice-input/ai-voice-input.scss.mjs +4 -0
  175. package/dist/ai-voice-input/index.d.ts +1 -0
  176. package/dist/ai-voice-input/index.mjs +5 -0
  177. package/dist/core/drag-controller.d.ts +66 -0
  178. package/dist/core/drag-controller.mjs +219 -0
  179. package/dist/core/index.d.ts +1 -0
  180. package/dist/core/index.mjs +4 -0
  181. package/dist/core/overlay/index.d.ts +1 -0
  182. package/dist/core/overlay/index.mjs +4 -0
  183. package/dist/core/overlay/overlay.d.ts +61 -0
  184. package/dist/core/overlay/overlay.mjs +142 -0
  185. package/dist/core/overlay/overlay.scss.mjs +4 -0
  186. package/dist/core/popover/index.d.ts +1 -0
  187. package/dist/core/popover/index.mjs +4 -0
  188. package/dist/core/popover/popover.d.ts +56 -0
  189. package/dist/core/popover/popover.mjs +71 -0
  190. package/dist/core/popover/popover.scss.mjs +4 -0
  191. package/dist/core/tooltip/index.d.ts +1 -0
  192. package/dist/core/tooltip/index.mjs +4 -0
  193. package/dist/core/tooltip/tooltip.d.ts +91 -0
  194. package/dist/core/tooltip/tooltip.mjs +243 -0
  195. package/dist/core/tooltip/tooltip.scss.mjs +4 -0
  196. package/dist/index.d.ts +27 -0
  197. package/dist/index.mjs +98 -0
  198. package/dist/utils.d.ts +14 -0
  199. package/dist/utils.mjs +22 -0
  200. package/package.json +122 -0
@@ -0,0 +1,68 @@
1
+ import { LitElement, TemplateResult } from 'lit';
2
+ declare global {
3
+ interface HTMLElementTagNameMap {
4
+ 'forge-ai-voice-input': AiVoiceInputComponent;
5
+ }
6
+ interface Window {
7
+ SpeechRecognition: typeof SpeechRecognition;
8
+ webkitSpeechRecognition: typeof SpeechRecognition;
9
+ }
10
+ }
11
+ interface SpeechRecognitionAlternative {
12
+ readonly transcript: string;
13
+ readonly confidence: number;
14
+ }
15
+ interface SpeechRecognitionResult {
16
+ readonly length: number;
17
+ item(index: number): SpeechRecognitionAlternative;
18
+ [index: number]: SpeechRecognitionAlternative;
19
+ }
20
+ interface SpeechRecognitionResultList {
21
+ readonly length: number;
22
+ item(index: number): SpeechRecognitionResult;
23
+ [index: number]: SpeechRecognitionResult;
24
+ }
25
+ interface SpeechRecognitionEvent extends Event {
26
+ readonly results: SpeechRecognitionResultList;
27
+ }
28
+ interface SpeechRecognition extends EventTarget {
29
+ continuous: boolean;
30
+ interimResults: boolean;
31
+ lang: string;
32
+ start(): void;
33
+ stop(): void;
34
+ onstart: ((this: SpeechRecognition, ev: Event) => void) | null;
35
+ onend: ((this: SpeechRecognition, ev: Event) => void) | null;
36
+ onerror: ((this: SpeechRecognition, ev: Event) => void) | null;
37
+ onresult: ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => void) | null;
38
+ }
39
+ declare const SpeechRecognition: {
40
+ prototype: SpeechRecognition;
41
+ new (): SpeechRecognition;
42
+ };
43
+ export declare const AiVoiceInputComponentTagName: keyof HTMLElementTagNameMap;
44
+ /**
45
+ * Event detail interface for the speech recognition result event.
46
+ */
47
+ export interface AiVoiceInputResultEvent {
48
+ /** The recognized speech text */
49
+ transcript: string;
50
+ /** Confidence score of the recognition result (0-1) */
51
+ confidence: number;
52
+ }
53
+ /**
54
+ * @tag forge-ai-voice-input
55
+ *
56
+ * @event {CustomEvent<AiVoiceInputResultEvent>} forge-ai-voice-input-result - Fired when speech recognition produces a result.
57
+ * The event detail contains the transcript and confidence score of the recognized speech.
58
+ */
59
+ export declare class AiVoiceInputComponent extends LitElement {
60
+ static styles: import('lit').CSSResult;
61
+ private _isRecording;
62
+ private _recognition;
63
+ connectedCallback(): void;
64
+ private _initializeSpeechRecognition;
65
+ private _toggleRecording;
66
+ render(): TemplateResult;
67
+ }
68
+ export {};
@@ -0,0 +1,107 @@
1
+ import { unsafeCSS, LitElement, html } from "lit";
2
+ import { state, customElement } from "lit/decorators.js";
3
+ import { classMap } from "lit/directives/class-map.js";
4
+ import styles from "./ai-voice-input.scss.mjs";
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __decorateClass = (decorators, target, key, kind) => {
8
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
9
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
10
+ if (decorator = decorators[i])
11
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
12
+ if (kind && result) __defProp(target, key, result);
13
+ return result;
14
+ };
15
+ const AiVoiceInputComponentTagName = "forge-ai-voice-input";
16
+ let AiVoiceInputComponent = class extends LitElement {
17
+ constructor() {
18
+ super(...arguments);
19
+ this._isRecording = false;
20
+ this._recognition = null;
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ this._initializeSpeechRecognition();
25
+ }
26
+ _initializeSpeechRecognition() {
27
+ const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;
28
+ if (!SpeechRecognitionClass) {
29
+ console.warn("Speech Recognition is not supported in this browser");
30
+ return;
31
+ }
32
+ this._recognition = new SpeechRecognitionClass();
33
+ this._recognition.continuous = false;
34
+ this._recognition.interimResults = false;
35
+ this._recognition.lang = "en-US";
36
+ this._recognition.onstart = () => {
37
+ this._isRecording = true;
38
+ };
39
+ this._recognition.onend = () => {
40
+ this._isRecording = false;
41
+ };
42
+ this._recognition.onerror = () => {
43
+ this._isRecording = false;
44
+ };
45
+ this._recognition.onresult = (event) => {
46
+ if (event.results.length > 0) {
47
+ const result = event.results[0];
48
+ if (result.length > 0) {
49
+ const alternative = result[0];
50
+ const eventDetail = {
51
+ transcript: alternative.transcript,
52
+ confidence: alternative.confidence
53
+ };
54
+ this.dispatchEvent(
55
+ new CustomEvent("forge-ai-voice-input-result", {
56
+ detail: eventDetail,
57
+ bubbles: true
58
+ })
59
+ );
60
+ }
61
+ }
62
+ };
63
+ }
64
+ _toggleRecording() {
65
+ if (!this._recognition) {
66
+ return;
67
+ }
68
+ if (this._isRecording) {
69
+ this._recognition.stop();
70
+ } else {
71
+ this._recognition.start();
72
+ }
73
+ }
74
+ render() {
75
+ const classes = classMap({
76
+ "forge-icon-button": true,
77
+ "forge-theme--error": this._isRecording,
78
+ recording: this._isRecording
79
+ });
80
+ return html`
81
+ <div class="ai-voice-input">
82
+ <button
83
+ class=${classes}
84
+ @click=${this._toggleRecording}
85
+ aria-label=${this._isRecording ? "Stop recording" : "Start recording"}
86
+ ?disabled=${!this._recognition}>
87
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
88
+ <path fill="none" d="M0 0h24v24H0z" />
89
+ <path
90
+ d="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3m5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72z" />
91
+ </svg>
92
+ </button>
93
+ </div>
94
+ `;
95
+ }
96
+ };
97
+ AiVoiceInputComponent.styles = unsafeCSS(styles);
98
+ __decorateClass([
99
+ state()
100
+ ], AiVoiceInputComponent.prototype, "_isRecording", 2);
101
+ AiVoiceInputComponent = __decorateClass([
102
+ customElement(AiVoiceInputComponentTagName)
103
+ ], AiVoiceInputComponent);
104
+ export {
105
+ AiVoiceInputComponent,
106
+ AiVoiceInputComponentTagName
107
+ };
@@ -0,0 +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/* prettier-ignore */\n.forge-icon-button {\n --_icon-button-display: var(--forge-icon-button-display, inline-flex);\n --_icon-button-size: var(--forge-icon-button-size, 48px);\n --_icon-button-gap: var(--forge-icon-button-gap, 0);\n --_icon-button-icon-color: var(--forge-icon-button-icon-color, currentColor);\n --_icon-button-background-color: var(--forge-icon-button-background-color, none);\n --_icon-button-icon-size: var(--forge-icon-button-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.5));\n --_icon-button-cursor: var(--forge-icon-button-cursor, pointer);\n --_icon-button-padding: var(--forge-icon-button-padding, var(--forge-spacing-xxsmall, 4px));\n --_icon-button-border: var(--forge-icon-button-border, none);\n --_icon-button-shadow: var(--forge-icon-button-shadow, none);\n --_icon-button-transition-duration: var(--forge-icon-button-transition-duration, var(--forge-animation-duration-short3, 150ms));\n --_icon-button-transition-timing: var(--forge-icon-button-transition-timing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)));\n --_icon-button-shape: var(--forge-icon-button-shape, calc(var(--forge-shape-full, 9999px) * var(--forge-shape-factor, 1)));\n --_icon-button-shape-start-start: var(--forge-icon-button-shape-start-start, var(--_icon-button-shape));\n --_icon-button-shape-start-end: var(--forge-icon-button-shape-start-end, var(--_icon-button-shape));\n --_icon-button-shape-end-start: var(--forge-icon-button-shape-end-start, var(--_icon-button-shape));\n --_icon-button-shape-end-end: var(--forge-icon-button-shape-end-end, var(--_icon-button-shape));\n --_icon-button-shape-squared: var(--forge-icon-button-shape-squared, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));\n --_icon-button-outlined-border-width: var(--forge-icon-button-outlined-border-width, 1px);\n --_icon-button-outlined-border-style: var(--forge-icon-button-outlined-border-style, solid);\n --_icon-button-outlined-border-color: var(--forge-icon-button-outlined-border-color, var(--_icon-button-icon-color));\n --_icon-button-tonal-icon-color: var(--forge-icon-button-tonal-icon-color, var(--forge-theme-on-primary-container, #222c62));\n --_icon-button-tonal-background-color: var(--forge-icon-button-tonal-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-filled-icon-color: var(--forge-icon-button-filled-icon-color, var(--forge-theme-on-primary, #ffffff));\n --_icon-button-filled-background-color: var(--forge-icon-button-filled-background-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-raised-shadow: var(--forge-icon-button-raised-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-hover-shadow: var(--forge-icon-button-raised-hover-shadow, 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-active-shadow: var(--forge-icon-button-raised-active-shadow, 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12));\n --_icon-button-raised-disabled-shadow: var(--forge-icon-button-raised-disabled-shadow, none);\n --_icon-button-density-small-size: var(--forge-icon-button-density-small-size, 24px);\n --_icon-button-density-small-padding: var(--forge-icon-button-density-small-padding, var(--forge-spacing-xxxsmall, 2px));\n --_icon-button-density-small-icon-size: var(--forge-icon-button-density-small-icon-size, calc(var(--forge-typography-font-size, 1rem) * 1.125));\n --_icon-button-density-medium-size: var(--forge-icon-button-density-medium-size, 36px);\n --_icon-button-density-medium-padding: var(--forge-icon-button-density-medium-padding, var(--forge-spacing-xxsmall, 4px));\n --_icon-button-density-large-size: var(--forge-icon-button-density-large-size, var(--_icon-button-size));\n --_icon-button-toggle-on-background-color: var(--forge-icon-button-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-toggle-on-icon-color: var(--forge-icon-button-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-outlined-toggle-on-background-color: var(--forge-icon-button-outlined-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-outlined-toggle-on-icon-color: var(--forge-icon-button-outlined-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-tonal-toggle-background-color: var(--forge-icon-button-tonal-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));\n --_icon-button-tonal-toggle-on-background-color: var(--forge-icon-button-tonal-toggle-on-background-color, var(--forge-theme-primary-container, #d1d5ed));\n --_icon-button-tonal-toggle-on-icon-color: var(--forge-icon-button-tonal-toggle-on-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-background-color: var(--forge-icon-button-filled-toggle-background-color, var(--forge-theme-surface-container-low, #ebebeb));\n --_icon-button-filled-toggle-icon-color: var(--forge-icon-button-filled-toggle-icon-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-on-background-color: var(--forge-icon-button-filled-toggle-on-background-color, var(--forge-theme-primary, #3f51b5));\n --_icon-button-filled-toggle-on-icon-color: var(--forge-icon-button-filled-toggle-on-icon-color, var(--forge-theme-on-primary, #ffffff));\n --_icon-button-disabled-cursor: var(--forge-icon-button-disabled-cursor, not-allowed);\n --_icon-button-disabled-opacity: var(--forge-icon-button-disabled-opacity, 0.38);\n --_icon-button-popover-icon-padding: var(--forge-icon-button-popover-icon-padding, var(--forge-spacing-xsmall, 8px));\n --_icon-button-focus-indicator-color: var(--forge-icon-button-focus-indicator-color, var(--forge-theme-primary, #3f51b5));\n}\n\n.forge-icon-button {\n display: var(--_icon-button-display);\n position: relative;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n position: relative;\n z-index: 0;\n display: var(--_icon-button-display);\n align-items: center;\n justify-content: center;\n gap: var(--_icon-button-gap);\n box-sizing: border-box;\n height: var(--_icon-button-density-large-size);\n min-width: var(--_icon-button-density-large-size);\n border: var(--_icon-button-border);\n border-start-start-radius: var(--_icon-button-shape-start-start);\n border-start-end-radius: var(--_icon-button-shape-start-end);\n border-end-start-radius: var(--_icon-button-shape-end-start);\n border-end-end-radius: var(--_icon-button-shape-end-end);\n padding: var(--_icon-button-padding);\n box-shadow: var(--_icon-button-shadow);\n color: var(--_icon-button-icon-color);\n background: var(--_icon-button-background-color);\n font-size: var(--_icon-button-icon-size);\n cursor: var(--_icon-button-cursor);\n user-select: none;\n transition-property: box-shadow, background;\n transition-duration: var(--_icon-button-transition-duration);\n transition-timing-function: var(--_icon-button-transition-timing);\n}\n\n.forge-icon-button img,\n.forge-icon-button svg {\n height: var(--_icon-button-icon-size);\n width: var(--_icon-button-icon-size);\n}\n\n.forge-icon-button svg {\n fill: currentColor;\n}\n\n.forge-icon-button:not(:disabled) {\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\n.forge-icon-button:not(:disabled)::before {\n opacity: 0;\n position: absolute;\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\n.forge-icon-button:not(:disabled):hover::before {\n background-color: var(--_state-layer-hover-color);\n opacity: var(--_state-layer-hover-opacity);\n}\n\n.forge-icon-button:not(:disabled):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\n.forge-icon-button:not(:disabled) {\n --forge-state-layer-color: var(--_icon-button-icon-color);\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.forge-icon-button:not(:disabled) {\n outline: none;\n}\n\n.forge-icon-button:not(:disabled):focus-visible::after {\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}\n\n.forge-icon-button:not(:disabled):focus-visible::after {\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-outward-grow, forge-focus-indicator-outward-shrink;\n border-end-end-radius: calc(var(--_focus-indicator-shape-end-end) + var(--_focus-indicator-outward-offset));\n border-end-start-radius: calc(var(--_focus-indicator-shape-end-start) + var(--_focus-indicator-outward-offset));\n border-start-end-radius: calc(var(--_focus-indicator-shape-start-end) + var(--_focus-indicator-outward-offset));\n border-start-start-radius: calc(var(--_focus-indicator-shape-start-start) + var(--_focus-indicator-outward-offset));\n inset: calc(-1 * var(--_focus-indicator-outward-offset));\n outline: var(--_focus-indicator-width) solid currentColor;\n content: "";\n display: block;\n}\n\n.forge-icon-button:not(:disabled) {\n --forge-focus-indicator-color: var(--_icon-button-focus-indicator-color);\n --forge-focus-indicator-shape: var(--_icon-button-shape);\n}\n\n.forge-icon-button:not(:disabled):where(.forge-icon-button--text,\n:not(:where(.forge-icon-button--outlined, .forge-icon-button--tonal, .forge-icon-button--filled, .forge-icon-button--raised))) {\n --forge-focus-indicator-outward-offset: 0px;\n}\n\n.forge-icon-button--outlined {\n border-width: var(--_icon-button-outlined-border-width);\n border-style: var(--_icon-button-outlined-border-style);\n border-color: var(--_icon-button-outlined-border-color);\n}\n\n.forge-icon-button--tonal {\n --_icon-button-icon-color: var(--_icon-button-tonal-icon-color);\n --_icon-button-background-color: var(--_icon-button-tonal-background-color);\n}\n\n.forge-icon-button--filled, .forge-icon-button--raised {\n --_icon-button-icon-color: var(--_icon-button-filled-icon-color);\n --_icon-button-background-color: var(--_icon-button-filled-background-color);\n}\n\n.forge-icon-button--raised {\n --_icon-button-shadow: var(--_icon-button-raised-shadow);\n}\n\n.forge-icon-button--raised:hover {\n --_icon-button-raised-shadow: var(--_icon-button-raised-hover-shadow);\n}\n\n.forge-icon-button--raised:active {\n --_icon-button-raised-shadow: var(--_icon-button-raised-active-shadow);\n}\n\n.forge-icon-button--squared {\n --_icon-button-shape: var(--_icon-button-shape-squared);\n}\n\n.forge-icon-button--small {\n --_icon-button-size: var(--_icon-button-density-small-size);\n --_icon-button-icon-size: var(--_icon-button-density-small-icon-size);\n --_icon-button-padding: var(--_icon-button-density-small-padding);\n}\n\n.forge-icon-button--small > * {\n font-size: var(--_icon-button-density-small-icon-size);\n}\n\n.forge-icon-button--medium {\n --_icon-button-size: var(--_icon-button-density-medium-size);\n --_icon-button-padding: var(--_icon-button-density-medium-padding);\n}\n\n.forge-icon-button:disabled {\n pointer-events: none;\n opacity: var(--_icon-button-disabled-opacity);\n pointer-events: auto;\n cursor: not-allowed;\n}\n\n.forge-icon-button forge-circular-progress {\n --forge-circular-progress-indicator-color: var(--_icon-button-icon-color);\n --forge-circular-progress-track-color: transparent;\n --forge-circular-progress-size: 1em;\n}\n\n.ai-voice-input {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n.ai-voice-input .forge-icon-button.recording {\n position: relative;\n animation: pulse 1.5s ease-in-out infinite;\n --forge-icon-button-background-color: transparent;\n}\n.ai-voice-input .forge-icon-button.recording::before {\n content: "";\n position: absolute;\n top: 50%;\n left: 50%;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background-color: var(--forge-theme-error-container-low, #f6e0e4);\n transform: translate(-50%, -50%) scale(0);\n animation: pulse-ring 1.5s ease-in-out infinite;\n z-index: -1;\n}\n\n@keyframes pulse {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 50% {\n transform: scale(1.1);\n opacity: 0.7;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n@keyframes pulse-ring {\n 0% {\n transform: translate(-50%, -50%) scale(1);\n opacity: 0.8;\n }\n 50% {\n transform: translate(-50%, -50%) scale(1.3);\n opacity: 0.4;\n }\n 100% {\n transform: translate(-50%, -50%) scale(1.6);\n opacity: 0;\n }\n}';
2
+ export {
3
+ styles as default
4
+ };
@@ -0,0 +1 @@
1
+ export * from './ai-voice-input';
@@ -0,0 +1,5 @@
1
+ import { AiVoiceInputComponent, AiVoiceInputComponentTagName } from "./ai-voice-input.mjs";
2
+ export {
3
+ AiVoiceInputComponent,
4
+ AiVoiceInputComponentTagName
5
+ };
@@ -0,0 +1,66 @@
1
+ import { ReactiveController, ReactiveControllerHost } from 'lit';
2
+ import { Ref } from 'lit/directives/ref.js';
3
+ export interface DragControllerOptions {
4
+ /** The element to make draggable */
5
+ targetElementRef: Ref<HTMLElement>;
6
+ /** The drag handle element reference */
7
+ dragHandleRef: Ref<HTMLElement>;
8
+ /** Whether to snap back to viewport bounds on release (default: true) */
9
+ snapToViewport?: boolean;
10
+ /** Whether keyboard navigation should be constrained to viewport (default: true) */
11
+ constrainKeyboardNavigation?: boolean;
12
+ /** Step size for keyboard navigation in pixels (default: 10) */
13
+ keyboardStep?: number;
14
+ /** Animation duration for snap-back in milliseconds (default: 200) */
15
+ snapAnimationDuration?: number;
16
+ /** Whether the element can be dragged outside viewport boundaries during drag (default: true) */
17
+ allowOutOfBounds?: boolean;
18
+ }
19
+ export declare class DragController implements ReactiveController {
20
+ private _host;
21
+ private _options;
22
+ private _isDragging;
23
+ private _currentTransformX;
24
+ private _currentTransformY;
25
+ private _dragOffsetX;
26
+ private _dragOffsetY;
27
+ private _dragAbortController?;
28
+ constructor(host: ReactiveControllerHost, options: DragControllerOptions);
29
+ hostConnected(): void;
30
+ hostDisconnected(): void;
31
+ /**
32
+ * Gets whether the element is currently being dragged
33
+ */
34
+ get isDragging(): boolean;
35
+ /**
36
+ * Gets the current transform values
37
+ */
38
+ get currentTransform(): {
39
+ x: number;
40
+ y: number;
41
+ };
42
+ /**
43
+ * Resets the drag position to original location
44
+ */
45
+ resetPosition(): void;
46
+ /**
47
+ * Cleanup method for removing event listeners and resetting state
48
+ */
49
+ cleanup(): void;
50
+ /**
51
+ * Handle pointer down event to start dragging
52
+ */
53
+ handlePointerDown: (event: PointerEvent) => void;
54
+ /**
55
+ * Handle keyboard navigation for drag handle
56
+ */
57
+ handleKeyDown: (event: KeyboardEvent) => void;
58
+ private _handlePointerMove;
59
+ private _handlePointerUp;
60
+ private _snapToViewport;
61
+ private _constrainToViewport;
62
+ private _getOriginalPosition;
63
+ private _getCurrentTransform;
64
+ private _addDragListeners;
65
+ private _removeDragListeners;
66
+ }
@@ -0,0 +1,219 @@
1
+ class DragController {
2
+ constructor(host, options) {
3
+ this._isDragging = false;
4
+ this._currentTransformX = 0;
5
+ this._currentTransformY = 0;
6
+ this._dragOffsetX = 0;
7
+ this._dragOffsetY = 0;
8
+ this.handlePointerDown = (event) => {
9
+ event.preventDefault();
10
+ const targetElement = this._options.targetElementRef.value;
11
+ const dragHandle = this._options.dragHandleRef.value;
12
+ if (!targetElement || !dragHandle) {
13
+ return;
14
+ }
15
+ dragHandle.setPointerCapture(event.pointerId);
16
+ this._getCurrentTransform(targetElement);
17
+ const targetRect = targetElement.getBoundingClientRect();
18
+ this._dragOffsetX = event.clientX - targetRect.left;
19
+ this._dragOffsetY = event.clientY - targetRect.top;
20
+ this._isDragging = true;
21
+ this._host.requestUpdate();
22
+ this._addDragListeners();
23
+ };
24
+ this.handleKeyDown = (event) => {
25
+ const step = this._options.keyboardStep;
26
+ let deltaX = 0;
27
+ let deltaY = 0;
28
+ switch (event.key) {
29
+ case "ArrowUp":
30
+ deltaY = -step;
31
+ break;
32
+ case "ArrowDown":
33
+ deltaY = step;
34
+ break;
35
+ case "ArrowLeft":
36
+ deltaX = -step;
37
+ break;
38
+ case "ArrowRight":
39
+ deltaX = step;
40
+ break;
41
+ default:
42
+ return;
43
+ }
44
+ event.preventDefault();
45
+ const targetElement = this._options.targetElementRef.value;
46
+ if (!targetElement) {
47
+ return;
48
+ }
49
+ this._getCurrentTransform(targetElement);
50
+ const newX = this._currentTransformX + deltaX;
51
+ const newY = this._currentTransformY + deltaY;
52
+ if (this._options.constrainKeyboardNavigation) {
53
+ const constrainedPosition = this._constrainToViewport(targetElement, newX, newY);
54
+ this._currentTransformX = constrainedPosition.x;
55
+ this._currentTransformY = constrainedPosition.y;
56
+ } else {
57
+ this._currentTransformX = newX;
58
+ this._currentTransformY = newY;
59
+ }
60
+ targetElement.style.transform = `translate(${this._currentTransformX}px, ${this._currentTransformY}px)`;
61
+ };
62
+ this._handlePointerMove = (event) => {
63
+ if (!this._isDragging) {
64
+ return;
65
+ }
66
+ event.preventDefault();
67
+ const targetElement = this._options.targetElementRef.value;
68
+ if (!targetElement) {
69
+ return;
70
+ }
71
+ const desiredX = event.clientX - this._dragOffsetX;
72
+ const desiredY = event.clientY - this._dragOffsetY;
73
+ const { originalX, originalY } = this._getOriginalPosition(targetElement);
74
+ const newTransformX = desiredX - originalX;
75
+ const newTransformY = desiredY - originalY;
76
+ this._currentTransformX = newTransformX;
77
+ this._currentTransformY = newTransformY;
78
+ targetElement.style.transform = `translate(${newTransformX}px, ${newTransformY}px)`;
79
+ };
80
+ this._handlePointerUp = (event) => {
81
+ if (!this._isDragging) {
82
+ return;
83
+ }
84
+ event.preventDefault();
85
+ const dragHandle = this._options.dragHandleRef.value;
86
+ if (dragHandle) {
87
+ dragHandle.releasePointerCapture(event.pointerId);
88
+ }
89
+ if (this._options.snapToViewport) {
90
+ this._snapToViewport();
91
+ }
92
+ this._isDragging = false;
93
+ this._host.requestUpdate();
94
+ this._removeDragListeners();
95
+ };
96
+ this._host = host;
97
+ this._options = {
98
+ snapToViewport: true,
99
+ constrainKeyboardNavigation: true,
100
+ keyboardStep: 10,
101
+ snapAnimationDuration: 200,
102
+ allowOutOfBounds: true,
103
+ ...options
104
+ };
105
+ host.addController(this);
106
+ }
107
+ hostConnected() {
108
+ }
109
+ hostDisconnected() {
110
+ this.cleanup();
111
+ }
112
+ /**
113
+ * Gets whether the element is currently being dragged
114
+ */
115
+ get isDragging() {
116
+ return this._isDragging;
117
+ }
118
+ /**
119
+ * Gets the current transform values
120
+ */
121
+ get currentTransform() {
122
+ return { x: this._currentTransformX, y: this._currentTransformY };
123
+ }
124
+ /**
125
+ * Resets the drag position to original location
126
+ */
127
+ resetPosition() {
128
+ const targetElement = this._options.targetElementRef.value;
129
+ if (targetElement) {
130
+ targetElement.style.transform = "";
131
+ targetElement.style.transition = "";
132
+ this._currentTransformX = 0;
133
+ this._currentTransformY = 0;
134
+ this._dragOffsetX = 0;
135
+ this._dragOffsetY = 0;
136
+ }
137
+ }
138
+ /**
139
+ * Cleanup method for removing event listeners and resetting state
140
+ */
141
+ cleanup() {
142
+ this._removeDragListeners();
143
+ this._isDragging = false;
144
+ }
145
+ _snapToViewport() {
146
+ const targetElement = this._options.targetElementRef.value;
147
+ if (!targetElement) {
148
+ return;
149
+ }
150
+ const constrainedPosition = this._constrainToViewport(
151
+ targetElement,
152
+ this._currentTransformX,
153
+ this._currentTransformY
154
+ );
155
+ if (constrainedPosition.x !== this._currentTransformX || constrainedPosition.y !== this._currentTransformY) {
156
+ this._currentTransformX = constrainedPosition.x;
157
+ this._currentTransformY = constrainedPosition.y;
158
+ targetElement.style.transition = `transform ${this._options.snapAnimationDuration}ms cubic-bezier(0.2, 0, 0, 1)`;
159
+ targetElement.style.transform = `translate(${constrainedPosition.x}px, ${constrainedPosition.y}px)`;
160
+ setTimeout(() => {
161
+ if (targetElement) {
162
+ targetElement.style.transition = "";
163
+ }
164
+ }, this._options.snapAnimationDuration);
165
+ }
166
+ }
167
+ _constrainToViewport(targetElement, transformX, transformY) {
168
+ const targetWidth = targetElement.offsetWidth;
169
+ const targetHeight = targetElement.offsetHeight;
170
+ const { originalX, originalY } = this._getOriginalPosition(targetElement);
171
+ const maxTransformX = window.innerWidth - targetWidth - originalX;
172
+ const minTransformX = -originalX;
173
+ const maxTransformY = window.innerHeight - targetHeight - originalY;
174
+ const minTransformY = -originalY;
175
+ const constrainedX = Math.max(minTransformX, Math.min(transformX, maxTransformX));
176
+ const constrainedY = Math.max(minTransformY, Math.min(transformY, maxTransformY));
177
+ return { x: constrainedX, y: constrainedY };
178
+ }
179
+ _getOriginalPosition(targetElement) {
180
+ const targetWidth = targetElement.offsetWidth;
181
+ const targetHeight = targetElement.offsetHeight;
182
+ const computedStyle = window.getComputedStyle(targetElement);
183
+ const originalX = parseFloat(computedStyle.right) ? window.innerWidth - parseFloat(computedStyle.right) - targetWidth : parseFloat(computedStyle.left) || 0;
184
+ const originalY = parseFloat(computedStyle.bottom) ? window.innerHeight - parseFloat(computedStyle.bottom) - targetHeight : parseFloat(computedStyle.top) || 0;
185
+ return { originalX, originalY };
186
+ }
187
+ _getCurrentTransform(targetElement) {
188
+ const currentTransform = targetElement.style.transform;
189
+ this._currentTransformX = 0;
190
+ this._currentTransformY = 0;
191
+ if (currentTransform) {
192
+ const match = currentTransform.match(/translate\((-?\d+(?:\.\d+)?)px,\s*(-?\d+(?:\.\d+)?)px\)/);
193
+ if (match) {
194
+ this._currentTransformX = parseFloat(match[1]);
195
+ this._currentTransformY = parseFloat(match[2]);
196
+ }
197
+ }
198
+ }
199
+ _addDragListeners() {
200
+ if (!this._dragAbortController) {
201
+ this._dragAbortController = new AbortController();
202
+ document.addEventListener("pointermove", this._handlePointerMove, {
203
+ signal: this._dragAbortController.signal
204
+ });
205
+ document.addEventListener("pointerup", this._handlePointerUp, {
206
+ signal: this._dragAbortController.signal
207
+ });
208
+ }
209
+ }
210
+ _removeDragListeners() {
211
+ if (this._dragAbortController) {
212
+ this._dragAbortController.abort();
213
+ this._dragAbortController = void 0;
214
+ }
215
+ }
216
+ }
217
+ export {
218
+ DragController
219
+ };
@@ -0,0 +1 @@
1
+ export { DragController, type DragControllerOptions } from './drag-controller.js';
@@ -0,0 +1,4 @@
1
+ import { DragController } from "./drag-controller.mjs";
2
+ export {
3
+ DragController
4
+ };
@@ -0,0 +1 @@
1
+ export { ForgeAiOverlayComponent, type OverlayPlacement } from './overlay.js';
@@ -0,0 +1,4 @@
1
+ import { ForgeAiOverlayComponent } from "./overlay.mjs";
2
+ export {
3
+ ForgeAiOverlayComponent
4
+ };
@@ -0,0 +1,61 @@
1
+ import { Placement } from '@floating-ui/dom';
2
+ import { LitElement, PropertyValues, TemplateResult } from 'lit';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'forge-ai-overlay': ForgeAiOverlayComponent;
6
+ }
7
+ interface HTMLElementEventMap {
8
+ 'forge-ai-overlay-toggle': CustomEvent<{
9
+ open: boolean;
10
+ newState: string;
11
+ oldState: string;
12
+ }>;
13
+ }
14
+ }
15
+ export type OverlayPlacement = Placement;
16
+ /**
17
+ * @summary A low-level overlay component for internal use within AI components.
18
+ *
19
+ * @cssprop --ai-overlay-max-width - The maximum width of the overlay.
20
+ * @cssprop --ai-overlay-max-height - The maximum height of the overlay.
21
+ * @cssprop --ai-overlay-min-width - The minimum width of the overlay.
22
+ * @cssprop --ai-overlay-min-height - The minimum height of the overlay.
23
+ *
24
+ * @slot - The default slot for overlay content.
25
+ */
26
+ export declare class ForgeAiOverlayComponent extends LitElement {
27
+ static styles: import('lit').CSSResult;
28
+ /**
29
+ * The anchor element to position the overlay relative to.
30
+ */
31
+ anchor: Element | null;
32
+ /**
33
+ * The placement of the overlay relative to the anchor.
34
+ */
35
+ placement: OverlayPlacement;
36
+ /**
37
+ * Whether the overlay should flip to the opposite side when there's no space.
38
+ */
39
+ flip: boolean;
40
+ /**
41
+ * Whether the overlay should shift to stay in view.
42
+ */
43
+ shift: boolean;
44
+ /**
45
+ * Whether the overlay is open.
46
+ */
47
+ open: boolean;
48
+ private _overlayElement;
49
+ private _cleanupAutoUpdate;
50
+ disconnectedCallback(): void;
51
+ updated(changedProperties: PropertyValues<this>): void;
52
+ private _handleOpenChange;
53
+ private _showOverlay;
54
+ private _hideOverlay;
55
+ private _updatePosition;
56
+ private _computePosition;
57
+ private _roundByDPR;
58
+ private _cleanup;
59
+ private _onToggle;
60
+ render(): TemplateResult;
61
+ }